Lotus - A complete web framework for Ruby
Lotus というWebアプリケーションのためのフレームワークを紹介します。
まえがき
先日、ちょっとしたWebアプリを作る必要がありました。 作りたいものはミニブログ的なもので以下の要件があります。
本当に仲間内だけで使用するためのものです。
私はもう10年近くWebアプリを作ったことがなかったので、最新技術も最近のトレンドも分からない状態でした。
とりあえず、以下のキーワードで探しました。
- 巨大でない(中身が分からないと苦労しそう)
- フレームワークのアーキテクチャは MVC を使う(良いらしいので)
- RESTful(保守性が高そうなので)
- サーバーサイドは Ruby を使う(Ruby が好きなので)
- クライアントサイドは CoffeeScript を使う(Ruby が好きなので)
- データベースはファイルか sqlite(小規模なの)
- Heroku にデプロイすることも考えて、MySQL や PostgreSQL も使えたらなおよし
- Javascript による制御は自分で書くか超軽量のライブラリを使う(勉強のために)
- CSS は自分で書くか超軽量のライブラリを使う(勉強のために)
つまり、軽量で、MVCアーキテクチャで、View部分はお好きにどうぞ。というフレームワークを探しました。
Ruby on Rails は、趣味でRedmine用のPluginを作ったことがあったので少し見たことがありますが、あれは今回の用途には巨大すぎだと思いました。Webアプリ開発の勉強も兼ねているため、フレームワーク内のコードを読む機会が多いと思いますが、これは読めそうにないです。
Sinatra は、軽量だし情報量も多かったのですが、DSL の塊なのがちょっと好みではありませんでした。フレームワークを使うときは便利そうですが、フレームワークの中身を勉強するのは難しそうです。
Padrino も Sinatra と同じ理由でパス。
Ramaze はとても良さそうでした。軽量でカスタマイズしやすそう。これに決めようと思っていたのですが…
出会ったのです。Lotus に。
Lotus
Lotus は、Ruby で作られた軽量、高速でテストしやすいWebフレームワークです。
Lotus の Web ページにはこうあります。
Lotus はオブジェクト志向プログラミング、安定した API、最低限の DSL、そしてプレーンオブジェクトをWeb開発の場に取り戻します。
単機能のモジュールを必要に応じて組み合わせ、Ruby のクラスを使用してオブジェクトを操作することを目指しています。
Modulability
Lotus 自体も、小さなモジュールの組み合わせでできています。 github を見ると分かります。
それぞれは独立したモジュールで、Lotus::Controller だけを自分のアプリケーションに組み込むこともできます。
また、基板として有名な gem を多く使用しており、余計なラッピングをしていないので学習が楽です。
NoDSL
Lotus のアプリケーションは、基本的に素の Ruby で書けます。 DSL もところどころ使ってますが(configure do とか)基本的には Ruby なのでフレームワーク自体の学習が楽です。
MVC
Lotus のアプリケーションアーキテクチャは MVC で…しょうか?
使った感じ、MVC ぽくないです。 多分私がよく知らないだけなのでしょうが。
こんなイメージです。
- Model
- いわゆる Model
- Controller
- ユーザーからの入力を Model へ変換して Template に渡す
- Template
- ユーザーへ静的な情報を表示する
- 動的な情報が必要な場合は Model を View に渡して表示を依頼する
- View
- Template から受け取った Model をユーザーが見るのに適した形で表示する
テンプレートを使うアーキテクチャはいろいろあるみたいですが「MVC」のような確固たる名前が見当たらなかったので、曖昧な記述ですみません。 もうすこし触ってちゃんと分かったら、情報を更新します。
Microservices
マイクロサービス。
初めて聞きましたが、1年ほどまえから盛り上がりつつあるWebアプリケーション開発のアプローチだそうです。
Modulabilityとも関連しますが、小さく独立したWebアプリケーションを複数組み合わせて一つの大きなアプリケーションを作る方法です。
Lotus にはアプリケーションのひな形をつくる機能がありますが、それにより作られるフォルダ構成を見てもマイクロサービスを意識していることが分かります。
$ lotus new sample
$ tree sample -d
sample
├── apps
│ └── web
│ ├── config
│ ├── controllers
│ │ └── home
│ ├── public
│ │ ├── javascripts
│ │ └── stylesheets
│ ├── templates
│ │ └── home
│ └── views
│ └── home
├── config
├── db
├── lib
│ ├── config
│ └── sample
│ ├── entities
│ └── repositories
└── spec
├── sample
│ ├── entities
│ └── repositories
├── support
└── web
├── controllers
├── features
└── views
apps/web/
の下に MVC があるのが見えます。
app/web/
が一つのアプリケーションとなります。
同じように app/api/
などを作り、app/web/
は app/api/
経由で情報を取得する。という感じに拡張できます。
RESTful
Lotus では、ルーティングは Lotus::Router モジュールが担当します(もちろんこれも単体で使用可能です)。
DSL は他のフレームワークでもおなじみの方法で、学習も簡単です。 また、RESTFul に対応したルーティングを自動生成することもできます。
Helper
Lotus :: Helpers がヘルパーメソッドを用意しています。 ただ、あまり数は多くありません。 ここらへんはコミュニティに期待です。
Community
チャットやフォーラム、StackOverflowにタグがあります。
フォーラムでの質問に対するレスポンスは早そうです。
あとがき
Ruby によるWebフレームワーク Lotus を紹介しました。
どこで見つけたかは忘れたのですが、「Webフレームワーク10選」みたいなブログ記事で見つけたので、さぞかし有名なフレームワークなのだろうと思っていたのですが、日本ではあまり紹介されていませんね。
世界的にもそれほどのシェアが無いのか、ドキュメント(英語)は分かりやすく書かれているのですが github の情報ですら古い場合があり、中身のコードを読まないと使えない機能があったりもします。
でも、非常に分かりやすく、アプリケーションを作るのが楽しくなるフレームワークだと思います。 このブログでちょこちょこ紹介していくので宜しければ使ってみてください。