MessagePack 0.2.0 リリース!
バイナリシリアライズ形式 MessagePack の2回目のリリースです。
フォーマットの仕様はそのままで、C++用のAPIを大幅に強化しました。詳しくは:サンプルコード
MessagePackとは
MessagePackは効率を重視したデータ交換用のフォーマットで、言うなれば「速いJSON」です。
- データ型を持つシリアライズ形式(JSONやYAMLと同じ。整形式XML文章とは異なる)
- フォーマット定義(IDL)が不要
- シリアライズ/デシリアライズがとても高速
- シリアライズされたデータのサイズが小さい
- ストリーム処理できる
- いまのところ Ruby、C、C++ で使える
プロトコルを実装する手間を省ける
ネットワークで通信を行うプログラムを書くときは、ぜひ高速なバイナリプロトコルを利用したいものです。しかしバイナリプロトコルの実装は細かいポインタの足し算・引き算やエンディアンの変換など、毎度同じような処理を書かなければならず、「できるけど面倒」な部類だと思います。
MessagePackを使えば面倒な部分を書かずに済みます。
十分に高速
MessagePackのデシリアライズ速度は 1Gbps を越えるので、ボトルネックにならないくらい十分に高速です。ベンチマーク:バイナリシリアライズ形式「MessagePack」
ストリーム処理ができる
RubyのEventMachineやC++のmp::iothreadsなど、昨今のイベント駆動型の高速IOフレームワークでは、流れてくるデータを届いたそばから次々に処理していくことができるプロトコルパーサーがあると便利です。
MessagePackのRubyとC++用のAPIにはストリームデシリアライザが入っているので、イベント駆動型のIOフレームワークとの相性はとても良好です。
インストール方法
C++
./configure && make && make install でインストールできます。コンパイルするときにRubyが必要なので、あらかじめインストールしておいてください。(Rubyはコードの自動生成に使っています)
wget http://code.launchpad.net/msgpack/trunk/0.2.0/+download/msgpack-0.2.0.tar.gz tar zxvf msgpack-0.2.0.tar.gz cd msgpack-0.2.0 ./configure make -j3 sudo make install
MessagePackを使うには #include
Ruby
gemでインストールできます。
gem install msgpack
require 'msgpack' で使えます。
require 'msgpack' buffer = ["Hello world!", 1, true, {"hash"=>"test"}].to_msgpack p MessagePack::unpack(buffer)
既知の問題
リファレンスが無い><
ソースコードの中のexample/の中にサンプルコードがいくつか入っているので、基本的な使い方はすぐに分かると思います。
C++で倍精度でシリアライズされた小数をfloat型に変換したときに、アンダーフロー・オーバーフローしてもエラーにならない
これは仕様なのかバグなのか未定なので、浮動小数点を使うときは注意してください。どちらが良いでしょう?
C++のストリームデシリアライザでバッファのアロケータにmalloc()しか使えない
メモリプールを使いたいかもしれません。どういうインターフェイスで使えると良いのか思いつきません><
どう使えると良いでしょう?
XXX言語に対応していない
言語バインディングを書こう ;- )
バグ修正・言語バインディング・機能追加 etc.
※2009-03-01追記:MessagePackのリポジトリはSourceForge.JPに移動しました:http://sourceforge.jp/projects/msgpack/
MessagePackのリポジトリはlaunchpadに置いてみました:MessagePack: Binary-based Efficent Data Interchange Format
launchpadは、github +バグトラック +チームアカウント +FAQホスティング +その他いろいろ -git +bazaar のようなところで、有名どころではMySQLの各種ブランチやDrizzle、Ubuntuなどが使っています。
Ubuntuの開発で知られるCanonicalが運営しており、どこまでもフリーで使えます。
というわけで簡単にbranchして自分用のMessagePackリポジトリを作れるので、どんどんいじってください :-)
# port sync && port install bzr # Mac OS X # aptitude install bzr # Debian, Ubuntu, etc # easy_install bzr # Python user $ bzr branch lp:msgpack $ cd msgpack $ ... いろいろ ... $ bzr ci -m "bug fix ;-)" $ bzr push lp:~MY_ACCOUNT/msgpack/branchname
bzrの使い方は push/pull を除いては svn と酷似しているので、すぐに理解できると思います。
とりあえずlaunchpadにアカウントを作ってみる:https://launchpad.net/+login