rs on rails 2011

209
Discutindo Rails e Arquiteturas a apresentação já vai começar ...

Upload: fabio-akita

Post on 15-May-2015

853 views

Category:

Technology


1 download

DESCRIPTION

Discutindo Rails e Arquiteturas. Palestra para a RS on Rails 2011

TRANSCRIPT

Page 1: Rs on Rails 2011

Discutindo Railse Arquiteturas

a apresentação já vai começar ...

Page 2: Rs on Rails 2011

Discutindo Railse Arquiteturas

Page 3: Rs on Rails 2011

Fabio Akitawww.akitaonrails.com

@akitaonrails

Page 4: Rs on Rails 2011
Page 5: Rs on Rails 2011

1 ano atrás 4 pessoas

Hoje 20 pessoas+ USD 1 Milhão/ano

Page 6: Rs on Rails 2011

1 ano atrás 4 pessoas

Hoje 20 pessoas+ USD 1 Milhão/ano

Page 7: Rs on Rails 2011

1 ano atrás 4 pessoas

Hoje 20 pessoas+ USD 1 Milhão/ano

Page 8: Rs on Rails 2011

~1990

Page 9: Rs on Rails 2011

Anos 80 Fim Anos 90 Século XXI

Page 10: Rs on Rails 2011

Perl

C

Anos 80 Fim Anos 90 Século XXI

Basic

dBase III

Clipper

Pascal

Delphi

ASP

PHP

Python

.NET

Java

ABAP

Ruby

ObjCVB6

Page 11: Rs on Rails 2011
Page 12: Rs on Rails 2011

1.8.71.9.2

1.9.3-dev2.3.123.0.9

3.1-RC4

Page 13: Rs on Rails 2011

1.8.71.9.2

1.9.3-dev2.3.123.0.9

3.1-RC4

Page 14: Rs on Rails 2011

1.8.71.9.2

1.9.3-dev2.3.123.0.9

3.1-RC4

Page 15: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 16: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 17: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 18: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 19: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 20: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 21: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 22: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 23: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 24: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 25: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 26: Rs on Rails 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 27: Rs on Rails 2011

Application Server Rack:

Unicorn, Passenger

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 28: Rs on Rails 2011

Web Server:

NginXApache

Application Server Rack:

Unicorn, Passenger

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 29: Rs on Rails 2011

NginX, Apache

Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQL

Page 30: Rs on Rails 2011

NginX, Apache

Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

RestClient/Savon

HAProxy

Page 31: Rs on Rails 2011

NginX, Apache

Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

RestClient/Savon

HAProxy

Varnish

Page 32: Rs on Rails 2011

NginX, Apache

Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

RestClient/Savon

HAProxy

Memcached

Varnish

Page 33: Rs on Rails 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 34: Rs on Rails 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 35: Rs on Rails 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Mais curto possível!

Page 36: Rs on Rails 2011

Thread Context Switch

Page 37: Rs on Rails 2011

Thread Context Switch

Page 38: Rs on Rails 2011

Request RailsApp

Page 39: Rs on Rails 2011
Page 40: Rs on Rails 2011
Page 41: Rs on Rails 2011
Page 42: Rs on Rails 2011
Page 43: Rs on Rails 2011
Page 44: Rs on Rails 2011
Page 45: Rs on Rails 2011

Eventos AssíncronosEnvio de mensagens

Page 46: Rs on Rails 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 47: Rs on Rails 2011

NginX

Request Request Request Request Request Request

RDBMS

Async App

Page 48: Rs on Rails 2011

NginX

Request Request Request Request Request Request

RDBMS

Async App“Look Ma!

No Threads!”

Page 49: Rs on Rails 2011

NginX

Request Request Request Request Request Request

RDBMS

Async App“Look Ma!

No Threads!”

5k ~ 10kconexões

Page 50: Rs on Rails 2011

NginX

Request Request Request Request Request Request

RDBMS

Async App“Look Ma!

No Threads!”

5k ~ 10kconexões

ConexõesLongas

