第7回Gotanda.rb

今回も前回の続きで、仮実装で済ませていたモデルの部分を実装してみました。

このアプリはどうせあまり実用目的で使う予定はないので、実験的にTokyoTyrantのTCTDB形式で使用してみることにしました。

http://github.com/walf443/todoit/blob/a23d4a2405cda2c554ba67effd35f861ac4368ca/lib/todoit/model/tokyotyrant.rb

テーブル機能をうまく使うには、Memcachedプロトコルを話すクライアントだと機能が生かしきれないので、TTプロトコルを使えるpure rubyインターフェースを使います。

TTインターフェースは言語間でインターフェースがほとんど同じになるように実装されているので、rubyだとtrueかfalseかで返すところが1か0になってることがあったり、エラーのときは-1を返すようになってるメソッドなどがあってやや使いにくいので、wrapするようなものを書きつつ今は使っています。

ちょっとハマったのが、TTインターフェースをruby1.9.1で使おうとすると、TTプロトコルのやりとりがバイナリフォーマットな関係で中でpackとかを使っているのですが、packして生成された文字列はASCII-8BITなのに、ユーザーが渡した文字列はUTF8とかになる関係でIncompatibleEncodingが発生したりしました。TTに渡したときに自動で内部でforce_encoding('ASCII-8BIT')してくれるようにするパッチは本家にいちおう投げておきました。

パッチを当てずに対処するのであれば、wrapperを書いてTTにデータを投げるときは必ずforce_encoding('ASCII-8BIT')にするようにすればよいかとは思います。どちらにせよTTから取得したデータはASCII-8BITなので、force_encodingを使って適切なエンコーディングには戻しておく必要があるかと思います。

パッチは http://gist.github.com/84076 みたいな感じです。

テーブル機能はスキーマがないんでValidationあたりはきっちりやらないとですね。まだそのあたりはあまり作りこんでないのですが;-)

あとデータ構造を変えたときにデフォルト値を各キーに設定してまわるのかとかはなかなかややこしい問題で、自分はモデルのオブジェクトをClassXをインスタンスにしてしまって、各カラムの属性にdefault値を割りあてることでTokyoTyrant側にデータがなくても表示がバグらないようにしました。


rackを1.9.1上で動かそうかと思いつつ、立ちあげてみるとmongrel(瀧内さんバージョン)が何も応答しなくなっちゃうので、まだ動かせてないです。どなたか1.9.1での動かし方のノウハウがある人がいれば教えていただけると幸いです。

Gotanda.rbでは、Rack周りやWAFをどう実装するかみたいな話に興味がある人、Rubyでこういうネタをやりたいけどうまい実装方法が浮ばないという人などとまったりと実際にコード書きながらやれたらいいなと思っているので、興味のある方は月曜20時以降、大崎広小路のベローチェ2Fまでお気軽にどうぞ。