スタ~ト Padrino

Presentation by Uchio Kondo (@udzura)
2011/10/21(Fri)
於 Preferred Infrastructure Inc. 殿

近藤うちお(@udzura)

Rubyist(2年半ほど)

Groovyに挫折

現在Haskellを順調に挫折

富士マガ所属、雑誌を定期購読で買ってね!

カルマ: Rack, Sinatra, Padrinoあたり
Rails3, TDD, Linux, アジャイルとかも興味はあるんですよ……

近藤うちおさんのworks

ブロッグ http://blog.udzura.jp/

Padrino 日本語サイト翻訳リーダー

Padrino framework contributor

自称、 Padrino framework エバンジェリストJPです

RubyGems: rack-session-dbm

RubyGems: rspec-padrino

若干のふざけたウェッブサービス

その他、 http://udzura.jp

今日の構成

第一章: Sinatra の歴史(独断と偏見篇)

第二章: What's going on Padrino?

第三章: Extending Sinatra in deep
~Sinatra Ecosystem~

Extra Session: “Blog Tutorial” をやってみよう

第一章

Sinatra の歴史

それは、Padrinoの歴史でもあるのだ……

Sinatra爆誕

0.0.1 on 2007-09(only on repo)

0.1.0 on 2007-10

http://rubygems.org/gems/sinatra/versions

シンプル

https://github.com/sinatra/sinatra/blob/0.0.1/lib/sinatra
/dsl.rb

たくさんのフレームワークに影響

Dancer, Mojolitious::Lite

Juno

loli

Scalatra, Graffiti

時は流れ、1.0 was released

2010-05

1.0になり、

クラシックスタイルとモジュラ~スタイルが
分離した。Sinatra::Baseの誕生

Sinatraの歴史の詳細

gihyo.jp さんへ

第41回 Sinatra 1.0の世界にようこそ

第42回 実世界のSinatra

http://gihyo.jp/dev/serial/01/ruby/0041

@tsuyoshikawa 氏渾身の記事

一方その頃

sinatra_more gem

2009年後半ごろから開発

sinatra_more moved to Padrino

Padrino 自体は 2009-11ごろから開発されていたっぽい
2010-02、sinatra_moreのREADMEに、Padrinoへ移行
する旨のコミット

https://github.com/nesquena/sinatra_more/commit/2ee59c6c709a90c7723a86d62c0542114bd02b09#README.rdoc

sinatra_more の開発者も Padrino 開発teamにジョイン


Sinatra

1.0 2010-03

1.1.0 2010-10

1.2.0 2011-03

1.2.6 2011-05 長い間の安定版でした

1.3.0/1.2.7 2011-10(new!)

3月と10月に何かが起こる

Padrino

0.9.0 2010-02 リリース

0.9系統は、キャッシュ機能担当のsub gemを

新規に追加するなど、改修に次ぐ改修

0.10.0 2011-07 リリース

0.10.3 で Sinatra 1.3 系をキャッチアップ!!

0.10.4 と 0.10.5 は半日足らずで連続リリース
(...)

最近のSinatra/Padrino情勢[PR]

「Sinatra 1.3.0 & Padrino 0.10.3 がリリースされ
ました。ざっくり紹介。」

(1): http://l.udr.me/oPFtQI

(2): http://l.udr.me/ruLxHN

(Sinatra)Stream API, (Padrino)JRuby/Rubiniusサ
ポートなど、Sinatrasta必読の話題です?

その他

big_band, renee など Sinatra 界隈でも色々な動

きがあるようですが……

続きはググれ!
もしくはudzuraさんがブログを書くかもしれ
ません[PR]

第二章

Padrino とは何か?

併せて読みたい: http://jp.padrinorb.com

併せて読みたい: http://www.padrinorb.com

この章の各項目について、ちゃんと公式の
Guideがあります。今回は概観を。

その前に

Sinatra使ってる?(そもそも論)

Sinatraでアレしてて

Viewやmodelのディレクトリ構造とか、
spec_helper.rbとか、Gemfileつくってbundlerで

読み込むとこの処理とか、

色々自作してません?

あなたと、

Padrino

“Sinatraの哲学の上に”、Sinatraを拡張し、楽

