09 - fábio akita - além do rails

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

Upload: dnad

Post on 15-May-2015

1.231 views

Category:

Technology


1 download

DESCRIPTION

Ruby on Rails com certeza é a estrela que elevou Ruby ao patamar de linguagem praticamente obrigatória a todo programador moderno. Porém muitos esquecem que Rails não é a única forma de desenvolver aplicações Web e muitas vezes nem é a melhor opção. O Ecossistema Ruby evolui a passos largos, todos os novos frameworks Web em Ruby adotaram o padrão Rack, que facilita a interoperabilidade entre frameworks Ruby. Além disso muitos estão olhando para o mundo da alta concorrência com novas tecnologias como Node.JS, mas o mundo Ruby tem opções robustas e testadas em produção como EventMachine. Enfim, vamos tentar aumentar o leque de soluções web com Ruby, além do Rails, traçando um paralelo com a plataforma .NET.

TRANSCRIPT

Page 1: 09 - Fábio Akita - Além do rails

Discutindo Railse Arquiteturas

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

Page 2: 09 - Fábio Akita - Além do rails

Discutindo Railse Arquiteturas

Page 3: 09 - Fábio Akita - Além do rails

Fabio Akitawww.akitaonrails.com

@akitaonrails

Page 4: 09 - Fábio Akita - Além do rails

Fabio Akitawww.akitaonrails.com

@akitaonrails

1990

Page 5: 09 - Fábio Akita - Além do rails

Anos 80 Fim Anos 90 Século XXI

Page 6: 09 - Fábio Akita - Além do rails

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 7: 09 - Fábio Akita - Além do rails
Page 8: 09 - Fábio Akita - Além do rails
Page 9: 09 - Fábio Akita - Além do rails
Page 10: 09 - Fábio Akita - Além do rails
Page 11: 09 - Fábio Akita - Além do rails
Page 12: 09 - Fábio Akita - Além do rails

<prólogo>

Page 13: 09 - Fábio Akita - Além do rails
Page 14: 09 - Fábio Akita - Além do rails
Page 15: 09 - Fábio Akita - Além do rails

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 16: 09 - Fábio Akita - Além do rails

Requerimentos:ENTENDIDO!

Page 17: 09 - Fábio Akita - Além do rails
Page 18: 09 - Fábio Akita - Além do rails

LOL

Page 19: 09 - Fábio Akita - Além do rails

DESIGN

Page 20: 09 - Fábio Akita - Além do rails

DESIGN

Page 21: 09 - Fábio Akita - Além do rails
Page 22: 09 - Fábio Akita - Além do rails
Page 23: 09 - Fábio Akita - Além do rails

Pattern PADRÃO

Page 24: 09 - Fábio Akita - Além do rails

Pattern PADRÃO

Default

STANDARD

Page 25: 09 - Fábio Akita - Além do rails

“Pattern”

Page 26: 09 - Fábio Akita - Além do rails
Page 27: 09 - Fábio Akita - Além do rails
Page 28: 09 - Fábio Akita - Além do rails

NÃO é “Standard”!

Page 29: 09 - Fábio Akita - Além do rails

Christopher Alexander

Page 30: 09 - Fábio Akita - Além do rails
Page 31: 09 - Fábio Akita - Além do rails
Page 32: 09 - Fábio Akita - Além do rails
Page 33: 09 - Fábio Akita - Além do rails
Page 34: 09 - Fábio Akita - Além do rails

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 35: 09 - Fábio Akita - Além do rails
Page 36: 09 - Fábio Akita - Além do rails

2 + 2 = 5!

Page 37: 09 - Fábio Akita - Além do rails

2 + 2 = 5!

Page 38: 09 - Fábio Akita - Além do rails

2 + 2 = 4!

Page 39: 09 - Fábio Akita - Além do rails
Page 40: 09 - Fábio Akita - Além do rails
Page 41: 09 - Fábio Akita - Além do rails
Page 42: 09 - Fábio Akita - Além do rails
Page 43: 09 - Fábio Akita - Além do rails
Page 44: 09 - Fábio Akita - Além do rails

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

