Edted 2010 Ruby on Rails
-
Upload
fabio-akita -
Category
Technology
-
view
797 -
download
0
description
Transcript of Edted 2010 Ruby on Rails
A apresentação já vai começar ...
Saturday, April 10, 2010
Ruby on RailsSaturday, April 10, 2010
AkitaOnRails.com
Saturday, April 10, 2010
~ 50 min~ 110 slides
Saturday, April 10, 2010
www.slideshare.net/akitaonrails
Saturday, April 10, 2010
Saturday, April 10, 2010
Ruby on Rails 2.3.x
Ruby on Rails 3.0-pre
Ruby 1.8.x
Ruby 1.9.xSaturday, April 10, 2010
Ruby on Rails 2.3.x
Ruby on Rails 3.0-pre
Ruby 1.8.x
Ruby 1.9.xSaturday, April 10, 2010
Ruby on Rails 2.3.x
Ruby on Rails 3.0-pre
Ruby 1.8.x
Ruby 1.9.xSaturday, April 10, 2010
Ruby on Rails 2.3.x
Ruby on Rails 3.0-pre
Ruby 1.8.x
Ruby 1.9.xSaturday, April 10, 2010
1993
“Matz”
Saturday, April 10, 2010
Saturday, April 10, 2010
2004
“DHH”
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
2006
Charles Nutter
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
“Tornar as coisas simples fáceis e as coisas complexas
possíveis”Filoso!a Ruby
Saturday, April 10, 2010
Saturday, April 10, 2010
Código que gera Código
Convention over Con!guration
“Don’t Repeat Yourself”
Extreme Programming
Saturday, April 10, 2010
Código que gera Código
Convention over Con!guration
“Don’t Repeat Yourself”
Extreme Programming
Saturday, April 10, 2010
Código que gera Código
Convention over Con!guration
“Don’t Repeat Yourself”
Extreme Programming
Saturday, April 10, 2010
Código que gera Código
Convention over Con!guration
“Don’t Repeat Yourself”
Extreme Programming
Saturday, April 10, 2010
Restful Resources
Unicode, Time Zone, i18n
Segurança(XSS, CSRF, Injection)
Saturday, April 10, 2010
Restful Resources
Unicode, Time Zone, i18n
Segurança(XSS, CSRF, Injection)
Saturday, April 10, 2010
Restful Resources
Unicode, Time Zone, i18n
Segurança(XSS, CSRF, Injection)
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Templates ERB, HAML
Autenticação HTTP Basic, HTTP Digest,Authlogic, Devise
Bancos de Dados MySQL, PostgreSQL, Oracle,MongoDB, CouchDB
ORMs ActiveRecord, DataMapper,MongoMapper, Sequel
Javascript Prototype, jQuery,SproutCore
Web Servers Apache 2, NginX,Lighty, Litespeed
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
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
Saturday, April 10, 2010
<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
Saturday, April 10, 2010
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
Saturday, April 10, 2010
“Beautiful Code”
Saturday, April 10, 2010
//$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; }
Saturday, April 10, 2010
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 + ")"; }
}
Saturday, April 10, 2010
class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend
Saturday, April 10, 2010
class Booking < ActiveRecord::Base belongs_to :hotel belongs_to :user validates_presence_of :hotel validates_presence_of :user validates_presence_of :credit_card validates_presence_of :credit_card_name validates_length_of :credit_card, :within => 16..16 validates_format_of :credit_card, :with => /^\\d*$/ validates_length_of :credit_card_name, :within => 3..70 def total hotel.price * nights end def nights ((checkout_date - checkin_date) / 1.day).round end def to_s "Booking(#{user},#{hotel})" endend
Saturday, April 10, 2010
class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds
t.timestamps end end
def self.down drop_table :bookings endend
Saturday, April 10, 2010
class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds
t.timestamps end end
def self.down drop_table :bookings endend
Saturday, April 10, 2010
class CreateBookings < ActiveRecord::Migration def self.up create_table :bookings do |t| t.references :user t.references :hotel t.datetime :checkin t.datetime :checkout t.string :credit_card t.string :credit_card_name t.integer :credit_card_expiry_month t.integer :credit_card_expiry_year t.boolean :smoking t.integer :beds
t.timestamps end end
def self.down drop_table :bookings endend
Saturday, April 10, 2010
190vs
40
Saturday, April 10, 2010
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
Ferramentas
Saturday, April 10, 2010
Repositórios GitoriousGithub
Integração Contínua
IntegrityCruise Control
Deployment ChefPuppet
Monitoramento New Relic
Saturday, April 10, 2010
Repositórios GitoriousGithub
Integração Contínua
IntegrityCruise Control
Deployment ChefPuppet
Monitoramento New Relic
Saturday, April 10, 2010
Repositórios GitoriousGithub
Integração Contínua
IntegrityCruise Control
Deployment ChefPuppet
Monitoramento New Relic
Saturday, April 10, 2010
Repositórios GitoriousGithub
Integração Contínua
IntegrityCruise Control
Deployment ChefPuppet
Monitoramento New Relic
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Comunidade
Saturday, April 10, 2010
Satish Talim
rubylearning.org
Saturday, April 10, 2010
Mike Gunderloy
guides.rubyonrails.org
Saturday, April 10, 2010
Geoffrey
peepcode.com
Saturday, April 10, 2010
Ryan Bates
railscasts.com
Saturday, April 10, 2010
github.com
Saturday, April 10, 2010
railsdispatch.com
Saturday, April 10, 2010
rubysoc.org
Saturday, April 10, 2010
guru-sp.org
rubyinside.com.br
Saturday, April 10, 2010
plataformatec.com.br
Saturday, April 10, 2010
caelum.com.br
Saturday, April 10, 2010
egenialsas.com.br
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
O que dizempor aí ...
Saturday, April 10, 2010
Ruby é Lento
Saturday, April 10, 2010
Existem mentiras, mentiras malditas e
estatísticas.
Saturday, April 10, 2010
Existem mentiras, mentiras malditas e
estatísticas.
Saturday, April 10, 2010
Existem mentiras, mentiras malditas e
estatísticas.
Saturday, April 10, 2010
Saturday, April 10, 2010
x mais lento que C++
Saturday, April 10, 2010
0 32.5 65 97.5 130
Python 2
Ruby 1.9
JRuby
Perl
Python 3
PHP
Ruby 1.8
x mais lento que C++
Saturday, April 10, 2010
Homepage: 331 ms
Saturday, April 10, 2010
Homepage: 331 ms
Total: 5.45 s
Saturday, April 10, 2010
Saturday, April 10, 2010
Performance!=
Escalabilidade
Saturday, April 10, 2010
Rails não Escala
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Blaine Cook
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
Saturday, April 10, 2010
Para colocar as coisas em perspectiva, o Friendster foi
escrito em Java e eles mudaram para PHP. MySpace foi escrito
em ColdFusion e eles mudaram para ASP.NET.
Blaine Cook
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
Saturday, April 10, 2010
Para colocar as coisas em perspectiva, o Friendster foi
escrito em Java e eles mudaram para PHP. MySpace foi escrito
em ColdFusion e eles mudaram para ASP.NET.
Blaine Cook
http://www.akitaonrails.com/2008/6/17/chatting-with-blaine-cook-twitter
Quando as pessoas caem em problemas de escalabilidade, normalmente acham que a
linguagem é o problema, mas eu acho que isso raramente é a
realidade.
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
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.”
Saturday, April 10, 2010
Web Server
MySQL
Browser
Saturday, April 10, 2010
Web Server
MySQL
Browser
Varnish/HAProxy
Saturday, April 10, 2010
Web Server
MySQL
Browser
Varnish/HAProxy
Memcached
Saturday, April 10, 2010
Web Server
MySQL
Browser
Varnish/HAProxy
Memcached
CouchDB/MongoDB
Saturday, April 10, 2010
Saturday, April 10, 2010
Outros Mitos?
Saturday, April 10, 2010
Saturday, April 10, 2010
Mais Produtivo
“Melhor”
Anti-legadoSaturday, April 10, 2010
Sempre se Lembre
Poderíamos contratar um Macaco Treinadopara fazer seu Trabalho!
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Agilidade
Saturday, April 10, 2010
Saturday, April 10, 2010
“Rápido”
Metodologias
Saturday, April 10, 2010
“Rápido”
Metodologias
Saturday, April 10, 2010
“Rápido”
Metodologias
Saturday, April 10, 2010
Saturday, April 10, 2010
Robert C. Martin
Saturday, April 10, 2010
“Uncle Bob”
Saturday, April 10, 2010
Código Limpo
Saturday, April 10, 2010
Saturday, April 10, 2010
Test Driven Development
Saturday, April 10, 2010
Saturday, April 10, 2010
describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend
Saturday, April 10, 2010
describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend
Saturday, April 10, 2010
describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend
Saturday, April 10, 2010
describe BankAccount do before :each do @bank_account = BankAccount.new :balance => 250 end it "should not be valid" do @bank_account.should be_valid end it "should transfer funds successfully" do @bank_account.should_receive(:transfer) .with_args(:amount => 100) .and_return(true) @bank_account.execute_transaction(:amount => 100) @bank_account.balance.should == 150 endend
Saturday, April 10, 2010
Saturday, April 10, 2010
Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120
Saturday, April 10, 2010
Funcionalidade: Adição Para evitar erros bobos Como um péssimo matemático Eu quero saber como somar dois números Cenário: Adicionar dois números Dado que eu digitei 50 na calculadora E que eu digitei 70 na calculadora Quando eu aperto o botão de soma Então o resultado na calculadora deve ser 120
Saturday, April 10, 2010
Saturday, April 10, 2010
Saturday, April 10, 2010
Não é mais demorado?
Saturday, April 10, 2010
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
1 2 3 4 5 6 7 80
17.50
35.00
52.50
70.00
Produtividade
Tempo
Cowboy Profissional
Produtividade
Saturday, April 10, 2010
Saturday, April 10, 2010
237 Equipes137 Finalizadas
Saturday, April 10, 2010
Saturday, April 10, 2010
Empreendedorismo
Código e “Forma”
Ciclo de Vida de Projetos
Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo
Código e “Forma”
Ciclo de Vida de Projetos
Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo
Código e “Forma”
Ciclo de Vida de Projetos
Comunidade Open Source
Saturday, April 10, 2010
Empreendedorismo
Código e “Forma”
Ciclo de Vida de Projetos
Comunidade Open Source
Saturday, April 10, 2010
Pro!ssionalismo
Saturday, April 10, 2010
Obrigado!akitaonrails.com
Saturday, April 10, 2010