SlideShare a Scribd company logo
1 of 179
Download to read offline
A apresentação já vai começar ...




Saturday, April 10, 2010
Ruby on Rails
Saturday, April 10, 2010
AkitaOnRails.com




Saturday, April 10, 2010
~ 50 min
                           ~ 110 slides



Saturday, April 10, 2010
www.slideshare.net/akitaonrails
                           fabioakita@gmail.com




Saturday, April 10, 2010
Saturday, April 10, 2010
Ruby on Rails               2.3.x
       Ruby on Rails              3.0-pre
                           Ruby    1.8.x
                           Ruby    1.9.x
Saturday, April 10, 2010
Ruby on Rails               2.3.x
       Ruby on Rails              3.0-pre
                           Ruby    1.8.x
                           Ruby    1.9.x
Saturday, April 10, 2010
Ruby on Rails               2.3.x
       Ruby on Rails              3.0-pre
                           Ruby    1.8.x
                           Ruby    1.9.x
Saturday, April 10, 2010
Ruby on Rails               2.3.x
       Ruby on Rails              3.0-pre
                           Ruby    1.8.x
                           Ruby    1.9.x
Saturday, April 10, 2010
“Matz”




                           1993
Saturday, April 10, 2010
Saturday, April 10, 2010
“DHH”


                           2004
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Charles Nutter



                            2006
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
“Tornar as coisas
                  simples fáceis e as
                  coisas complexas
                      possíveis”
                           Filoso a Ruby

Saturday, April 10, 2010
Saturday, April 10, 2010
Código que gera Código

           Convention over Con guration

                           “Don’t Repeat Yourself”

                           Extreme Programming
Saturday, April 10, 2010
Código que gera Código

           Convention over Con guration

                           “Don’t Repeat Yourself”

                           Extreme Programming
Saturday, April 10, 2010
Código que gera Código

           Convention over Con guration

                           “Don’t Repeat Yourself”

                           Extreme Programming
Saturday, April 10, 2010
Código que gera Código

           Convention over Con guration

                           “Don’t Repeat Yourself”

                           Extreme Programming
Saturday, April 10, 2010
Restful Resources

                      Unicode, Time Zone, i18n

                                Segurança
                           (XSS, CSRF, Injection)

Saturday, April 10, 2010
Restful Resources

                      Unicode, Time Zone, i18n

                                Segurança
                           (XSS, CSRF, Injection)

Saturday, April 10, 2010
Restful Resources

                      Unicode, Time Zone, i18n

                                Segurança
                           (XSS, CSRF, Injection)

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Templates           ERB, HAML


                               HTTP Basic, HTTP Digest,
            Autenticação          Authlogic, Devise

                              MySQL, PostgreSQL, Oracle,
       Bancos de Dados           MongoDB, CouchDB

                              ActiveRecord, DataMapper,
                       ORMs     MongoMapper, Sequel

                                  Prototype, jQuery,
                 Javascript          SproutCore

                                  Apache 2, NginX,
              Web Servers         Lighty, Litespeed

Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Model
   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 => :permalink
   end




Saturday, April 10, 2010
Views ERB
   <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? %>



Saturday, April 10, 2010
Controller
    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


Saturday, April 10, 2010
“Beautiful Code”


