はじめる! RubyでWeb開発

~ loop { @sinatra += 1 } ~

Uchio Kondo
.rb勉強会 @ 2011-12-20
於 Jelly Jelly Cafe

自己紹介

Uchio Kondo(@udzura)

http://udzura.jp & http://blog.udzura.jp

Works:

Padrino framework contributor & evangelist(?

kaminari gem collaborator(sinatra周り)

rspec-padrino / rack-block / rack-session-dbm

微妙なウェッブサービス(未完成ばかり

Interest:

Ruby/Sinatra/TDD/Agile/non-blocking IO/Haskell...

るびま

Sinatra 再入門、 Padrino / Rack / その先の何か

http://jp.rubyist.net/magazine/?0036-SinatraReintroduction

今日

Rubyでのウェッブ開発の話をします

緩い感じでやりたいです

途中で高ぶる or 感極まるかもしれません

ところで

みなさん、
なぜ Ruby をやろうと思いましたか?

ぶっちゃけ

Rails???

ですよね~

すいません

今日は、Rubyでのウェブ開発と言っても

もっと広い話

Sinatra入門

みたいなことを話したい

Railsのことも少し触れますよ~

disりません

Rubyのウェッブフレームワーク

Ruby on Rails

Merb

Ramaze

Camping

Sinatra

Padrino

Cramp

Renee

などなど………

Rackという「規格」がある

Ruby on Rails

Merb

Ramaze

Camping

Sinatra

Padrino

(Cramp)

Renee

などなど………

Rackはアプリケーションフレーム
ワークと、サーバ実装を繋ぐ

Ruby on Rails

Merb

Ramaze

Camping

Sinatra

Padrino

(Cramp)

Renee

などなど………

Apache
(mod_rails)

NginX
● Webrick
● Unicorn
● Thin
● FastCGI

Rackの仕組みが共通なので

ミドルウェアが使いまわせる

Rackの条件に沿った実装をすれば、どんなフレーム
ワークでも特定の機能/「関心事」を同じような手順
で組み込める

統一的なデプロイ手順が実現できる

ディレクトリ構成、設定ファイル(config.ru)が統一

herokuやdotcloudのような仕組みが実現しやすい

→ただの「オレオレ」じゃない、
再利用性の高いフレームワークが作成できる

cf. ほかの言語

Ruby – Rack

Python – WSGI(本家)

Perl – PSGI/Plack

HaskellとかCommon Lispにもあるらしい

Javaは、、、

PHPは、、、

さて、

少し脇道にそれて、

Ruby のウェッブフレームワークの進化の歴史

第1期:フルスタック

Rails(1.x, 2.xの初期)

ウェブに必要な機能がほぼ全部入っている

重い、大きい

“Rail” から外れたことをしようとすると大変だっ
たりする

第2期:マイクロフレームワーク

Sinatra

軽量

最低限の機能(ルーティングとわずかなテンプ
レートヘルパー、設定のためのDSL)

欲しい機能がない場合が多かった

車輪の自作

第3期

Modularity+Agnosticism
「最低限の機能」の上に、その時作りたいもの
に必要な機能を盛り付けていく

柔軟性、「必要なものを必要なだけ」

Rails 3 以降、そして Padrino が相当

「ビュッフェスタイル」の開発

より先発

Rails 1.x
Rails 2.x

Full-stack

Sinatra
Camping
Renee

Microframework

より後発

(Merb)
Rails 3.x ~
Padrino

Modular &
Agnostic

そして、右に行くほど
「Rack」の仕組みの理解が重要になってくる

Remember the Rack

疎結合

可搬性

Rackで実現できること

セッションの実装

リライト

認証(Basic/Digest)

キャッシュ

ソーシャルな認証

画像変換

ロギング

ReCaptchaの利用

セキュリティの向上

Deflate

検索ボット対策

ロック

ガラケー対応

などなど……

モジュラーでアグノスティックとは

Rack Middleware

 +

各フレームワークでの拡張機構

(Rails plugins, Sinatra/Padrino Extensions)

を組み合わせ、必要な機能を必要なだけ再利用
&実装したアプリケーションを作るということ
最小の工数で最大の効果!

閑話休題

Ruby + Webをはじめよう

まずは、動かすところから始めるといいと思う

動かないとつまんないし

理論だけでもつまんないし

でも、「Rackの感じ」がつかめるとなお良い

あなたと、

Sinatra

Simple

You may know:
require 'sinatra'
get '/' do
'My way!'
end

Sinatraはマイクロだけれど
ちゃんとしている

拡張のための機構がある

→ Padrino への道続き

軽量、サクサク

Rack自体にはしっかり準拠(Rackの上の薄い
レイヤー)しているので、Rack Middlewareな
どの挙動の理解がわかりやすい

Railsに比べたメリット

軽量(大事なことなので二回)

学習コストが小さい

コードベース小さいので、何がどうなっている
か分かる

最悪 1,500 行程度を頑張って読めばすべてが
理解できる(...)

rack    => 1193.26 rps
camping => 897.41  rps
sinatra => 603.23  rps
padrino => 570.75  rps
merb    => 367.69  rps
ramaze  => 248.59  rps
rails   => 139.62  rps
https://github.com/DAddYE/web-frameworks-benchmark

上記の特徴のおかげで、
リードタイムも短くなる

動かしてみよう
require 'sinatra'
get '/' do
'My way!'
end
get '/:name' do
params[:name] + '\'s way!'
end

$ ruby app.rb

Hello, world

レイアウトを追加しよう
require 'sinatra'
require 'haml'
get '/' do
'My way!'
end
get '/:name' do
@name = params[:name]
haml :hello
end
__END__
@@ layout
!!! 5
%html
%head
%title Hello Sinatra
%body
= yield
@@ hello
%h1= "Hello, #{@name}"
%p
= @name
's Way!

$ gem install haml

hamlも簡単!

認証機能をつけてみよう
require 'sinatra/base'
require 'haml'
class App < Sinatra::Base
use Rack::Auth::Basic do |user, pass|
user == 'udzura' && pass == 'XXXX'
end
enable :inline_templates
get '/' do
'My way!'
end
get '/:name' do
@name = params[:name]
haml :hello
end
end
App.run!

__END__
@@ layout
!!! 5
%html
%head
%title Hello Sinatra
%body
= yield
@@ hello
%h1= "Hello, #{@name}"
%p
= @name
's Way!

Basic認証も簡単!

これがRack Middlewareです

use Rack::Auth::Basic do |user, pass|
user == 'udzura' && pass == 'XXXX'
end

怪しい図解
Rack Application




Server

Rack::Auth::Basic

Rack::Request
(リクエスト情報のハッシュ)

App

認証OK?
処理

(レスポンス情報の配列)

Rack::Response

デプロイについて

Herokuが何だかんだで楽

ほんのちょっとだけgitなのじゃ……
$ heroku create
$ git add . && git commit -m 'init'
$ git push heroku master

Dotcloud, fluxflex, etc...
もちろんApache2+Passenger, NginX+unicornなどを
セットアップする方法もあります。昔に比べれば凄く
楽になったのよ…

Sinatraをもっと!

WEB+DB PRESS vol. 57

Ruby in your hands – Sinatra

日本語+紙媒体では一番良い資料だと思う

Sinatra – Up and Running

The first Sinatra book in the world

Alan Harris
(各言語のProシリーズ, というかC#ハッカーらしい)

Konstantin Haase
(@rkh, currently Sinatra's main commiter)

英書

邦訳マダー or やりますよ……(

Sinatraの先へ

Webの情報で、もっといろいろいじくる

@ruedup さん (HerokuでWebアプリ開発を始めるなら知ってお
きたい10のこと)
( http://d.hatena.ne.jp/ruedap/20110509)

素直にRails

Many many documents

新進気鋭Padrino(hot!)

Sinatraのノウハウそのままに大規模アプリへ

Railsにも慣れるかも

ジェネレータ、ActiveRecord、テスト……

Padrinoも面白いです[PR]

公式チュートリアル

blog.udzura.jp - Padrino+MongoDB+Heroku

(http://blog.udzura.jp/2011/02/23/app-in-5-min-with-padrinomongodb-heroku/)

るびま

(http://jp.padrinorb.com/guides/blog-tutorial)

(http://jp.rubyist.net/magazine/?0036-SinatraReintroduction)

書籍?ねえよ! 出てくるといいですね

Railsは…たくさん本があるし……

一冊と言われれば

Ruby/Sinatra/Rackを一通りいじった上で、上記を必
要に応じて使えば、+webの解説ぐらいでやりたい
ことが出来ると思う

まとめ

いきなりRails、もいいけどまずは
「全体の地図」を把握しよう

「モダンなCGI」たるRackの機構をつかもう

Sinatraは高速だし、結構使えるんですよ…

Enjoy Ruby & Enjoy Programming!

Thanks

@aereal 氏のスライド

http://speakerdeck.com/u/aereal/p/the-brief-seeds-of-padrino

必読(英語です)

WAF歴史3層説をパクり参考にしました

__END__

ご清聴ありがとうございました
各種書籍持ってきているので一緒に見てみま
しょう

Sign up to vote on this title
UsefulNot useful