2011-12-20
やる夫が Rack についても学ぶそうです
やる夫で学ぶ WSGI - present の続編(?)。
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ 先日、Python の WSGI について説明した。
| } Python 以外の言語にも、WSGI みたいなものは存在する。
ヽ } たとえば Ruby なら Rack だ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ 先日、Python の WSGI について説明した。
| } Python 以外の言語にも、WSGI みたいなものは存在する。
ヽ } たとえば Ruby なら Rack だ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
____
/⌒ ⌒\ ホジホジ
/( ●) (●)\
/::::::⌒(__人__)⌒::::: \ <ふーん
| mj |ー'´ |
\ 〈__ノ /
ノ ノ
/⌒ ⌒\ ホジホジ
/( ●) (●)\
/::::::⌒(__人__)⌒::::: \ <ふーん
| mj |ー'´ |
\ 〈__ノ /
ノ ノ
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ (ムカッ)
| } Rack インタフェースの仕様はシンプルで、
ヽ } 簡単にまとめると下の通りだ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ (ムカッ)
| } Rack インタフェースの仕様はシンプルで、
ヽ } 簡単にまとめると下の通りだ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
- call メソッドを持っている
- call メソッドは引数としてリクエストを受け取る
- call メソッドは次の要素を含むレスポンス(Array) を返す
- ステータスコード
- レスポンスヘッダ(Hash)
- レスポンスボディ(Array)
____
/ \
/ ─ ─ \
/ (●) (●) \
| (__人__) | コードじゃないと分からないお
\ ` ⌒´ ,/
r、 r、/ ヘ
ヽヾ 三 |:l1 ヽ
\>ヽ/ |` } | |
ヘ lノ `'ソ | |
/´ / |. |
\. ィ | |
| | |
/ \
/ ─ ─ \
/ (●) (●) \
| (__人__) | コードじゃないと分からないお
\ ` ⌒´ ,/
r、 r、/ ヘ
ヽヾ 三 |:l1 ヽ
\>ヽ/ |` } | |
ヘ lノ `'ソ | |
/´ / |. |
\. ィ | |
| | |
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ (……コイツ!)
| } 上記を満たす最小の Web アプリケーションを
ヽ } 書くとしたらこんな感じだ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ (……コイツ!)
| } 上記を満たす最小の Web アプリケーションを
ヽ } 書くとしたらこんな感じだ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
# coding: utf-8 # sample_app.rb class SampleApp def call(env) # env はハッシュ # HTTP リクエストの内容が格納されている method = env["REQUEST_METHOD"] # ステータスコード、レスポンスヘッダ(Hash)、レスポンスボディ(Array) # を入れた Array を返す [ 200, # ステータスコード { "Content-Type" => "text/html" }, # レスポンスヘッダ [ "<html><body>#{method} です。</body></html>" ] # レスポンスボディ ] end end
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ これだけだと Web アプリを実行できない。
| } 上記のコードを書いたファイルと同じディレクトリに、
ヽ } config.ru というファイルが必要だ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ これだけだと Web アプリを実行できない。
| } 上記のコードを書いたファイルと同じディレクトリに、
ヽ } config.ru というファイルが必要だ。
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
# coding: utf-8 # config.ru require './sample_app.rb' run SampleApp.new
/ ̄ ̄\
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ あとは config.ru があるディレクトリでrackup コマンドを実行すると、
| } Web サーバーが起動して Web アプリケーションがホストされる。
ヽ }
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
/ _ノ \
| ( ●)(●)
| (__人__)
| ` ⌒´ノ あとは config.ru があるディレクトリでrackup コマンドを実行すると、
| } Web サーバーが起動して Web アプリケーションがホストされる。
ヽ }
ヽ、.,__ __ノ
_, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
/;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;!:::::::::::::::::::\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
_______
:/ ̄| : : ./ / # ;,; ヽ
:. | ::| /⌒ ;;# ,;.;::⌒ : ::::\ :
| ::|: / -==、 ' ( ●) ..:::::|
,― \ | ::::::⌒(__人__)⌒ :::::.::::| : やる夫にも Rack よくわかったお・・・
| ___) ::|: ! #;;:.. l/ニニ| .::::::/
| ___) ::| ヽ.;;;//;;.;`ー‐'ォ ..;;#:::/
| ___) ::| .>;;;;::.. ..;,.;-\
ヽ__)_/ : / \ ハァハァ....
:/ ̄| : : ./ / # ;,; ヽ
:. | ::| /⌒ ;;# ,;.;::⌒ : ::::\ :
| ::|: / -==、 ' ( ●) ..:::::|
,― \ | ::::::⌒(__人__)⌒ :::::.::::| : やる夫にも Rack よくわかったお・・・
| ___) ::|: ! #;;:.. l/ニニ| .::::::/
| ___) ::| ヽ.;;;//;;.;`ー‐'ォ ..;;#:::/
| ___) ::| .>;;;;::.. ..;,.;-\
ヽ__)_/ : / \ ハァハァ....
トラックバック - http://d.hatena.ne.jp/griefworker/20111220/rack

