T time

プログラミングや電子工作、各種ガジェットに関するブログです。

Lotus - A complete web framework for Ruby

lotusrb.org

Lotus というWebアプリケーションのためのフレームワークを紹介します。

まえがき

先日、ちょっとしたWebアプリを作る必要がありました。 作りたいものはミニブログ的なもので以下の要件があります。

  • 記事の作成と一覧が出来る
  • ログインによるユーザ管理ができる
  • サーバー負荷もクライアント負荷も小さいほうがいい
  • クライアントはスマホガラケー
  • ユーザは1~3人程度

本当に仲間内だけで使用するためのものです。

私はもう10年近くWebアプリを作ったことがなかったので、最新技術も最近のトレンドも分からない状態でした。

とりあえず、以下のキーワードで探しました。

  • 巨大でない(中身が分からないと苦労しそう)
  • フレームワークアーキテクチャMVC を使う(良いらしいので)
  • RESTful(保守性が高そうなので)
  • サーバーサイドは Ruby を使う(Ruby が好きなので)
  • クライアントサイドは CoffeeScript を使う(Ruby が好きなので)
  • データベースはファイルか sqlite(小規模なの)
    • Heroku にデプロイすることも考えて、MySQLPostgreSQL も使えたらなおよし
  • Javascript による制御は自分で書くか超軽量のライブラリを使う(勉強のために)
  • CSS は自分で書くか超軽量のライブラリを使う(勉強のために)

つまり、軽量で、MVCアーキテクチャで、View部分はお好きにどうぞ。というフレームワークを探しました。

Ruby on Rails は、趣味でRedmine用のPluginを作ったことがあったので少し見たことがありますが、あれは今回の用途には巨大すぎだと思いました。Webアプリ開発の勉強も兼ねているため、フレームワーク内のコードを読む機会が多いと思いますが、これは読めそうにないです。
Sinatra は、軽量だし情報量も多かったのですが、DSL の塊なのがちょっと好みではありませんでした。フレームワークを使うときは便利そうですが、フレームワークの中身を勉強するのは難しそうです。
PadrinoSinatra と同じ理由でパス。
Ramaze はとても良さそうでした。軽量でカスタマイズしやすそう。これに決めようと思っていたのですが…

出会ったのです。Lotus に。

Lotus

Lotus は、Ruby で作られた軽量、高速でテストしやすいWebフレームワークです。

Lotus の Web ページにはこうあります。

f:id:tatur0u:20150620173716p:plain

Lotus はオブジェクト志向プログラミング、安定した API、最低限の DSL、そしてプレーンオブジェクトをWeb開発の場に取り戻します。

単機能のモジュールを必要に応じて組み合わせ、Ruby のクラスを使用してオブジェクトを操作することを目指しています。

Modulability

Lotus 自体も、小さなモジュールの組み合わせでできています。 github を見ると分かります。

f:id:tatur0u:20150620174552p:plain

それぞれは独立したモジュールで、Lotus::Controller だけを自分のアプリケーションに組み込むこともできます。

また、基板として有名な gem を多く使用しており、余計なラッピングをしていないので学習が楽です。

NoDSL

Lotus のアプリケーションは、基本的に素の Ruby で書けます。 DSL もところどころ使ってますが(configure do とか)基本的には Ruby なのでフレームワーク自体の学習が楽です。

MVC

Lotus のアプリケーションアーキテクチャMVC で…しょうか?

使った感じ、MVC ぽくないです。 多分私がよく知らないだけなのでしょうが。

こんなイメージです。

http://www.plantuml.com:80/plantuml/png/qz0goI_GLD3LjLC8BKujuW8HO9vpVbv9KNvE3b0CmGJB-EQdfEQW2uQavXRa99QaSi4OOD6mpDHoBX21Hmt8HW00

  • 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 に対応したルーティングを自動生成することもできます。

f:id:tatur0u:20150620182449p:plain

Helper

Lotus :: Helpers がヘルパーメソッドを用意しています。 ただ、あまり数は多くありません。 ここらへんはコミュニティに期待です。

Community

チャットフォーラムStackOverflowにタグがあります。

フォーラムでの質問に対するレスポンスは早そうです。

あとがき

Ruby によるWebフレームワーク Lotus を紹介しました。

どこで見つけたかは忘れたのですが、「Webフレームワーク10選」みたいなブログ記事で見つけたので、さぞかし有名なフレームワークなのだろうと思っていたのですが、日本ではあまり紹介されていませんね。

世界的にもそれほどのシェアが無いのか、ドキュメント(英語)は分かりやすく書かれているのですが github の情報ですら古い場合があり、中身のコードを読まないと使えない機能があったりもします。

でも、非常に分かりやすく、アプリケーションを作るのが楽しくなるフレームワークだと思います。 このブログでちょこちょこ紹介していくので宜しければ使ってみてください。

この次は、Lotus を使用して One-file-application を作ってみます