Saturday, April 10, 2010
@Transient
                                                                  public BigDecimal getTotal()
       //$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $      {
       package org.jboss.seam.example.booking;                       return hotel.getPrice().multiply( new BigDecimal( getNights() ) );
                                                                  }
       import   java.io.Serializable;
       import   java.math.BigDecimal;                             @Transient
       import   java.text.DateFormat;                             public int getNights()
       import   java.util.Date;                                   {
                                                                     return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) /
       import   javax.persistence.Basic;                       1000 / 60 / 60 / 24;
       import   javax.persistence.Entity;                         }
       import   javax.persistence.GeneratedValue;
       import   javax.persistence.Id;                             @Id @GeneratedValue
       import   javax.persistence.ManyToOne;                      public Long getId()
       import   javax.persistence.Temporal;                       {
       import   javax.persistence.TemporalType;                      return id;
       import   javax.persistence.Transient;                      }
                                                                  public void setId(Long id)
       import   org.hibernate.validator.Length;                   {
       import   org.hibernate.validator.NotNull;                     this.id = id;
       import   org.hibernate.validator.Pattern;                  }
       import   org.jboss.seam.annotations.Name;
                                                                  @NotNull
       @Entity                                                    @Basic @Temporal(TemporalType.DATE)
       @Name("booking")                                           public Date getCheckinDate()
       public class Booking implements Serializable               {
       {                                                             return checkinDate;
          private Long id;                                        }
          private User user;                                      public void setCheckinDate(Date datetime)
          private Hotel hotel;                                    {
          private Date checkinDate;                                  this.checkinDate = datetime;
          private Date checkoutDate;                              }
          private String creditCard;
          private String creditCardName;                          @ManyToOne @NotNull
          private int creditCardExpiryMonth;                      public Hotel getHotel()
          private int creditCardExpiryYear;                       {
          private boolean smoking;                                   return hotel;
          private int beds;                                       }
                                                                  public void setHotel(Hotel hotel)
          public Booking() {}                                     {
                                                                     this.hotel = hotel;
          public Booking(Hotel hotel, User user)                  }
          {
             this.hotel = hotel;                                  @ManyToOne @NotNull
             this.user = user;                                    public User getUser()
          }                                                       {
                                                                     return user;
                                                                  }

Saturday, April 10, 2010
public int getBeds()
  public void setUser(User user)
                                                                                  {
  {
                                                                                     return beds;
     this.user = user;
                                                                                  }
  }

                                                                                  public void setBeds(int beds)
  @Basic @Temporal(TemporalType.DATE)
                                                                                  {
  @NotNull
                                                                                     this.beds = beds;
  public Date getCheckoutDate()
                                                                                  }
  {
                                                                                  @NotNull(message="Credit card name is required")
     return checkoutDate;
                                                                                  @Length(min=3, max=70, message="Credit card name is required")
  }
                                                                                  public String getCreditCardName()
  public void setCheckoutDate(Date checkoutDate)
                                                                                  {
  {
                                                                                     return creditCardName;
     this.checkoutDate = checkoutDate;
                                                                                  }
  }

                                                                                  public void setCreditCardName(String creditCardName)
  @NotNull(message="Credit card number is required")
                                                                                  {
  @Length(min=16, max=16, message="Credit card number must 16 digits long")
                                                                                     this.creditCardName = creditCardName;
  @Pattern(regex="^d*$", message="Credit card number must be numeric")
                                                                                  }
  public String getCreditCard()
  {
                                                                                  public int getCreditCardExpiryMonth()
     return creditCard;
                                                                                  {
  }
                                                                                     return creditCardExpiryMonth;
                                                                                  }
  public void setCreditCard(String creditCard)
  {
                                                                                  public void setCreditCardExpiryMonth(int creditCardExpiryMonth)
     this.creditCard = creditCard;
                                                                                  {
  }
                                                                                     this.creditCardExpiryMonth = creditCardExpiryMonth;
                                                                                  }
  @Transient
  public String getDescription()
                                                                                  public int getCreditCardExpiryYear()
  {
                                                                                  {
     DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
                                                                                     return creditCardExpiryYear;
     return hotel==null ? null : hotel.getName() +
                                                                                  }
           ", " + df.format( getCheckinDate() ) +
           " to " + df.format( getCheckoutDate() );
                                                                                  public void setCreditCardExpiryYear(int creditCardExpiryYear)
  }
                                                                                  {
                                                                                     this.creditCardExpiryYear = creditCardExpiryYear;
  public boolean isSmoking()
                                                                                  }
  {
     return smoking;
                                                                                  @Override
  }
                                                                                  public String toString()
                                                                                  {
  public void setSmoking(boolean smoking)
                                                                                     return "Booking(" + user + ","+ hotel + ")";
  {
                                                                                  }
     this.smoking = smoking;
  }
                                                                              }


