erecompi

Post on 24-Apr-2015

1.902 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Palestra de Ruby on Rails que dei no evento ERECOMPI, em Teresina, no Piauí.

TRANSCRIPT

Ruby on RailsThursday, June 4, 2009

AkitaOnRails.comslideshare.net/akitaonrails

Thursday, June 4, 2009

2008Thursday, June 4, 2009

2008Thursday, June 4, 2009

13 e 14Outubro

2009Thursday, June 4, 2009

Thursday, June 4, 2009

~108 slides~90 min

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

“Especialista em

uma coisa só é um

amador em todo o

resto.”

Thursday, June 4, 2009

Thursday, June 4, 2009

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

Ruby on Rails 2.3

Ruby 1.8

Novo Ruby 1.9

Thursday, June 4, 2009

1993

“Matz”

Thursday, June 4, 2009

2001

“Prag Dave”

Thursday, June 4, 2009

2004

“DHH”

Thursday, June 4, 2009

2006

Charles Nutter

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

“Tornar as coisas

simples fáceis e as

coisas complexas

possíveis”

Filosofia Ruby

Thursday, June 4, 2009

Thursday, June 4, 2009

O que dizempor aí ...

Thursday, June 4, 2009

Pouco usado

Thursday, June 4, 2009

Rails não Escala

Thursday, June 4, 2009

Ruby é Lento

Thursday, June 4, 2009

WTF!?

Thursday, June 4, 2009

Pouco usado

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Rails não Escala

Thursday, June 4, 2009

Thursday, June 4, 2009

Para colocar as coisas em perspectiva, o Friendster foi

escrito em Java e eles mudaram para PHP. MySpace foi escrito em ColdFusion e eles mudaram para ASP.NET.

Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a

linguagem é o problema, mas eu acho que isso raramente

é a realidade. Blaine Cook

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

Thursday, June 4, 2009

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

“O The New York Times usou Ruby on Rails para agregar, analizar e mostrar os resultados das

eleições em quase tempo real em um de seus sites mais acessados de todos os tempos.”

Thursday, June 4, 2009

Ruby é Lento

Thursday, June 4, 2009

x mais lento que C++

Thursday, June 4, 2009

0

50

100

150

200

Python 2

Ruby 1.9

Perl

JRuby

Python 3

PHP

Ruby 1.8.6

x mais lento que C++

Thursday, June 4, 2009

Homepage: 331 ms

Thursday, June 4, 2009

Homepage: 331 ms

Total: 5.45 s

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

PHP “puro” 331 req/s

CakePHP 4 a 8 req/s*

Code Igniter 22 a 98 req/s*

Rails (2008) 88 req/s

Thursday, June 4, 2009

Thursday, June 4, 2009

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

PHP Reload

Java Persistente

Ruby Misto

Thursday, June 4, 2009

Browser

Rails

Banco de DadosBanco Slave

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Browser

Rails

Banco de Dados

Banco Slave

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Memcached

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Memcached

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Memcached

Memcached

Thursday, June 4, 2009

Browser

Rails

Banco de Dados Banco Slave

Memcached

Memcached Web Caches

Thursday, June 4, 2009

Performance

!=Escalabilidade

Thursday, June 4, 2009

Performance

Ghz“Vertical”

Thursday, June 4, 2009

Escalabilidade

MultiCore“Horizontal”

Thursday, June 4, 2009

Ruby on Rails

Thursday, June 4, 2009

RUBY

Thursday, June 4, 2009

ActiveSupportRails

RUBY

Thursday, June 4, 2009

ActionPack

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

ActiveRecord

ActionPack

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

ActiveRecord

ActionPack

ActionMailer

ActionController

ActionView

ActiveSupportRails

RUBY

Thursday, June 4, 2009

ActiveRecord

ActionPack

ActiveResource

ActionMailer

ActionController

ActionView

ActiveSupportRails

ActionWebService

RUBY

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

describe Product do include ProductSpecHelper

before(:each) do @product = Product.new end

it "should not be valid when empty" do @product.should_not be_valid end

it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend

RSpec

Thursday, June 4, 2009

describe Product do include ProductSpecHelper

before(:each) do @product = Product.new end

it "should not be valid when empty" do @product.should_not be_valid end

it "should be valid when having correct information" do @product.attributes = valid_product_attributes @product.should be_valid endend

RSpec

rake spec

Thursday, June 4, 2009

class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category

validates_presence_of :name validates_presence_of :master_price validates_presence_of :description

make_permalink :with => :name, :field => :permalinkend

Model

Thursday, June 4, 2009

