Wider than rails
Upcoming SlideShare
Loading in...5

Wider than rails






Total Views
Views on SlideShare
Embed Views



10 Embeds 753

http://dou.ua 629
http://www.svitla.com 81
https://twitter.com 18
http://fromperm.ru 9
http://example.com 4
http://a0.twimg.com 4
http://subscribe.ru 3
http://douua.org 3 1 1



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.

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

Wider than rails Wider than rails Presentation Transcript

  • Wider Than Rails: Lightweight Ruby Solutions Alexey Nayden, EvilMartians.com RubyC 2011суббота, 5 ноября 11 г.
  • Lightweight != Fast Lightweight ≈ Simpleсуббота, 5 ноября 11 г.
  • Less code = Easier to maintain = (often) Fasterсуббота, 5 ноября 11 г. View slide
  • Motives to travel light • Production performance • Complexity overhead • Learning curve • More flexibility • Self-improvementсуббота, 5 ноября 11 г. View slide
  • Do you always need all $  ls of that? app/ config/ db/ doc/ Gemfile lib/ log public/ Rakefile README script/ spec/ test/ tmp/ vendor/ www/ Gemfile.lock .rspec config.ruсуббота, 5 ноября 11 г.
  • Do you always need all $  ls of that? app/ config/ db/ doc/ Gemfile lib/ log public/ Rakefile README script/ spec/ test/ tmp/ vendor/ www/ Gemfile.lock .rspec config.ruсуббота, 5 ноября 11 г.
  • Lightweight plan • Replace components of your framework • Inject lightweight tools • Migrate to a different platform • Dont forget to be consistentсуббота, 5 ноября 11 г.
  • ActiveRecord? Sequel! • http://sequel.rubyforge.org • Sequel is a gem providing both raw SQL and neat ORM interfaces • 18 DBMS support out of the box • 25—50% faster than ActiveRecord • 100% ActiveModel compliantсуббота, 5 ноября 11 г.
  • Sequel ORM class UsersController < ApplicationController before_filter :find_user, :except => [:create] def create @user = User.new(params[:user]) end protected def find_user @user = User[params[:id]] end endсуббота, 5 ноября 11 г.
  • Sequel Model class User < Sequel::Model one_to_many :comments subset(:active){comments_count > 20} plugin :validation_helpers def validate super validates_presence [:email, :name] validates_unique :email validates_integer :age if new? end def before_create self.created_at ||= Time.now # however theres a plugin super # for timestamping end endсуббота, 5 ноября 11 г.
  • Raw SQL DB.fetch("SELECT * FROM albums WHERE name LIKE :pattern", :pattern=>A%) do |row| puts row[:name] end DB.run "CREATE TABLE albums (id integer primary key, name varchar(255))" db(:legacy).fetch(" SELECT (SELECT count(*) FROM activities WHERE ACTION = logged_in AND DATE(created_at) BETWEEN DATE(:start) AND DATE(:end) ) AS login_count, (SELECT count(*) FROM users WHERE (DATE(created_at) BETWEEN DATE(:start) AND DATE(:end)) AND (activated_at IS NOT NULL) ) AS user_count", :start => start_date, :end => end_date)суббота, 5 ноября 11 г.
  • Benchmarksсуббота, 5 ноября 11 г.
  • Clean frontend with Zepto.js • http://zeptojs.com • JS framework for with a jQ-compatible syntax and API • Perfect for rich mobile (esp. iOS) web-apps, but works in any modern browser except IE • 7.5 Kb at the moment (vs. 31 Kb jQ) • Officially — beta, but used at mobile version of Groupon production-readyсуббота, 5 ноября 11 г.
  • Good old $ $(p>span).html(Hello, RubyC).css(color:red); Well-known syntax $(p).bind(click, function(){ $(span, this).css(color:red); }); Touch UI? No problem! $(some selector).tap(function(){ ... }); $(some selector).doubleTap(function(){ ... }); $(some selector).swipeRight(function(){ ... }); $(some selector).pinch(function(){ ... });суббота, 5 ноября 11 г.
  • Xtra Xtra Small: Rack • Rack is a specification of a minimal Ruby API that models HTTP • One might say Rack is a CGI in a Ruby world • Only connects a webserver with your «app» (actually it can be just a lambda!)суббота, 5 ноября 11 г.
  • Rack • You need to have an object with a method call(env) • It should return an array with 3 elements [status_code, headers, body] • So now you can connect it with any webserver that supports Rack require ‘thin’ Rack::Handler::Thin.run(app, :Port => 4000) • Lightweight webapp completedсуббота, 5 ноября 11 г.
  • Rack App Example class ServerLoad def call(env) [200, {"Content-Type" => "text/plain"}, ["uptime | cut -f 11 -d "]] end endсуббота, 5 ноября 11 г.
  • Metal. Rack on Rails • ActionController::Metal is a way to get a valid Rack app from a controller • A bit more comfortable dealing with Rack inside Rails • You still can include any parts of ActionController stack inside your metal controller • Great for API`sсуббота, 5 ноября 11 г.
  • Metallic API class ApiController < ActionController::Metal include AbstractController::Callbacks include ActionController::Helpers include Devise::Controllers::Helpers before_filter :require_current_user def history content_type = "application/json" recipient = User.find(params[:user_id]) messages = Message.between(current_user, recipient) if params[:start_date] response_body = messages.after(params[:start_date]).to_json else response_body = messages.recent.to_json end end endсуббота, 5 ноября 11 г.
  • Sinatra • Sinatra should be considered as a compact framework (however they prefer calling it DSL) replacing ActionController and router • You still can include ActiveRecord, ActiveSupport or on the other side — include Sinatra app inside Rails app • But you can also go light with Sequel / DataMapper and plaintext / XML / JSON outputсуббота, 5 ноября 11 г.
  • Sinatra require rubygems require sinatra get / do haml :index end post /signup do Spam.deliver(params[:email]) end mime :json, application/json get /events/recent.json do content_type :json Event.recent.to_json endсуббота, 5 ноября 11 г.
  • Padrino. DSL evolves to a framework • http://www.padrinorb.com/ • Based on a Sinatra and brings LIKE-A-BOSS comfort to a Sinatra development process • Fully supports 6 ORMs, 5 JS libs, 2 rendering engines, 6 test frameworks, 2 stylesheet engines and 2 mocking libs out of the box • Still remains quick and simpleсуббота, 5 ноября 11 г.
  • Padrino blog $ padrino g project sample_blog -t shoulda -e haml -c sass -s jquery -d activerecord -b class SampleBlog < Padrino::Application register Padrino::Helpers register Padrino::Mailer register SassInitializer get "/" do "Hello World!" end get :about, :map => /about_us do render :haml, "%p This is a sample blog" end endсуббота, 5 ноября 11 г.
  • Posts controller SampleBlog.controllers :posts do get :index, :provides => [:html, :rss, :atom] do @posts = Post.all(:order => created_at desc) render posts/index end get :show, :with => :id do @post = Post.find_by_id(params[:id]) render posts/show end endсуббота, 5 ноября 11 г.
  • A little bit of useless benchmarking • We take almost plain «Hello World» application and run ab  -­‐c  10  -­‐n  1000 • rack  1200  rps • sinatra  600  rps • padrino  570  rps • rails  140  rpsсуббота, 5 ноября 11 г.
  • Tools They dont need to be huge and slowсуббота, 5 ноября 11 г.
  • Pow • http://pow.cx/ • A 37signals Rack-based webserver for developer needs • One-line installer, unobtrusive, fast and only serves web-apps, nothing else • cd  ~/.pow ln  -­‐s  /path/to/appсуббота, 5 ноября 11 г.
  • rbenv • https://github.com/sstephenson/rbenv • Small, quick, doesnt modify shell commands, UNIX-way • rbenv  global  1.9.2-­‐p290 cd  /path/to/app rbenv  local  jruby-­‐1.6.4суббота, 5 ноября 11 г.
  • One more thing...суббота, 5 ноября 11 г.
  • Ruby is not a silver bullet You should always consider different platforms and languages: Erlang, Scala, .NET and even C++суббота, 5 ноября 11 г.
  • Ruby is not a silver bullet You should always consider different platforms and languages: Erlang, Scala, .NET and even C++ Dont miss Timothy Tsvetkovs speech tomorrowсуббота, 5 ноября 11 г.
  • Questions? alexey.nayden@evilmartians.comсуббота, 5 ноября 11 г.