Your SlideShare is downloading. ×
0
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Ruby off Rails---rack, sinatra and sequel
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Ruby off Rails---rack, sinatra and sequel

11,183

Published on

A presentation on Shanghai on Rails, March 14 2009, includes rack middelware introduction, one-file application using sinatra and sequel, and sinatra program running under Rails Metal.

A presentation on Shanghai on Rails, March 14 2009, includes rack middelware introduction, one-file application using sinatra and sequel, and sinatra program running under Rails Metal.

Published in: Technology
1 Comment
10 Likes
Statistics
Notes
  • The production benchmark is in the under link, wish you know Chinese to understand it better.
    http://masterwujiang.javaeye.com/blog/349203
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
11,183
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
157
Comments
1
Likes
10
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Ruby off Rails Rack, Sinatra and Sequel Jiang Wu 2009.3.14
  • 2. Outline <ul><li>Rack </li></ul><ul><li>Sinatra </li></ul><ul><li>Sequel </li></ul><ul><li>Ruby off Rails </li></ul><ul><li>Rails Metal: A way of fusion </li></ul>
  • 3. rack http://rack.rubyforge.net/ Rack aims to provide a minimal API for connecting web servers and web frameworks.
  • 4. Rack SPEC {&quot;HTTP_USER_AGENT&quot;=>&quot;curl/7.12.2 ...&quot;, &quot;REQUEST_URI&quot;=>&quot;http://ruby-lang.org/&quot;, &quot;QUERY_STRING&quot;=>&quot;&quot;, &quot;HTTP_ACCEPT&quot;=>&quot;*/*&quot;, &quot;REQUEST_METHOD&quot;=>&quot;GET&quot;, &quot;rack.input&quot; => '...', ... } call(env) [status, headers, body] to_i each each [String,String] String yields yields
  • 5. Rack middleware: process RESP RESP RESP Rack Middleware 1 Rack Middleware 3 Rack Middleware 2
  • 6. A rack middleware can do: <ul><li>Do nothing (usually after a condition judgment) </li></ul><ul><li>Response directly </li></ul><ul><li>Alter environment variables </li></ul><ul><li>Alter response(body, headers and status code) </li></ul>
  • 7. Write your own rack middleware <ul><li>nothing.ru </li></ul><ul><li>middleware do nothing </li></ul><ul><li>calc_time.ru </li></ul><ul><li>add response time to body </li></ul><ul><li>method_override.ru </li></ul><ul><li>alter HTTP method </li></ul>
  • 8. sinatra http://www.sinatrarb.com/
  • 9. sinatra program: infinity.rb <ul><li>1 require 'rubygems' </li></ul><ul><li>2 require 'sinatra' </li></ul><ul><li>  3 </li></ul><ul><li>  4 use Rack::CommonLogger </li></ul><ul><li>  5 use Rack::ShowExceptions </li></ul><ul><li>  6 </li></ul><ul><li>  7 get '/' do </li></ul><ul><li>  8   &quot;Hello, Sinatra&quot; </li></ul><ul><li>  9 end </li></ul><ul><li>10 </li></ul><ul><li>11 get '/version' do </li></ul><ul><li>12   &quot;infinity 0.1&quot; </li></ul><ul><li>13 end </li></ul><ul><li>14 </li></ul><ul><li>15 get '/version/last' do </li></ul><ul><li>16   &quot;infinity beta 0.13&quot; </li></ul><ul><li>17 end </li></ul>
  • 10. sequel The Database Toolkit for Ruby sequel postgres://localhost/blog Your database is stored in DB... >> DB.tables => [:blogs, :tags] >> require 'logger' >> DB.logger = Logger.new(STDOUT) >> DB[:tags].filter(:count > 100).order( :name.desc).limit(5).all INFO -- : SELECT * FROM &quot;tags&quot; WHERE (&quot;count&quot; > 150) ORDER BY &quot;name&quot; DESC LIMIT 5 >> class Tag < Sequel::Model;end >> Tag.filter(:count > 150).order(:name.desc).limit(5).all
  • 11. sinatra + sequel: a simple note ruby notes.rb Just ONE file to run!
  • 12. Ruby off Rails <ul><li>jquery vs. prototype.js </li></ul><ul><li>jquery UI vs. script.aculo.us </li></ul><ul><li>extlib vs. ActiveSupport </li></ul><ul><li>sequel vs. ActiveRecord </li></ul><ul><li>sinatra vs. ActionPack </li></ul><ul><li>pony vs. ActionMailer </li></ul><ul><li>rest-client vs. ActiveResource </li></ul>
  • 13. Off Rails if you ... <ul><li>Hate the namespace pollution </li></ul><ul><ul><li>Prototype.js </li></ul></ul><ul><ul><li>ActiveSupport </li></ul></ul><ul><ul><li>ActiveRecord pollutes collection </li></ul></ul><ul><li>Want to use a dispatcher based on URL </li></ul><ul><li>Hate the constraints </li></ul><ul><ul><li>Constraint of program structure </li></ul></ul><ul><ul><li>Constraint of table structure </li></ul></ul><ul><ul><li>Constraint of URL structure </li></ul></ul><ul><li>Want to speed up </li></ul><ul><ul><li>Speed up upload </li></ul></ul><ul><ul><li>Speed up performance </li></ul></ul><ul><ul><li>Speed up test performance </li></ul></ul>
  • 14. On Rails if you ... <ul><li>Need mature plug-ins </li></ul><ul><li>Need write-through cache(with support from Cache-money) </li></ul><ul><li>Need existing view helpers </li></ul><ul><li>Need help from community </li></ul>
  • 15. Rails metal: new in 2.3 <ul><li>If you have a Rails application that has service end </li></ul><ul><li>points that need to be really, really fast. So fast that </li></ul><ul><li>the few milliseconds that a trip through the Rails router </li></ul><ul><li>and Action Controller path is too much. </li></ul><ul><li>For this scenario, we’ve built a thin wrapper around </li></ul><ul><li>the generic Rack middleware and given it a place in </li></ul><ul><li>the hierarchy along with the name “ Metal ” . </li></ul><ul><li>Introducing Rails Metal </li></ul><ul><li>—— DHH </li></ul>
  • 16. Rails Metal: the code <ul><li>“Hello World” Metal: </li></ul><ul><li>class Poller < Rails::Rack::Metal </li></ul><ul><li>def call(env) </li></ul><ul><li>if env[&quot;PATH_INFO&quot;] =~ /^/poller/ </li></ul><ul><li>[200, {&quot;Content-Type&quot; => &quot;text/html&quot;}, &quot;Hello, World!&quot;] </li></ul><ul><li>else </li></ul><ul><li>[404, {&quot;Content-Type&quot; => &quot;text/html&quot;}, &quot;Not Found&quot;] </li></ul><ul><li>end </li></ul><ul><li>end </li></ul><ul><li>end </li></ul><ul><li>“ Hello World” controller: </li></ul><ul><li>class OldPollerController < ApplicationController </li></ul><ul><li>def poller </li></ul><ul><li>render :text => &quot;Hello World!&quot; </li></ul><ul><li>end </li></ul><ul><li>end </li></ul>
  • 17. Rails Metal and sinatra <ul><li>1 require 'sinatra/base' </li></ul><ul><li>2 </li></ul><ul><li>3 class Hello < Sinatra::Base </li></ul><ul><li>4 # all options are available for the setting: </li></ul><ul><li>5 enable :static, :session </li></ul><ul><li>6 set :root, File.dirname(__FILE__) </li></ul><ul><li>7 </li></ul><ul><li>8 # each subclass has its own private middleware stack: </li></ul><ul><li>9 #use Rack::Deflater </li></ul><ul><li>10 </li></ul><ul><li>11 get '/sinatra' do </li></ul><ul><li>12 &quot;Hello, sinatra&quot; </li></ul><ul><li>13 end </li></ul><ul><li>14 end </li></ul>
  • 18. Speed contrast: sequel and metal <ul><li>Ubuntu 8.04, Intel Atom N270 @1.60GHz, 100 requests, </li></ul><ul><li>development mode </li></ul><ul><li>Traditional Rails MVC </li></ul><ul><li>Requests per second: 16.69 [#/sec] (mean) </li></ul><ul><li>Time per request: 59.923 [ms] (mean) </li></ul><ul><li>Rails Metal </li></ul><ul><li>Requests per second: 71.78 [#/sec] (mean) </li></ul><ul><li>Time per request: 13.932 [ms] (mean) </li></ul><ul><li>Sinatra standalone ( 3 times of Rails Metal! ) </li></ul><ul><li>Requests per second: 208.39 [#/sec] (mean) </li></ul><ul><li>Time per request: 4.799 [ms] (mean) </li></ul>
  • 19. Questions?
  • 20. Thank you! <ul><li>http://masterwujiang.javaeye.com/ </li></ul><ul><li>my blog (Chinese only) </li></ul><ul><li>http://github.com/nouse/ruby-off-rails/tree/master </li></ul><ul><li>whole ruby files running in this presentation </li></ul><ul><li>Jiang Wu </li></ul><ul><li>Shanghai on Rails </li></ul><ul><li>2009.3.14 </li></ul>

×