しく開発できるようにしたフレームワーク
The goal for this framework is to match the essence of Sinatra and make it
suitable for increasingly complex applications that require the use of forms,
mail delivery, localization, helpers, caching, etc…
For our team, coding is an art form and Sinatra best enables this concept
because of these core principles:
* Clean
* Compact
* Fast
* Creative
* Concise
The Padrino framework is the perfect solution for your small projects as
well as for your larger project requirements!

Sinatraを「正しく」拡張

2つの安全なAPI

use

register

を中心的に用いている。

大きな特徴

Agnostic

Modularity

Light-weight

Agnostic

ORM

Adapter

Template Engine

Testing Framework/Mocking

JavaScript/CSS Framework

が、交換可能

Modularity

開発者は、Padrinoのすべての機能を使っても
いいし、一部の機能を Sinatra に導入する形
で使ってもいい。
register/useで “Sinatra way” で拡張している強み

Lightweight

フルスタックPadrinoでも、素のSinatraとほと
んど変わらないレスポンスの速さ

* http://www.padrinorb.com/blog/padrino-0-10-0-routingupgrades-rbx-and-jruby-support-and-minor-breaking-changes

図解

Padrinoの出現以前

Rails
ActionController
Mongoidほか

ActiveRecord

Erubis

mochaほか

RSpec

ERB
Hamlほか

RspecRails

Sinatra

ゴッドファーザー登場

Sinatra Family 誕生の瞬間

Rails
ActionController
Mongoidほか

ActiveRecord

Erubis

mochaほか

RSpec

ERB
Hamlほか

RspecRails

Sinatra

Padrino

Sinatraから拡張した点

Rails風MVCパターンの導入

豊富なHelper

シンプルなメール配信機能

シンプルなキャッシュ機能

基本的な国際化機能

見易いロガー

開発時のリローダー

管理画面の自動作成

サブアプリケーションの作成/マウント

ジェネレータ含むコマンドラインツール

テストの自動生成

Rails風MVC

コントローラ相当

Rails – ActionController + routes.rb

Sinatra – Sinatra DSL

Padrino は、Sinatra DSLをさらに拡張し、擬似

→ Padrino::Rouiting

的な「コントローラ」を導入、各ルーティン
グを参照可能にする

Helper

Railsっぽい便利ヘルパ~ズ

content_for

form_for

stylesheet_link_tag

Format Helpers

→ Padrino::Helpers

Mailer

メール定義用のDSL

deliver メソッドで配信

Mail gemがベースなので、マルチパートを

はじめ結構融通が効く

→ Padrino::Mailer

Cache

割と最近追加されました

Page cache/Fragment cache

→ Padrino::Cache

ロガ~

Padrino::Logger::Rack

リローダー

0.10.5 現在、超頭良い

F5駆動開発にぜひ

管理画面

管理画面担当のサブアプリケーションを簡単
に作れる

どうせScaffoldとか管理画面作ることが多いでしょ?

ModelのScaffold、というかCRUDを簡単に

サブアプリケーション

ルーティングは共有しないが、Modelはじめ共
通ライブラリを使う場合に有利
Djangoからインスパイアザネクスト

コマンドラインツール

padrino コマンドがあります

一通り
ジェネレータ
あります
コンソール、
サーバ起動
など…

padrino rake test

ジェネレータは、基本的にユニットテストも
一緒に作ってくれます。
テストの基本的な構成物を作ってくれるの
で、TDDにも向いていたりします。
また、実は、machinist、capybaraなどのテスト
支援ライブラリもちょっとしたコツで使えた
りします。

テストの話は

TokyuRubyKaigi 04 で!

10/29

於 神泉近くの某社

http://regional.rubykaigi.org/tokyu04

ここまでのまとめ

Sinatraはシンプル、軽量、素敵
Sinatraはシンプル過ぎるので、「かゆいとこ
ろに手が届く」Padrinoが出現、Railsとの抗争

激化(予定)

Padrinoは伸縮自在、小規模~大規模OK

Padrinoはいろんなライブラリと共存する

第三章

Extending Sinatra
as a super-simple Rack-based framework

The Sinatra Ecosystem

そして伝説へ…

Sinatraを強めるAPI

use

Rack Middleware を登録する

register

Sinatra::Base を拡張したクラスに直接作用し、挙

動を変更する

helpers, set, use, なんかのクラスマクロをセットで

呼ぶのがよくある使い方

use

Rack config DSL

とある簡素な config.ru

Rack準拠アプリケ~ション

App#call(env) を呼び、

