beyond ruby with nodejs - rubyconf brasil 2010

232
Beyond With

Upload: emerson-macedo

Post on 13-Jan-2015

3.235 views

Category:

Technology


3 download

DESCRIPTION

Nessa apresentação eu descrevo o quanto eu gosto do Ruby e do Rails, mas onde ele pode não ser a melhor opção. NodeJS é uma tecnologia de certa forma recente, mas que pode cobrir algumas lacunas que o Ruby e Rails não fazem tão bem.

TRANSCRIPT

Page 1: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Beyond

With

Page 2: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#whoami

Page 3: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 4: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#ruby

Page 5: Beyond Ruby with NodeJS - RubyConf Brasil 2010

IRuby

Page 6: Beyond Ruby with NodeJS - RubyConf Brasil 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 => :permalink

end

Model

Friday, August 7, 2009

Page 7: Beyond Ruby with NodeJS - RubyConf Brasil 2010

“Tornar as coisas simples fáceis e as

coisas difíceis possíveis”

Fisolofia Ruby

Page 8: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Bonito

Page 9: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Bonito

Don’t Repeat Yourself

Page 10: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Bonito

Don’t Repeat Yourself

Convention Over Configuration

Page 11: Beyond Ruby with NodeJS - RubyConf Brasil 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})"

end

end

Friday, August 7, 2009

Page 12: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 13: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 14: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#números

Page 15: Beyond Ruby with NodeJS - RubyConf Brasil 2010

2010

Page 16: Beyond Ruby with NodeJS - RubyConf Brasil 2010

~ 2 bilhões de usuários de internet

em todo mundo

Page 17: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 18: Beyond Ruby with NodeJS - RubyConf Brasil 2010

68 milhões de usuários

Page 19: Beyond Ruby with NodeJS - RubyConf Brasil 2010

68 milhões de usuários

37 milhões são ativos

Page 20: Beyond Ruby with NodeJS - RubyConf Brasil 2010

0

22,5

45

67,5

90

Brasil Italia Espanha Japão EUA Inglaterra França AustráliaAlemanha Suiça

59 %63 %

72 %73 %74 %74 %75 %77 %78 %

86 %

% de usuários ativos nas Redes Sociais

Fonte: The Nielsen Company

Page 21: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 22: Beyond Ruby with NodeJS - RubyConf Brasil 2010

2014

Page 23: Beyond Ruby with NodeJS - RubyConf Brasil 2010

~ 70% dos adultos serão usuários regulares de redes sociais

Page 24: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 25: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 26: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 27: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 28: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Estrutura física de servidores para escalar

Page 29: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na vertical

Page 30: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na vertical

Page 31: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 32: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 33: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 34: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 35: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 36: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando DB na horizontal

write

read

write write

read

Page 37: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando DB na horizontal

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

ShardDatabase

Page 38: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 39: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura pra fazer o software escalar

Page 40: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender muitos requests

Page 41: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender muitos requests

Finalize a requisição o mais rápido possível

Page 42: Beyond Ruby with NodeJS - RubyConf Brasil 2010

HTTP GET

Page 43: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 44: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 45: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 46: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 47: Beyond Ruby with NodeJS - RubyConf Brasil 2010

HTTP POST

Page 48: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 49: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 50: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 51: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 52: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 53: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Por que então mais uma tecnologia ?

Page 54: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 55: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 56: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Escalando na horizontal

Page 57: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 58: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 59: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Evented, non-blocking I/O Google V8 Engine

Page 60: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Qual é o problema das tecnologias atuais ?

Page 61: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 62: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Nosso código costuma ser escrito assim

Page 63: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Nosso código costuma ser escrito assim

O que o software está fazendo enquanto a querie executa ?

Page 64: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Na maioria dos casos está travado esperando

a resposta

Page 65: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD Database

Page 66: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD Database

Page 67: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD Database

Page 68: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD

RUBYPROCESS

Database

Page 69: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD

RUBYPROCESS

Database

BLOCK

Page 70: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Ruby on Rails

HTTPD

RUBYPROCESS

RUBYPROCESS

RUBYPROCESS

EUBYPROCESS

Database

BLOCK

BLOCK

BLOCK

BLOCK

Page 71: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 72: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 73: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 74: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet Container

Servlet

Page 75: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet Container

Servlet

Page 76: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet Container

