SlideShare a Scribd company logo
1 of 210
Download to read offline
Ruby on Rails
A apresentação já vai começar ...
Ruby on Rails
AkitaOnRails.com
 @AkitaOnRails
www.slideshare.net/akitaonrails
       boss@akitaonrails.com
Ruby on Rails   2.3.x
Ruby on Rails   3 Beta
    Ruby        1.8.x
    Ruby        1.9.x
Ruby on Rails   2.3.x
Ruby on Rails   3 Beta
    Ruby        1.8.x
    Ruby        1.9.x
Ruby on Rails   2.3.x
Ruby on Rails   3 Beta
    Ruby        1.8.x
    Ruby        1.9.x
Ruby on Rails   2.3.x
Ruby on Rails   3 Beta
    Ruby        1.8.x
    Ruby        1.9.x
“Matz”




1993
Dave Thomas




 2001
“DHH”


2004
Charles Nutter



 2006
JRuby     1.5.x
Rubinius   1.0
IronRuby   1.0
MacRuby    0.6
JRuby     1.5.x
Rubinius   1.0
IronRuby   1.0
MacRuby    0.6
JRuby     1.5.x
Rubinius   1.0
IronRuby   1.0
MacRuby    0.6
JRuby     1.5.x
Rubinius   1.0
IronRuby   1.0
MacRuby    0.6
“Tornar as coisas
simples fáceis e as
coisas complexas
    possíveis”
      Filoso a Ruby
Alan Kay   Dan Ingalls
Eu inventei o
                     termo
             “Orientação a
                Objetos” e
           posso dizer que
               não era C++
              que eu tinha
                em mente.
Alan Kay
Meta Programação
Meta Apresentação
Código que gera Código

Convention over Con guration

   “Don’t Repeat Yourself”

   Extreme Programming
Código que gera Código

Convention over Con guration

   “Don’t Repeat Yourself”

   Extreme Programming
Código que gera Código

Convention over Con guration

   “Don’t Repeat Yourself”

   Extreme Programming
Código que gera Código

Convention over Con guration

   “Don’t Repeat Yourself”

   Extreme Programming
Recursos Restful

Unicode, Time Zone, i18n

      Segurança
 (XSS, CSRF, Injection)
Recursos Restful

Unicode, Time Zone, i18n

      Segurança
 (XSS, CSRF, Injection)
Recursos Restful

Unicode, Time Zone, i18n

      Segurança
 (XSS, CSRF, Injection)
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Templates                        ERB, HAML


                    HTTP Basic, HTTP Digest,
Autenticação                         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
Estrutura de Diretórios Similar
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
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? %>
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
“Beautiful Code”
@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;
                                                           }
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;
}
                                                                            }
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
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
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
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
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
190
vs
40
“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
“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
“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
“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
Ferramentas
Repositórios      Github

Integração       Hudson
Contínua          Cruise
                    Chef
Deployment
                  Puppet

Monitoramento   New Relic
Repositórios      Github

Integração       Hudson
Contínua          Cruise
                    Chef
Deployment
                  Puppet

Monitoramento   New Relic
Repositórios      Github

Integração       Hudson
Contínua          Cruise
                    Chef
Deployment
                  Puppet

Monitoramento   New Relic
Repositórios      Github

Integração       Hudson
Contínua          Cruise
                    Chef
Deployment
                  Puppet

Monitoramento   New Relic
RSpec
                Cucumber
Testes            Shoulda
               Factory Girl
                 Machinist
                Passenger
                  Mongrel
Servidores
                     Thin
             EventMachine
RSpec
                Cucumber
Testes            Shoulda
               Factory Girl
                 Machinist
                Passenger
                  Mongrel
Servidores
                     Thin
             EventMachine
MongoMapper
                 MongoID
NoSQL
                CouchRest
                Cassandra

              Ruby on Rails
Frameworks          Sinatra
Web                   Merb
                 Camping
MongoMapper
                 MongoID
NoSQL
                CouchRest
                Cassandra

              Ruby on Rails
Frameworks          Sinatra
Web                   Merb
                 Camping
Subversion
GIT
Comunidade
rubylearning.org




                   Satish Talim
guides.rubyonrails.org




                     Mike Gunderloy
peepcode.com




               Geoffrey
railscasts.com




                 Ryan Bates
