2014年5月29日木曜日

RubyのRackとはなんぞや?

Rubyでsinatraを触っていて、Rackってなんだろうと思ったので、調べてみました。
今回は、フレームワーク抜きでRackだけで作るwebアプリを書いてみます。

■Rackとはなんぞや?
Rackの本家には
「Rack provides a minimal interface between webservers supporting Ruby and Ruby frameworks.」
と書いてあります。

この一文の通りwebアプリやフレームワークとサーバー間のRuby用インターフェースライブラリだそうです。RailsやSinatraでも採用されているもので、webアプリフレームワークをインストールすると、ほぼ必ず関連gemでインストールされますよね。
rackはアプリケーションの実装が、特定のサーバーに依存せずに済むのです。


■実装してみよう

環境はこんな感じ↓
OS: Mac 10.9
Ruby 2.1.2
#2.0以上ならばとりあえず大丈夫です。

まずはRackのインストール。
gem install rack

任意の場所へ作業ディレクトリを作ってその中でRackを使うアプリを作ります。
本稿ではSimpleRackAppとします。




Rackで必要なこと
rackを実装するにあたり必要なことがいくつかあります。
  • callというメソッドが実装されている
  • call引数は環境変数のハッシュパラメータを受ける
  • callの戻り値は配列で、以下の3点を含む必要がある
  •    HTTPレスポンスコード(正常なら200とか)
  •    ヘッダのハッシュ{'Content-Type' => 'text/html'} とか
  •    ボディ
です。
ともかく実際のコードをかいてみます。


まずはアプリ本体
HELLO WORLDと表示するHTMLを返すようにします。

【simple_app.rb】
class SimpleApp
  def call(env)
     [
       200, 
       { 'Content-Type' => 'text/html' },
       ['&lt html>&ltbody&gtHELLO WORLD!&lt/form&gt&lt/body&gt&lt/html&gt']
     ]
  end
end

続いてconfig.ruの実装
rackup  コマンドで最初に呼ばれるファイルです。この中に以下のようなものを書きます。
先ほど作ったsimple_appを読み込んでnewしてるだけです。

【config.ru】
require './simple_app.rb'
run SimpleApp.new

■起動
2つのファイルができたら、rackupコマンドで起動です。
config.ruを指定しなくてもrackupコマンドはカレントディレクトリのconfig.ruを探してくれますが、ここでは公式ページに倣って明示しておきます。

$ rackup config.ru

rakeupでWEBrickというサーバーが起動し、さきほど書いたアプリケーションへhttpでアクセスできるようになります。

http://localhost:9292
へアクセスして画面を確認してください。


■参考
サイト
・Rack本家
http://rack.github.io/

・技術評論社のサイト「Rackとは何か」
http://gihyo.jp/dev/serial/01/ruby/0023


・オライリー 入門sinatra
2014/06現在、電子書籍でしか販売されていないようですがSinatra周辺技術としてRackの解説もあります。


・Webアプリエンジニア養成読本(Software Design plus)


ruby編の最初の方でrackの概要解説があります。
本エントリは、ほぼこの本の写経です。


フレームワークを使っているとrackを始めミドルウェアのライブラリを意識することってあまりありませんし、フレームワークはこういう所を隠蔽してユーザーに意識させないことも仕事ですので、なかなか触れる機会が少ないとは思います。
でも、勉強してみると、これはやっぱり知っておかないといけないなと感じることが多々有ります。
ということで、webアプリ作りつつrackのコードを読んだりしようかと思います。

0 件のコメント:

コメントを投稿