class Product < ActiveRecord::Base after_create :set_initial_inventory has_many :variants, :dependent => :destroy has_many :images, :as => :viewable, :order => :position, :dependent => :destroy has_many :properties, :through => :product_properties belongs_to :tax_category

validates_presence_of :name validates_presence_of :master_price validates_presence_of :description

make_permalink :with => :name, :field => :permalinkend

Model

Product.find(1)

Thursday, June 4, 2009

class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end

create.after { self.current_user = @user }

create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end

Controller

Thursday, June 4, 2009

class UsersController < Spree::BaseController resource_controller before_filter :initialize_extension_partials actions :all, :except => [:index, :destroy] show.before do @orders = Order.checkout_completed(true) .find_all_by_user_id(current_user.id) end

create.after { self.current_user = @user }

create.response do |wants| wants.html { redirect_back_or_default(products_path) } end end

Controller

/users/1

Thursday, June 4, 2009

<div id="product-listing"> <%= breadcrumbs(@taxon) %> <br/> <%= render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon } %></div>

<% content_for :sidebar do %> <td id="shop-by-col" valign="top"> <%= render :partial => "shared/taxonomies" %> </td><% end %>

<%= render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty? %>

Views ERB

Thursday, June 4, 2009

#product-listing =breadcrumbs(@taxon) %br =render :partial => "shared/products.html.erb", :locals => {:products => @products, :taxon => @taxon}

-content_for :sidebar do %td#shop-by-col(:valign => "top") =render :partial => "shared/taxonomies" =render :partial => 'shared/paginate', :locals => {:collection => @products, :options => {}} unless @products.empty?

Views HAML

Thursday, June 4, 2009

ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'

map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]

map.namespace :admin do |admin| admin.resources :users admin.resources :products endend

Rotas RESTFul

Thursday, June 4, 2009

ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'

map.resources :products, :member => {:change_image => :post} map.resources :addresses map.resources :orders, :has_many => [:line_items]

map.namespace :admin do |admin| admin.resources :users admin.resources :products endend

Rotas RESTFul

GET /products/newGET /productsPOST /productsGET /products/1GET /products/1/editPUT /products/1DESTROY /products/1

Thursday, June 4, 2009

class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end

def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend

Migrations

Thursday, June 4, 2009

class RenameAppConfiguration < ActiveRecord::Migration def self.up rename_table :app_configurations, :configurations change_table :configurations do |t| t.string :type end end

def self.down change_table :configurations do |t| t.remove :type end rename_table :configurations, :app_configurations endend

Migrations

rake db:migrate

Thursday, June 4, 2009

“Beautiful Code”

Thursday, June 4, 2009

//$Id: Booking.java 5579 2007-06-27 00:06:49Z gavin $package org.jboss.seam.example.booking;

import java.io.Serializable;import java.math.BigDecimal;import java.text.DateFormat;import java.util.Date;

import javax.persistence.Basic;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.ManyToOne;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;

import org.hibernate.validator.Length;import org.hibernate.validator.NotNull;import org.hibernate.validator.Pattern;import org.jboss.seam.annotations.Name;

@Entity@Name("booking")public class Booking implements Serializable{ private Long id; private User user; private Hotel hotel; private Date checkinDate; private Date checkoutDate; private String creditCard; private String creditCardName; private int creditCardExpiryMonth; private int creditCardExpiryYear; private boolean smoking; private int beds; public Booking() {} public Booking(Hotel hotel, User user) { this.hotel = hotel; this.user = user; }

@Transient public BigDecimal getTotal() { return hotel.getPrice().multiply( new BigDecimal( getNights() ) ); }

@Transient public int getNights() { return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24; }

@Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id; } @NotNull @Basic @Temporal(TemporalType.DATE) public Date getCheckinDate() { return checkinDate; } public void setCheckinDate(Date datetime) { this.checkinDate = datetime; }

@ManyToOne @NotNull public Hotel getHotel() { return hotel; } public void setHotel(Hotel hotel) { this.hotel = hotel; } @ManyToOne @NotNull public User getUser() { return user; }

Thursday, June 4, 2009

public void setUser(User user) { this.user = user; } @Basic @Temporal(TemporalType.DATE) @NotNull public Date getCheckoutDate() { return checkoutDate; } public void setCheckoutDate(Date checkoutDate) { this.checkoutDate = checkoutDate; } @NotNull(message="Credit card number is required") @Length(min=16, max=16, message="Credit card number must 16 digits long") @Pattern(regex="^\\d*$", message="Credit card number must be numeric") public String getCreditCard() { return creditCard; }

public void setCreditCard(String creditCard) { this.creditCard = creditCard; } @Transient public String getDescription() { DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); return hotel==null ? null : hotel.getName() + ", " + df.format( getCheckinDate() ) + " to " + df.format( getCheckoutDate() ); }

