2007 年末の登場以来,軽量フレームワークの Sinatra web framework には,多くの関心が寄せられてきた。その結果は,現在 Google で "Sinatra" を検索すると,Frank や Nancy に関係するものより上位にランクされるほどだ。InfoQ では Sinarta プロジェクトの創始者である Blake Mizerany 氏から,Sinatra の詳細と 1.0 リリースの内容について話を聞いた。
Mizerany 氏の説明によれば,1.0 がひとつのマイルストーンであるのは,追加されたものよりも,取り除かれたものに理由があるという。
テンプレートに Tilt を採用することによって,かなりの行数のコードが取り除かれました。また,拡張 API の仕様が確定されました。0.9 シリーズにあった API 部分の重複は,現在では完全に解消されています。
その他のコードベースは,以前のリリースからほとんど変更されていない。
Sinatra は Rails のようなモデル-ビュー-コントローラ (Model-View-Controller,MVC) フレームワークではない。強いて言うならば,"Ruby を使用して web アプリケーションを作成するためのドメイン固有言語 (domain-specific language)" である。Sinatra ではアプリケーションが HTTP リクエストに応答する方法を,REST パラダイムに沿ったシンプルな形式で定義することができる。
Sinatra は HTTP へのダイレクトなマッピングです。Sinarta は隠された複雑さの代わりに,公開された単純さを目指しているのです。そもそも HTTP や HTML は難しいものではありません。隠す必要など何もないのです。 ... あまりに '基本的' なために誤解されることもありますが,実際に試せば気に入ってもらえると思います。
Sinatra のアプリケーションは,ひとつのファイルに収まるほど小さくなる。各処理のルートは HTTP メソッドと URL パターンによって定義され,ひとつのブロックとして扱われる。例えば Sinatra の "Hello world" アプリケーションは次のようなものだ。
require 'rubygems'
require 'sinatra'
get '/hi' do
"Hello World!"
end
Sinatra はまた,Erb,Erubis,HAML など数多くのテンプレートシステムと組み合わせることができる。その一方でフォームビルダやデータベース接続など,MVC フレームワークの持っている機能の多くはバンドルされていない。このような単純さにゆえに,Ruby 1.8.x と 1.9.x,JRuby,MacRuby など,数多くの Ruby 実装上で動作可能だ。
Sinatra の採用実績を年代順に記録した Sinatra in the Wild というサイトがあり,このフレームワークを用いたさまざまな Web アプリケーションとサイトがリストされている。そこには GitHub や Gemcutter,さらには Heroku,Engine Yard,ENTP といった企業の名もある。最近では NewRelic から,同社の RPM Ruby Agent パフォーマンス計測ツールで Sinatra をサポートするという発表があった。
バージョン1.0 では,新機能もいくつか取り入れられている。テンプレートのレンダリングに Tilt フレームワークが採用されたことにより,テンプレートキャッシュ,一貫性のあるテンプレートバックトレース,新たなテンプレートエンジンなどがサポートされるようになった。また Erb,Erubis,Haml などのテンプレートが初回レンダリング時にコンパイルされるようになり,表示構成時間が5~10倍も改善されている。テンプレートファイルのコンパイル結果を再利用するか,あるいは要求ごとに再コンパイルするかは,新たに追加されたフラグによってコントロールできる。
現行バージョンのユーザは,アップグレードによって多少の問題が発生するかも知れない。しかし今後も新機能を追加していくためには,それは必要なことだ。FAQ によると,
アプリケーションが公開機能のみを使用して,非推奨機能について対処できているなら,Sinatra 1.0 でも問題ありません。最新の Sinatra 0.9.x リリースでは ... Sinatra 1.0 で導入される非互換性のすべてについて,非推奨の警告が行われるようになっています。
[...]
今後 Sinatra 0.9.x リリースについては,セキュリティ上の問題や大きな障害に対応する追加リリースはありますが,新機能の追加は行われません。
1.0 リリースに長期間を要した理由のひとつは,Semantic Versioning Model を採用したことにある。
すべての 1.x リリースについて,今回の 1.0 リリースへの後方互換性を確保する予定です。そのためには今後長期間に渡って,1.0 リリースとの非互換性の発生を防ぐ必要があります。そのため私たちには,望ましくないインターフェースについての精査が必要だったのです。
Mizerany 氏は今後も Sinatra が,その支持者を増やし続けるものと予測する。
Sinatra はそのシンプルさゆえ,あらゆる場所で利用可能です。このシンプルさを維持するため,今後の活動には特に注意しています。... Sinatra には内輪の IRC や Campfire ルームなどは存在しません。次のステップは,ひとつの場所で決定されています。すべてがオープンなのです。
Mizerany 氏は Sinatra の拡張サポート機能を (作成が簡単なことなどの点で) 特に気に入っている 。氏によるとそれは,"特別なボイラプレート用のディレクトリや初期化スクリプトを必要としない,gem として提供・取得可能な単純なライブラリ" である,ということだ。すでに数多くの拡張が開発されていて,ActiveRecord を通じてデータベースを操作するためのもの,Sequel ORM,認証 (authentication)や 非同期タスク を行うものなどがある。さらに Sinatra は,Ruby web フレームワークの標準 Rack インターフェース上に位置しているため,Rack ミドルウェアコンポーネントへの接続も可能である。
Sinatra のアイデアは,数多くの同種のフレームワークからインスパイアされたものだ。JavaScript 用の Sammy や Clojure 言語における Compojure などがその例であり,その他 Scala,PHP,.NET,といった言語にも同種のものがある。
Sinatra の開発をサポートしているのは Heroku だ。しかし,
Sinatra の成功の要因はコミュニティにあります。Heroku は単に必要な作業時間の確保をサポートしてくれたり,作業の継続を励ましてくれる存在なのです。このクレジットの 99.9999% はコミュニティのものです。メーリングリストのスレッド/質問を私が見るよりも先に,いつも他の誰かが,良質で丁寧な回答を付けてくれるのですから。