우아! 이건 뭐, 킹왕짱임! >_<)=b 몇일전에 Boost.spirit 예제 코드 보면서 떡실신 했는데, 역시, C++보다는 Ruby가 DSL 만들기엔 2천만배쯤 편한 것 같다. 루비로 (Lisp의 친척인) Scheme 인터프리터를 15분만에 만들어낸다. (지아님 미투에서 발견했다.) EDSL이라는 점에서 Yacc보단 Spirit에 가까운, Treetop이라는 파서 제네레이터도 흥미롭다.

(반드시, 풀화면으로 보시길!!)

Scheme interpreter in 15 minutes from James Coglan on Vimeo.

그나저나, Lisp는 역시 문법이 간단하구나 싶다. 해커와 화가에서, Lisp의 초기 문법은 A4 용지 한장도 안된다고 한 것 같은데. 물론, 클로저가 있는 루비였으니 더 쉬웠겠지만. 흠… 위 내용을 파이썬으로 하면 어떻게 해야 할까? 또는, 자바로 구현하려면 어떻게 해야 할까? 또는, C++로 하려면?

-- 이상한 나라의 종텐.


Ruby에서 Comparable 구현

2008/09/05 14:43

루비에서 Comparable 믹스인을 포함하면 클래스 비교 연산자(<, <=, ==, >=, >)와 between? 메서드가 추가된다. 이것을 가능하게 하기 위해서는 <=> 메서드만 있으면 된다. 즉, <=> 만 구현하고, Comparable 믹스인을 포함하면, 여섯개의 비교 함수를 얻을 수 있다.

each라는 반복자를 작성하고, Enumerable 모듈을 믹스인하면, map, include?, find_all 같은 메서드를 지원하게 된다. 그리고, <=> 메서드를 가지고 있으면, min, max, sort같은 메서드도 얻을 수 있다.

프로그래밍 루비 2판에서 발췌.


아래 두 링크를 참고해서 그대로 따라하면 된다.

로그인이 반드시 필요한 페이지들은, 컨트롤러 클래스 안에 before_filter :login_required 를 추가해주면 된다. 모든 페이지에 로그인이 필요하고, 몇몇 페이지만 그냥 보여줘도 된다면, ApplicationController에 추가해주고, 그냥 보여줘도 되는 페이지에만, skip_before_filter :login_required를 추가해주면 된다.

잡담: 하앍하앍. 이제, 로그인은 되는데, 로그아웃은 어떻게 하는거지? 사용자 정보는 또 어떻게 얻어오는거야? 아~ 정말 난감하다. Daum DevDay가 내일 모레인데, 아직껏 오픈API를 테스트 해보기는 커녕, 근처에도 못 가고 있다. 이번 행사에서 우리팀이 완성을 하면, 기적이 아닐런지?! 다같이 "벼락치기 레일스"같은 이름의 책을 써도 될 것 같다. 표지에는 "당신도 할 수 있다. 레일스 공부해서 몇 일만에 웹 서비스 만들기!" 정도로 써두고 말이지. 어때? 잘 팔릴 것 같지 않나?? 잘 나가면, 시리즈로 해도 될 듯. 벼락치기 PHP, 벼락치기 C++, 벼락치기 자바, 벼락치기 디자인패턴..

-- Jong10


Ruby on Rails 공식 사이트에는, 15분만에 블로그를 프로그래밍하는 유명한 동영상이 있다. 이는 Rails 1.2 대 버전을 기준으로 작성되었고, 大山님이 쓰신 책에 나오는 블로그 만드는 예제도 Rails 1.2.2를 기준으로 되어있다. Rails는 2.0을 넘기면서 적지 않은 부분이 바뀌어서 많은 사람들이 이 책을 보며 조금 헤메고 있다. (설마.. 나만 헤메나?!)

여튼, StudioEgo님이 알려주서서, 2.1로 블로그를 만드는 동영상을 다운받았다! 스캐폴딩에서 헤메이고, 다른 일들 때문에 몇일간 RoR을 완전 손 놓고 있었는데.. -_-;; 이 동영상을 보면서 따라해야겠다. 제주도(Daum Devday) 가려면 열심히 해야지.. ㅠㅠ

http://uzooro.tistory.com/7 로 가면, 해당 동영상을 볼 수 있고, AVI 파일로 된 원본도 받을 수 있다. 해상도도 꽤 괜찮다!! 다른 모니터에 풀화면으로 띄워놓고 따라해야겠다.


웹 개발 2.0 루비 온 레일스이 책大山님이 쓰신, 국내에선 이미 유명한 Ruby on Rails 입문서다. 요즘 읽은 책들중에는 가장 오래전부터 읽기 시작한 책인데, 다른 책들을 보다가 이제서야 거의 다 읽었다.

거의라는 표현은, 이 책의 하이라이트라 할 수 있는 마지막 7장을 아직 읽는 중이기 때문인데, 따라해보며 블로그를 만드는 7장을 어느 버전의 Rails로 할지 아직 결정하지 못 했다. 책에서 다루는 1.2.2 버전으로 할지, 최근에 나온 2.1 버전으로 할지 아직 고민중이다. 1년만에 1.2에서 2.1로 올라가다니, Rails의 버전업은 너무나도 빨라서 숨이 턱까지 차 오른다. (그만큼, 요즘은 Ruby와 Rails가 굉장한 주목을 받고 있긴 하다.)