chegar com eles?

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

Page 45: 09 - Fábio Akita - Além do rails
Page 46: 09 - Fábio Akita - Além do rails
Page 47: 09 - Fábio Akita - Além do rails
Page 48: 09 - Fábio Akita - Além do rails
Page 49: 09 - Fábio Akita - Além do rails
Page 50: 09 - Fábio Akita - Além do rails
Page 51: 09 - Fábio Akita - Além do rails
Page 52: 09 - Fábio Akita - Além do rails
Page 53: 09 - Fábio Akita - Além do rails
Page 54: 09 - Fábio Akita - Além do rails
Page 55: 09 - Fábio Akita - Além do rails
Page 56: 09 - Fábio Akita - Além do rails

80

Page 57: 09 - Fábio Akita - Além do rails

20

80

Page 58: 09 - Fábio Akita - Além do rails

20

80“Long Tail”

Page 59: 09 - Fábio Akita - Além do rails
Page 60: 09 - Fábio Akita - Além do rails

</prólogo>

Page 61: 09 - Fábio Akita - Além do rails
Page 62: 09 - Fábio Akita - Além do rails

Pequenos(Startups?)

Grandes(Enterprisey?)

Page 63: 09 - Fábio Akita - Além do rails

Pequenos(Startups?)

Grandes(Enterprisey?)

DDD

Page 64: 09 - Fábio Akita - Além do rails

Pequenos(Startups?)

Grandes(Enterprisey?)

DDD

“Light”

Page 65: 09 - Fábio Akita - Além do rails

Pequenos(Startups?)

Grandes(Enterprisey?)

Page 66: 09 - Fábio Akita - Além do rails
Page 67: 09 - Fábio Akita - Além do rails

Complexidade Acidental

Page 68: 09 - Fábio Akita - Além do rails
Page 69: 09 - Fábio Akita - Além do rails

Ruby on Rails é a melhor forma de desenvolver qualquer aplicação Web.

Page 70: 09 - Fábio Akita - Além do rails
Page 71: 09 - Fábio Akita - Além do rails

Todas as outras formas de desenvolver aplicações Web são inferiores a Ruby on Rails.

Page 72: 09 - Fábio Akita - Além do rails
Page 73: 09 - Fábio Akita - Além do rails

Ruby on Rails é uma das maneiras competentes de se desenvolver aplicações Web em alguns cenários.

Page 74: 09 - Fábio Akita - Além do rails

(linguagem)

1994

(framework web)

2004

Page 75: 09 - Fábio Akita - Além do rails

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 76: 09 - Fábio Akita - Além do rails

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 77: 09 - Fábio Akita - Além do rails

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 78: 09 - Fábio Akita - Além do rails

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 79: 09 - Fábio Akita - Além do rails
Page 80: 09 - Fábio Akita - Além do rails

gem install rails

rails new nome_do_projeto

Page 81: 09 - Fábio Akita - Além do rails

gem install rails

rails new nome_do_projeto

Page 82: 09 - Fábio Akita - Além do rails

gem install rails

rails new nome_do_projeto

SIM! Via CLI! :-P

Page 83: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 84: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 85: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 86: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 87: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 88: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 89: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 90: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 91: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 92: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 93: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 94: 09 - Fábio Akita - Além do rails
Page 95: 09 - Fábio Akita - Além do rails
Page 96: 09 - Fábio Akita - Além do rails

~30 mil gems

~15 GB

Page 97: 09 - Fábio Akita - Além do rails
Page 98: 09 - Fábio Akita - Além do rails

bundle install

Page 99: 09 - Fábio Akita - Além do rails

RubyGems Library Assembly (DLL)

Rake MSBuild

Bundler NuGet

Page 100: 09 - Fábio Akita - Além do rails

> bundle list

Gems included by the bundle: * abstract (1.0.0) * actionmailer (3.0.7) * actionpack (3.0.7) * activemodel (3.0.7) * activerecord (3.0.7) * activeresource (3.0.7) * activesupport (3.0.7) * arel (2.0.9) * builder (2.1.2) * bundler (1.0.13) * erubis (2.6.6) * i18n (0.5.0)

