Upload
fabio-akita
View
1.902
Download
0
Embed Size (px)
DESCRIPTION
Palestra de Ruby on Rails que dei no evento ERECOMPI, em Teresina, no Piauí.
Citation preview
Ruby on RailsThursday, June 4, 2009
AkitaOnRails.comslideshare.net/akitaonrails
Thursday, June 4, 2009
2008Thursday, June 4, 2009
2008Thursday, June 4, 2009
13 e 14Outubro
2009Thursday, June 4, 2009
Thursday, June 4, 2009
~108 slides~90 min
Thursday, June 4, 2009
www.slideshare.net/akitaonrails
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
“Especialista em
uma coisa só é um
amador em todo o
resto.”
Thursday, June 4, 2009
Thursday, June 4, 2009
Ruby on Rails 2.3
Ruby 1.8
Novo Ruby 1.9
Thursday, June 4, 2009
Ruby on Rails 2.3
Ruby 1.8
Novo Ruby 1.9
Thursday, June 4, 2009
Ruby on Rails 2.3
Ruby 1.8
Novo Ruby 1.9
Thursday, June 4, 2009
1993
“Matz”
Thursday, June 4, 2009
2001
“Prag Dave”
Thursday, June 4, 2009
2004
“DHH”
Thursday, June 4, 2009
2006
Charles Nutter
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
“Tornar as coisas
simples fáceis e as
coisas complexas
possíveis”
Filosofia Ruby
Thursday, June 4, 2009
Thursday, June 4, 2009
O que dizempor aí ...
Thursday, June 4, 2009
Pouco usado
Thursday, June 4, 2009
Rails não Escala
Thursday, June 4, 2009
Ruby é Lento
Thursday, June 4, 2009
WTF!?
Thursday, June 4, 2009
Pouco usado
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Rails não Escala
Thursday, June 4, 2009
Thursday, June 4, 2009
Para colocar as coisas em perspectiva, o Friendster foi
escrito em Java e eles mudaram para PHP. MySpace foi escrito em ColdFusion e eles mudaram para ASP.NET.
Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a
linguagem é o problema, mas eu acho que isso raramente
é a realidade. Blaine Cook
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
Thursday, June 4, 2009
http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1
“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das
eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.”
Thursday, June 4, 2009
Ruby é Lento
Thursday, June 4, 2009
x mais lento que C++
Thursday, June 4, 2009
0
50
100
150
200
Python 2
Ruby 1.9
Perl
JRuby
Python 3
PHP
Ruby 1.8.6
x mais lento que C++
Thursday, June 4, 2009
Homepage: 331 ms
Thursday, June 4, 2009
Homepage: 331 ms
Total: 5.45 s
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
PHP “puro” 331 req/s
CakePHP 4 a 8 req/s*
Code Igniter 22 a 98 req/s*
Rails (2008) 88 req/s
Thursday, June 4, 2009
PHP “puro” 331 req/s
CakePHP 4 a 8 req/s*
Code Igniter 22 a 98 req/s*
Rails (2008) 88 req/s
Thursday, June 4, 2009
PHP “puro” 331 req/s
CakePHP 4 a 8 req/s*
Code Igniter 22 a 98 req/s*
Rails (2008) 88 req/s
Thursday, June 4, 2009
PHP “puro” 331 req/s
CakePHP 4 a 8 req/s*
Code Igniter 22 a 98 req/s*
Rails (2008) 88 req/s
Thursday, June 4, 2009
Thursday, June 4, 2009
PHP Reload
Java Persistente
Ruby Misto
Thursday, June 4, 2009
PHP Reload
Java Persistente
Ruby Misto
Thursday, June 4, 2009
PHP Reload
Java Persistente
Ruby Misto
Thursday, June 4, 2009
Browser
Rails
Banco de DadosBanco Slave
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Thursday, June 4, 2009
Browser
Rails
Banco de Dados
Banco Slave
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Memcached
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Memcached
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Memcached
Memcached
Thursday, June 4, 2009
Browser
Rails
Banco de Dados Banco Slave
Memcached
Memcached Web Caches
Thursday, June 4, 2009
Performance
!=Escalabilidade
Thursday, June 4, 2009
Performance
Ghz“Vertical”
Thursday, June 4, 2009
Escalabilidade
MultiCore“Horizontal”
Thursday, June 4, 2009
Ruby on Rails
Thursday, June 4, 2009
RUBY
Thursday, June 4, 2009
ActiveSupportRails
RUBY
Thursday, June 4, 2009
ActionPack
ActionController
ActionView
ActiveSupportRails
RUBY
Thursday, June 4, 2009
ActiveRecord
ActionPack
ActionController
ActionView
ActiveSupportRails
RUBY
Thursday, June 4, 2009
ActiveRecord
ActionPack
ActionMailer
ActionController
ActionView
ActiveSupportRails
RUBY
Thursday, June 4, 2009
ActiveRecord
ActionPack
ActiveResource
ActionMailer
ActionController
ActionView
ActiveSupportRails
ActionWebService
RUBY
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
describe Product do include ProductSpecHelper
before(:each) do @product = Product.new end
it "should not be valid when empty" do @product.should_not be_valid end
it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend
RSpec
Thursday, June 4, 2009
describe Product do include ProductSpecHelper
before(:each) do @product = Product.new end
it "should not be valid when empty" do @product.should_not be_valid end
it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend
RSpec
rake spec
Thursday, June 4, 2009
class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category
validates_presence_of :name validates_presence_of :master_price validates_presence_of :description
make_permalink :with => :name, :field => :permalinkend
Model
Thursday, June 4, 2009
class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category
validates_presence_of :name validates_presence_of :master_price validates_presence_of :description
make_permalink :with => :name, :field => :permalinkend
Model
Product.find(1)
Thursday, June 4, 2009
class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end
create.after { self.current_user = @user }
create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end
Controller
Thursday, June 4, 2009
class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end
create.after { self.current_user = @user }
create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end
Controller
/users/1
Thursday, June 4, 2009
<div id="product-listing"> <%= breadcrumbs(@taxon) %> <br/> <%= render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon } %></div>
<% content_for :sidebar do %> <td id="shop-by-col" valign="top"> <%= render :partial => "shared/taxonomies" %> </td><% end %>
<%= render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty? %>
Views ERB
Thursday, June 4, 2009
#product-listing =breadcrumbs(@taxon) %br =render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon}
-content_for :sidebar do %td#shop-by-col(:valign => "top") =render :partial => "shared/taxonomies" =render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty?
Views HAML
Thursday, June 4, 2009
ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'
map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]
map.namespace :admin do |admin| admin.resources :users admin.resources :products endend
Rotas RESTFul
Thursday, June 4, 2009
ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'
map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]
map.namespace :admin do |admin| admin.resources :users admin.resources :products endend
Rotas RESTFul
GET /products/newGET /productsPOST /productsGET /products/1GET /products/1/editPUT /products/1DESTROY /products/1
Thursday, June 4, 2009
class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end
def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend
Migrations
Thursday, June 4, 2009
class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end
def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend
Migrations
rake db:migrate
Thursday, June 4, 2009
“Beautiful Code”
Thursday, June 4, 2009
//$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $package org.jboss.seam.example.booking;
import java.io.Serializable;import java.math.BigDecimal;import java.text.DateFormat;import java.util.Date;
import javax.persistence.Basic;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;
import org.hibernate.validator.Length;import org.hibernate.validator.NotNull;import org.hibernate.validator.Pattern;import org.jboss.seam.annotations.Name;
@Entity@Name("booking")public class Booking implements Serializable{ private Long id; private User user; private Hotel hotel; private Date checkinDate; private Date checkoutDate; private String creditCard; private String creditCardName; private int creditCardExpiryMonth; private int creditCardExpiryYear; private boolean smoking; private int beds; public Booking() {} public Booking(Hotel hotel, User user) { this.hotel = hotel; this.user = user; }
@Transient public BigDecimal getTotal() { return hotel.getPrice().multiply( new BigDecimal( getNights() ) ); }
@Transient public int getNights() { return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24; }
@Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotNull @Basic @Temporal(TemporalType.DATE) public Date getCheckinDate() { return checkinDate; } public void setCheckinDate(Date datetime) { this.checkinDate = datetime; }
@ManyToOne @NotNull public Hotel getHotel() { return hotel; } public void setHotel(Hotel hotel) { this.hotel = hotel; } @ManyToOne @NotNull public User getUser() { return user; }
Thursday, June 4, 2009
public void setUser(User user) { this.user = user; } @Basic @Temporal(TemporalType.DATE) @NotNull public Date getCheckoutDate() { return checkoutDate; } public void setCheckoutDate(Date checkoutDate) { this.checkoutDate = checkoutDate; } @NotNull(message="Credit card number is required") @Length(min=16, max=16, message="Credit card number must 16 digits long") @Pattern(regex="^\\d*$", message="Credit card number must be numeric") public String getCreditCard() { return creditCard; }
public void setCreditCard(String creditCard) { this.creditCard = creditCard; } @Transient public String getDescription() { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return hotel==null ? null : hotel.getName() + ", " + df.format( getCheckinDate() ) + " to " + df.format( getCheckoutDate() ); }
public boolean isSmoking() { return smoking; }
public void setSmoking(boolean smoking) { this.smoking = smoking; }
public int getBeds() { return beds; }
public void setBeds(int beds) { this.beds = beds; } @NotNull(message="Credit card name is required") @Length(min=3, max=70, message="Credit card name is required") public String getCreditCardName() { return creditCardName; }
public void setCreditCardName(String creditCardName) { this.creditCardName = creditCardName; }
public int getCreditCardExpiryMonth() { return creditCardExpiryMonth; }
public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { this.creditCardExpiryMonth = creditCardExpiryMonth; }
public int getCreditCardExpiryYear() { return creditCardExpiryYear; }
public void setCreditCardExpiryYear(int creditCardExpiryYear) { this.creditCardExpiryYear = creditCardExpiryYear; } @Override public String toString() { return "Booking(" + user + ","+ hotel + ")"; }
}
Thursday, June 4, 2009
class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend
Thursday, June 4, 2009
class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds
t.timestamps end end
def self.down drop_table :bookings endend
Thursday, June 4, 2009
190vs
40
Thursday, June 4, 2009
http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails
“Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante,
facilitou a dificuldade que tinham em manutenção. Uma vez completo e otimizado, o site deles agora é mais rápido que antes. Eles também
finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.”
Thursday, June 4, 2009
Thursday, June 4, 2009
11 mil
classes!
46 só de
coleções!
Thursday, June 4, 2009
• Modules:
• Enumerable
• Comparable
• Classes:
• Array
• Hash
• Set
• Sorted Set
Thursday, June 4, 2009
• Modules:
• Enumerable
• Comparable
• Classes:
• Array
• Hash
• Set
• Sorted Set
1.400
classes
só 6 de
coleções!
Thursday, June 4, 2009
Ferramentas Ágeis
Thursday, June 4, 2009
Gerenciamento
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Repositórios
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Integração Contínua
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Manutenção
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Open Source
Thursday, June 4, 2009
Thursday, June 4, 2009
describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend
Thursday, June 4, 2009
Thursday, June 4, 2009
Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120
Thursday, June 4, 2009
Before do @calc = Calculadora.newend Dado /que eu digitei (\d+) na calculadora/ do |n| @calc.push n.to_iend Quando 'eu aperto o botão de soma' do @result = @calc.somaend Então /o resultado na calculadora deve ser (\d*)/ do |result| @result.should == result.to_iend
Thursday, June 4, 2009
class SignupTest < ActionController::IntegrationTest
def test_trial_account_sign_up visit home_path click_link "Sign up" fill_in "Email", :with => "[email protected]" select "Free account" click_button "Register" end
end
Thursday, June 4, 2009
rspec rspec.info
cucumber cukes.info
shoulda thoughtbot.com/projects/shoulda
webrat github.com/brynary/webrat
integrity integrityapp.com
ZenTest zenspider.com
Thursday, June 4, 2009
• plugins de Active Record
• plugins de Views
• plugins de Localização
• CMS
• Parsers
• Autenticadores/Autorizadores
Thursday, June 4, 2009
Comunidade
Thursday, June 4, 2009
Geoffrey
peepcode.com
Thursday, June 4, 2009
Jason e Gregg
railsenvy.com
Thursday, June 4, 2009
Ryan Bates
railscasts.com
Thursday, June 4, 2009
Pratik Naik
guias.rubyonrails.pro.br
Thursday, June 4, 2009
Satish Talim
rubylearning.org
Thursday, June 4, 2009
Peter Cooper
rubyinside.com.br
Thursday, June 4, 2009
_why
why.nomedojogo.com
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Thursday, June 4, 2009
Uma pulga ...
Thursday, June 4, 2009
Standish Group - CHAOS Report 2009
Thursday, June 4, 2009
Sucesso32%
Fracasso Médio44%
Fracasso Total24%
Standish Group - CHAOS Report 2009
Thursday, June 4, 2009
Winston W. Royce - 1970
Thursday, June 4, 2009
“Eu acredito neste conceito mas a implementação descrita acima é arriscada
e convida falhas.”
Winston W. Royce - 1970
Thursday, June 4, 2009
“Eu acredito neste conceito mas a implementação descrita acima é arriscada
e convida falhas.”
Winston W. Royce - 1970
Thursday, June 4, 2009
“Eu acredito neste conceito mas a implementação descrita acima é arriscada
e convida falhas.”
Winston W. Royce - 1970
Thursday, June 4, 2009
Insanidade
Thursday, June 4, 2009
“Querer resultados
melhores fazendo a
mesma coisa.”
Thursday, June 4, 2009
“Think Different”
Thursday, June 4, 2009
“Think Different”
Thursday, June 4, 2009
Obrigado!akitaonrails.com
Thursday, June 4, 2009