Saturday, April 10, 2010
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})"
                end
              end
Saturday, April 10, 2010
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})"
                end
              end
Saturday, April 10, 2010
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
                             end
                           end

Saturday, April 10, 2010
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
                             end
                           end

Saturday, April 10, 2010
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
                             end
                           end

Saturday, April 10, 2010
190
                           vs
                           40


Saturday, April 10, 2010
Saturday, April 10, 2010
“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 di culdade que tinham em
               manutenção. Eles também nalizaram a reescrita do sistema
             em apenas 3 meses com 4 desenvolvedores. Uma vez completo
                  e otimizado, o site deles agora é mais rápido que antes.”


                           http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Saturday, April 10, 2010
“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 di culdade que tinham em
               manutenção. Eles também nalizaram a reescrita do sistema
             em apenas 3 meses com 4 desenvolvedores. Uma vez completo
                  e otimizado, o site deles agora é mais rápido que antes.”


                           http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Saturday, April 10, 2010
“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 di culdade que tinham em
               manutenção. Eles também nalizaram a reescrita do sistema
             em apenas 3 meses com 4 desenvolvedores. Uma vez completo
                  e otimizado, o site deles agora é mais rápido que antes.”


                           http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Saturday, April 10, 2010
“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 di culdade que tinham em
               manutenção. Eles também nalizaram a reescrita do sistema
             em apenas 3 meses com 4 desenvolvedores. Uma vez completo
                  e otimizado, o site deles agora é mais rápido que antes.”


                           http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails




Saturday, April 10, 2010
Ferramentas


Saturday, April 10, 2010
Gitorious
        Repositórios
                                 Github
        Integração              Integrity
        Contínua           Cruise Control
                                   Chef
        Deployment
                                 Puppet

        Monitoramento          New Relic
Saturday, April 10, 2010
Gitorious
        Repositórios
                                 Github
        Integração              Integrity
        Contínua           Cruise Control
                                   Chef
        Deployment
                                 Puppet

        Monitoramento          New Relic
Saturday, April 10, 2010
Gitorious
        Repositórios
                                 Github
        Integração              Integrity
        Contínua           Cruise Control
                                   Chef
        Deployment
                                 Puppet

        Monitoramento          New Relic
Saturday, April 10, 2010
Gitorious
        Repositórios
                                 Github
        Integração              Integrity
        Contínua           Cruise Control
                                   Chef
        Deployment
                                 Puppet

        Monitoramento          New Relic
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Comunidade


Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
O que dizem
                             por aí ...


Saturday, April 10, 2010
Ruby é Lento


Saturday, April 10, 2010
Existem mentiras,
              mentiras malditas e
                 estatísticas.

Saturday, April 10, 2010
Existem mentiras,
              mentiras malditas e
                 estatísticas.

Saturday, April 10, 2010
Existem mentiras,
              mentiras malditas e
                 estatísticas.

Saturday, April 10, 2010
Saturday, April 10, 2010
x mais lento que C++




Saturday, April 10, 2010
x mais lento que C++


                           0   32.5             65           97.5   130

  Python 2


   Ruby 1.9


       JRuby


         Perl


   Python 3


          PHP


     Ruby 1.8




Saturday, April 10, 2010
Homepage: 331 ms




Saturday, April 10, 2010
Homepage: 331 ms

                           Total: 5.45 s

Saturday, April 10, 2010
Saturday, April 10, 2010
Performance
                                 !=
                           Escalabilidade

Saturday, April 10, 2010
Rails não Escala


Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Blaine Cook

                           http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter


Saturday, April 10, 2010
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.




                                                                                Blaine Cook

                           http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter


