2014年 1月 の投稿一覧

JavaScriptのハッシュをマージする

  var _hashMerge = function(target) {
var sources = [].slice.call(arguments, 1);
sources.forEach(function (source) {
for (var prop in source) {
target[prop] = source[prop];
}
});
return target;
};

を定義しておけば、

var origin1 = {a: "foo"};
var origin2 = {b: "hoge"};
var merged = _hashMerge({}, origin1, origin2);
// => Object {a: "foo", b: "hoge"}

といった具合でマージできる

JavaScriptのハッシュのキーへ任意の変数名を指定する場合

JavaScriptのハッシュのキーへ任意の変数名を設定したいつもりで、以下の様に書くと意図した挙動にならない。

例えば下の場合、

var key = "foo";
var data = {key: "hoge"};
// data
// Object {key: "hoge"}

dataというハッシュに foo というキーを設定したかったができていない。

そこで、以下の様に関数を定義してあげると所望する処理を実現できる。

var hash = function(key, value) {
var h = {};
h[key] = value;
return h;
};
var key = "foo";
var data = hash(key, "hoge");
// data
// Object {foo: "hoge"}

dataのキーにfooを設定できている。

Mocha と should.js で例外が生じるケースのテストを書く

Mochashould.jsでテストを書いていて例外が起こるテストを書いていて、少し詰まったのでメモ。

例えばhogeというメソッドに空文字列を渡すと例外が生じるというケースのテストを書きたいときに、

foo.hoge('').should.throw();

という書き方をすると、これは誤りで

(function(){ foo.hoge('') }).should.throw();

と書くのが正解。*1

実際に書いてみると下の様な形になる。(確認用なのでテストの中にクラス入れているが、ここは本来requireして呼び出す形。)

これでmochaを実行すると、

$ node_modules/mocha/bin/mocha --reporter spec
Foo
#sample1
✓ equal test
#sample2
✓ exception test
2 passing (8ms)

といった形で例外を起こすテストができている。

*1:https://github.com/visionmedia/should.js/#throw-and-throwerror に書いてあるのだが....

Graph-Easyで構成図(ブロック図)を描いてみる

PerlCPANで公開されているGraph-Easyを利用して構成図(ブロック図)を書いてみたいと思ったので試してみた。

導入方法はここを見ればすぐに出来た。普段cpanコマンド使っていれば、$ cpan Graph::Easy でインストールできるはず。*1

あとは、概略を書くとグラフ化される。記述の方法はマニュアルを参照するとおおよそわかる。

# sample.txt
[ Internet ]  -- WAN --> [ nginx ]
[ nginx ] -- LAN --> [ remp001 ]
[ nginx ] -- LAN --> [ storyboards001 ]
[ storyboards001 ] -- ref --> [ mongo001 ]
[ remp001 ] -- ref --> [ mongo001 ]
(LXC: [remp001], [storyboards001], [mongo001])

上記の様な記述を graph-easy コマンドの標準入力として渡せば結果を以下の様なブロック図として得られる。

更にLXCとnginxをVPSというグループでまとめたかったのだけど一旦書きたかった図はすぐに書けたので良しとする。

*1:インストールページに書かれているmake使って入れる方法でもすぐ入った

ラーメン

ラーメンを食べました。
千切りキャベツ山盛り。

Key-value Stores with FPGA

FPGAでmemcachedを!的な話をブログに妄想として書いたり、雑談で人とすることがあったりしたのですが、世界では実装されて既に発表されていました。*1


ざっくり中身

  • NICに対してFPGAオンボードしてその部分でmemcachedのプロトコルを解釈して直接DRAMに値を書き込む
    • ハッシュテーブルの大きさは200万レコードで24GByteのストレージを持つ
  • NICに入ってきたパケットを以下の順で処理する
    • memcachedプロトコルの解析
    • ハッシュテーブル問い合わせ
    • ハッシュテーブルへの値の格納・取得(DRAM書き込み or 読み込み)
    • memcachedプロトコルとしての応答生成
  • 上の一連の処理が156MHzのクロック駆動481サイクルで完了する
  • これを並列化且つパイプライン化
  • 実験
    • memcachedのGET命令を1秒辺りの応答数 vs パケットサイズでグラフ図示
      • FPGA単独の場合、パケットサイズが96byteであれば13,000 req/sec くらい (グラフ赤線)
      • 但しNICのボトルネックがあるのでパケットサイズが大きくなるとXeonサーバと同等の req/sec になる
    • 過去のFPGA実装と比較すると大幅にパフォーマンスがよくなっている (グラフ黄線との比較)
      • 過去の実装はこれと思われる

  • First Results of Memcached Evaluation
    • Xeonサーバと比較してもパフォーマンスよかった
    • 応答時間も100倍程度良くなっている
    • 1W当たりのリクエスト処理数はXeonサーバに比べて大変良い(=エコ)
  • 今後の課題
    • ハッシュテーブルの大きさの制限
    • 実際のアプリケーションでの利用
    • 他のアプリケーションでの活用を見つける(=恐らくWebアプリで利用されるキャッシュ以外での活用の模索?)

そしていろいろ調べると既にFPGA入ったアプライアンスとして世の中に出ていることを知った。*2

このあたり今年ぐらいから盛り上がったりするのだろうか。

*1:気づくのが遅くて大変ツライ

*2:しかもこれも去年の話だった...

半熟玉子の幸福

おひるごはん。ガパオライス。

半熟の目玉焼きの黄身を割る時の幸福感は何者にも代え難い。

というニュアンスの台詞がテレビドラマであったのを思い出した。

ガパオライス