Ruby off Rails (japanese)
Upcoming SlideShare
Loading in...5
×
 

Ruby off Rails (japanese)

on

  • 10,359 views

Web applications development with Ruby (but without Rails)

Web applications development with Ruby (but without Rails)

Statistics

Views

Total Views
10,359
Views on SlideShare
10,284
Embed Views
75

Actions

Likes
4
Downloads
22
Comments
0

7 Embeds 75

http://hdknr.posterous.com 54
http://www.slideshare.net 13
https://twitter.com 4
http://www.soup.io 1
http://74.125.153.132 1
http://s.deeeki.com 1
http://localhost 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Ruby off Rails (japanese) Ruby off Rails (japanese) Presentation Transcript

  • Ruby off Rails by Stoyan Zhekov Kyoto, 17-May-2008
  • 自己紹介 ● 名前: ストヤン ジェコフ ● ブルガリア人 ● 3人男の子のパパ
  • 内容 ● Coupling and Cohesion ● ウェブアプリに必要なこと ● ORM - Sequel (簡単な見解) ● Ruby ウェブエボリューション ● Enter Rack - The Middle Man ● Thin, Ramaze, Tamanegi ● まとめ, その他, 質問 08/05/19 3
  • Coupling and Cohesion (1) ● Cohesion - 凝集度 (ぎょうしゅうど) http://en.wikipedia.org/wiki/Cohesion_(computer_science) ● Coupling - 結合度 (けつごうど) http://en.wikipedia.org/wiki/Coupling_(computer_science) 08/05/19 4
  • Coupling and Cohesion (2) 正しいウェブアプリの組み立て方 ● High cohesion – 少ない動作でたかい機能性 ● Low (loosely) coupling – 簡単な入れ替え 08/05/19 5
  • Coupling and Cohesion (3) Google vs Amazon 08/05/19 6
  • Coupling and Cohesion (5) VS 08/05/19 7
  • Railsについて 08/05/19 8
  • Ruby on Rails ● 全部セットでよかった。しかし、今は? ● Convention over configuration – いいのか? ● DRY – 可能? – Generators – Plugins – Libraries 08/05/19 9
  • Railsなしの人生 できる? 08/05/19 10
  • ウェブアプリに必要なこと ● データベースの使い方: ORM ● Request手順: CGI env, アップロード ● ルーティング: URLとクラスの組み合わせ ● Rendering (views): rendering libraries ● Sessions: persist objects or data 08/05/19 11
  • Database ORM ● Active Record ?= ActiveRecord ● ActiveRecord – たくさんの問題点 – http://datamapper.org/why.html ● Data Mapper – 早いけどまだ未完 – まだコンポジットキーなし – 自分のDBドライバーが必要 ● Sequel – よし。気に入ってる。 08/05/19 12
  • ORM – Sequel (なぜ?) ● Pure Ruby ● Thread safe ● Connection pooling ● DB queries構築のためのDSL ● ObjectとDBレコードの組み合わせの軽いORM ● Transactions with rollback 08/05/19 13
  • ORM – Sequel (Core) ● データベースのつなげ方 require 'sequel' DB = Sequel.open 'sqlite:///blog.db' DB = Sequel.open 'postgres://cico:12345@localhost:5432/mydb' DB = Sequel.open(quot;postgres://postgres:postgres@localhost/my_dbquot;, :max_connections => 10, :logger => Logger.new('log/db.log')) 08/05/19 14
  • ORM – Sequel (Core, 2) DB << quot;CREATE TABLE users (name VARCHAR(255) NOT NULL)quot; DB.fetch(quot;SELECT name FROM usersquot;) do |row| p r[:name] end dataset = DB[:managers].where(:salary => 50..100).order(:name, :department) paginated = dataset.paginate(1, 10) # first page, 10 rows per page paginated.page_count #=> number of pages in dataset paginated.current_page #=> 1 08/05/19 15
  • ORM – Sequel (Model) class Post < Sequel::Model(:my_posts) set_primary_key [:category, :title] belongs_to :author has_many :comments has_and_belongs_to_many :tags after_create do set(:created_at => Time.now) end end 08/05/19 16
  • ORM – Sequel (Model, 2) class Person < Sequel::Model has_many :posts, :eager=>[:tags] set_schema do primary_key :id text :name text :email foreign_key :team_id, :table => :teams end end 08/05/19 17
  • Evolution 08/05/19 18
  • Ruby Web Evolution Webrick Mongrel Event Thin Ebb Machine 08/05/19 19
  • Thin ウェブサーバー ● 早い – Ragel and Event Machine ● クラスタリング ● Unix sockets - nginx ● Rack-based – Rails, Ramaze etc. ● Rackup ファイルサポート (後で) 08/05/19 20
  • Thin + Nginx thin start --servers 3 --socket /tmp/thin thin start --servers 3 --port 3000 # nginx.conf upstream backend { fair; server unix:/tmp/thin.0.sock; server unix:/tmp/thin.1.sock; server unix:/tmp/thin.2.sock; } 08/05/19 21
  • 問題点 Merb Ramaze Sinatra ... How to connect them? CGI Webrick Mongrel Thin 08/05/19 22
  • ソリューション - Rack Merb Ramaze Sinatra ... Rack – The Middle Man CGI Webrick Mongrel Thin 08/05/19 23
  • Rackって何? 08/05/19 24
  • Rackって何なの? http://rack.rubyforge.org/ By Christian Neukirchen 08/05/19 25
  • Rackって何? ● HTTPっぽいもののRuby APIのための簡単な仕様 (とその実装) – Request -> Response ● callメソッドを持ち、envを受け取り以下を返すよう なオブジェクト: – a status, i.e. 200 – the headers, i.e. {‘Content-Type’ => ‘text/html’} – an object that responds to each: ‘some string’ 08/05/19 26
  • これがRackだ! class RackApp def call(env) [ 200, {quot;Content-Typequot; => quot;text/plainquot;}, quot;Hi!quot;] end end app = RackApp.new 08/05/19 27
  • Free Hugs http://www.freehugscampaign.org/ 08/05/19 28
  • Hugs ウェブアプリ (1) p 'Hug!' 08/05/19 29
  • ruby hugs.rb %w(rubygems rack).each { |dep| require dep } class HugsApp def call(env) [ 200, {quot;Content-Typequot; => quot;text/plainquot;}, quot;Hug!quot;] end end Rack::Handler::Mongrel.run(HugsApp.new, :Port => 3000) 08/05/19 30
  • Rack::Builder require 'hugs' app = Rack::Builder.new { use Rack::Static, :urls => [quot;/cssquot;, quot;/imagesquot;], :root => quot;publicquot; use Rack::CommonLogger use Rack::ShowExceptions map quot;/quot; do run lambda { [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hi!quot;]] } end map quot;/hugquot; do run HugsApp.new end } Rack::Handler::Thin.run app, :Port => 3000 08/05/19 31
  • Rack Building Blocks ● request = Rack::Request.new(env) – request.get? ● response = Rack::Response.new('Hi!') – response.set_cookie('sess-id', 'abcde') ● Rack::URLMap ● Rack::Session ● Rack::Auth::Basic ● Rack::File 08/05/19 32
  • Rack Middleware 自分のuse Rack::「...」 ブロックを作れる? class RackMiddlewareExample def initialize app @app = app end def call env @app.call(env) end end 08/05/19 33
  • ウェブアプリに必要なこと ● データベースの使い方(ORM): Sequel ● Request手順: Rack::Request(env) ● ルーティング: Rack 'map' and 'run' ● Rendering/views: Tenjin, Amrita2 ● Sessions: Rack::Session 08/05/19 34
  • Does it scale? 08/05/19 35
  • rackup hugs.ru require 'hugs' app = Rack::Builder.new { use Rack::Static, :urls => [quot;/cssquot;, quot;/imagesquot;], :root => quot;publicquot; map quot;/quot; do run lambda { [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hi!quot;]] } end map quot;/hugquot; do run HugsApp.new end } Rack::Handler::Thin.run app, :Port => 3000 08/05/19 36
  • Hugs サービス ● rackup -s webrick -p 3000 hugs.ru ● thin start --servers 3 -p 3000 -R hugs.ru ● SCGI ● FastCGI ● Litespeed ● .... 08/05/19 37
  • Rack-based フレームワークス ● Invisible – thin-based フレームワーク in 35 LOC – http://github.com/macournoyer/invisible/ ● Coset – REST on Rack ● Halcyon – JSON Server Framework ● Merb ● Sinatra ● Ramaze ● Rails !? 08/05/19 38
  • RailsにもRackが必要 ● RailsはRackをすでに持っている、しかし: – raw req -> rack env -> Rack::Request ->CGIWrapper -> CgiRequest ● Ezra Zygmuntowicz (merb)'s repo on github – http://github.com/ezmobius/rails – raw req -> rack env -> ActionController::RackRequest – ./script/rackup -s thin -c 5 -e production 08/05/19 39
  • Ramaze ● 何?: モジュラーウェブアプリ フレームワーク ● どこで?: http://ramaze.net/ ● どうやって?: gem install ramaze ● git clone http://github.com/manveru/ramaze.git ● 誰が?: Michael Fellinger and Co. 08/05/19 40
  • なぜ Ramaze? ● モジュラー (low [loosely] coupling) ● Rack-based ● 簡単な使い方 ● たくさんの例 (~25) – facebook, rapaste ● フリースタイルな開発 ● フレンドリーなコミュ - #ramaze ● “All bugs are fixed within 48 hours of reporting.” 08/05/19 41
  • Deployment オプションズ ● CGI ● Ebb ● FastCGI ● Evented Mongrel ● LiteSpeed ● Swiftiplied Mongrel ● Mongrel ● Thin ● SCGI ● Rack-basedなら使える ● Webrick 08/05/19 42
  • Templating engines ● Amrita2 ● RedCloth ● Builder ● Remarkably ● Erubis ● Sass ● Ezamar ● Tagz ● Haml ● Tenjin ● Liquid ● XSLT ● Markaby 08/05/19 43
  • Ezamar 08/05/19 44
  • 本当に簡単? %w(rubygems ramaze).each {|dep| require dep} class MainController < Ramaze::Controller def index; quot;Hiquot; end end class HugsController < Ramaze::Controller map '/hug' def index; quot;Hug!quot; end end Ramaze.start :adapter => :thin, :port => 3000 08/05/19 45
  • Ramaze使い方 class SmileyController < Ramaze::Controller map '/smile' helper :smiley def index smiley(':)') end end 08/05/19 46
  • Ramaze 使い方 (2) module Ramaze module Helper module SmileyHelper FACES = { ':)' => '/images/smile.png', ';)' => '/images/twink.png'} REGEXP = Regexp.union(*FACES.keys) def smiley(string) string.gsub(REGEXP) { FACES[$1] } end end end end 08/05/19 47
  • 他のStack ● ORM – Sequel ● ウェブサーバー – Thin + NginX ● Rack Middleware ● Ramaze フレームワーク ● Templates – HAML, Tenjin, Amrita2 08/05/19 48
  • まとめ ● Railsを使うなとは言いません ● オープンマインドで ● SequelはORMに適している ● Rackを使え! – DIY framework, DIY server ● Ramazeはかっこよくて、使いやすい! 08/05/19 49