Saturday, April 10, 2010
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


Saturday, April 10, 2010
“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.”



                           http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1




Saturday, April 10, 2010
“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.”



                           http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1




Saturday, April 10, 2010
Browser




                           Web Server




                            MySQL




Saturday, April 10, 2010
Browser


                                        Varnish/HAProxy


                           Web Server




                            MySQL




Saturday, April 10, 2010
Browser


                                        Varnish/HAProxy


                           Web Server


                                          Memcached


                            MySQL




Saturday, April 10, 2010
Browser


                                         Varnish/HAProxy


                           Web Server


                                           Memcached


                            MySQL

                                        CouchDB/MongoDB




Saturday, April 10, 2010
Saturday, April 10, 2010
Outros Mitos?


Saturday, April 10, 2010
Saturday, April 10, 2010
Mais Produtivo

                            “Melhor”

                           Anti-legado
Saturday, April 10, 2010
Sempre se Lembre




              Poderíamos contratar um Macaco Treinado
                      para fazer seu Trabalho!
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Agilidade


Saturday, April 10, 2010
Saturday, April 10, 2010
“Rápido”



                           Metodologias

Saturday, April 10, 2010
“Rápido”



                           Metodologias

Saturday, April 10, 2010
“Rápido”



                           Metodologias

Saturday, April 10, 2010
Saturday, April 10, 2010
Robert C. Martin


Saturday, April 10, 2010
Saturday, April 10, 2010
Código Limpo


Saturday, April 10, 2010
Saturday, April 10, 2010
Test Driven
                           Development


Saturday, April 10, 2010
Saturday, April 10, 2010
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
            end
          end


Saturday, April 10, 2010
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
            end
          end


Saturday, April 10, 2010
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
            end
          end


Saturday, April 10, 2010
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
            end
          end


Saturday, April 10, 2010
Saturday, April 10, 2010
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




Saturday, April 10, 2010
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




Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Não é mais
                           demorado?


Saturday, April 10, 2010
Produtividade
                           Cowboy    Profissional




Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
 Saturday, April 10, 2010
Saturday, April 10, 2010
237 Equipes
                     137 Finalizadas


Saturday, April 10, 2010
Saturday, April 10, 2010
Empreendedorismo

                           Código e “Forma”

                       Ciclo de Vida de Projetos

                    Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo

                           Código e “Forma”

                       Ciclo de Vida de Projetos

                    Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo

                           Código e “Forma”

                       Ciclo de Vida de Projetos

                    Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo

                           Código e “Forma”

                       Ciclo de Vida de Projetos

                    Comunidade Open Source
Saturday, April 10, 2010
Pro ssionalismo


Saturday, April 10, 2010
Obrigado!
                           akitaonrails.com

Saturday, April 10, 2010

More Related Content

Similar to Edted 2010 Ruby on Rails

Open End To End Js Stack
Open End To End Js StackOpen End To End Js Stack
Open End To End Js Stack
Skills Matter
 

Similar to Edted 2010 Ruby on Rails (20)

Persistence Smoothie: Blending SQL and NoSQL (RubyNation Edition)
Persistence  Smoothie: Blending SQL and NoSQL (RubyNation Edition)Persistence  Smoothie: Blending SQL and NoSQL (RubyNation Edition)
Persistence Smoothie: Blending SQL and NoSQL (RubyNation Edition)
 
QueryPath: It's like PHP jQuery in Drupal!
QueryPath: It's like PHP jQuery in Drupal!QueryPath: It's like PHP jQuery in Drupal!
QueryPath: It's like PHP jQuery in Drupal!
 
BRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQLBRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQL
 
Open End To End Js Stack
Open End To End Js StackOpen End To End Js Stack
Open End To End Js Stack
 
IronRuby - Fosdem 2010
IronRuby - Fosdem 2010IronRuby - Fosdem 2010
IronRuby - Fosdem 2010
 
