MessagePack(-RPC) for Luaをちょろちょろ改造中

スローペースで開発してます。サーセン。今週は折角の休暇だったので仕事コードにはあえて一切触れず趣味プロに走りました。あんまりプログラミングの時間をとれませんでしたが、癒されました。

MessagePack for Lua (mplua) 0.2.0

http://github.com/nobu-k/mplua

print(msgpack.unpack(msgpack.pack('hoge')))

みたいなのができるようになりました。中国の方からの要望で作成。Packer, Unpackerは従来通り使えます。

ほかはMessagePack-RPC for Luaのためのリファクタリングがメインになりました。あと$(libdir)/libmsgpack-lua.soというのも作るようになりました(lua/.../msgpack.soは今バージョンからただのシンボリックリンクになりました)。

あとは今後の予定です。

まずクリティカルなものとして、luaL_error絡みの問題があります。Luaの例外処理はlongjmpで行われます。それ自体は問題ないのですが、スタックを辿りながらローカル変数のデストラクタを呼んだりはしてくれないので、C++と相性が良くありません。簡単な対処として、lua自体のコンパイルオプションで、longjmpを例外に置き換えることもできるようです。なんですが、まあ、対応しておくに越したことはないですね・・・。仕事でもちょっと使ってみたいので対応します。

次にPackerですが、今後Stream Serializationチックな何かに対応する予定です。

p = msgpack.Packer(ここに関数を追加)
p:pack(...)
p:pack(...)
p:flush()

のような感じになりそうです。一定のサイズがたまったら関数が呼び出される感じになるはずです。なんかグラフのシリアライズとかをされてる方がいたので、これがあると意外と便利そうです。packの度にデータくっつけたり自分でファイルに書いたりするの面倒ですしね。

クラスのシリアライゼーションはインターフェイスが難しいので悩み中。Luaから見たら全部テーブルなんですよ。ええ。

Unpackerもfeederに対応する予定です。

u = msgpack.Unpacker(ここに関数を追加)
for v in u ...(文法忘れた)

普通はfeedでデシリアライズするデータを与えますが、データが足りなくなったらコンストラクタに渡した関数が呼ばれてそこから補充されます。

MessagePack-RPC for Lua(まだ危険な状態)

https://github.com/nobu-k/mprpclua

とりあえずクライアントは普通に使えるようになり、非同期呼び出しもできるようになりました。が、まだ検証不十分です。簡単なドキュメントを書きながらテストしてみます。

クライアントは後はコネクションプーリングと複数サーバへの非同期呼び出し、futureへのコールバック設定に対応できればたぶんRuby版と同じ機能がそろうのかなーと思います。

サーバはまだ設計段階です。なやましい。

終わりに

長いこと作業できてなかったんですが、その間に何件か海外の人から反応を頂きました。ありがたいです。海外というのが良いですね。MessagePackがもっと世界に広がるように頑張りたいと思います。

あと、ここ数ヶ月仕事も私生活もドタバタしてましたが、いろいろ落ち着いてきたので今後はちょこちょこ手を加えて行けると思います。別のライブラリも作ったりするよ〜。