Hatena::ブログ(Diary)

2011-09-05

redisのハイレベルラッパー、redbackはけっこう良い。CappedList使ってみた

visionmediaさんが推しているからなのか? node.jsとredisの相性が良い理由は全く把握していないけど、node.jsライブラリ、ドキュメントが充実しているKVSはredisだった。

redisは、リスト、ハッシュ、集合のデータ構造を保存できるから、そういうデータ構造使おうとすると、ハイレベルなラッパーがあった方がやっぱり使いやすい。
redbackの良いところは、redisの基本データ構造をサポートするだけでなく、それらに色々な機能を追加したデータ構造も実装してくれているところ。あと自分で定義できるところ。

ドキュメントは、この自動生成されたやつしか見当たらず。この形式検索できないしあんまり見易くないと思うんだけど、どうですか? (RubyのRDocのが良いなあ。)
http://redbackjs.com/api.html

// redis-nodeパッケージに依存しているけど、redbackだけrequireして使える
var redback = require('redback').createClient();

// redis-nodeを明示的にrequireしておいて、色々設定しておいてから
// redbackに渡すこともできる
var redis = require('redis'),
    redback = require('redback');

// redisの設定
redis.debug_mode = true;

redis = redis.createClient();
redback = redback.createClient(redis);

// redback.client で、redis-nodeのクライアントが返る
// redis == redback.client
redback.client.on('error', function(err) {
  console.log(err);
});

CappedList
保存するデータの数を制限するリスト。
データの数が制限に達していた場合、自動的にあふれたデータを削除してくれる。

var list = redback.createCappedList('unko', 3); // キーが'unko'、データ数の制限が3のリスト

list.push('year!');
list.push('oh-year!');
list.push('hey-year!');
list.values(function(err, values) { console.log(values) });
// ['year!', 'oh-year!', 'hey-year!']

list.push('so-i-year!');
list.values(function(err, values) { console.log(values) });
// ['oh-year!', 'hey-year!', 'so-i-year!']

list.unshift('ha-i-year!');
list.values(function(err, values) { console.log(values) });
// ['ha-i-year!', 'oh-year!', 'hey-year!']

list.get(1, 2, function(err, values) { console.log(values) });
// ['oh-year!', 'hey-year!']

// さっき保存したCappedListをただのリストとして取ることもできる。
var list = redback.createList('unko');

2011-09-04

expressで、railsのcontent_for を実装する

expressのdynamicHelperは、スコープを維持したfunctionオブジェクトを返せるようなので、dynamicHelperを使うとでける。

ここを見たらわかりましたよ
http://stackoverflow.com/questions/3601080/how-do-i-pass-content-from-a-template-to-a-layout-in-express

  app.dynamicHelpers({
    pageTitle: function() {
      var _pageTitle = '';

      return  {
        get: function() {
          return _pageTitle;
        },

        set: function(val) {
          _pageTitle = val;
          return _pageTitle;
        }
      };
    }
  });


layout.jade

title
  良いサイト #{pageTitle.get() ? ' - ' + pageTitle.get() : ''}


index.jade

h1= pageTitle.set('ていやー!')


<title>良いサイト - ていやー!</title>
<h1>ていやー!</h1>

こんな感じ。

Connection: close