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

msgpack-erlang 0.4.0 to 0.3.5 をリリースしました

2015-11-11 15.27.37

これはErlang Advent Calendar 2015 - Qiitaの11日目の記事だ。本日、 OTPの17と18のみに対応して古いOTPで動かなくしてコードがシンプルになった 0.4.0と、R16以前でも動く0.3.5をリリースした。 0.4.0 は別に新しい機能があるとかそういうわけじゃないのだけど、ついに maps がデフォルトになったとかあのよく分からない nil がなくなったとか、 Erlang の QuickCheck でバッチリテストされようとしているくらいだろうか(ちょっと頑張ったけど、結局うまく動いてない…)。

わたしの近況

Bashoという会社で働いていて、 Riak CS という製品の開発リーダー的なことをやりつつ、新製品Machiの開発もやっている。ほぼ毎日ひたすらコードを書いたり設計したり議論したり、ちょっとだけテストしたり、という感じ。でもわりとアーランのアプリを書いてばかりなので、OTPとかBEAMに深入りしなくてもやることは沢山あって仕事には困ってない…ので、OTPの知識が増えない…

MsgPackとmsgpack-erlang の近況

msgpack/msgpackのレポジトリでは「生きてる?」みたいなコメントされたりしてネット上では存在感が薄くなってきたが、 Basho に入って3年あまりついにBasho製品に MessagePack と msgpack-erlang の実装が入ってしまった。具体的には、 Riak TS という、先日若干界隈を賑わせた製品の下回りでデータのシリアライザとして利用されている。具体的には、 Riak にスキーマ的なのをつけられるようになって、それがMsgPackでシリアライズされてLevelDBに入るようになった。カラムナなデータ構造になったわけではないが、クエリの一部をLevelDBの直前のC++のところまでプッシュダウンすることで効率化されている。まあもともとLevelDBにはsnappy圧縮が入ってるんでMsgPackの小ささ自体がそこまで貢献してるわけじゃないけど、まあJSONよりはマシかあ、PBもスキーマいるし大変だよねえといったところだ。入社前に書いたコードがついに仕事で役立っている模様(なにせ私は直接関わっていないどころか知らないところでほとんど話が進んでいた)。

ちなみにNIF版の開発は全然やってない。メモリアロケータまわりまで含めてちゃんとやるのめんどくさそうなんやもん…

msgpack-erlangErlang QuickCheck テストを追加

QuickCheckはすばらしい。 msgpack-erlang を rebar3 化するにあたってあまりノウハウがなかったのだが、そこは想定外だがプラグインがあったので大した苦労もなく導入できた。書いたコードは本当に一部だけだった。特になにもしなくて

$ ./rebar3 eqc

だけでビルドとテストができるようになっている。

あなたも無料でQuickCheckが使える

もうほとんど忘れられているが、 msgpack-erlanghttp://quickcheck-ci.com でテストされている。URIはないのだが(マジかよって感じですね)、msgpack-erlang でサイトを検索してもらうと見つかるはずだ。未だに 17.1 だったり、メモリ使いすぎるとすぐ死ぬ(ので肝心のShrinkはあまり使えない)とかまあQuviqがあんまりやる気ないことは百も承知だが、ないよりはマシだ。マシだと思いたい。

頭が痛い問題

Arrays with numbers and {enable_str, true} · Issue #51 · msgpack/msgpack-erlang · GitHubがわりと面倒くさい。気持ちはわかる。Printableな文字列をそのままシリアライザにツッコミたいよね。そらそうだ。Functionを指定させるってのがいいのかなあという気になりつつはあるけど、文字列かどうかを判定させるオーバーヘッドがパフォーマンスにどれくらい効いてくるのか未知数ではある。

iolist() にしてみたい

いまのところシリアライザもデシリアライザも binary() しか使えないし吐かないようになっているが、これを iolist() にしたらどうなるかなというのはちょっと気になっている。もちろん iolist_to_binary() を間に挟むだけだと意味がなくてプログラミングは割と面倒くさいというか、どの粒度でバイナリを切ってリストにするとメモリアロケータを使う頻度を最小化できるかという問題になると思う。まずは erts_alloc をおべんきょするところから始めるべきだと思うんだけど、アロケータ周りをいじるとシステム全体に影響がありそうなのが気になる。という問いを空中に投げてこの記事を締めたい。