Web Development With Ruby - From Simple To Complex
Web Development With Ruby - From Simple To ComplexWeb Development With Ruby - From Simple To Complex
Web Development With Ruby - From Simple To Complex
 
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
 
Caelum dicas web 2010
Caelum dicas web 2010Caelum dicas web 2010
Caelum dicas web 2010
 
Red Dirt Ruby Conference
Red Dirt Ruby ConferenceRed Dirt Ruby Conference
Red Dirt Ruby Conference
 
node.js for front-end developers
node.js for front-end developersnode.js for front-end developers
node.js for front-end developers
 
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
 
Opscode Lightning Talk - Operations as Code
Opscode Lightning Talk - Operations as CodeOpscode Lightning Talk - Operations as Code
Opscode Lightning Talk - Operations as Code
 
Stay Out Please
Stay Out PleaseStay Out Please
Stay Out Please
 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design Patterns
 
Synchronizing Core Data With Rails
Synchronizing Core Data With RailsSynchronizing Core Data With Rails
Synchronizing Core Data With Rails
 
Operations as Code
Operations as CodeOperations as Code
Operations as Code
 
Building Brilliant APIs
Building Brilliant APIsBuilding Brilliant APIs
Building Brilliant APIs
 
Introduction to node.js by Ran Mizrahi @ Reversim Summit
Introduction to node.js by Ran Mizrahi @ Reversim SummitIntroduction to node.js by Ran Mizrahi @ Reversim Summit
Introduction to node.js by Ran Mizrahi @ Reversim Summit
 
App Engine Meetup
App Engine MeetupApp Engine Meetup
App Engine Meetup
 
Not Only Drupal
Not Only DrupalNot Only Drupal
Not Only Drupal
 

More from Fabio Akita

More from Fabio Akita (20)

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São Carlos
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about Languages
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SP
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter Goiania
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7Masters
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TI
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening Keynote
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - AP
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech Day
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização Prematura
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 

