2011年10月29日土曜日

pficommonをちょっとだけ紹介

報道機関の発表の通り、10/27日に分散オンライン機械学習基盤Jubatusを発表しました。これに関しても書きたいことは山ほどあるのですが、来週Jubatus Workshopがあるので、それまでは秘密です(ウソです、聞かれたら答えます)。

さて、同時に公開されたのがpficommonです。これは、弊社内で使われていた便利ライブラリで、あまりの便利さにこれがないと開発できないため、Jubatusでも使われています(もちろんSedueでも)。そして、Jubatus公開に伴い公開となりました。pficommonは明日からでも使うべきなライブラリなので、先にこちらを紹介します。


pficommonは様々なライブラリからなる、複合的なライブラリです。
今日は個人的にお気に入りの、
  • xhtml_cgi
  • json
の2つを紹介します。

xhtml_cgi


実験用のコードなどを書くと、たくさんログを出力したくなることがあると思います。しかし、例えば1行に収まらないとか表にしたいことはよくあります。私は昔からHTMLで出力していたのですが、いかんせんcoutで出力するのは面倒、かと言ってフロントエンドをpythonで書いてrpcまでしだすと面倒・・・。実際、私は修論のとき検索をやっていたのですが、このためだけにpython, django, rpcを使って大変面倒でした。これを一気に解決するのがxhtml_cgiです。

まず、cgiのサンプルを見てください。なんというシンプルさ。さらに、pficommonにはhttp serverが実装されているので、これを使うと単独で動くhttp serverができあがります。コンパイルして実行すればhttp serverとして動きます。インタラクティブに引数を変えて実験などをしたいとき、この仕組を使うとhttp経由で実験ができます。Apacheとかいりません。正直、実験用のコードでrpcなんてしたくないんですね。

さらに画期的なのが、このxhtml_cgiです。このサンプルを見てください。C++の黒魔術を使うことで、なんとC++のソースがテンプレートライブラリ化するのです。単なるC++のソースなので、一部を関数にして使いまわしたりも可能です。あとは適当に書くだけで、簡単なデモは出来上がり。先日のYANSの時も、こんな感じで作っていました。

おまけで、サンプルとしてhttp経由でmecabの実行結果を確認するプログラムを書いて見ました。これくらい簡単に書けます。

json


社内的にも最も使われるライブラリの一つがjsonです。上記のcgiなどを書いていると、ちょっとした事をjsonでやりとりしたくなったりします。それ以外にも、例えばtwitter APIのjsonを読みたくなったり、別プログラムの出力をjsonで吐いて取り込みたくなります。ここで便利なのが、jsonライブラリ。pficommonのjsonライブラリは、テンプレートとserialization機能で、かなり便利に使えます。

jsonの読み込み・書き込みはは、streamから取ってくるだけでおしまし。

json js;

stringstream ss;
ss<<js;

json ks;
ss>>ks; // js==ks

値の取り出しは、直感に従って書いて、最後にjson_castすればOK.

cout << json_cast<string>(js["user"]["profile"]) << endl;
最後に、jsonを何かしらの構造体にマップするのがserialize機構です。ここのソースを見てください。serialize自体は、例えばバイナリ形式でファイルに保存するのに使いますが、ここでは任意のデータ型をjsonへシリアライズ・デシリアライズできます。これは単に構造体中にserialize関数を作れば、via_jsonとto_jsonでstreamから変換ができるようになります。



以上、簡単ですが2つ紹介しました。それ以外にもスマートポインターやスレッド、msgpack_rpcなど便利なライブラリがたくさん含まれます。他の機能に関しても、せっせと @tanakh さんが紹介記事を書いていると思います。ドキュメントはありますが、ちゃんと書かれていない機能や、使い方がわからなくなったらソースや単体テストを参照すればだいたい分かる(たぶん)と思います。研究用のプログラムなどでも大変活躍すると思いますので、是非ご活用ください。

0 件のコメント:

コメントを投稿