Ruby off Rails (japanese)

8,190 views
8,053 views

Published on

Web applications development with Ruby (but without Rails)

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,190
On SlideShare
0
From Embeds
0
Number of Embeds
115
Actions
Shares
0
Downloads
24
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Ruby off Rails (japanese)

  1. 1. Ruby off Rails by Stoyan Zhekov Kyoto, 17-May-2008
  2. 2. 自己紹介 ● 名前: ストヤン ジェコフ ● ブルガリア人 ● 3人男の子のパパ
  3. 3. 内容 ● Coupling and Cohesion ● ウェブアプリに必要なこと ● ORM - Sequel (簡単な見解) ● Ruby ウェブエボリューション ● Enter Rack - The Middle Man ● Thin, Ramaze, Tamanegi ● まとめ, その他, 質問 08/05/19 3
  4. 4. 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
  5. 5. Coupling and Cohesion (2) 正しいウェブアプリの組み立て方 ● High cohesion – 少ない動作でたかい機能性 ● Low (loosely) coupling – 簡単な入れ替え 08/05/19 5
  6. 6. Coupling and Cohesion (3) Google vs Amazon 08/05/19 6
  7. 7. Coupling and Cohesion (5) VS 08/05/19 7
  8. 8. Railsについて 08/05/19 8
  9. 9. Ruby on Rails ● 全部セットでよかった。しかし、今は? ● Convention over configuration – いいのか? ● DRY – 可能? – Generators – Plugins – Libraries 08/05/19 9
  10. 10. Railsなしの人生 できる? 08/05/19 10
  11. 11. ウェブアプリに必要なこと ● データベースの使い方: ORM ● Request手順: CGI env, アップロード ● ルーティング: URLとクラスの組み合わせ ● Rendering (views): rendering libraries ● Sessions: persist objects or data 08/05/19 11
  12. 12. Database ORM ● Active Record ?= ActiveRecord ● ActiveRecord – たくさんの問題点 – http://datamapper.org/why.html ● Data Mapper – 早いけどまだ未完 – まだコンポジットキーなし – 自分のDBドライバーが必要 ● Sequel – よし。気に入ってる。 08/05/19 12
  13. 13. ORM – Sequel (なぜ?) ● Pure Ruby ● Thread safe ● Connection pooling ● DB queries構築のためのDSL ● ObjectとDBレコードの組み合わせの軽いORM ● Transactions with rollback 08/05/19 13
  14. 14. 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
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. Evolution 08/05/19 18
  19. 19. Ruby Web Evolution Webrick Mongrel Event Thin Ebb Machine 08/05/19 19
  20. 20. Thin ウェブサーバー ● 早い – Ragel and Event Machine ● クラスタリング ● Unix sockets - nginx ● Rack-based – Rails, Ramaze etc. ● Rackup ファイルサポート (後で) 08/05/19 20
  21. 21. 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
  22. 22. 問題点 Merb Ramaze Sinatra ... How to connect them? CGI Webrick Mongrel Thin 08/05/19 22
  23. 23. ソリューション - Rack Merb Ramaze Sinatra ... Rack – The Middle Man CGI Webrick Mongrel Thin 08/05/19 23
  24. 24. Rackって何? 08/05/19 24
  25. 25. Rackって何なの? http://rack.rubyforge.org/ By Christian Neukirchen 08/05/19 25
  26. 26. 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
  27. 27. これが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
  28. 28. Free Hugs http://www.freehugscampaign.org/ 08/05/19 28
  29. 29. Hugs ウェブアプリ (1) p 'Hug!' 08/05/19 29
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. Rack Middleware 自分のuse Rack::「...」 ブロックを作れる? class RackMiddlewareExample def initialize app @app = app end def call env @app.call(env) end end 08/05/19 33
  34. 34. ウェブアプリに必要なこと ● データベースの使い方(ORM): Sequel ● Request手順: Rack::Request(env) ● ルーティング: Rack 'map' and 'run' ● Rendering/views: Tenjin, Amrita2 ● Sessions: Rack::Session 08/05/19 34
  35. 35. Does it scale? 08/05/19 35
  36. 36. 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
  37. 37. Hugs サービス ● rackup -s webrick -p 3000 hugs.ru ● thin start --servers 3 -p 3000 -R hugs.ru ● SCGI ● FastCGI ● Litespeed ● .... 08/05/19 37
  38. 38. 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
  39. 39. 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
  40. 40. Ramaze ● 何?: モジュラーウェブアプリ フレームワーク ● どこで?: http://ramaze.net/ ● どうやって?: gem install ramaze ● git clone http://github.com/manveru/ramaze.git ● 誰が?: Michael Fellinger and Co. 08/05/19 40
  41. 41. なぜ Ramaze? ● モジュラー (low [loosely] coupling) ● Rack-based ● 簡単な使い方 ● たくさんの例 (~25) – facebook, rapaste ● フリースタイルな開発 ● フレンドリーなコミュ - #ramaze ● “All bugs are fixed within 48 hours of reporting.” 08/05/19 41
  42. 42. Deployment オプションズ ● CGI ● Ebb ● FastCGI ● Evented Mongrel ● LiteSpeed ● Swiftiplied Mongrel ● Mongrel ● Thin ● SCGI ● Rack-basedなら使える ● Webrick 08/05/19 42
  43. 43. Templating engines ● Amrita2 ● RedCloth ● Builder ● Remarkably ● Erubis ● Sass ● Ezamar ● Tagz ● Haml ● Tenjin ● Liquid ● XSLT ● Markaby 08/05/19 43
  44. 44. Ezamar 08/05/19 44
  45. 45. 本当に簡単? %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
  46. 46. Ramaze使い方 class SmileyController < Ramaze::Controller map '/smile' helper :smiley def index smiley(':)') end end 08/05/19 46
  47. 47. 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
  48. 48. 他のStack ● ORM – Sequel ● ウェブサーバー – Thin + NginX ● Rack Middleware ● Ramaze フレームワーク ● Templates – HAML, Tenjin, Amrita2 08/05/19 48
  49. 49. まとめ ● Railsを使うなとは言いません ● オープンマインドで ● SequelはORMに適している ● Rackを使え! – DIY framework, DIY server ● Ramazeはかっこよくて、使いやすい! 08/05/19 49

×