Edted 2010 Ruby on Rails

Post on 18-May-2015

796 views 0 download

Tags:

description

Palestra de introdução à Cultura e Ecossistema Ruby on Rails no EDTED 2010 Rio de Janeiro

transcript

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

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

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