[status_code, {“Header” => “foo”}, [bodies]] を返す

ダックタイピング、特定のClass/Moduleを継承
する必要なし(奥野氏)

Rack Middleware

Initialize 時に、第一引数として app を取る

あとは Rack向けアプリケーションと同様

Super Simple Rack Middleware

これは、ねこのおくちです

便利な Rack Middleware 情報です

OmniAuth

Warden

Rack::Rewrite

Rack::Protection
(1.3 よりSinatraが標準で使う)

Rack::Recaptcha

Jpmobile::Rack::* (一部機能不可)

Rack gem 自身にもいくつか添付されています。
ベーシック/ダイジェスト認証とかが有名?ですか?

register

register されたModuleは、`self.registered`フック

が呼ばれる

そのフックで、元アプリのクラスマクロを呼
んだりできたりする

そんな難しい話ではないですね

app.class_eval とかが始まると

暗黒

send :include, send :extend, …

Padrino::Routingとかは、もともとのSinatraの
get/post/put/delete の移譲先、

Sinatra::Base.route

を上書きしている!!!!!!

メタプログラミングは用量を守って正しく

使い分け

Rackに切り出せるものはRackで

ほとんど何でも切り出せますが……

一応、例えばRailsで使えるか?とか意識

たとえばhelperの追加、クラスマクロの追加と
かはregisterでどう?

そもそもそういう機能追加ならSinatraへの依存度
が高いはず、遠慮なくいっとこう

Sinatraをベースに、

use/registerを駆使して、ビュッフェのごとく欲しい
機能を皿に盛ることで、

ウェッブアプリケ~ションができる!

疎結合、スモール、読みやすい、高速

post-Railsなウェブ開発を感じさせてくれます

 

左: Railsを用いたフルスタック開発のイメージ画像
右: Sinatra/RackベースのModularな開発のイメージ画像

cf.

cho45先生の発表

ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく

Sinatra「呼んだ?」

安全: rack-protection とか色々ある
読むコード最小:
sinatra/base.rbは1,646行、いける!(...)

早い: これは自信あるぞ、高速

必要なら最低限自分で書く:
前述した二つのAPIの力で、
簡単な機能を自作するのもやりやすいですね

Sinatra、いい線行ってる

行ってると信じてる

Yet Another Extending


plugin 機構がある
The Plugin Generator allows you to create Padrino projects based on a template file that
contains all the necessary actions needed to create the project. Plugins can also be
executed within an existing Padrino application. The plugin generator provides a simple
DSL in addition with leveraging Thor to make generating projects a breeze!

Generator の内部DSLと同じものを使っている
っぽい。padrino-recipeというところでいくつ

かレシピが公開されている
https://github.com/padrino/padrino-recipes/tree/master/plugins
Pull request welcome!

こんな感じですね

Rack/Sinatra/Padrinoエコシステム

成長中と信じてる
英語圏、けっこう便利Rackミドルウェア~や
Sinatra拡張が多い印象
日本語情報もどんどん増やそう!

悲しいお知らせの例

一つのヒント

rack-contrib

https://github.com/rack/rack-contrib

sinatra-contrib

https://github.com/sinatra/sinatra-contrib

padrino-contrib

https://github.com/padrino/padrino-contrib

上記リポジトリでやりたいことはできないか?

上記リポジトリに入っているライブラリは、gemで簡単に利用できる

英語も含めてちゃんとググったか?
いたずらな車輪の再発明より、あるものを使う、あるものにリ
ソースを集中させる方を個人的にすすめて行きたい

そうして、コミュニティが徐々にできていくのでは

何か目的があって車輪を発明することを咎めるわけではない

最後にPadrinoとSinatraの関係に
ついて言っとくか

PadrinoはSinatraなしでは存在し得ない

PadrinoはSinatraを便利にする道具の一つです

なので、Sinatraをリプレースするものとか
じゃないですね。誤解しないでね~。
協力し、Rails組との抗争に打ち勝とう!

@rails

総括

Sinatra is a fun!

Padrino helps you a lot!

どんどん使って、どんどん貢献していきま
しょう(特に Padrino はまだ若いです)

__END__

ご清聴ありがとうございました

misc

今日の資料、と言うかコピペ向けコード

https://gist.github.com/1302918

スライドシェッア~予定地

http://www.slideshare.net/udzura/startpadrino

Sign up to vote on this title
UsefulNot useful