Servlet

Page 77: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet ContainerThread

Servlet

Page 78: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet ContainerThread

Servlet

BLOCK

Page 79: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java

HTTPD Database

Servlet ContainerThread

Thread

Thread

Thread

Thread

Thread

Thread

Servlet

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

BLOCK

Page 80: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Apenas um processo abrindo uma thread para cada request

Page 81: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 82: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 83: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Produtividade do programador mais que

performance da tecnologia

Page 84: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 85: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java Rumble ?!?:p

Page 86: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Apenas um processo abrindo uma thread para cada request

Page 87: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Parece bom mas ...

Page 88: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

Page 89: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Como manter conectados 10, 20 ou

30 mil usuários simultâneos ?

30 mil threads ?

Page 90: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Page 91: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Apache vs NGINXconcurrency × memory

http://blog.webfaction.com/a-little-holiday-present

Apache vs NGINXconcurrency × reqs/sec

http://blog.webfaction.com/a-little-holiday-present

Page 92: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Apache cria uma thread por request

Page 93: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Troca de contexto entre theads tem

um custo

Page 94: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Cada OS Thread cria uma pilha de execução nova

Page 95: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pense bem antes de usar uma thread por

request quando precisar suportar alta

concorrência

Page 96: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 97: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender muitos requests

Finalize a requisição o mais rápido possível

Page 98: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender alta concorrência

Page 99: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender alta concorrência

Evite threads

Page 100: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Pattern para atender alta concorrência

Evite threads

Use um Event Loop

Page 101: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Performance!=

Escalabilidade

Page 102: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Performance!=

Escalabilidade

mas ...

Page 103: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Uma performance melhor ajuda a escalar com menos recursos

Page 104: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 105: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 106: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Precisamos fazer I/O de outra maneira

Page 107: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Latência de I/O

Page 108: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

Latência de I/O

Page 109: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

Latência de I/O

Page 110: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Latência de I/O

Page 111: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Latência de I/O

Page 112: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

Latência de I/O

Page 113: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

Latência de I/O

Page 114: Beyond Ruby with NodeJS - RubyConf Brasil 2010

I/O não bloqueante

Page 115: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

Page 116: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

I/O não bloqueante

I/O bloqueante

Page 117: Beyond Ruby with NodeJS - RubyConf Brasil 2010

L1 3 ciclos

L2 14 ciclos

RAM 250 ciclos

Disco 41.000.000 ciclos

Rede 240.000.000 ciclos

I/O não bloqueante

I/O bloqueante

Page 118: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Infraestrutura não bloqueante, puramente baseada em eventos, para desenvolver

software de alta concorrência

Page 119: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Servidor TCP simples em NodeJS

O código acima faz com que a execução retorne imediatamente ao event loop

Page 120: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Por que já não faziamos dessa forma ?

Page 121: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 122: Beyond Ruby with NodeJS - RubyConf Brasil 2010

POSIX Assync I/O não suportado por todos

os S.Os

Page 123: Beyond Ruby with NodeJS - RubyConf Brasil 2010

POSIX Assync I/O não suportado por todos

os S.Os

libmysql_client não permite query async

Page 124: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Filosofia do NodeJS

Page 125: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Filosofia do NodeJS

Todo I/O deveria ser feito desta forma

Page 126: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura

eventloop

(libev)

threadpool

(libeio)

V8

Node Bindings

Node standard libraryJavascript

C

Page 127: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#reactor

Page 128: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 129: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 130: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 131: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 132: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

load(“index.html”)

I/O em disco (bloqueante)

Page 133: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(1)

http_parse(1)

Pilha de execução

I/O em disco (bloqueante)

Page 134: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(1)

Pilha de execução

I/O em disco (bloqueante)

Page 135: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

I/O em disco (bloqueante)

Page 136: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 137: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 138: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 139: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

http_respond(2)

I/O em RAM (não bloqueante)

Page 140: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(2)