Page 51: Rs on Rails 2011
Page 52: Rs on Rails 2011
Page 53: Rs on Rails 2011
Page 54: Rs on Rails 2011
Page 55: Rs on Rails 2011
Page 56: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 57: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 58: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 59: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 60: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 61: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 62: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 63: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 64: Rs on Rails 2011

EventMachine.run do conn = { :host => "0.0.0.0", :port => 8080 } EventMachine::WebSocket.start(conn) do |ws| ws.onopen do puts "WebSocket connection open" # publish message to the client ws.send "Hello Client" end ws.onclose { puts "Connection closed" } ws.onmessage do |msg| puts "Recieved message: #{msg}" ws.send "Pong: #{msg}" end endend

Page 65: Rs on Rails 2011
Page 66: Rs on Rails 2011

<script src="http://js.pusherapp.com/1.8/pusher.min.js"></script>

<script>var pusher = new Pusher('API_KEY');var myChannel = pusher.subscribe('MEU_CANAL');</script>

Page 67: Rs on Rails 2011

<script src="http://js.pusherapp.com/1.8/pusher.min.js"></script>

<script>var pusher = new Pusher('API_KEY');var myChannel = pusher.subscribe('MEU_CANAL');</script>

Page 68: Rs on Rails 2011

<script src="http://js.pusherapp.com/1.8/pusher.min.js"></script>

<script>var pusher = new Pusher('API_KEY');var myChannel = pusher.subscribe('MEU_CANAL');</script>

Page 69: Rs on Rails 2011

myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name);});

Page 70: Rs on Rails 2011

myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name);});

Page 71: Rs on Rails 2011

myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name);});

Page 72: Rs on Rails 2011

require 'pusher'

Pusher.app_id = 'APP_ID'Pusher.key = 'API_KEY'Pusher.secret = 'SECRET_KEY'

class ThingsController < ApplicationController def create @thing = Thing.new(params[:thing])

if @thing.save Pusher['MEU_CANAL'].trigger('coisa-criada', @thing.attributes) end endend

Page 73: Rs on Rails 2011

require 'pusher'

Pusher.app_id = 'APP_ID'Pusher.key = 'API_KEY'Pusher.secret = 'SECRET_KEY'

class ThingsController < ApplicationController def create @thing = Thing.new(params[:thing])

if @thing.save Pusher['MEU_CANAL'].trigger('coisa-criada', @thing.attributes) end endend

Page 74: Rs on Rails 2011

require 'pusher'

Pusher.app_id = 'APP_ID'Pusher.key = 'API_KEY'Pusher.secret = 'SECRET_KEY'

class ThingsController < ApplicationController def create @thing = Thing.new(params[:thing])

if @thing.save Pusher['MEU_CANAL'].trigger('coisa-criada', @thing.attributes) end endend

Page 75: Rs on Rails 2011

require 'pusher'

Pusher.app_id = 'APP_ID'Pusher.key = 'API_KEY'Pusher.secret = 'SECRET_KEY'

class ThingsController < ApplicationController def create @thing = Thing.new(params[:thing])

if @thing.save Pusher['MEU_CANAL'].trigger('coisa-criada', @thing.attributes) end endend

Page 76: Rs on Rails 2011
Page 77: Rs on Rails 2011

Arquitetura de Altíssima Concorrência

Page 78: Rs on Rails 2011

(

Page 79: Rs on Rails 2011

W. Edward Deming

Page 80: Rs on Rails 2011
Page 81: Rs on Rails 2011

IN GOD WE TRUST

Todos os outros devem trazer dados

Page 82: Rs on Rails 2011
Page 83: Rs on Rails 2011

EXPERIENCE BY ITSELF BRINGSNOTHING

Page 84: Rs on Rails 2011

ACD

P

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 85: Rs on Rails 2011

ACD

P

STANDARD

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 86: Rs on Rails 2011

ACD

P

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 87: Rs on Rails 2011

ACD

P

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 88: Rs on Rails 2011

ACD

P

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 89: Rs on Rails 2011

ACD

P

Ciclo “Plan-Do-Check-Act”(melhoria contínua)

Page 90: Rs on Rails 2011

)

