Ruby 1.9でThinが動いた(といえないこともない)

松江Ruby会議開催おめでとうございます。私も前半をust経由で見せていただきました。そうそうたる方々のパネルは、見ているだけでも、話を聞くといっそう、壮観で面白いものでした。

で、そこでちょっと話題になっていた、Ruby1.9Railsやその周辺環境のお話で、Thinを動かしてみたら動き出しましたのでご報告。
先日とおなじく、これでThinがRackの下で動いています。

$ ruby19 -rrack -e 'Rack::Handler::Thin.run ->(e){ [200, {}, ["Hello new Ruby!!"]] }, :Port => 10080'

ソースは、eventmachineのcppで書いてある箇所、一ヶ所だけ手を入れました。見よう見まね。

2009-02-03追記

ThinとEventmachineが混ざって読みにくいエントリになってますね。Thinが「依存しているEventmachineがコンパイルできない」という問題でした。で、Eventmachineのコンパイル通したところ、無事にThinも動くようになったというお話です。

もう一個追記

どうもレスポンスに日本語というか2byte以上ある文字が含まれているとまともに動かないみたいです。残念。EventmachineでString#lengthをいっぱい使っていて、その結果に基づいてクライアントに送るレスポンスの長さを決めてるみたいです。いっぱいありすぎて、ちょっと手を入れれば動くという感じでもないので、ちゃんと動かすにはもうちょっと時間が必要そうです。

以下原文

以下手順です。

公式サイトを見てもどのソースが新しいものだったのかがよくわかんなかったので、既存の最新版のgemを展開して直すことにしました。

$ mkdir eventmachine-monkey-patch
$ cd eventmachine-monkey-patch
$ tar xvf ~/Downloads/eventmachine-0.12.2.gem
$ tar xvzf data.tar.gz
$ gzcat metadata.gz > eventmachine.gemspec

とここまでしてソースを入手。修正は一ヶ所だけです。

diff --git a/ext/rubymain.cpp b/ext/rubymain.cpp
index a85b707..ac824a2 100644
--- a/ext/rubymain.cpp
+++ b/ext/rubymain.cpp
@@ -463,7 +463,7 @@ t_invoke_popen
 
 static VALUE t_invoke_popen (VALUE self, VALUE cmd)
 {
-       int len = RARRAY (cmd)->len;
+       int len = RARRAY_LEN (cmd);
        if (len > 98)
                rb_raise (rb_eRuntimeError, "too many arguments to popen");
        char *strings [100];

で、見よう見まねですが、こういうときにはマクロを使えと瀧内さんが行ってたので。。。で、これをもう一回gemに固めてインストールすればOKでした。

$ gem19 build eventmachine.gemspec
$ gem19 install -l eventmachine

# あとはthinを普通にインストール
$ gem19 install -r thin

簡単ですね。最後にもう一度、Rackで起動するサンプルスクリプト

$ ruby19 -rrack -e 'Rack::Handler::Thin.run ->(e){ [200, {}, ["Hello new Ruby!!"]] }, :Port => 10080'

Ruby1.9を--program-suffix=19で作ってるので、コマンド名なんかは適宜読み替えてくださいな。ちゃんと使うにはまだエラーが出るかもしれませんが、まずは起動したということで。