얼마 전 무료로 공개된 Tuts+ Premium 코스인 30 Days to Learn jQuery 영상에서 따온 요령으로, Python의 내장된 간단한 웹 서버를 현 작업 디렉터리에서 실행시키는 명령인데 다음과 같이 쓰일 수 있다.

터미얼을 열고,

cd /some/test/directory
open http://localhost:8000 && python -m SimpleHTTPServer

편한 것이 굳이 일반 웹 서버를 실행시킬 필요 없이, 예를 들어 ajax call 실험용으로 간단한 테스트만 할 때 손쉽게 사용할 수 있다. PHP와 Python 그리고 Ruby의 한 줄 내장 웹 서버 실행(이)란 제목의 글 마저 읽기 →

아직 공식적인 발표는 없지만, 이미 정식 Rails 2.0이 배포되기 시작한 모양이다.

아직 너무 이른 탓인지 그냥 $ gem update 명령으로 갱신하려고 하면, activeresource가 설치 안 되는 문제를 보이지만, 다음과 같은 명령으로 무사히 설치할 수 있었다.

$ sudo gem install rails --source http://gems.rubyonrails.org

개인적으로 새로운 버전의 Rails를 설치하면, 갱신된 API도 함께 local에 저장해 놓고 살펴보려고 아래와 같이 새로운 project를 만들어서 rails 버전을 freezing 시킨 후 doc을 추출해 내는 과정을 거치는데, 여기서 문제가 발생.

$ rails new_project
...
$ cd new_project
...
$ rake rails:freeze:gems
Freezing to the gems for Rails 2.0.0
rake aborted!
uninitialized constant Gem::GemRunner

google을 통해 문제의 원인을 찾아보니, RubyGems이 갱신되면서 require rubygems 할 때 자동적으로 gem_runner를 require 해주지 않아서 생기는 문제란다.
앞으로 이 문제가 patch될 예정이라고 하는데, 당장은 아래와 같은 해결 방법을 소개하고 있다.

먼저 gems 디렉토리에 있는 gems/rails-2.0.0/lib/tasks/framework.rake 파일을 열고, 아래와 같이 require ‘rubygems/gem_runner’ 한 줄을 추가해 준다.

deps = %w(actionpack activerecord actionmailer activesupport activeresource)
require 'rubygems'
require 'rubygems/gem_runner'
Gem.manage_gems

patch 후에, $ rake doc:rails로 무사히 rails api를 추출해서 프로젝트 디렉토리 속 doc/app에 들어 있는 api 문서를 웹 브라우저의 책갈피에 등록 완료.

아직 Rails 1.2.x에서도 버벅이는데 새로운 버전이 나와버렸으니 슬쩍 마음만 조급해지는군.
Rails 2.0 Final Released! – Summary of Features

Ruby on Rails Web Framework에 관심을 가진 사람은 Merb도 눈여겨 볼 만하다. 보통 Ruby on Rails보다 가벼운 아류 정도로 불리우는데, 가벼운 것은 맞지만, 여러 유용한 기능들까지 생략된 것으로 오해될 수도 있는데 절대 그렇지 않다.
장점이라면 평소 Ruby on Rails를 쓰면서 생길 수도 있는 몇몇 불만과 아쉬움들을 채워주면서, 동시에 가볍기 때문에 오히려 개발자의 선택 자유도를 더 넓혀줄 수 있다는 점이 마음에 든다. RoR의 ActiveRecord를 대체할 수 있는 ORMDataMapper와의 조합도 매력적이다.

아직 참고할 만한 Merb의 문서가 웹 상에 많이 소개되지는 않았지만, 시간이 지나면 이것도 금방 해결되리라 믿고, 또 하나의 좋은 선택이 될 수 있는 Ruby 기반 웹 어플리케이션 개발 프레임워크가 앞으로 많은 이들의 주목을 받을 듯.

현재 Ruby 홈 페이지에서 제공하고 있는 Ruby의 최신 Stable Version은 Ruby 1.8.6-p110 (실제 가장 최근의 patch 버전은 p111)이다. 이 놈은 Leopard에 기본 설치되어 있는 놈 보다도 더 많은 패치가 이루어져서 설치를 위해 터미널에서 일반적인 configure 명령을 입력하면 다음과 같은 오류가 뜨고 만다.

$ ./configure --prefix=/usr/local --enable-pthread --with-readline-dir=/usr/local --enable-shared --enable-install-doc
checking build system type... i686-apple-darwin9.0.0
.
.
.
ar rcu libruby-static.a array.o bignum.o class.o compar.o dir.o dln.o enum.o error.o eval.o file.o gc.o hash.o inits.o io.o marshal.o math.o numeric.o object.o pack.o parse.o process.o prec.o random.o range.o re.o regex.o ruby.o signal.o sprintf.o st.o string.o struct.o time.o util.o variable.o version.o  dmyext.o
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -I. -I.  -c main.c
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -I. -I.  -c dmydln.c
gcc -g -O2  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -L.    main.o dmydln.o libruby-static.a -lpthread -ldl -lobjc   -o miniruby
./mkconfig.rb:191: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-23) [i686-darwin9.0.0]
 
make: *** [.rbconfig.time] Abort trap

결국, 문제의 원인을 알아보기 위해 Google에게 물어 본 결과 다음과 같은 해결책을 담아놓은 글타래를 찾아냈다.
ruby-1.8.6-p111 build on osx 10.5.0 fails; ok on 10.4.10. bug or config? – Ruby Forum

해결 방법은 먼저, 터미널에서 내려받은 최신 Ruby 소스 디렉토리로 이동후, 위 글타래에서 제공하고 있는 ignore-gsetcontext.diff이름의 패치 파일을 내려받아 다음과 같이 적용해준다.

$ patch < ignore-gsetcontext.diff

그리고 나서 다시 컴파일 해주면 정상적으로 설치되면서 다음과 같은 최신 버전을 확인할 수 있다.

$ ruby --version
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin9.0.0]

Leopard에서 최신 Ruby 버전을 설치할 때 문제를 일으켰던 원인은, 위 글타래의 말을 빌리자면, setcontext/getcontext 함수가 Leopard에 와서는 일반 UNIX 형식을 따르기 위해 수정되면서 생긴 문제라고 한다. 문제 해결을 위한 패치가 벌써 몇 주전에 ruby-core 팀에게 전달되었으나 아직 안 고쳐진 모양이다.

웹 어플리케이션 프레임워크들을 상징하는 아이콘들의 그림. (Ruby on Rails, Zope/Plone, TurboGears, Django)

웹 어플리케이션 프레임워크의 대표 주자로서 Java J2EE, Ruby on Rails, Zope/Plone, TurboGears, Django 간 서로가 가진 웹 어플리케이션 개발 환경의 장점과 단점들을 비교해 놓은 webcast (mov). 각각의 프레임워크 개발 환경을 맛볼 수 있는 것이 무척이나 흥미롭니다.

다른 개발 프레임워크에 비해 개발 속도가 더딘데다가 웹 어플리케이션 개발에 있어서 매우 중요한 요소로서 급격하게 변하는 사용자의 요구에 대응하고자 하는 rapid turnaround도 어려운 J2EE를 제외하고, 또 Zope(Plone)은 CMS 개발 환경 위주인 것을 감안하면, 나머지 선택은 자명한 듯 하다.