JubatusをPHPから使うためのjubatus-php-clientを公開しました

先日、ビッグデータリアルタイム分析基盤 Jubatus(http://jubat.us/)というものが、株式会社プリファードインフラストラクチャーさんと、日本電信電話株式会社さんとの共同研究開発で生まれOSSとしてリリースされました。

これにより、大量の自然言語データを高精度で高速に学習・分類するシステムが誰にでも手軽に構築できるようになりました。

正に、現在開発中のものに利用したい!ということで、とりあえず、公式のチュートリアルPythonのまま行ってみて挙動を確認した後、すぐにでも使いたかったので公式のjubatus-python-clientをベースにまるっとPHPクライアントライブラリを作成してみました。
現状、なかなか何とかの一つ覚え的な、ひどい写経なのですが、一応公開します。

https://github.com/oxalis-gps/jubatus-php-client

必須: php-msgpack (http://code.google.com/p/php-msgpack/)

現状あまり美味しくないポイントは多々あるのですが、大きな物からいくつか挙げておきます。

  1. MessagePack-RPCの型とPHPの型の問題
  2. 全体的なクラス設計
  3. Exceptionクラス一部未実装のまま(例外パターンの動作が一部Fatalで落ちます)

1.に関して
Jubatusは、クライアントとサーバーの通信にMessagePack-RPCというプロトコルが提供されています。
しかし、MessagePackというプロトコルでサポートされている型に、ArrayとMapsというものがあります。
サーバー側ではpythonの{}をMaps、[]と()をArrayとして区別していますが、PHPには、連想配列と配列の区別が無く、空のMapsを表現できませんでした。
フォーマットが適切でないデータ型でサーバーに送りつけると、サーバーがエラーを返してきてしまいます。
そのため、その部分の対応をphp-msgpackの作者様に伝えた所、パッチを送ってくださいました。
python上のデータ型で言うところの空の{}を、php上でnew stdClass()として与えてmsgpack_packすることで、適切にその部分を空のmap型としてシリアライズしてくれるようになりました。(php-msgpack 0.5.3から)
とりあえず、これで第一の関門は回避できました。

2.に関して
あまり頭を使わずに、ただ翻訳&写経のようにjubatus-python-clientを見ながら、PHP化しただけなのですが、
将来的にはZend Framework上での親和性を考慮したい為、若干アレンジが入っています。
そのため、中途半端な部分が多々あり、写経している間にどういう事をしたいのかが理解できたので、根本的にクラス設計
見直したほうがもうちょっとPHPらしくなるかなと思います。こちらは地道にやっていきます。

3.に関して

  • Jubatus_BadRPC
  • Jubatus_MethodNotFound
  • Jubatus_TypeMismatch

上記三つの例外クラスを、MPCClientFuncクラス内でthrowしていますが、現状そんな名前のExceptionクラスは存在しません(えー
こちらはとりあえず、早急に実装致します。