* mail (2.2.19) * mime-types (1.16) * polyglot (0.3.1) * rack (1.2.2) * rack-mount (0.6.14) * rack-test (0.5.7) * rails (3.0.7) * railties (3.0.7) * rake (0.8.7) * sqlite3 (1.3.3) * thor (0.14.6) * treetop (1.4.9) * tzinfo (0.3.27)

Page 101: 09 - Fábio Akita - Além do rails

> bundle list

Gems included by the bundle: * abstract (1.0.0) * actionmailer (3.0.7) * actionpack (3.0.7) * activemodel (3.0.7) * activerecord (3.0.7) * activeresource (3.0.7) * activesupport (3.0.7) * arel (2.0.9) * builder (2.1.2) * bundler (1.0.13) * erubis (2.6.6) * i18n (0.5.0)

* mail (2.2.19) * mime-types (1.16) * polyglot (0.3.1) * rack (1.2.2) * rack-mount (0.6.14) * rack-test (0.5.7) * rails (3.0.7) * railties (3.0.7) * rake (0.8.7) * sqlite3 (1.3.3) * thor (0.14.6) * treetop (1.4.9) * tzinfo (0.3.27)

Page 102: 09 - Fábio Akita - Além do rails

> rake -T

rake about rake db:create rake db:drop rake db:fixtures:load rake db:migrate rake db:migrate:status rake db:rollback rake db:schema:dump rake db:schema:load rake db:seed rake db:setup rake db:structure:dump rake db:versionrake doc:app

rake log:clear rake middleware rake notes rake notes:custom rake rails:template rake rails:update rake routes rake secret rake stats rake test rake test:recent rake test:uncommitted rake time:zones:all rake tmp:clear rake tmp:create

Page 103: 09 - Fábio Akita - Além do rails

> rails generateUsage: rails generate GENERATOR [args] [options]

General options: -h, [--help] # Print generator's options and usage -p, [--pretend] # Run but do not make any changes -f, [--force] # Overwrite files that already exist -s, [--skip] # Skip files that already exist -q, [--quiet] # Suppress status output

Please choose a generator below.

Rails: controller generator helper integration_test mailer migration model

observer performance_test plugin resource scaffold scaffold_controller session_migration stylesheets

Page 104: 09 - Fábio Akita - Além do rails

> rake middleware

use ActionDispatch::Staticuse Rack::Lockuse ActiveSupport::Cache::Strategy::LocalCacheuse Rack::Runtimeuse Rails::Rack::Loggeruse ActionDispatch::ShowExceptionsuse ActionDispatch::RemoteIpuse Rack::Sendfileuse ActionDispatch::Callbacksuse ActiveRecord::ConnectionAdapters::ConnectionManagementuse ActiveRecord::QueryCacheuse ActionDispatch::Cookiesuse ActionDispatch::Session::CookieStoreuse ActionDispatch::Flashuse ActionDispatch::ParamsParseruse Rack::MethodOverrideuse ActionDispatch::Headuse ActionDispatch::BestStandardsSupportrun Demo::Application.routes

Rack Middlewares

Page 105: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 106: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 107: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Application Server Rack:

Mongrel,Thin,

Passenger,Unicorn

Page 108: 09 - Fábio Akita - Além do rails

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Web Server:NginX

Apache

Application Server Rack:

Mongrel,Thin,

Passenger,Unicorn

Page 109: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQL

Page 110: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQL

TidyTDS

SQL ServerSQL Azure

Page 111: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

WCF

Page 112: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

HAProxy

Page 113: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

HAProxy

Varnish

Page 114: 09 - Fábio Akita - Além do rails

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

HAProxy

Memcache

Varnish

Page 115: 09 - Fábio Akita - Além do rails

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 116: 09 - Fábio Akita - Além do rails

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 117: 09 - Fábio Akita - Além do rails

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Mais curto possível!

Page 118: 09 - Fábio Akita - Além do rails

Thread Context Switch

Page 119: 09 - Fábio Akita - Além do rails