http_parse(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 141: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

socket_readdable(2)

Pilha de execução

I/O em RAM (não bloqueante)

Page 142: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

I/O em RAM (não bloqueante)

Page 143: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 144: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 145: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

file_loaded()

http_respond(1)

Pilha de execução

Arquivo carregou do disco

Page 146: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

file_loaded()

Pilha de execução

Arquivo carregou do disco

Page 147: Beyond Ruby with NodeJS - RubyConf Brasil 2010

ev_loop()

Pilha de execução

Arquivo carregou do disco

Page 148: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura Web

Page 149: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura Web

Nginx

Page 150: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura Web

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Nginx

Page 151: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura Web

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Rubyon

Rails

Nginx

NodeJS

Page 152: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Arquitetura Web

Nginx

Page 153: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 154: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 155: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#bizarrices

Page 156: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 157: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 158: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 159: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 160: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Isso é bonito?

Page 161: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 162: Beyond Ruby with NodeJS - RubyConf Brasil 2010

em-syslog

Page 163: Beyond Ruby with NodeJS - RubyConf Brasil 2010

em-spec

em-dns

em-syslog

Page 164: Beyond Ruby with NodeJS - RubyConf Brasil 2010

em-proxy

em-spec

em-dns

em-syslog

em-ruby-irc

em-memcache-client

Page 165: Beyond Ruby with NodeJS - RubyConf Brasil 2010

em-mysql

em-proxy

em-syncrony

em-spec

em-dns

em-syslog

em-ruby-irc

em-mongo

em-memcache-client em-simplechat

Page 166: Beyond Ruby with NodeJS - RubyConf Brasil 2010

em-mysql

em-http-request em-websocket

em-proxy

em-syncrony

em-redis

em-spec

em-ftpd

em-dns

em-jabberbot

em-resolv-replace

em-syslogem-dir-watcher

em-ruby-irc

em-net-http

em-s3 em-mongo

em-memcache-client em-simplechat

Page 167: Beyond Ruby with NodeJS - RubyConf Brasil 2010

EM-*

Page 168: Beyond Ruby with NodeJS - RubyConf Brasil 2010

WS-*

Page 169: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#simplicidade

Page 170: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código bloqueante

Page 171: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código bloqueante

Código não-bloqueante

Page 172: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 173: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 174: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 175: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Callback

Page 176: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Callback

Callback

Page 177: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#evolução

Page 178: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 179: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 180: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Don’t Repeat Yourself

Page 181: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 182: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 183: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 184: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 185: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 186: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 187: Beyond Ruby with NodeJS - RubyConf Brasil 2010

XML

Properties

YAML

Configurações

Page 188: Beyond Ruby with NodeJS - RubyConf Brasil 2010

XML

Properties

YAML

Configurações

JSON

Transporte

Page 189: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Configurações

JSON

Page 190: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Configurações

JSON

Page 191: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Configurações

JSON

Transporte

Page 192: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Configurações

Javascript Object Notation

Transporte

Page 193: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java Ruby Python

Server Side

PHP

Page 194: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Java Ruby Python

Server Side

PHP

Client Side

JavaScript

Page 195: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Server Side

JavaScript

Page 196: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Server Side

JavaScript

Page 197: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Server Side

JavaScript

Client Side

Page 198: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#ecossistema

Page 199: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 200: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 201: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Sinatra detected !

Page 202: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 203: Beyond Ruby with NodeJS - RubyConf Brasil 2010

TDD / BDD

Page 204: Beyond Ruby with NodeJS - RubyConf Brasil 2010

TDD / BDD#http://github.com/visionmedia/expresso/

Page 205: Beyond Ruby with NodeJS - RubyConf Brasil 2010

TDD / BDD#vows - http://vowsjs.org/

Page 206: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 207: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 208: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 209: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 210: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 211: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 212: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 213: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 214: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 215: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 216: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#last-thing

Page 217: Beyond Ruby with NodeJS - RubyConf Brasil 2010

on

Page 218: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Client Ruby on Rails

Page 219: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Client Ruby on Rails

Page 220: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Servidor em Node.js

Page 221: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Servidor em Node.js

Page 222: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Client-Side ( JS )

Page 223: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Client-Side ( JS )

Page 224: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Código Server Coffeescript

Page 225: Beyond Ruby with NodeJS - RubyConf Brasil 2010

#conclusão

Page 226: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 227: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 228: Beyond Ruby with NodeJS - RubyConf Brasil 2010

IRuby

Page 229: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 230: Beyond Ruby with NodeJS - RubyConf Brasil 2010
Page 231: Beyond Ruby with NodeJS - RubyConf Brasil 2010

Obrigado !!!

Emerson Macedo@emerleite

http://nodecasts.orghttp://codificando.com