またつまらぬGemを作ってしまった…

先週と今週で夜なべして2つほどつまらぬGemを作りました。まず一つ目。

Scrym

Scrymというやつです。
authorNari/scrym · GitHub
http://rubygems.org/gems/scrym

ScrymはSelf collecting Ruby Mutatorsという名前の略です。
何をするかというと、malloc/freeみたいなのを簡易的なMarkSweepでやるやつなんですね。
CRubyにはGCがありますが、Scrym::Mutator.mark(obj)とかすると対象のobjはGCから(ほぼ)管理されなくなり、その代わりにScrym::Mutator.collectの対象となります。
ふつうのMarkSweepみたくScrym::Mutator.collectと次のcollectの間でmarkしておけばそのオブジェクトは消されないし、markしなければ消されます。
malloc/freeみたく明示的にfreeを呼ばなくてもいいので、メモリリークはあんまりない利点がある感じです。

さらにこれの利点は導入する影響範囲が狭いということで、Scrym::Mutator.markをした対象のオブジェクトにしか影響がないんですね。

READMEの例ではCRubyに同梱のベンチマークスクリプトでScrymを使うようにしてますけど、わりと性能があがっているのがわかります。
RDocに組み込んだら結構速くなるんじゃないかなあと思ってるんですけど、残念ながらその前に飽きてしまいました。

MessagePack-RPC over HTTP

MessagePack-RPC over HTTPを作りました。
authorNari/msgpack-rpc-over-http · GitHub
msgpack-rpc-over-http | RubyGems.org | your community gem host

MessagePack-RPCのRuby版を使わせてもらっているのですが、これがまあけっこうクセがありまして…。イベントループをやたらと意識しないと使えないんですよね…。
それでもいろいろ手をいれてなんとか使わせてもらっていたのですが、なんというかCool.ioも虫の息だし、そもそもサーバまるごと自前で作ってしまうアプローチがイマイチな気がしてきました。
XML-RPCみたくHTTP使ってやりゃ性能のイイWebサーバとか使えるのにぃと思って、そういうやつを作りました。

だいたいの機能は作りこんだのですが、一点だけ1クライアントで次々リクエスト送るっていうの(パイプライン)ができませんでした。
これはHTTP Pipelining使えばやれると思うんだけど、対応してないサーバもあるしな、とか逃げの姿勢で…(httpclientも対応してないことですし)。

一個作りたかったのがStremingの機能で、Chunked Transfer-Encoding使えば簡単に作れそうだと数ヶ月前に妄想していて手が動いてなかったのだけど、ようやく作れました。
この辺ってFiberつかうと綺麗に書けるんですねえ。便利だなあ。

Rackのミドルウェアとかも割と便利だなあとか、Celluloidわりかし便利じゃん、とかいろいろ勉強になりました。

おわり。