django-evserver を Mac で使いたいのよ

id:Voluntas さんの Twitter での発言で Django で Comet できる django-evserver ってのがあるのを知った。ちょうどこれから Django と Comet を利用したアプリケーションを作るのに関わってく必要があったんで「これは!」と思って早速自分の MacBook にインストールを試みた。
けど、全然うまく動いてくれんがな。。Mac で。
頑張って解決しようとしたけどなんともうまくいかんし、色々差し迫ってきたしで、とりあえず自分の中で一区切りつけよう思って今までの事の顛末を綴ってみることに。もしかしたら動かんのは自分の環境がどっか悪いのかもしれんのだけど、全然動かん理由がわかりませんがな。

環境

Mac OS X LeopardPython 2.5

手順書通りに

Error 404 (Not Found)!!1
ここに従って粛々と作業を進める。
サンプルの Chat アプリケーションを実行する前まで何の問題もなく進んで、期待に胸を膨らませつつサーバの起動コマンドを打つ。

./manage evserver
optparse.OptionConflictError: option -v/--verbosity: conflicting option string(s): -v, --verbosity 

エラーでた。。

まず何はともあれ起動させる

evserver-chat/chat/compile を実行すると Django やら django-evserver のソースを勝手に落としてきて eveserver_chat/python/ 以下に配置する。そして manage を実行するときにそいつらを PYTHON_PATH に追加してから python manage.py evserver するようになっている。
もしかしたら Django のバージョン変えたらいけるんじゃねぇかと思って、とりあえず Django 1.0 のソースを落として、勝手に入ってきていた最新版の SVN版の Django と置き換えてみた。

OSError: dlopen(libevent-1.4.so.2, 6): image not found

エラー変わった。
libevent-1.4.so.2 が存在しないって言われてるので確認してみると、確かにそんなもんどこにもない。そのかわり、evserver-chat/src/libevent-1.4.2-rc/.libs に libevent-1.4.2.dylib ってファイルがあった。
なんとなく ctypes_event.py の6行目あたりを以下に書き換えて、実行してみる。

_libraries['libevent-1.4.so.2'] = CDLL('libevent-1.4.2.dylib')

動いた。
どうやら Mac では so じゃなくて dylib ってのになるらしい。初めて知った。。勉強なります。。
そんでもって http://127.0.0.1:8000/chat にアクセス。全く問題なく表示されるのでそのままの勢いでメッセージを送信してみる。
全然内容が更新されない。。何度送信しても、いくら待っても全くもって微動だにしなかった。エラーも何も出てないし、ちゃんと動いているはずなのに。。どうもイベントをうまく捕捉してくれてないみたいだ。。

Mac以外ではどうなるんだろう

そう思って、VMWare Fusiondebian をインストールして実験したみた。
例の手順書どおりに作業。Django は例によって 1.0 に置き換えて実行。
。。一発で動きやがった。
メッセージ送信したら即座に更新されるし、複数のクライアントに対しても一斉に変更が反映される。完璧だった。

ctypes_event.sh を発見

なんで Mac じゃできないんだろうこんにゃろうと悩んでいたら、ctypes_event.sh なるファイルを見つけた。
中を見てみると「generate ctypes_event.py」って書いてある。ctypes_event.py の中身は libevent を Python で扱えるように ctypes で色々関数やクラスを定義してあるファイルっぽく見える。そうか今までは ctypes_event.py が Mac 仕様になってなかったんだな、きっとそうだ、これを実行すると環境にあった ctypes_event.py を生成してくれるに違いない、と思って試してみることにした。
とりあえず中に「need gccxml, ctypes_libs」ってかいてあるので各々インストールする。
ctypes_libs は普通に MacPorts で、gccxml は MacPorts でインストールできるやつが古いので以下の手順で導入する。

cvs -d :pserver:anoncvs@www.gccxml.org:/cvsroot/GCC_XML co gccxml
mkdir gccxml_build
cd gccxml_build
ccmake ../gccxml
make
sudo make install

そんでもって普通に ctypes_event.sh を実行しても失敗するので、色々試してみて以下のように変更&実行。

# 7行目
-- LIBEVENT="$HOME/plucha/src/libevent"
++ LIBEVENT="$HOME/evserver-chat/src/libevent"
# 10行目
-- cp /usr/include/event.h event.h
++ cp $LIBEVENT/event.h event.h
# 23行目
-- cat /usr/include/evhttp.h >> evhttp.h
++ cat $LIBEVENT/evhttp.h >> evhttp.h
# 37行目
-- h2xml.py d.h -o d.xml -q -c
++ h2xml.py d.h -o d.xml -q -c -I $LIBEVENT
# 42行目
-- xml2py.py -levent -d d.xml -r "(event_|signal_|evbuffer_|evhttp|evtimer|EV).*" >> ctypes_event.py
++ xml2py.py -l $LIBEVENT/.libs/libent-1.4.2.dylib -d d.xml -r "(event_|signal_|evbuffer_|evhttp|evtimer|EV).*" >> ctypes_event.py

/tmp 以下に ctypes_event.py が生成されるのでそれを 既存のものと置き換える。
実行してみたけど、event_dispatch に入る前に落ちる。。
うーーーん。
そのあとも libevent の 1.4.2 や 1.4.8 とかをインストールしたりして色々なパターンを試してみたけど、基本的には落ちるかエラーになってまう。一応さっきの手順書には、さっきのコンパイルスクリプト動かしたら libevent 勝手に入るし、libevent を改めてインストールする必要ねぇよっぽいことが書いてある(?)んでこんなことやっても無駄なのかもしれんけど。。

現状

server.py や comet.py とかのソースを見たり出力を確認したりして、なんとなく内部の動きはわかってきたものの未だに原因がつかめず。なんとなくだけど、fifo への書き込みがうまいことイベントとして伝播してないように見える。サーバへ push しても全く反応しないし、ずっと定期的に繰り返している chat/comet でも内容の変更を感知していない。
うーーーん。なんでなんだろう。わからん。。
とりあえず、VMWare 上の debian で動くようにはなったのでいざとなったらそっちでやろうかなと思いつつ、やっぱり普通に Mac で色々いじくりたいので今後もちょこちょこ検証して行きたいと思っとります。もし、「普通にできたけど」とかあったら教えてほしいっす。
ああぁもっとコードを読めるようにならんとなぁ。。