Archive for category Ruby

Rack Middleware たちがどのように呼ばれるかを見てみよう(e.g. Sinatra)

Time to Read

3分

Sinatra::Base.middleware

そもそも、 Sinatra::Base を継承したクラスには、クラスメソッドとして Sinatra::Base.middleware が用意されており、明示的に Sinatra::Base.use で利用を宣言したミドルウェアはそこから一覧を取得できる。

ところが、 Sinatra アプリケーションが実際に Rack でホストされ、アクセスされる際には、 use で宣言していないミドルウェアもたくさん呼ばれるわけで。その全貌が知りたい場合。むろん、 Rails、Ramaze、Camping といった Rack に対応したフレームワークならば同じような方法で「中を覗く」ことが可能なはず。

set_trace_func を使ってみる

Read the rest of this entry »

 

Ruby Advent Calendar 2011 / 2日目 – almost-sinatra.rb の深淵を覗く

Time to Read

15分

初めましての方は初めまして。近藤うちお(@udzura)です。 Sinatra ベースのフレームワークである Padrino framework の日本語サイトを管理したりしています。

Ruby Advent Calendar jp: 2011 2日目である今日は、 Sinatra 主要コミッタである rkh が、わずか 8 行で実装した Sinatra クローン、「almost-sinatra.rb」を読み解いたりして、2日目にして一気に読者を置いてけぼりにしたいと思います(1日目はこちら – “Coffeescripting with Ruby”)。

RedBull(できれば複数本)の用意を推奨します……

Read the rest of this entry »

 

Sinatra 再入門 – 後日談と言うか

Time to Read

1分

先日公開された るびまの Sinatra/Padrino/Rack の記事 ですが、ぼくの想像以上の反響と好意的な評価をいただいているようで、大変うれしく思います。

“Rails Hub情報局” にも取り上げていただきました。

西村さんの素晴らしい洞察力で、 Sinatra、Padrino、Rackについての考察もされた必読の記事なんですが、一点だけ引っかかったところが、

Padrinoはビュッフェ

という点で、「アレ?」 となりました。

自分自身でも

Sinatra と言う皿の上に、ロガー、キャッシュ、ヘルパー、認証と言った料理をたくさん盛り付けていく

という表現をしていたんですが、ちょっと、自分でどういうつもりで使ったのかな~とあらためて考えこんでしまいました。

#このあたりの違和感を twitter で整理していたところ、

@knsmr さん ご本人に拾っていただいて、今の記事ではコメントが入っています。お騒がせして失礼しました……。

で、この違和感は「間違っているから」、ではなく、記事を最初に読んだ時点では「間違いではないけれど、ぼくの考えでは Sinatra の段階でそれは出来るような……」ということだったんですね。

ただ、考え直してみると、実際、 Padrino framerowk には 3 つの要素があって、

  • (1) 各種 Extensions と Rack Middleware で Sinatra 自身を拡張するためのライブラリスイート
  • (2) 「コントローラ+ルーティング」担当としての Sinatra と、O/Rマッパ、テストライブラリ等他の機能とをつなぐ「グルー」としての役割
  • (3) ジェネレータ、テスト自動化等の開発支援ツール群としての役割

ということで、 (1) とあわせて (2) の要素、別の言い方をすれば「各種関連ライブラリをピックアップできる agnostic な側面」を含めて「ビュッフェ」であるとも考えられます。そうであれば「Padrinoはビュッフェ」という表現もぴったりとはまるのかな、と思いました。Padrino のおかげで、より多くの料理が選べますね。

まとめると、Rack 、そして Sinatra 自身は、フレームワークであるとは言ってもやはり最小限のマイクロフレームワークと、拡張のための API を用意してあるだけで、「お皿」はあくまで「お皿」なんですね(そこが素晴らしいところなんですが)。実際、 Sinatra の show-’em-once フラッシュ(flash[:notice] 的なもの) やセキュリティ関連の実装(rack-protection, ちなみにこれも rkh さん作)は別の Rubygem に切り出されていたりもしますし。 Padrino は、 Sinatra ベースの開発により豊富な選択肢を提供してくれるので、それを以って 「Padrinoはビュッフェ」 と言えるのだと思います。

(ちなみに、 Sinatra 自身に盛るための料理には、 Rack wiki にある各種ミドルウェアsinatra-contribbig_band プロジェクトで提供される拡張(少し古いですが)、などもあります、ご参考までに!)

* * *

1
padrino gen project foo

このコマンドで作られるスケルトンを元に、ジェネレータを駆使して作っていけば、上記の (1) ~ (3) はきれいに統合されて、「フルスタックフレームワーク」としての Padrino を便利に使うことが出来ます。でも、ぼく自身が「軽量さ」を重視して、 (1) の、手軽に Sinatra に組み込める側面を強調しすぎていたこともあり、ここはちょっとぼくが偏っていたのかなあ、と思いました。 (1) だけでは、ある意味ではただのライブラリ群であり、フルスタックフレームワークとしての側面とか Padrino の独自性が薄まってしまいますね……。

何にしても、記事で取り上げてくださったことは凄く嬉しいです! “モダンなCGI”という表現はぼくも真似させてください……w

* * *

ということで、なにやら徐々にプログラマーとしてもカルマ(謎)も上がってきた気がしますし、今後もできる範囲で頑張っていきますよ~……。

それにしても、 Redis の antirez 氏もイタリア人だとは存じ上げなかった……。 Padrino の @DAddYE もナポリではたらくイケメンですし、今イタリアが熱いですね。

 

Rubyist Magazine 36 号に寄稿しました

Time to Read

1分

昨日公開されたRubyist Magazine 0036 号に寄稿させていただきました。

昨日公開時点と比べ、 11月29日 11時現在では一点だけ修正をさせていただいています。

Sinatra Extensions

続いて、Sinatra Extensions についてですが、こちらはもっと簡単で、

  • register された際に、self.registered(app) と言うフックが呼ばれる
  • register したモジュールのメソッドは、 Sinatra アプリの「クラスマクロ」として使える

というだけです。

下線部が追加箇所で、実は原稿を書いた時点では私も誤解していた、ということでした……。

Read the rest of this entry »

 

shibuya.rb(仮名)、第一回簡易報告+ ActiveSupport の便利 tips

Time to Read

5分

11月25日、有志にておこなった、渋谷近辺の Rubyist とそうでもない Rubyist による勉強会。今回は、 ActiveSupport のソースを読んでみた。

会場は最近「株式会社 VOYAGE GROUP に行ってきた!」で話題にもなった VOYAGE GROUP さん提供でした。

見たファイルとそのメモ

公式 github repo から落としてきた。下記、抜けがあるかもしれません。

Read the rest of this entry »