Archive for category <技術一般>

.rb勉強会(第1回)参加しました

facebook でつながった(ソーシャル的常套句)人たちとルッビーの勉強会をやり、僕は僕の妄想的な主張を形にして発表したりしました。

.rb勉強会資料 – はじめる! Ruby de Web 開発

「またいつもの主張かよ~」 と思う向きもありそうなんですが、割と好評だったようで大変うれしく思いました。あと、「Sinatra楽しい!」と多くの人に言っていただけたのはよかったです。

ツッコミがあったので、補足すると、 Java は Rack 等の登場以前からJavaサーブレットのような技術でアプリケーションとサーバの抽象化を行っています。ただ、 Rack の方がよりシンプルになっていて、かつ動的型である Ruby(きっとPython/Perlも) の特徴に見合った実装になっていると思います。 PHP の場合は会場でも意見があったとおりそもそも Web 専用なので特別に WSGI/Rack 的なレイヤーを切り出していないということなのでしょう(2011/12/21 14:31)。

会場の Jelly Jelly Cafe 自体もかなりカオスで面白かったです。もっと時間をゆっくりとってもくもくしたりもできれば楽しそうだな~とか思ったりもしました。第2回に期待です。

 

AOP はよく分からないが Module#method_added がクールだと思う

Time to Read

3分

Groovy クラスタなので、こういう記事を読んだ。で、最後の方に Ruby その他について言及がある。

Groovyが趣味に合わないという方の場合、好きな動的言語で上記の例を再実装することが可能です。例えばRubyでは、invokeMethodではなくmethod_addedフックを無効にすることが可能です。“method_added”は、新しいメソッドがクラスに追加されたときに呼び出されます。メソッドがObjectに追加された場合、alias_methodを介してbefore、after、aroundアドバイスを挿入する実装のため交換し、プロキシすることができます。かつてすべてのWeb開発者を悩ませたJavascriptですら、AOPが容易に実装できる強力なイディオムを備えています。AspectJ(サイト・英語)というそれ用のフレームワークも存在するのです。

でも、僕は正直 Module#method_added を使ったことが無かったので、ちょっと調べてみましたよ、と。

Read the rest of this entry »

 

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 もナポリではたらくイケメンですし、今イタリアが熱いですね。