トップ «前の日記(2008-07-15) 最新 次の日記(2008-07-17)» 編集

Route 477



2008-07-16

[ruby][rack] 5分でわかるRack

RackはRubyのためのWebサーバインターフェイスだ。

RubyでWebっていうとRailsが有名だけど、実はRails以外にもいろんなRuby用のWebアプリ用フレームワークが存在する。

  • Ramaze
  • Merb
  • Camping
  • Waves
  • などなど…。

一方Webを実際に動かすにはWebサーバが必要だ。RubyのためのWebサーバも、これまたいろんなものがある。

  • Apache(CGI, FastCGI..)
  • WEBrick
  • Mongrel
  • Ebb
  • Thin
  • などなど…。

ここで問題が一つ。それは「フレームワークが増えるたびに、いろんなサーバをサポートするためのコードが必要になる」ってとこだ。 各フレームワークの作者がみんなそれぞれにCGIやMongrelに対応するためのコードを書いてるなんて、無駄だと思わないか?

RackはWebアプリ用のフレームワークと、Webサーバの間を取り持ってくれるライブラリだ。

 [ブラウザ]      [Webサーバ]                    [フレームワーク]
 * IE            * Apache                       * Ramaze
 * Firefox  <=>  * WEBrick    <=>  [Rack]  <=>  * Merb            <=>  [Webアプリ]
 * Safari        * Mongrel                      * Camping
 * ...           * ...                          * ...

フレームワーク作者はRackにだけ対応しておけば、Apache/WEBrick/Mongrelなど いろんなサーバがすぐに使えるようになる。逆にWebサーバの作者も、 Rackにだけ対応しておけばRack/Merb/CampingなどいろんなWebアプリ用フレームワークから すぐに使ってもらえるようになる。

というわけで、これからRuby用のWebアプリ用フレームワークやWebサーバを書こうとするなら Rackは間違いなくチェックすべきライブラリだ。 そうでなくて、単にWebアプリを作りたいだけの場合でも、「超シンプルなWebアプリ用 フレームワーク」としてRackを使うという選択肢もあるだろう。

3分で使ってみるRack

まずはインストール。

 $ gem install rack

hello.rbを用意。

 require 'rubygems'
 require 'rack'

 class HelloApp
   def call(env)
     [200, {"Content-Type" => "text/plain"}, ["Hello, Rack"]]
   end
 end

hello.ruを用意。

 require 'hello'
 run HelloApp.new

サーバを起動。

 $ rackup hello.ru

ブラウザで http://localhost:9292/ にアクセスしてみよう。「Hello, Rack」と 表示されたはず。

どう、簡単でしょう?

rackupのオプションでポートとかサーバとかいろいろ設定できる。詳しくは rackup --help で。

Rackの思想

「Webアプリって要するにリクエストをレスポンスに変換するだけの関数だよねー」 ってのがRackの基本っぽい。

なので、

  • env(環境変数のハッシュ)を受け取って
  • ステータスコードとHTTPヘッダとHTTPボディを返す

ような関数を書けばWebアプリになります。

だけどこのままだとさすがに使いにくいんで、 Rack::RequestとRack::Responseという補助クラスも用意されています。 これを使うと、「Webアプリ=RequestをResponseに変換する処理」となる。

ミドルウェア

Rackではさらに、「Responseを別のResponseに変換する処理」も扱えるようになっています。例えば ruファイルで

 require 'hello'
 use Rack::ShowExceptions
 use Rack::CommonLogger
 use Rack::Auth::Basic {|user, pass| user == 'alibaba' and pass == 'open sesame'}
 run HelloApp.new

のように書くと、Webアプリで起きた例外を綺麗に表示してくれたり、Apache形式のログを出力したり、Basic認証をかけてくれたりします。 つまり、ラック(棚)にサーバを追加するみたいに機能を追加することができる。

もっと詳しく知りたくなったら

でどうぞ!

[junk] シュレーディンガーの猫たち

funny-pictures-cat-kittens-fractal-schrodinger-back.jpg

誰かが実験中にポケットを叩いたのかも。

てかLOLCATSは良いなぁ。

本日のツッコミ(全3件) [ツッコミを入れる]
no6v (2008-07-16 14:22)

Rackってこういうことだったんですね。<br>分かりやすい解説をありがとうございます。<br>あと、ResponceじゃなくResponseでした。<br>wikiのは2個ほど直すなどしました。

yhara (2008-07-16 20:01)

ひー。ありがとうございます。(いつも間違えるんですよね…。)

authorNari (2008-07-18 10:03)

Rackいいっすよねー。<br>中身のコードもかなりいい感じですし。