読者です 読者をやめる 読者になる 読者になる

MessagePack 0.2.0 リリース!

バイナリシリアライズ形式 MessagePack の2回目のリリースです。
フォーマットの仕様はそのままで、C++用のAPIを大幅に強化しました。詳しくは:サンプルコード

MessagePackとは

MessagePackは効率を重視したデータ交換用のフォーマットで、言うなれば「速いJSON」です。

プロトコルを実装する手間を省ける

ネットワークで通信を行うプログラムを書くときは、ぜひ高速なバイナリプロトコルを利用したいものです。しかしバイナリプロトコルの実装は細かいポインタの足し算・引き算やエンディアンの変換など、毎度同じような処理を書かなければならず、「できるけど面倒」な部類だと思います。
MessagePackを使えば面倒な部分を書かずに済みます。

十分に高速

MessagePackのデシリアライズ速度は 1Gbps を越えるので、ボトルネックにならないくらい十分に高速です。ベンチマークバイナリシリアライズ形式「MessagePack」

ストリーム処理ができる

RubyEventMachineC++mp::iothreadsなど、昨今のイベント駆動型の高速IOフレームワークでは、流れてくるデータを届いたそばから次々に処理していくことができるプロトコルパーサーがあると便利です。
MessagePackのRubyC++用のAPIにはストリームデシリアライザが入っているので、イベント駆動型のIOフレームワークとの相性はとても良好です。

C++用のAPI

C++から気持ちよく使えるテクニカルなAPIがあります。MessagePackはシリアライズされたデータ自身が型情報を持つ動的なシリアライズ形式ですが、静的な型にキャストして扱いやすくすることができます。templateで実装されているので、使いやすさと型安全性、そして性能も両立しています。
サンプルコード:protocol.cc

インストール方法

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 して、-lmsgpack でリンクしてください。

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の各種ブランチやDrizzleUbuntuなどが使っています。
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