Thread Context Switch

Page 120: 09 - Fábio Akita - Além do rails
Page 121: 09 - Fábio Akita - Além do rails
Page 122: 09 - Fábio Akita - Além do rails

$(':checkbox').map(function() { return this.id;}).get().join(',');

Page 123: 09 - Fábio Akita - Além do rails
Page 124: 09 - Fábio Akita - Além do rails
Page 125: 09 - Fábio Akita - Além do rails

Request RailsApp

Page 126: 09 - Fábio Akita - Além do rails
Page 127: 09 - Fábio Akita - Além do rails
Page 128: 09 - Fábio Akita - Além do rails
Page 129: 09 - Fábio Akita - Além do rails
Page 130: 09 - Fábio Akita - Além do rails
Page 131: 09 - Fábio Akita - Além do rails
Page 132: 09 - Fábio Akita - Além do rails

Eventos AssíncronosEnvio de mensagens

Page 133: 09 - Fábio Akita - Além do rails

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 134: 09 - Fábio Akita - Além do rails

NginX

Request Request Request Request Request Request

RDBMS

EventMachine

Page 135: 09 - Fábio Akita - Além do rails

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

Page 136: 09 - Fábio Akita - Além do rails

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

5k ~ 10kconexões

Page 137: 09 - Fábio Akita - Além do rails

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

5k ~ 10kconexões

ConexõesLongas

Page 138: 09 - Fábio Akita - Além do rails
Page 139: 09 - Fábio Akita - Além do rails

<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 140: 09 - Fábio Akita - Além do rails

<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 141: 09 - Fábio Akita - Além do rails

<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 142: 09 - Fábio Akita - Além do rails

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

Page 143: 09 - Fábio Akita - Além do rails

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

Page 144: 09 - Fábio Akita - Além do rails

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

Page 145: 09 - Fábio Akita - Além do rails

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 146: 09 - Fábio Akita - Além do rails

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 147: 09 - Fábio Akita - Além do rails

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 148: 09 - Fábio Akita - Além do rails

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 149: 09 - Fábio Akita - Além do rails

Arquitetura de Altíssima Concorrência

Page 150: 09 - Fábio Akita - Além do rails

(

Page 151: 09 - Fábio Akita - Além do rails

W. Edward Deming

Page 152: 09 - Fábio Akita - Além do rails
Page 153: 09 - Fábio Akita - Além do rails

IN GOD WE TRUST

Todos os outros devem trazer dados

Page 154: 09 - Fábio Akita - Além do rails
Page 155: 09 - Fábio Akita - Além do rails

EXPERIENCE BY ITSELF BRINGSNOTHING

Page 156: 09 - Fábio Akita - Além do rails

ACD

P

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

Page 157: 09 - Fábio Akita - Além do rails

ACD

P

STANDARD

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

Page 158: 09 - Fábio Akita - Além do rails

ACD

P

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

Page 159: 09 - Fábio Akita - Além do rails

ACD

P

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

Page 160: 09 - Fábio Akita - Além do rails

ACD

P

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

Page 161: 09 - Fábio Akita - Além do rails

ACD

P

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

Page 162: 09 - Fábio Akita - Além do rails

)

Page 163: 09 - Fábio Akita - Além do rails
Page 164: 09 - Fábio Akita - Além do rails
Page 165: 09 - Fábio Akita - Além do rails
Page 166: 09 - Fábio Akita - Além do rails
Page 167: 09 - Fábio Akita - Além do rails
Page 168: 09 - Fábio Akita - Além do rails
Page 169: 09 - Fábio Akita - Além do rails
Page 170: 09 - Fábio Akita - Além do rails

Perl

Page 171: 09 - Fábio Akita - Além do rails
Page 172: 09 - Fábio Akita - Além do rails

Python

Page 173: 09 - Fábio Akita - Além do rails
Page 174: 09 - Fábio Akita - Além do rails

PHP

Page 175: 09 - Fábio Akita - Além do rails
Page 176: 09 - Fábio Akita - Além do rails

Ruby

Page 177: 09 - Fábio Akita - Além do rails

