Fisl 11 - Ecossistema Ruby on Rails

1,632 views
1,593 views

Published on

Ruby on Rails é um framework web. Mas essa é a parte menos importante. O que torna difícil a qualquer um de "clonar" essa iniciativa é que seria necessário clonar toda a comunidade. Sem o ecossistema que faz open source, trás preceitos ágeis, empreendedorismo, produtos, nada disso seria possível.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,632
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
61
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Fisl 11 - Ecossistema Ruby on Rails

  1. 1. Ruby on Rails A apresentação já vai começar ...
  2. 2. Ruby on Rails
  3. 3. AkitaOnRails.com @AkitaOnRails
  4. 4. www.slideshare.net/akitaonrails boss@akitaonrails.com
  5. 5. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  6. 6. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  7. 7. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  8. 8. Ruby on Rails 2.3.x Ruby on Rails 3 Beta Ruby 1.8.x Ruby 1.9.x
  9. 9. “Matz” 1993
  10. 10. Dave Thomas 2001
  11. 11. “DHH” 2004
  12. 12. Charles Nutter 2006
  13. 13. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  14. 14. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  15. 15. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  16. 16. JRuby 1.5.x Rubinius 1.0 IronRuby 1.0 MacRuby 0.6
  17. 17. “Tornar as coisas simples fáceis e as coisas complexas possíveis” Filoso a Ruby
  18. 18. Alan Kay Dan Ingalls
  19. 19. Eu inventei o termo “Orientação a Objetos” e posso dizer que não era C++ que eu tinha em mente. Alan Kay
  20. 20. Meta Programação
  21. 21. Meta Apresentação
  22. 22. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  23. 23. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  24. 24. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  25. 25. Código que gera Código Convention over Con guration “Don’t Repeat Yourself” Extreme Programming
  26. 26. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  27. 27. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  28. 28. Recursos Restful Unicode, Time Zone, i18n Segurança (XSS, CSRF, Injection)
  29. 29. 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
  30. 30. 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
  31. 31. 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
  32. 32. 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
  33. 33. 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
  34. 34. 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
  35. 35. Estrutura de Diretórios Similar
  36. 36. 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
  37. 37. 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? %>
  38. 38. 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
  39. 39. “Beautiful Code”
  40. 40. @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; }
  41. 41. 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; } }
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. 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
  47. 47. 190 vs 40
  48. 48. “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
  49. 49. “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
  50. 50. “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
  51. 51. “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
  52. 52. Ferramentas
  53. 53. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  54. 54. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  55. 55. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  56. 56. Repositórios Github Integração Hudson Contínua Cruise Chef Deployment Puppet Monitoramento New Relic
  57. 57. RSpec Cucumber Testes Shoulda Factory Girl Machinist Passenger Mongrel Servidores Thin EventMachine
  58. 58. RSpec Cucumber Testes Shoulda Factory Girl Machinist Passenger Mongrel Servidores Thin EventMachine
  59. 59. MongoMapper MongoID NoSQL CouchRest Cassandra Ruby on Rails Frameworks Sinatra Web Merb Camping
  60. 60. MongoMapper MongoID NoSQL CouchRest Cassandra Ruby on Rails Frameworks Sinatra Web Merb Camping
  61. 61. Subversion
  62. 62. GIT
  63. 63. Comunidade
  64. 64. rubylearning.org Satish Talim
  65. 65. guides.rubyonrails.org Mike Gunderloy
  66. 66. peepcode.com Geoffrey
  67. 67. railscasts.com Ryan Bates
  68. 68. github.com
  69. 69. railsdispatch.com
  70. 70. rubysoc.org
  71. 71. rubyinside.com.br guru-sp.org
  72. 72. plataformatec.com.br
  73. 73. caelum.com.br
  74. 74. egenialsas.com.br
  75. 75. Eventos
  76. 76. oxenterails.com.br
  77. 77. rsrails.com.br
  78. 78. rubyconf.com.br
  79. 79. O que dizem por aí ...
  80. 80. Ruby é Lento
  81. 81. Existem mentiras, mentiras malditas e estatísticas.
  82. 82. Existem mentiras, mentiras malditas e estatísticas.
  83. 83. Existem mentiras, mentiras malditas e estatísticas.
  84. 84. x mais lento que C++
  85. 85. 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
  86. 86. Homepage: 331 ms
  87. 87. Homepage: 331 ms Total: 5.45 s
  88. 88. Performance != Escalabilidade
  89. 89. Entendendo a Web Dicas sobre Desenvolvimento Web com Ruby Sala 41-C às 13h
  90. 90. Rails não Escala
  91. 91. Blaine Cook http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
  92. 92. 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
  93. 93. 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
  94. 94. “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
  95. 95. “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
  96. 96. Outros Mitos?
  97. 97. Mais Produtivo “Melhor” Anti-legado
  98. 98. Sempre se Lembre Poderíamos contratar um Macaco Treinado para fazer seu Trabalho!
  99. 99. Agilidade
  100. 100. “Rápido” Metodologias
  101. 101. “Rápido” Metodologias
  102. 102. Robert C. Martin
  103. 103. Código Limpo
  104. 104. Test Driven Development
  105. 105. 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
  106. 106. 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
  107. 107. 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
  108. 108. 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
  109. 109. 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
  110. 110. 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
  111. 111. Não é mais demorado?
  112. 112. Produtividade Cowboy Profissional
  113. 113. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  114. 114. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  115. 115. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  116. 116. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  117. 117. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  118. 118. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  119. 119. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  120. 120. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  121. 121. Produtividade Cowboy Profissional 70.00 52.50 Produtividade 35.00 17.50 0 1 2 3 4 5 6 7 8 Tempo
  122. 122. 237 Equipes 137 Finalizadas
  123. 123. #horaextra
  124. 124. #horaextra
  125. 125. #horaextra
  126. 126. #horaextra
  127. 127. #horaextra
  128. 128. #horaextra ~4 horas/app
  129. 129. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  130. 130. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  131. 131. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  132. 132. Empreendedorismo Código e “Forma” Ciclo de Vida de Projetos Comunidade Open Source
  133. 133. Pro ssionalismo
  134. 134. Thx! www.slideshare.net/akitaonrails boss@akitaonrails.com

×