Edted 2010 Ruby on Rails

  • 1. A apresentação já vai começar ... Saturday, April 10, 2010
  • 2. Ruby on Rails Saturday, April 10, 2010
  • 4. ~ 50 min ~ 110 slides Saturday, April 10, 2010
  • 5. www.slideshare.net/akitaonrails fabioakita@gmail.com Saturday, April 10, 2010
  • 7. Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, April 10, 2010
  • 8. Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, April 10, 2010
  • 9. Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, April 10, 2010
  • 10. Ruby on Rails 2.3.x Ruby on Rails 3.0-pre Ruby 1.8.x Ruby 1.9.x Saturday, April 10, 2010
  • 11. “Matz” 1993 Saturday, April 10, 2010
  • 13. “DHH” 2004 Saturday, April 10, 2010
  • 19. Charles Nutter 2006 Saturday, April 10, 2010
  • 22. “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filoso a Ruby Saturday, April 10, 2010
  • 24. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming Saturday, April 10, 2010
  • 25. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming Saturday, April 10, 2010
  • 26. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming Saturday, April 10, 2010
  • 27. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming Saturday, April 10, 2010
  • 28. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, April 10, 2010
  • 29. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, April 10, 2010
  • 30. Restful Resources Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection) Saturday, April 10, 2010
  • 31. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 32. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 33. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 34. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 35. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 36. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação Authlogic, Devise MySQL, PostgreSQL, Oracle, Bancos de Dados MongoDB, CouchDB ActiveRecord, DataMapper, ORMs MongoMapper, Sequel Prototype, jQuery, Javascript SproutCore Apache 2, NginX, Web Servers Lighty, Litespeed Saturday, April 10, 2010
  • 53. Model 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 => :permalink end Saturday, April 10, 2010
  • 54. Views ERB <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? %> Saturday, April 10, 2010
  • 55. Controller 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 Saturday, April 10, 2010
  • 57. @Transient public BigDecimal getTotal() //$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $ { package org.jboss.seam.example.booking; return hotel.getPrice().multiply( new BigDecimal( getNights() ) ); } import java.io.Serializable; import java.math.BigDecimal; @Transient import java.text.DateFormat; public int getNights() import java.util.Date; { return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / import javax.persistence.Basic; 1000 / 60 / 60 / 24; import javax.persistence.Entity; } import javax.persistence.GeneratedValue; import javax.persistence.Id; @Id @GeneratedValue import javax.persistence.ManyToOne; public Long getId() import javax.persistence.Temporal; { import javax.persistence.TemporalType; return id; import javax.persistence.Transient; } public void setId(Long id) import org.hibernate.validator.Length; { import org.hibernate.validator.NotNull; this.id = id; import org.hibernate.validator.Pattern; } import org.jboss.seam.annotations.Name; @NotNull @Entity @Basic @Temporal(TemporalType.DATE) @Name("booking") public Date getCheckinDate() public class Booking implements Serializable { { return checkinDate; private Long id; } private User user; public void setCheckinDate(Date datetime) private Hotel hotel; { private Date checkinDate; this.checkinDate = datetime; private Date checkoutDate; } private String creditCard; private String creditCardName; @ManyToOne @NotNull private int creditCardExpiryMonth; public Hotel getHotel() private int creditCardExpiryYear; { private boolean smoking; return hotel; private int beds; } public void setHotel(Hotel hotel) public Booking() {} { this.hotel = hotel; public Booking(Hotel hotel, User user) } { this.hotel = hotel; @ManyToOne @NotNull this.user = user; public User getUser() } { return user; } Saturday, April 10, 2010
  • 58. public int getBeds() public void setUser(User user) { { return beds; this.user = user; } } public void setBeds(int beds) @Basic @Temporal(TemporalType.DATE) { @NotNull this.beds = beds; public Date getCheckoutDate() } { @NotNull(message="Credit card name is required") return checkoutDate; @Length(min=3, max=70, message="Credit card name is required") } public String getCreditCardName() public void setCheckoutDate(Date checkoutDate) { { return creditCardName; this.checkoutDate = checkoutDate; } } public void setCreditCardName(String creditCardName) @NotNull(message="Credit card number is required") { @Length(min=16, max=16, message="Credit card number must 16 digits long") this.creditCardName = creditCardName; @Pattern(regex="^d*$", message="Credit card number must be numeric") } public String getCreditCard() { public int getCreditCardExpiryMonth() return creditCard; { } return creditCardExpiryMonth; } public void setCreditCard(String creditCard) { public void setCreditCardExpiryMonth(int creditCardExpiryMonth) this.creditCard = creditCard; { } this.creditCardExpiryMonth = creditCardExpiryMonth; } @Transient public String getDescription() public int getCreditCardExpiryYear() { { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return creditCardExpiryYear; return hotel==null ? null : hotel.getName() + } ", " + df.format( getCheckinDate() ) + " to " + df.format( getCheckoutDate() ); public void setCreditCardExpiryYear(int creditCardExpiryYear) } { this.creditCardExpiryYear = creditCardExpiryYear; public boolean isSmoking() } { return smoking; @Override } public String toString() { public void setSmoking(boolean smoking) return "Booking(" + user + ","+ hotel + ")"; { } this.smoking = smoking; } } Saturday, April 10, 2010
  • 59. 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})" end end Saturday, April 10, 2010
  • 60. 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})" end end Saturday, April 10, 2010
  • 61. 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 end end Saturday, April 10, 2010
  • 62. 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 end end Saturday, April 10, 2010
  • 63. 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 end end Saturday, April 10, 2010
  • 64. 190 vs 40 Saturday, April 10, 2010
  • 66. “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 di culdade que tinham em manutenção. Eles também nalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Saturday, April 10, 2010
  • 67. “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 di culdade que tinham em manutenção. Eles também nalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Saturday, April 10, 2010
  • 68. “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 di culdade que tinham em manutenção. Eles também nalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Saturday, April 10, 2010
  • 69. “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 di culdade que tinham em manutenção. Eles também nalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores. Uma vez completo e otimizado, o site deles agora é mais rápido que antes.” http://www.railsonwave.com/railsonwave/2008/6/4/yellowpages-com-migrates-to-rails Saturday, April 10, 2010
  • 71. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, April 10, 2010
  • 72. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, April 10, 2010
  • 73. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, April 10, 2010
  • 74. Gitorious Repositórios Github Integração Integrity Contínua Cruise Control Chef Deployment Puppet Monitoramento New Relic Saturday, April 10, 2010
  • 106. O que dizem por aí ... Saturday, April 10, 2010
  • 107. Ruby é Lento Saturday, April 10, 2010
  • 108. Existem mentiras, mentiras malditas e estatísticas. Saturday, April 10, 2010
  • 109. Existem mentiras, mentiras malditas e estatísticas. Saturday, April 10, 2010
  • 110. Existem mentiras, mentiras malditas e estatísticas. Saturday, April 10, 2010
  • 112. x mais lento que C++ Saturday, April 10, 2010
  • 113. x mais lento que C++ 0 32.5 65 97.5 130 Python 2 Ruby 1.9 JRuby Perl Python 3 PHP Ruby 1.8 Saturday, April 10, 2010
  • 114. Homepage: 331 ms Saturday, April 10, 2010
  • 115. Homepage: 331 ms Total: 5.45 s Saturday, April 10, 2010
  • 117. Performance != Escalabilidade Saturday, April 10, 2010
  • 118. Rails não Escala Saturday, April 10, 2010
  • 121. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Saturday, April 10, 2010
  • 122. 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. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter Saturday, April 10, 2010
  • 123. 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 Saturday, April 10, 2010
  • 124. “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.” http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1 Saturday, April 10, 2010
  • 125. “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.” http://www.computerworld.com.au/article/268003/ruby_rails_rolls_into_enterprise?fp=16&fpid=1 Saturday, April 10, 2010
  • 126. Browser Web Server MySQL Saturday, April 10, 2010
  • 127. Browser Varnish/HAProxy Web Server MySQL Saturday, April 10, 2010
  • 128. Browser Varnish/HAProxy Web Server Memcached MySQL Saturday, April 10, 2010
  • 129. Browser Varnish/HAProxy Web Server Memcached MySQL CouchDB/MongoDB Saturday, April 10, 2010
  • 133. Mais Produtivo “Melhor” Anti-legado Saturday, April 10, 2010
  • 134. Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho! Saturday, April 10, 2010
  • 141. “Rápido” Metodologias Saturday, April 10, 2010
  • 142. “Rápido” Metodologias Saturday, April 10, 2010
  • 143. “Rápido” Metodologias Saturday, April 10, 2010
  • 145. Robert C. Martin Saturday, April 10, 2010
  • 149. Test Driven Development Saturday, April 10, 2010
  • 151. 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 end end Saturday, April 10, 2010
  • 152. 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 end end Saturday, April 10, 2010
  • 153. 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 end end Saturday, April 10, 2010
  • 154. 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 end end Saturday, April 10, 2010
  • 156. 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 Saturday, April 10, 2010
  • 157. 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 Saturday, April 10, 2010
  • 160. Não é mais demorado? Saturday, April 10, 2010
  • 161. Produtividade Cowboy Profissional Saturday, April 10, 2010
  • 162. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 163. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 164. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 165. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 166. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 167. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 168. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 169. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 170. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo Saturday, April 10, 2010
  • 172. 237 Equipes 137 Finalizadas Saturday, April 10, 2010
  • 174. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, April 10, 2010
  • 175. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, April 10, 2010
  • 176. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, April 10, 2010
  • 177. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source Saturday, April 10, 2010
  • 179. Obrigado! akitaonrails.com Saturday, April 10, 2010