OMG!

Page 178: 09 - Fábio Akita - Além do rails

2007

2008

2009

2010

2011

Ruby on Rails

Page 179: 09 - Fábio Akita - Além do rails

2.0.0

2.0.5

2007

2008

2009

2010

2011

6Ruby on Rails

Page 180: 09 - Fábio Akita - Além do rails

2.0.0

2.1.02.0.5

2.1.2

2007

2008

2009

2010

2011

6

3

Ruby on Rails

Page 181: 09 - Fábio Akita - Além do rails

2.0.0

2.1.0

2.2.0

2.0.5

2.1.2

2.2.3

2007

2008

2009

2010

2011

6

3

4

Ruby on Rails

Page 182: 09 - Fábio Akita - Além do rails

2.0.0

2.1.0

2.2.0

2.3.0

2.0.5

2.1.2

2.2.3

2.3.11

2007

2008

2009

2010

2011

6

3

4

12

Ruby on Rails

Page 183: 09 - Fábio Akita - Além do rails

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.11

3.0.7

2007

2008

2009

2010

2011

6

3

4

12

8

Ruby on Rails

Page 184: 09 - Fábio Akita - Além do rails

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.11

3.0.7

2007

2008

2009

2010

2011

Ruby on Rails

31Versões!

Page 185: 09 - Fábio Akita - Além do rails
Page 186: 09 - Fábio Akita - Além do rails

Web Server

Request

RailsApp

/public/stylesheets

Page 187: 09 - Fábio Akita - Além do rails

Web Server

Request

RailsApp

ArquivosEstáticos

/public/stylesheets

Page 188: 09 - Fábio Akita - Além do rails
Page 189: 09 - Fábio Akita - Além do rails

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 190: 09 - Fábio Akita - Além do rails

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 191: 09 - Fábio Akita - Além do rails

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 192: 09 - Fábio Akita - Além do rails

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 193: 09 - Fábio Akita - Além do rails
Page 194: 09 - Fábio Akita - Além do rails

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 195: 09 - Fábio Akita - Além do rails

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 196: 09 - Fábio Akita - Além do rails
Page 197: 09 - Fábio Akita - Além do rails
Page 198: 09 - Fábio Akita - Além do rails

102

Page 199: 09 - Fábio Akita - Além do rails

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

/public

Page 200: 09 - Fábio Akita - Além do rails

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

/public

Page 201: 09 - Fábio Akita - Além do rails

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

/public

Page 202: 09 - Fábio Akita - Além do rails

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

Ugli!er

/public

Page 203: 09 - Fábio Akita - Além do rails

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 204: 09 - Fábio Akita - Além do rails

Rails 3.1:Release Candidate

(may 2011)

Page 205: 09 - Fábio Akita - Além do rails
Page 206: 09 - Fábio Akita - Além do rails
Page 207: 09 - Fábio Akita - Além do rails
Page 208: 09 - Fábio Akita - Além do rails
Page 209: 09 - Fábio Akita - Além do rails
Page 210: 09 - Fábio Akita - Além do rails

RubyConfBrasil

3 e 4 de Novembrowww.rubyconf.com.br

Page 211: 09 - Fábio Akita - Além do rails

<epílogo>

Page 212: 09 - Fábio Akita - Além do rails

@pedroh96

Pedro Franceschi

Page 213: 09 - Fábio Akita - Além do rails

15 anos

@pedroh96

Pedro Franceschi

Page 214: 09 - Fábio Akita - Além do rails

9 anos

@pedroh96

Pedro Franceschi

Page 215: 09 - Fábio Akita - Além do rails

6 anos

@pedroh96

Pedro Franceschi

Page 216: 09 - Fábio Akita - Além do rails

@pedroh96

Pedro Franceschi

Page 217: 09 - Fábio Akita - Além do rails
Page 218: 09 - Fábio Akita - Além do rails
Page 219: 09 - Fábio Akita - Além do rails
Page 220: 09 - Fábio Akita - Além do rails
Page 221: 09 - Fábio Akita - Além do rails

</epílogo>