github.com
railsdispatch.com
rubysoc.org
rubyinside.com.br




                    guru-sp.org
plataformatec.com.br
caelum.com.br
egenialsas.com.br
Eventos
oxenterails.com.br
rsrails.com.br
rubyconf.com.br
O que dizem
  por aí ...
Ruby é Lento
Existem mentiras,
mentiras malditas e
   estatísticas.
Existem mentiras,
mentiras malditas e
   estatísticas.
Existem mentiras,
mentiras malditas e
   estatísticas.
x mais lento que C++
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
Homepage: 331 ms
Homepage: 331 ms

Total: 5.45 s
Performance
      !=
Escalabilidade
Entendendo a Web
Dicas sobre Desenvolvimento Web com Ruby




  Sala 41-C às 13h
Rails não Escala
Blaine Cook
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
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
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
“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
“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
Outros Mitos?
Mais Produtivo

  “Melhor”

 Anti-legado
Sempre se Lembre




Poderíamos contratar um Macaco Treinado
        para fazer seu Trabalho!
Agilidade
“Rápido”


Metodologias
“Rápido”


Metodologias
Robert C. Martin
Código Limpo
Test Driven
Development
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
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
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
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
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
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
Não é mais
demorado?
Produtividade
Cowboy    Profissional
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
Produtividade
                                Cowboy                   Profissional

                70.00



                52.50
Produtividade




                35.00



                17.50



                   0
                        1   2     3      4           5          6      7   8
                                             Tempo
237 Equipes
137 Finalizadas
#horaextra
#horaextra
#horaextra
#horaextra
#horaextra
#horaextra




~4 horas/app
Empreendedorismo

   Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source
Empreendedorismo

   Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source
Empreendedorismo

   Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source
Empreendedorismo

   Código e “Forma”

Ciclo de Vida de Projetos

Comunidade Open Source
Pro ssionalismo
Thx!
www.slideshare.net/akitaonrails


       boss@akitaonrails.com

More Related Content

What's hot

Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPACaelum
 
Desenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchDesenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchCampus Party Brasil
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled gardenGuilherme
 

What's hot (7)

Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
jsp-intro
jsp-introjsp-intro
jsp-intro
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPA
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Desenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-TouchDesenvolvendo para iOS com Cocoa-Touch
Desenvolvendo para iOS com Cocoa-Touch
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled garden
 

Viewers also liked

Jasig Rubyon Rails
Jasig Rubyon RailsJasig Rubyon Rails
Jasig Rubyon RailsPaul Pajo
 
An Introduction to Ruby on Rails
An Introduction to Ruby on RailsAn Introduction to Ruby on Rails
An Introduction to Ruby on RailsJoe Fiorini
 
Rails advantages and techniques
Rails advantages and techniquesRails advantages and techniques
Rails advantages and techniquesDefV
 
Background Processing in Ruby on Rails
Background Processing in Ruby on RailsBackground Processing in Ruby on Rails
Background Processing in Ruby on Railsrobmack
 
Beginners' guide to Ruby on Rails
Beginners' guide to Ruby on RailsBeginners' guide to Ruby on Rails
Beginners' guide to Ruby on RailsVictor Porof
 

Viewers also liked (6)

Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Jasig Rubyon Rails
Jasig Rubyon RailsJasig Rubyon Rails
Jasig Rubyon Rails
 
An Introduction to Ruby on Rails
An Introduction to Ruby on RailsAn Introduction to Ruby on Rails
An Introduction to Ruby on Rails
 
Rails advantages and techniques
Rails advantages and techniquesRails advantages and techniques
Rails advantages and techniques
 
Background Processing in Ruby on Rails
Background Processing in Ruby on RailsBackground Processing in Ruby on Rails
Background Processing in Ruby on Rails
 
Beginners' guide to Ruby on Rails
Beginners' guide to Ruby on RailsBeginners' guide to Ruby on Rails
Beginners' guide to Ruby on Rails
 

Similar to Fisl 11 - Ecossistema Ruby on Rails

Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Daniel Lopes
 
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)Daniel Lopes
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )João Moura
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaHenrique Gogó
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyRodrigo Martins
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3David Ruiz
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 

Similar to Fisl 11 - Ecossistema Ruby on Rails (20)

Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)
 
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EE
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
GUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EEGUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EE
 
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
WebSocket com Node.js ( socketstream && coffeescript ) X RoR ( Juggernaut )
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
 
PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha Camarada
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com Ruby
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 

More from Fabio Akita

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São CarlosFabio Akita
 
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 LanguagesFabio Akita
 
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 2018Fabio Akita
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPFabio Akita
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaFabio Akita
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersFabio Akita
 
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 CampinasFabio Akita
 
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 2017Fabio Akita
 
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 RubyFabio Akita
 
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 TIFabio Akita
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening KeynoteFabio Akita
 
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 2017Fabio Akita
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APFabio Akita
 
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 2017Fabio Akita
 
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 2017Fabio Akita
 
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 DayFabio Akita
 
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 2016Fabio Akita
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Fabio Akita
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraFabio Akita
 
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 EvilFabio 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

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 

Recently uploaded (8)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

Fisl 11 - Ecossistema Ruby on Rails

  • 1. Ruby on Rails A apresentação já vai começar ...
  • 2.
  • 3.
  • 6.
  • 7. www.slideshare.net/akitaonrails boss@akitaonrails.com
  • 8.
  • 9. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  • 10. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  • 11. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  • 12. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 22.
  • 23.
  • 24.
  • 25. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  • 26. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  • 27. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  • 28. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  • 29. “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filoso a Ruby
  • 30.
  • 31. Alan Kay Dan Ingalls
  • 32. Eu inventei o termo “Orientação a Objetos” e posso dizer que não era C++ que eu tinha em mente. Alan Kay
  • 35.
  • 36.
  • 37. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  • 38. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  • 39. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  • 40. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  • 41. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  • 42. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  • 43. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  • 44. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 45. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 46. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 47. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 48. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 49. Templates ERB, HAML HTTP Basic, HTTP Digest, Autenticação 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
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 67. 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
  • 68. 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? %>
  • 69. 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
  • 71. @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; }
  • 72. 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; } }
  • 73. 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
  • 74. 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
  • 75. 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
  • 76. 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
  • 77. 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
  • 79.
  • 80. “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
  • 81. “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
  • 82. “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
  • 83. “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
  • 85. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  • 86. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  • 87. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  • 88. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99. RSpec Cucumber Testes Shoulda Factory Girl Machinist Passenger Mongrel Servidores Thin EventMachine
  • 100. RSpec Cucumber Testes Shoulda Factory Girl Machinist Passenger Mongrel Servidores Thin EventMachine
  • 101. MongoMapper MongoID NoSQL CouchRest Cassandra Ruby on Rails Frameworks Sinatra Web Merb Camping
  • 102. MongoMapper MongoID NoSQL CouchRest Cassandra Ruby on Rails Frameworks Sinatra Web Merb Camping
  • 104. GIT
  • 106. rubylearning.org Satish Talim
  • 107. guides.rubyonrails.org Mike Gunderloy
  • 108. peepcode.com Geoffrey
  • 109. railscasts.com Ryan Bates
  • 113. rubyinside.com.br guru-sp.org
  • 117.
  • 118.
  • 120.
  • 124. O que dizem por aí ...
  • 129.
  • 130. x mais lento que C++
  • 131. 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
  • 134.
  • 135. Performance != Escalabilidade
  • 136. Entendendo a Web Dicas sobre Desenvolvimento Web com Ruby Sala 41-C às 13h
  • 137.
  • 139.
  • 140.
  • 141.
  • 142.
  • 144. 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
  • 145. 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
  • 146. “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
  • 147. “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
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 155.
  • 156. Mais Produtivo “Melhor” Anti-legado
  • 157. Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho!
  • 158.
  • 159.
  • 160.
  • 161.
  • 163.
  • 166.
  • 167.
  • 168.
  • 170.
  • 172.
  • 174.
  • 175. 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
  • 176. 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
  • 177. 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
  • 178. 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
  • 179.
  • 180. 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
  • 181. 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
  • 182.
  • 183.
  • 185. Produtividade Cowboy Profissional
  • 186. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 187. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 188. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 189. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 190. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 191. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 192. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 193. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 194. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  • 195.
  • 203.
  • 204. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  • 205. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  • 206. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  • 207. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  • 209.
  • 210. Thx! www.slideshare.net/akitaonrails boss@akitaonrails.com