public boolean isSmoking() { return smoking; }

public void setSmoking(boolean smoking) { this.smoking = smoking; }

public int getBeds() { return beds; }

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

public void setCreditCardName(String creditCardName) { this.creditCardName = creditCardName; }

public int getCreditCardExpiryMonth() { return creditCardExpiryMonth; }

public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { this.creditCardExpiryMonth = creditCardExpiryMonth; }

public int getCreditCardExpiryYear() { return creditCardExpiryYear; }

public void setCreditCardExpiryYear(int creditCardExpiryYear) { this.creditCardExpiryYear = creditCardExpiryYear; } @Override public String toString() { return "Booking(" + user + ","+ hotel + ")"; }

}

Thursday, June 4, 2009

class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend

Thursday, June 4, 2009

class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds

t.timestamps end end

def self.down drop_table :bookings endend

Thursday, June 4, 2009

190vs

40

Thursday, June 4, 2009

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

“Eles servem mais de 23 milhões de visitantes/mês. A conversão resultou em 20 mil linhas de Ruby em vez de 125 mil linhas de Java e, mais importante,

facilitou a dificuldade que tinham em manutenção. Uma vez completo e otimizado, o site deles agora é mais rápido que antes. Eles também

finalizaram a reescrita do sistema em apenas 3 meses com 4 desenvolvedores.”

Thursday, June 4, 2009

Thursday, June 4, 2009

11 mil

classes!

46 só de

coleções!

Thursday, June 4, 2009

• Modules:

• Enumerable

• Comparable

• Classes:

• Array

• Hash

• Set

• Sorted Set

Thursday, June 4, 2009

• Modules:

• Enumerable

• Comparable

• Classes:

• Array

• Hash

• Set

• Sorted Set

1.400

classes

só 6 de

coleções!

Thursday, June 4, 2009

Ferramentas Ágeis

Thursday, June 4, 2009

Gerenciamento

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Repositórios

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Integração Contínua

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Manutenção

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Open Source

Thursday, June 4, 2009

Thursday, June 4, 2009

describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend

Thursday, June 4, 2009

Thursday, June 4, 2009

Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120

Thursday, June 4, 2009

Before do @calc = Calculadora.newend Dado /que eu digitei (\d+) na calculadora/ do |n| @calc.push n.to_iend Quando 'eu aperto o botão de soma' do @result = @calc.somaend Então /o resultado na calculadora deve ser (\d*)/ do |result| @result.should == result.to_iend

Thursday, June 4, 2009

class SignupTest < ActionController::IntegrationTest

def test_trial_account_sign_up visit home_path click_link "Sign up" fill_in "Email", :with => "good@example.com" select "Free account" click_button "Register" end

end

Thursday, June 4, 2009

rspec rspec.info

cucumber cukes.info

shoulda thoughtbot.com/projects/shoulda

webrat github.com/brynary/webrat

integrity integrityapp.com

ZenTest zenspider.com

Thursday, June 4, 2009

• plugins de Active Record

• plugins de Views

• plugins de Localização

• CMS

• Parsers

• Autenticadores/Autorizadores

Thursday, June 4, 2009

Comunidade

Thursday, June 4, 2009

Geoffrey

peepcode.com

Thursday, June 4, 2009

Jason e Gregg

railsenvy.com

Thursday, June 4, 2009

Ryan Bates

railscasts.com

Thursday, June 4, 2009

Pratik Naik

guias.rubyonrails.pro.br

Thursday, June 4, 2009

Satish Talim

rubylearning.org

Thursday, June 4, 2009

Peter Cooper

rubyinside.com.br

Thursday, June 4, 2009

_why

why.nomedojogo.com

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Thursday, June 4, 2009

Uma pulga ...

Thursday, June 4, 2009

Standish Group - CHAOS Report 2009

Thursday, June 4, 2009

Sucesso32%

Fracasso Médio44%

Fracasso Total24%

Standish Group - CHAOS Report 2009

Thursday, June 4, 2009

Winston W. Royce - 1970

Thursday, June 4, 2009

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

“Eu acredito neste conceito mas a implementação descrita acima é arriscada

e convida falhas.”

Winston W. Royce - 1970

Thursday, June 4, 2009

Insanidade

Thursday, June 4, 2009

“Querer resultados

melhores fazendo a

mesma coisa.”

Thursday, June 4, 2009

“Think Different”

Thursday, June 4, 2009

“Think Different”

Thursday, June 4, 2009

Obrigado!akitaonrails.com

Thursday, June 4, 2009

top related