Page 91: Rs on Rails 2011
Page 92: Rs on Rails 2011
Page 93: Rs on Rails 2011
Page 94: Rs on Rails 2011
Page 95: Rs on Rails 2011
Page 96: Rs on Rails 2011
Page 97: Rs on Rails 2011
Page 98: Rs on Rails 2011

Perl

Page 99: Rs on Rails 2011
Page 100: Rs on Rails 2011

Python

Page 101: Rs on Rails 2011
Page 102: Rs on Rails 2011

PHP

Page 103: Rs on Rails 2011
Page 104: Rs on Rails 2011

Ruby

Page 105: Rs on Rails 2011

OMG!

Page 106: Rs on Rails 2011

2007

2008

2009

2010

2011

Ruby on Rails

Page 107: Rs on Rails 2011

2.0.0

2.1.0

2.2.0

2.3.0

3.0.0

2.0.5

2.1.2

2.2.3

2.3.12

3.0.9

2007

2008

2009

2010

2011

6

3

4

12

10

Ruby on Rails

Page 108: Rs on Rails 2011

2.0.0

2.1.0

2.2.0

2.3.0

3.0.0

2.0.5

2.1.2

2.2.3

2.3.12

3.0.9

2007

2008

2009

2010

2011

Ruby on Rails

34Versões!

Page 109: Rs on Rails 2011
Page 110: Rs on Rails 2011

Web Server

Request

RailsApp

/public/stylesheets

Page 111: Rs on Rails 2011

Web Server

Request

RailsApp

ArquivosEstáticos

/public/stylesheets

Page 112: Rs on Rails 2011
Page 113: Rs on Rails 2011

Variáveis/* CSS */

