Sunday, May 22, 2011

Rails 3.1 HTTP Streaming and content_for in controller

2012-01-14: content_for_in_controllers を gem にしてくれた人がいます。 thanks!

Rails 3.1 では HTTP Streaming が導入されますが、 stream ON だと template と layout の処理順序がいままでの rails のように template -> layout ではなく layout 前半 -> template -> layout 後半 という自然な流れになるのですが、 content_for が絡むとややこしいことになります (詳しくは action_controller/metal/streaming.rb のコメントを参照)。

この関係で、 layout 前半で content_for :bar が先に実行されていることを期待した yield :bar が空振りしないように、 layout 前半で yield :bar などが実行されると stream であるのにも係わらず template が先に実行されます。このジレンマを緩和するために provide というヘルパーが導入されて、 provide :bar されると、以降の template の処理を中断して layout 前半を処理しているようです。

もうこうなると stream ON のときは content_for は使わないで、 controller で @title = "foo" とかやってしまいそうになるので、 content_for を controller でも実行できるようにしてみました。 rails 2.X, 3.0 で使っていたやっつけ実装なのですがいちおう rails 3.1 でも動くことは確認しました。




みたいな感じで使います。

あと HTTP Streaming に関しては、
いままでは view のベンチマーク結果に DB の負荷が混ざらないためにも DB アクセスは action 内で実行されるようにしてたけど stream の場合 view のレンダリング中に DB アクセスが実行されるようにしたほうがよいことになりますね。(ソースのコメントにもかいてありますけど。)

また、HTTP Streaming は ruby 1.9 の Fiber が使われているので、 Encoding の問題が煩わしくて ruby 1.9 にする必要性が感じられない場合に ruby 1.9 導入のきっかけになるといいですね。

Monday, May 2, 2011

processing png

2012-02-02: processing.js へのリンクが切れて画像が生成されなかった問題を修正

web や iOS app の開発をしているときにボタンとかに使うチマチマした画像が必要なことがあります。いままでは Seashore でドットを打ったりしてましたが、 Processing.js を使うとプログラムで簡単に絵を描くことができるので、プログラマとしては色やサイズの微調整とかの応用がしやすいですね。

以下は iframe に展開したデモです。 m とか s の値を変えて update すると更新されるのがわかるかと思います。


基本的には Processing.js Web IDEの簡易版ですが、 canvas の内容を img タグに画像としてコピーしているので、その画像をファイルとして保存すれば素材として使えます。

現状、ワークフロー的にはローカルリポジトリのファイルとブラウザ上の textarea, img との手作業のコピペが何度も発生するので洗練されてませんが、工夫すればもうちょっとマシになるかもしれません。

ソースのhtmlは gist にあります (raw を iframe の src に指定すると text/plain になっちゃってダメなので dropbox のファイルを参照)