여튼, 소개를 좀 하자면, Rails는 정말 so nice한 프레임워크다. Rails의 철학인 DRY(Do not Repeat Yourself)설정보다 관례가 더 편리하다는 Rails의 철학들은 코드를 통해 증명하고 있다. MVC 패턴도 잘 지켜져있고, ActiveRecord라는 (직접 SQL 구문을 사용할 필요가 없는) 깔끔한 ORM도 포함되어있다. ActiveRecord에서 클래스와 SQL의 항목간에 단수와 복수의 관계로 연결되는 모습은 충격이었다. 이런 요소들은 모두가 합쳐져서, 코드를 덜 치며, 우아하고, 쉽게 웹 어플리케이션을 만들 수 있는 요소가 된다. 이 곳에 올라온, 15분만에 블로그를 뚝딱 만드는 모습은 Ruby on Rails의 생산성을 표현하는 좋은 예이다. RoR에 익숙해지기만 하면, 훨씬 더 적은 코드로 다른 언어+프레임워크로 작성한 것과 같은 짓을 할 수 있을 법 하다.

아, 그래. 이것들은 Ruby on Rails에 대한 칭찬이고, 책에 대한 칭찬을 하자면, Ruby on Rails에 대한 입문서를 찾고 계셨다면 제대로 찾으신 거다. 바로 이 책이다. 이 책은 군더더기 없이 깔끔하게 설명이 되어있고, 타이핑하면서 따라할 수 있게 되어있고, 난이도도 어렵지 않으며, MVC모델, ORM 등에 대해서도 설명을 해주고, 루비에 대한 간단한(하지만, 이 책을 읽기에 충분한) 문법 설명도 있다. 한 문장으로 표현하면, Ruby on Rails 입문서로 훌륭하다. 별은 4개반. ★★★★☆

-- Jong10


ostream_iterator

2008/05/18 23:23

지난 금요일, 학교에서 PL 수업 시간중에.. "루비는 열라 막 짱임. 과제를 날로 먹을 수 있음!" 뭐 이런 내용에 대해서 발표를 했더랬습니다. 그러면서 예로 들었던 코드가,

a = [99, "hello", "ruby", 2.17]
a.each { |x| puts x }

요렇게 한줄로, a 배열을 순차적으로 찍을 수 있다는 내용이 있었는데요. C++도 물론 C++0x에선 람다를 지원할 예정이기 때문에,

// vector<int> a일 경우에..
for_each(a.begin(), a.end(), [](int x) { cout << x << endl; } );

이렇게 람다를 섞으면, 한줄로 모든 항목을 한줄씩 뿜을 수 있긴 한데, 단지 출력만 할 경우라면, 이미 현재의 C++ 표준 문법에서도 가능한 더 깔끔한 방법이 있었습니다. ostream_iterator라는 녀석이 그것인데, 아래 코드는 위 코드와 같은 동작을 보입니다.

copy(a.begin(), a.end(), ostream_iterator<int>(cout, "\n"));

벡터가 아닌 int 배열이라면, 아래 처럼.. (배열도 시퀀셜 컨테이너에 적용되는 알고리즘들이 대부분 사용 가능합니다.)

int a = { 99, 123, 543, 12, -4, 6 };
copy(&a[0], &a[6], ostream_iterator<int>(cout, "\n"));

주의할 점이랄까, copy 알고리즘의 두번째 매개변수는 마지막 칸의 다음칸의 주소이기 때문에, &a[6]이 맞습니다. STL의 모든 알고리즘은 범위가 [a, b) 이거든요. b는 포함되지 않는.

-- Jong10

p.s. ostream_iterator는 오늘 처음 본 줄 알았는데.. TC++PL에 있더군요;; 기억이 없..=3=3


나의 첫 Ruby 사용기

2008/04/06 01:58

ruby 3일 전부터, 등하교길에 大山님의 웹 개발 2.0 루비 온 레일스를 읽기 시작했습니다. 그런데, 학교에서 Tokenizing하는 과제를 하나 던져주더군요. 한 줄을 읽어서, 예약어, 변수명, 숫자, 연산자 등등으로 쪼개어 화면에 찍어주는 간단한 과제입니다.

이래저래 몇번 해본 내용이고, 다른 과목에서도 비슷한 걸 해서, "또?!"하고 생각했었습니다만, 과목이 프로그래밍언어라서 그런지 교수님께서 떡밥을 던져주시더군요. "언어는 아무거나 써도 되요." 오오. 코딩하는 과제에 있어서 이보다 매력적인 조건이 또 뭐가 있겠어요? C++을 쓰면 훨~씬 편한데, 오직 C언어로만 하라는 다른 과목의 교수님은 정말 미웠다고요. -_-

게다가, 교수님께 따로 물어보니, 꼭 유한상태기계 방식으로 하진 않아도 된다고 하시길래, 루비에서 정규표현식으로 샤샤샥~해서 매우 짧은 코드를 만들기로 했습니다.

루비로 코딩을 해보는 것은 처음이었습니다만.. 곡괭이책(책버전/웹버전)을 뒤적여가면서 코드를 작성해나가는데, 이야아.. 자질구레한 것을 다 지원해주는 것이 참 마음에 들더군요. 처음 써보는 언어라서 라인수에 비해 굉장히 오래 걸리긴 했습니다만, C/C++로 했으면 150줄은 넘었을텐데, 처음 써 본 루비로 30줄로 끝내버려서 조금은 뿌듯합니다. (걸린 시간만 보면 500줄은 쓴 기분입니다만. -_-)

이런 말랑말랑한 언어들을 쓰다보면, 이렇게 문법이 유연한 native 언어도 있었으면 좋겠다는 생각을 자주 합니다. Haskell처럼 Script이면서 강타입인 언어가 있으면, native 컴파일 언어이면서 Duck타입인 언어도 있어야 하지 않겠어요? native로 컴파일 되면서, 말랑말랑한 뭐 그런 언어 없을까요? 뭐, py2exe 같은 것은 논외로 하고요.

-- Jong10