.content-navigation { border-color: #3bbfce; color: #2b9eab;}

.border { padding: 8px; margin: 8px; border-color: #3bbfce;}

$blue: #3bbfce;$margin: 16px;

.content-navigation { border-color: $blue; color: darken($blue, 9%);}

.border { padding: $margin / 2; margin: $margin / 2; border-color: $blue;}

Page 114: Rs on Rails 2011

Nestingtable.hl { margin: 2em 0; td.ln { text-align: right; }}

li { font: { family: serif; weight: bold; size: 1.2em; }}

/* CSS */

table.hl { margin: 2em 0;}table.hl td.ln { text-align: right;}

li { font-family: serif; font-weight: bold; font-size: 1.2em;}

Page 115: Rs on Rails 2011

Mixins@mixin table-base { th { text-align: center; font-weight: bold; } td, th {padding: 2px}}

@mixin left($dist) { float: left; margin-left: $dist;}

#data { @include left(10px); @include table-base;}

/* CSS */

#data { float: left; margin-left: 10px;}#data th { text-align: center; font-weight: bold;}#data td, #data th { padding: 2px;}

Page 116: Rs on Rails 2011

Selector Inheritance.error { border: 1px #f00; background: #fdd;}.error.intrusion { font-size: 1.3em; font-weight: bold;}

.badError { @extend .error; border-width: 3px;}

/* CSS */

.error, .badError { border: 1px #f00; background: #fdd;}

.error.intrusion,

.badError.intrusion { font-size: 1.3em; font-weight: bold;}

.badError { border-width: 3px;}

Page 117: Rs on Rails 2011
Page 118: Rs on Rails 2011

class Animal constructor: (@name) ->

move: (meters) -> alert @name + " moved " + meters + "m."

class Snake extends Animal move: -> alert "Slithering..." super 5

class Horse extends Animal move: -> alert "Galloping..." super 45

sam = new Snake "Sammy the Python"tom = new Horse "Tommy the Palomino"

sam.move()tom.move()

Page 119: Rs on Rails 2011

class Animal constructor: (@name) ->

move: (meters) -> alert @name + " moved " + meters + "m."

class Snake extends Animal move: -> alert "Slithering..." super 5

class Horse extends Animal move: -> alert "Galloping..." super 45

sam = new Snake "Sammy the Python"tom = new Horse "Tommy the Palomino"

sam.move()tom.move()

var Animal, Horse, Snake, sam, tom;var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child;};Animal = (function() { function Animal(name) { this.name = name; } Animal.prototype.move = function(meters) { return alert(this.name + " moved " + meters + "m."); }; return Animal;})();Snake = (function() { __extends(Snake, Animal); function Snake() { Snake.__super__.constructor.apply(this, arguments); } Snake.prototype.move = function() { alert("Slithering..."); return Snake.__super__.move.call(this, 5); }; return Snake;})();Horse = (function() { __extends(Horse, Animal); function Horse() { Horse.__super__.constructor.apply(this, arguments); } Horse.prototype.move = function() { alert("Galloping..."); return Horse.__super__.move.call(this, 45); }; return Horse;})();sam = new Snake("Sammy the Python");tom = new Horse("Tommy the Palomino");sam.move();tom.move();loadrun

Page 120: Rs on Rails 2011
Page 121: Rs on Rails 2011
Page 122: Rs on Rails 2011

102

Page 123: Rs on Rails 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

/public

Page 124: Rs on Rails 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

/public

Page 125: Rs on Rails 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

/public

Page 126: Rs on Rails 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

Ugli!er

/public

Page 127: Rs on Rails 2011

ENGINE FILE EXTENSIONS REQUIRED LIBRARIES

ERB .erb, .rhtmlnone

Interpolated String .strnone

Erubis .erb, .rhtml, .erubis erubis

Haml .haml haml

Sass .sasssass

Scss .scsssass

Less CSS .less less

Builder .builder builder

Liquid .liquid liquid

RDiscount

.markdown, .mkd, .md

rdiscount

Redcarpet

.markdown, .mkd, .md

redcarpet

BlueCloth .markdown, .mkd, .md bluecloth

Kramdown

.markdown, .mkd, .md

kramdown

Maruku

.markdown, .mkd, .md

maruku

RedCloth .textile redcloth

RDoc .rdoc rdoc

Radius .radius radius

Markaby .mab markaby

Nokogiri .nokogiri nokogiri

CoffeeScript .coffee coffee-script

Creole (Wiki markup) .creole creole

Page 128: Rs on Rails 2011
Page 129: Rs on Rails 2011

jQuery Tamanho Tempo

Original Size 621kb

Google Closure 234kb 6.5s

YUI Compressor 240kb 2.7s

UglifyJS 235kb 1.3s

Page 130: Rs on Rails 2011

jQuery Tamanho Tempo

Original Size 621kb

Google Closure 234kb 6.5s

YUI Compressor 240kb 2.7s

UglifyJS 235kb 1.3s

Page 131: Rs on Rails 2011

jQuery Tamanho Tempo

Original Size 621kb

Google Closure 234kb 6.5s

YUI Compressor 240kb 2.7s

UglifyJS 235kb 1.3s

Page 132: Rs on Rails 2011

jQuery Tamanho Tempo

Original Size 621kb

Google Closure 234kb 6.5s

YUI Compressor 240kb 2.7s

UglifyJS 235kb 1.3s

Page 133: Rs on Rails 2011

jQuery Tamanho Tempo

Original Size 621kb

Google Closure 234kb 6.5s

YUI Compressor 240kb 2.7s

UglifyJS 235kb 1.3s

Page 134: Rs on Rails 2011
Page 135: Rs on Rails 2011
Page 136: Rs on Rails 2011
Page 137: Rs on Rails 2011

Rails 3.1:Release Candidate

(may 2011)

Page 138: Rs on Rails 2011
Page 139: Rs on Rails 2011
Page 140: Rs on Rails 2011
Page 141: Rs on Rails 2011
Page 142: Rs on Rails 2011
Page 143: Rs on Rails 2011

RubyConfBrasil

3 e 4 de Novembrowww.rubyconf.com.br

Page 144: Rs on Rails 2011

<epílogo>

Page 145: Rs on Rails 2011
Page 146: Rs on Rails 2011
Page 147: Rs on Rails 2011

Como o cliente explicou

Como o Líder de Projeto entendeu

Como o Analista desenhou

Como o Programador escreveu

Como o Consultor de Negócios descreveu

Como o projeto foi documentado

Como Operações instalou

Como o cliente foi cobrado Como foi o suporte

O que o cliente realmente queria

Page 148: Rs on Rails 2011

Requerimentos:ENTENDIDO!

Page 149: Rs on Rails 2011
Page 150: Rs on Rails 2011

LOL

Page 151: Rs on Rails 2011

DESIGN

Page 152: Rs on Rails 2011

DESIGN

Page 153: Rs on Rails 2011
Page 154: Rs on Rails 2011
Page 155: Rs on Rails 2011

Pattern PADRÃO

Page 156: Rs on Rails 2011

Pattern PADRÃO

Default

STANDARD

Page 157: Rs on Rails 2011

“Pattern”

Page 158: Rs on Rails 2011
Page 159: Rs on Rails 2011
Page 160: Rs on Rails 2011

NÃO é “Standard”!

Page 161: Rs on Rails 2011

Christopher Alexander

Page 162: Rs on Rails 2011
Page 163: Rs on Rails 2011
Page 164: Rs on Rails 2011
Page 165: Rs on Rails 2011
Page 166: Rs on Rails 2011

cada padrão (“pattern”)representa nosso melhor chute agora ... os padrões ainda são hipóteses, ... e portanto todos são

tentativas, todos livres para evoluir sob o impacto de novas experiências e

observações."

Christopher Alexander

Page 167: Rs on Rails 2011
Page 168: Rs on Rails 2011

2 + 2 = 5!

Page 169: Rs on Rails 2011

2 + 2 = 5!

Page 170: Rs on Rails 2011

2 + 2 = 4!

Page 171: Rs on Rails 2011
Page 172: Rs on Rails 2011

Bertrand Russel

Page 173: Rs on Rails 2011

Bertrand Russel

Page 174: Rs on Rails 2011
Page 175: Rs on Rails 2011
Page 176: Rs on Rails 2011
Page 177: Rs on Rails 2011

Aqui estão os fatos. Que conclusões podemos

chegar com eles?

Aqui está a conclusão. Que fatos podemos suportar com eles?

Page 178: Rs on Rails 2011
Page 179: Rs on Rails 2011
Page 180: Rs on Rails 2011
Page 181: Rs on Rails 2011
Page 182: Rs on Rails 2011
Page 183: Rs on Rails 2011
Page 184: Rs on Rails 2011
Page 185: Rs on Rails 2011
Page 186: Rs on Rails 2011
Page 187: Rs on Rails 2011
Page 188: Rs on Rails 2011
Page 189: Rs on Rails 2011

80

Page 190: Rs on Rails 2011

20

80

Page 191: Rs on Rails 2011

20

80

Page 192: Rs on Rails 2011

20

80“Long Tail”

Page 193: Rs on Rails 2011
Page 194: Rs on Rails 2011
Page 195: Rs on Rails 2011
Page 196: Rs on Rails 2011
Page 197: Rs on Rails 2011

@pedroh96

Pedro Franceschi

Page 198: Rs on Rails 2011

15 anos

@pedroh96

Pedro Franceschi

Page 199: Rs on Rails 2011

9 anos

@pedroh96

Pedro Franceschi

Page 200: Rs on Rails 2011

6 anos

@pedroh96

Pedro Franceschi

Page 201: Rs on Rails 2011

@pedroh96

Pedro Franceschi

Page 202: Rs on Rails 2011
Page 203: Rs on Rails 2011
Page 204: Rs on Rails 2011
Page 205: Rs on Rails 2011
Page 206: Rs on Rails 2011
Page 207: Rs on Rails 2011

<epílogo>

Page 209: Rs on Rails 2011

Obrigado!

.com.br

www.akitaonrails.com

u.akita.ws/rsonrails11