Rack
- Ruby のための Web サーバと Web アプリケーションの標準的インターフェイスを提供するツール/ライブラリである。
- Rack(ラック/棚)に Web アプリケーションを載せるイメージで、Web サーバに Ruby の Web アプリケーションを配置できる。
- gem install rack でインストールする。
- Web アプリケーションの標準的なインターフェイスなので、対応していれば各種サーバで同じように動かすことが可能である*1。
- 拡張子 ru というファイルに Web アプリケーションの構成を記述する。
- コマンド名は rackup である。
- 参考
- メインサイト - Rack: a Ruby Webserver Interface
- File: SPEC ― Documentation for rack/rack (master)
- Rack の仕様である。英語。
- Rack解説を試みて失敗しつつも晒す、の巻 - KoshigoeBLOG
- Rack の仕様を日本語に訳しているページである。
- Route 477 - Rack 日本語リファレンス
- Route 477 - 5分でわかるRack
以下、Rack に関する個人的見解です。
- Rack を直接利用して Web アプリケーションを作れるが、Rack に対応した Web アプリケーションフレームワークを使って開発するのが通常だと思う。
- Rack 対応の Web アプリケーションフレームワークを使えば自然と Rack に対応することになり、Rack の大部分は隠蔽されるため詳細を知っている必要は薄い。
- 個人的に重要だと思うのは以下の2点である。
- Rack Middleware の存在と機構。
- 対象の Web アプリケーションがとある環境で動くのか否かを判断するための材料。
Rack Middleware とは?
- Web アプリケーションの非機能要件を拡張してくれるモジュールのこと。
- use というキーワードで Web アプリケーションに組み込む。
- use というキーワードが出てきたら、それが Rack Middleware を組み込んでいると思って良い。
- Rack Middleware には Rack 標準のものもあれば、各種 Web アプリケーションフレームワーク/ライブラリが用意してくれるものもある。
- 明示的に自分で組み込むものもあれば、Web アプリケーションフレームワークが機能実現のために自動で組み込むものもある。
- Rack Middleware は Web アプリケーションの処理の前後に独自の処理を割り込ませることができる機構および機構を使って実装したモジュールである。
- ブラウザからのリクエストや、ブラウザへのレスポンスを加工できる。
- これによりアクセス制限や Basic 認証や例外発生時のページ表示、レスポンスの圧縮処理などを実現できる。
- Rack Middleware はもちろん Ruby のコードなので、その他にも任意の処理ができる。
- これによりプロファイリングなどができる。
- ブラウザからのリクエストや、ブラウザへのレスポンスを加工できる。
- 参考
- Contributed Rack Middleware and Utilities - rack/rack-contrib - GitHub
- Rack 標準(?)のミドルウェアの一覧である(英語)。
- Contributed Rack Middleware and Utilities - rack/rack-contrib - GitHub
対象の Web アプリケーションがとある環境で動くのか否かを判断するための材料。
以下のような表現が使われていることがあるので、その意味を理解していると Web アプリケーションサーバを動かせるかどうかが判断できます。
- 環境(Web アプリケーションサーバや各種サービス)に Rack が対応している。
- rackup コマンドでサーバを起動できるという意味である。
- 環境(Web アプリケーションサーバや各種サービス)が Rack に対応しているの違い。
- Web アプリケーションサーバが起動時*2に Rack アプリケーションを自動で認識して起動してくれるという意味である。
- Web アプリケーションフレームワークが Rack に対応している。
- Web アプリケーションで作った Web アプリケーションは Rack 対応の各種サーバで動かせるという意味である。
- Web アプリケーションが Rack に対応している。
- Web アプリケーションが Rack 対応の各種サーバで動かせるという意味である。
以下、事例です。
- 環境に関して
- Web アプリフレームワークに関して
- Ruby on Rails や Sinatra は Rack に対応しているので、これらの Web アプリケーションフレームワークで作った Web アプリケーションは Rack 対応の環境で動かせる。
- Web アプリケーションに関して
- Redmine や tDiary などは、Rack に対応しているので Rack 対応の環境で動かせる。
Web アプリケーションフレームワーク
Ruby on Rails
- Ruby 界では言わずと知れた有名な Web アプリケーションフレームワークである。
- バージョン 2.3 から Rack に対応している。
- gem install rails でインストールする。
- Ruby on Rails は単なるライブラリではなく、複数の依存ライブラリの上に成り立っている。
- rails というコマンドを持ち、ソースコードの自動生成機能を持つ。
- 自動生成したソースコードには Rakefile や Gemfile を含み、rake や Bundler を利用し、開発を行う。
- MVC の全てをサポートする。
- バージョン 3.0 から Merb と統合した。そのため Ruby on Rails 2 系と 3 系には互換性が無いので注意が必要である。
- 参考
- メインサイト - Ruby on Rails
- Ruby on Rails入門
- Railsドキュメント
Sinatra
- Ruby on Rails も有名な Web アプリケーションフレームワークだが、Sinatra も有名な Web アプリケーションフレームワークである。
- Sinatra の特徴は Ruby にメソッドを追加した DSL として定義されている点である。
- Rack に対応している。
- gem install sinatra でインストールする。
- ruby コマンドで作った Web アプリケーションのスクリプトを実行すると 4567 ポートで簡単に動かすこともできる。
- メインサイトが複数言語翻訳されており、日本語の情報も充実している。
- MVC ではない。強いて言うならば MVC の C(Controller)のみをサポートしているというようなイメージである。
- 独自にまとめた情報
- 参考
- メインサイト - Sinatra
- Sinatra: README(Japanese)
- Sinatra: README の日本語バージョンである。
- 残念ながら README 以外は日本語化されていないようなので、より詳しい内容は英語のメインサイトを読む必要がある。
- Sinatra Book(英語)
Goliath
- 非同期*3 Web アプリケーションフレームワークである。
- Rack に対応している。
- Ruby 1.9 以上が必要である。
- gem install sinatra でインストールする。
- ruby コマンドで作った Web アプリケーションのスクリプトを実行すると 9000 ポートで簡単に動かすこともできる。
- 参考
- メインサイト - Goliath
Merb
- Ruby on Rails と統合(Ruby on Rails 3.0)し、既に存在しない Web アプリケーションフレームワークである。
- たまに名前が出てくるので記載した。
その他(名前だけ見たもの)
- Padrino
- Ramaze
Web アプリケーションサーバ
WEBrick
- 単純な HTTP Web サーバ の機能を提供するライブラリである。
- Ruby 1.8 以降、標準で利用できる。
- ライブラリなので単独で起動することはなく、その他のライブラリやツールに取り込まれて使われることが多い。
- 当たり前だが自分のアプリケーションに組み込んで使うことも可能である。
- 参考
- メインサイト(?) - library webrick(Ruby 1.9.3)
Mongrel
- 名前をよく見かけるわりにはメインサイトが見つからなかったりするので、他の Web アプリケーションサーバに取って代わられた気配がある(2012/02/14 時点)。
- 参考
- メインサイト - 見つからない!?
Thin
- Mongrel のスピードとセキュリティを参考に作られた高性能 Ruby サーバである。
- Rack 対応の Web アプリケーションサーバである。
- 参考
- メインサイト - Thin - yet another web server
その他(名前だけ見たもの)
- Unicorn
- Puma
- Rainbows!
Web アプリケーションサーバサポートモジュール
Passenger
- Web アプリケーションのレスポンスを改善するサーバサポートモジュールである。
- 単純な CGI として Ruby の Web アプリケーションを起動すると毎動作ごとに Ruby プロセスの起動に時間が掛かってしまいレスポンスが遅くなってしまう問題を解決してくれる。
- ''Windows はサポートしない…との回答がある。
- 参考
Web アプリケーションでのユーザ認証
Rack::Auth
- Rack が標準で持っているユーザ認証用の Rack Middleware である。
- 標準で Basic 認証(Rack::Auth::Basic)とDigest 認証(Rack::Auth::Digest::MD5)と OpenID(Rack::Auth::OpenID)による認証をサポートする。
- ユーザ名とパスワードによる認証を行うエントリーポイントを提供してくれる。
- エントリーポイントの提供だけで、認証の許可/却下を判断するロジックの定義は開発者が行うものである。
- 当然としてユーザの管理機能もない。
- 認証後は、Web アプリケーション内でユーザ名の参照が可能である。
- ユーザ名の参照は Rack Environment からキー「'REMOTE_USER'」を使って行う。
- ユーザ認証に必要な最小限の機能のみを提供してくれるものであり、要件に見たない場合は別の方法を使う必要がある。
- 独自にまとめた情報
Warden
- ユーザを認証するためのエントリーポイントを提供してくれる Rack Middleware ライブラリである。
- 認証したユーザの情報を格納し、格納したユーザ情報にアクセスする仕組みを提供してくれる。
- 認証方法のことをストラテジーと呼び、各種ストラテジーを組み込む仕組みを提供してくれる。
- Warden 自体は仕組みの提供だけであり、「ユーザ」「ストラテジー」の定義を一切持たない。
- 例えば「ユーザとはユーザ名とパスワードとメールアドレスを持つものである」という定義もないし、ユーザの情報をファイルやデータベースで管理するという機能なども当然としてない。ユーザの定義は開発者が行うものである。
- 認証方法(Warden でいうところのストラテジー)として「Basic 認証」や「ダイジェスト認証」も何もない。ストラテジーの定義は開発者が行うものである。
- Warden のメインサイトにあるサンプルには password や Users など、もしかしたらこういう機能があるのかな?と思うような単語がサンプルに書いてあるが、これらは仮想のものであって、決して Warden 自体が持っている機能ではなく、こういうものを開発して使うものですという事例である。
- 「ユーザ」「ストラテジー」の定義は、開発者が自分で開発するか、各種拡張ライブラリが存在するのでそれらを利用する。
- Warden は認証のための基盤であり、各種ライブラリに隠蔽されている場合がある。
- gem install warden でインストールする。
- 通常は各種ストラテジーを提供するライブラリと組み合わせて使うことになるため、それらのインストール時に Warden はインストールされる。
- 独自にまとめた情報
- 参考
- メインサイト - hassox/warden - GitHub
- Sinatra アプリケーションに Warden で認証を実装する - present
- Sinatra 専用ではあるが、Warden を直接利用した単純なサンプルが日本語で紹介されている。
Devise
- Warden をベースにした Ruby on Rails 用の Web アプリケーション認証を実現する総合ライブラリである。
- Web アプリケーション認証に関わる一般的な機能全般をサポートする。
- ユーザ認証に関わるユーザ情報のデータベース管理はあたりまえ。
- メールによる認証や、メールでのパスワードリセットなどもサポートする。
- ログイン情報を格納してくれたり、ログインを複数回失敗した場合にはユーザをロックする機能なんかもサポートする。
- これら機能はモジュール化されており、選択して利用できる。
- Warden をベースにしていると言っているのだから Ruby on Rails 以外の Rack#rack ベースの Web アプリケーションフレームワークでも使えるのではないかと想像する。
- しかし、Ruby on Rails にどこまで依存しているのかは使ってみてないので不明。想像するに以下の点で Ruby on Rails と結合しているのではないかと想像している。
- コントローラーやモデルなどのコード自動生成
- データベースアクセス(ActiveRecord)
- メール送信(ActionMailer)
- 参考
その他(調査中)
- Authlogic
- sorcery
その他(非推奨)
調査していて、既に古く、利用が推奨されないと思ったもの(主観的)。もしくはメインサイトにて明確に非推奨であることが宣言されているもの。
- Restful Authentication
- Merbful Authentication
- Merb-Auth
Web アプリケーションのテスト
Rack::Test
- Rack アプリケーションのテストをサポートするライブラリである。
- gem install rack-test でインストールする。
- 既存のテスティングフレームワークで作ったテストケースに include Rack::Test::Methods とすることで機能を追加して利用する。
- テストケース内で get や post などのリクエストの送信と、last_response によるレスポンスの検証ができる。
- 参考
- メインサイト - Rack::Test
- ramaze-users.jp - Rack::Test
その他
どれも Rack::Test を拡張(?)し、より高度な検証を可能とするテスティングフレームワークなのではないかと思う。
特にレスポンスの検証に関して Rack::Test はボディを文字列としてしかみていないが、HTML として検証しやすく設計されている(のではないかと想像している)。
モバイル/スマートフォン対応
jpmobile
- ユーザエージェントからアクセス元の端末を判断し、入出力の調整をサポートしてくれるライブラリである。
- gem install jpmobile でインストールする。
- 基本機能は Rack Middleware として提供される。
- その他、Ruby on Rails を中心に機能が提供されている。Sinatra への機能提供もある。
- 参考
- メインサイト - jpmobile/jpmobile - GitHub
- 参考書籍
- - Ruby on Rails 3で作る - jpmobileによるモバイルサイト構築
- Ruby on Rails で作るとあるが、Sinatra に関しても一部記載がある。
- - Ruby on Rails 3で作る - jpmobileによるモバイルサイト構築