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

NET Architects Day - DNAD 2011

Embed Size (px)

DESCRIPTION

Palestra sobre Arquitetura, Design e conceitos de pensamento a respeito de desenvolvimento de software e Ruby on Rails.

Citation preview

Page 1: NET Architects Day - DNAD 2011

Discutindo Railse Arquiteturas

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

Page 2: NET Architects Day - DNAD 2011

Discutindo Railse Arquiteturas

Page 3: NET Architects Day - DNAD 2011

Fabio Akitawww.akitaonrails.com

@akitaonrails

Page 4: NET Architects Day - DNAD 2011

Fabio Akitawww.akitaonrails.com

@akitaonrails

1990

Page 5: NET Architects Day - DNAD 2011

Anos 80 Fim Anos 90 Século XXI

Page 6: NET Architects Day - DNAD 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 7: NET Architects Day - DNAD 2011
Page 8: NET Architects Day - DNAD 2011
Page 9: NET Architects Day - DNAD 2011
Page 10: NET Architects Day - DNAD 2011
Page 11: NET Architects Day - DNAD 2011
Page 12: NET Architects Day - DNAD 2011

<prólogo>

Page 13: NET Architects Day - DNAD 2011
Page 14: NET Architects Day - DNAD 2011
Page 15: NET Architects Day - DNAD 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 16: NET Architects Day - DNAD 2011

Requerimentos:ENTENDIDO!

Page 17: NET Architects Day - DNAD 2011
Page 18: NET Architects Day - DNAD 2011

LOL

Page 19: NET Architects Day - DNAD 2011

DESIGN

Page 20: NET Architects Day - DNAD 2011

DESIGN

Page 21: NET Architects Day - DNAD 2011
Page 22: NET Architects Day - DNAD 2011
Page 23: NET Architects Day - DNAD 2011

Pattern PADRÃO

Page 24: NET Architects Day - DNAD 2011

Pattern PADRÃO

Default

STANDARD

Page 25: NET Architects Day - DNAD 2011

“Pattern”

Page 26: NET Architects Day - DNAD 2011
Page 27: NET Architects Day - DNAD 2011
Page 28: NET Architects Day - DNAD 2011

NÃO é “Standard”!

Page 29: NET Architects Day - DNAD 2011

Christopher Alexander

Page 30: NET Architects Day - DNAD 2011
Page 31: NET Architects Day - DNAD 2011
Page 32: NET Architects Day - DNAD 2011
Page 33: NET Architects Day - DNAD 2011
Page 34: NET Architects Day - DNAD 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 35: NET Architects Day - DNAD 2011
Page 36: NET Architects Day - DNAD 2011

2 + 2 = 5!

Page 37: NET Architects Day - DNAD 2011

2 + 2 = 5!

Page 38: NET Architects Day - DNAD 2011

2 + 2 = 4!

Page 39: NET Architects Day - DNAD 2011
Page 40: NET Architects Day - DNAD 2011
Page 41: NET Architects Day - DNAD 2011
Page 42: NET Architects Day - DNAD 2011
Page 43: NET Architects Day - DNAD 2011
Page 44: NET Architects Day - DNAD 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 45: NET Architects Day - DNAD 2011
Page 46: NET Architects Day - DNAD 2011
Page 47: NET Architects Day - DNAD 2011
Page 48: NET Architects Day - DNAD 2011
Page 49: NET Architects Day - DNAD 2011
Page 50: NET Architects Day - DNAD 2011
Page 51: NET Architects Day - DNAD 2011
Page 52: NET Architects Day - DNAD 2011
Page 53: NET Architects Day - DNAD 2011
Page 54: NET Architects Day - DNAD 2011
Page 55: NET Architects Day - DNAD 2011
Page 56: NET Architects Day - DNAD 2011

80

Page 57: NET Architects Day - DNAD 2011

20

80

Page 58: NET Architects Day - DNAD 2011

20

80“Long Tail”

Page 59: NET Architects Day - DNAD 2011
Page 60: NET Architects Day - DNAD 2011

</prólogo>

Page 61: NET Architects Day - DNAD 2011
Page 62: NET Architects Day - DNAD 2011

Pequenos(Startups?)

Grandes(Enterprisey?)

Page 63: NET Architects Day - DNAD 2011

Pequenos(Startups?)

Grandes(Enterprisey?)

DDD

Page 64: NET Architects Day - DNAD 2011

Pequenos(Startups?)

Grandes(Enterprisey?)

DDD

“Light”

Page 65: NET Architects Day - DNAD 2011

Pequenos(Startups?)

Grandes(Enterprisey?)

Page 66: NET Architects Day - DNAD 2011
Page 67: NET Architects Day - DNAD 2011

Complexidade Acidental

Page 68: NET Architects Day - DNAD 2011
Page 69: NET Architects Day - DNAD 2011

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

Page 70: NET Architects Day - DNAD 2011
Page 71: NET Architects Day - DNAD 2011

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

Page 72: NET Architects Day - DNAD 2011
Page 73: NET Architects Day - DNAD 2011

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

Page 74: NET Architects Day - DNAD 2011

(linguagem)

1994

(framework web)

2004

Page 75: NET Architects Day - DNAD 2011

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 76: NET Architects Day - DNAD 2011

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 77: NET Architects Day - DNAD 2011

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 78: NET Architects Day - DNAD 2011

1.8.71.9.2

1.9.3-dev2.3.113.0.7

3.1-RC1

Page 79: NET Architects Day - DNAD 2011
Page 80: NET Architects Day - DNAD 2011

gem install rails

rails new nome_do_projeto

Page 81: NET Architects Day - DNAD 2011

gem install rails

rails new nome_do_projeto

Page 82: NET Architects Day - DNAD 2011

gem install rails

rails new nome_do_projeto

SIM! Via CLI! :-P

Page 83: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 84: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 85: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 86: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 87: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 88: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 89: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 90: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 91: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 92: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Request

Page 93: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 94: NET Architects Day - DNAD 2011
Page 95: NET Architects Day - DNAD 2011
Page 96: NET Architects Day - DNAD 2011

~30 mil gems

~15 GB

Page 97: NET Architects Day - DNAD 2011
Page 98: NET Architects Day - DNAD 2011

bundle install

Page 99: NET Architects Day - DNAD 2011

RubyGems Library Assembly (DLL)

Rake MSBuild

Bundler NuGet

Page 100: NET Architects Day - DNAD 2011

> 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: NET Architects Day - DNAD 2011

> 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: NET Architects Day - DNAD 2011

> 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: NET Architects Day - DNAD 2011

> 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: NET Architects Day - DNAD 2011

> 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: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 106: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Page 107: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Application Server Rack:

Mongrel,Thin,

Passenger,Unicorn

Page 108: NET Architects Day - DNAD 2011

Web Server

Rack Middlewares

Routes

Controller

ModelView

Response Request

Web Server:NginX

Apache

Application Server Rack:

Mongrel,Thin,

Passenger,Unicorn

Page 109: NET Architects Day - DNAD 2011

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQL

Page 110: NET Architects Day - DNAD 2011

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQL

TidyTDS

SQL ServerSQL Azure

Page 111: NET Architects Day - DNAD 2011

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

WCF

Page 112: NET Architects Day - DNAD 2011

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

HAProxy

Page 113: NET Architects Day - DNAD 2011

NginX, Apache, Lighty, IIS

Mongrel, Thin, Unicorn, Passenger

Reverse Proxy

ActiveRecord/DataMapper

RDBMS/NoSQLWeb Services (REST, SOAP)

ActiveResource/RestClient/Savon

HAProxy

Varnish

Page 114: NET Architects Day - DNAD 2011

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: NET Architects Day - DNAD 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 116: NET Architects Day - DNAD 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 117: NET Architects Day - DNAD 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 118: NET Architects Day - DNAD 2011

Thread Context Switch

Page 119: NET Architects Day - DNAD 2011

Thread Context Switch

Page 120: NET Architects Day - DNAD 2011
Page 121: NET Architects Day - DNAD 2011
Page 122: NET Architects Day - DNAD 2011

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

Page 123: NET Architects Day - DNAD 2011
Page 124: NET Architects Day - DNAD 2011
Page 125: NET Architects Day - DNAD 2011

Request RailsApp

Page 126: NET Architects Day - DNAD 2011
Page 127: NET Architects Day - DNAD 2011
Page 128: NET Architects Day - DNAD 2011
Page 129: NET Architects Day - DNAD 2011
Page 130: NET Architects Day - DNAD 2011
Page 131: NET Architects Day - DNAD 2011
Page 132: NET Architects Day - DNAD 2011

Eventos AssíncronosEnvio de mensagens

Page 133: NET Architects Day - DNAD 2011

HTTPD

Request Request Request Request Request Request

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RailsApp

RDBMS

HTTPD HTTPD HTTPD HTTPD HTTPD

Page 134: NET Architects Day - DNAD 2011

NginX

Request Request Request Request Request Request

RDBMS

EventMachine

Page 135: NET Architects Day - DNAD 2011

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

Page 136: NET Architects Day - DNAD 2011

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

5k ~ 10kconexões

Page 137: NET Architects Day - DNAD 2011

NginX

Request Request Request Request Request Request

RDBMS

EventMachine “Look Ma!

No Threads!”

5k ~ 10kconexões

ConexõesLongas

Page 138: NET Architects Day - DNAD 2011
Page 139: NET Architects Day - DNAD 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 140: NET Architects Day - DNAD 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 141: NET Architects Day - DNAD 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 142: NET Architects Day - DNAD 2011

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

Page 143: NET Architects Day - DNAD 2011

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

Page 144: NET Architects Day - DNAD 2011

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

Page 145: NET Architects Day - DNAD 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 146: NET Architects Day - DNAD 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 147: NET Architects Day - DNAD 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 148: NET Architects Day - DNAD 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 149: NET Architects Day - DNAD 2011

Arquitetura de Altíssima Concorrência

Page 150: NET Architects Day - DNAD 2011

(

Page 151: NET Architects Day - DNAD 2011

W. Edward Deming

Page 152: NET Architects Day - DNAD 2011
Page 153: NET Architects Day - DNAD 2011

IN GOD WE TRUST

Todos os outros devem trazer dados

Page 154: NET Architects Day - DNAD 2011
Page 155: NET Architects Day - DNAD 2011

EXPERIENCE BY ITSELF BRINGSNOTHING

Page 156: NET Architects Day - DNAD 2011

ACD

P

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

Page 157: NET Architects Day - DNAD 2011

ACD

P

STANDARD

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

Page 158: NET Architects Day - DNAD 2011

ACD

P

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

Page 159: NET Architects Day - DNAD 2011

ACD

P

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

Page 160: NET Architects Day - DNAD 2011

ACD

P

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

Page 161: NET Architects Day - DNAD 2011

ACD

P

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

Page 162: NET Architects Day - DNAD 2011

)

Page 163: NET Architects Day - DNAD 2011
Page 164: NET Architects Day - DNAD 2011
Page 165: NET Architects Day - DNAD 2011
Page 166: NET Architects Day - DNAD 2011
Page 167: NET Architects Day - DNAD 2011
Page 168: NET Architects Day - DNAD 2011
Page 169: NET Architects Day - DNAD 2011
Page 170: NET Architects Day - DNAD 2011

Perl

Page 171: NET Architects Day - DNAD 2011
Page 172: NET Architects Day - DNAD 2011

Python

Page 173: NET Architects Day - DNAD 2011
Page 174: NET Architects Day - DNAD 2011

PHP

Page 175: NET Architects Day - DNAD 2011
Page 176: NET Architects Day - DNAD 2011

Ruby

Page 177: NET Architects Day - DNAD 2011

OMG!

Page 178: NET Architects Day - DNAD 2011

2007

2008

2009

2010

2011

Ruby on Rails

Page 179: NET Architects Day - DNAD 2011

2.0.0

2.0.5

2007

2008

2009

2010

2011

6Ruby on Rails

Page 180: NET Architects Day - DNAD 2011

2.0.0

2.1.02.0.5

2.1.2

2007

2008

2009

2010

2011

6

3

Ruby on Rails

Page 181: NET Architects Day - DNAD 2011

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: NET Architects Day - DNAD 2011

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: NET Architects Day - DNAD 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.11

3.0.7

2007

2008

2009

2010

2011

6

3

4

12

8

Ruby on Rails

Page 184: NET Architects Day - DNAD 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.11

3.0.7

2007

2008

2009

2010

2011

Ruby on Rails

31Versões!

Page 185: NET Architects Day - DNAD 2011
Page 186: NET Architects Day - DNAD 2011

Web Server

Request

RailsApp

/public/stylesheets

Page 187: NET Architects Day - DNAD 2011

Web Server

Request

RailsApp

ArquivosEstáticos

/public/stylesheets

Page 188: NET Architects Day - DNAD 2011
Page 189: NET Architects Day - DNAD 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 190: NET Architects Day - DNAD 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 191: NET Architects Day - DNAD 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 192: NET Architects Day - DNAD 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 193: NET Architects Day - DNAD 2011
Page 194: NET Architects Day - DNAD 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 195: NET Architects Day - DNAD 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 196: NET Architects Day - DNAD 2011
Page 197: NET Architects Day - DNAD 2011
Page 198: NET Architects Day - DNAD 2011

102

Page 199: NET Architects Day - DNAD 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

/public

Page 200: NET Architects Day - DNAD 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

/public

Page 201: NET Architects Day - DNAD 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

/public

Page 202: NET Architects Day - DNAD 2011

Web Server(Produção)

Request

RailsApp

/app/assets

Web Server(Desenvolvimento)

Request

Sprockets

Tilt

Ugli!er

/public

Page 203: NET Architects Day - DNAD 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 204: NET Architects Day - DNAD 2011

Rails 3.1:Release Candidate

(may 2011)

Page 205: NET Architects Day - DNAD 2011
Page 206: NET Architects Day - DNAD 2011
Page 207: NET Architects Day - DNAD 2011
Page 208: NET Architects Day - DNAD 2011
Page 209: NET Architects Day - DNAD 2011
Page 210: NET Architects Day - DNAD 2011

RubyConfBrasil

3 e 4 de Novembrowww.rubyconf.com.br

Page 211: NET Architects Day - DNAD 2011

<epílogo>

Page 212: NET Architects Day - DNAD 2011

@pedroh96

Pedro Franceschi

Page 213: NET Architects Day - DNAD 2011

15 anos

@pedroh96

Pedro Franceschi

Page 214: NET Architects Day - DNAD 2011

9 anos

@pedroh96

Pedro Franceschi

Page 215: NET Architects Day - DNAD 2011

6 anos

@pedroh96

Pedro Franceschi

Page 216: NET Architects Day - DNAD 2011

@pedroh96

Pedro Franceschi

Page 217: NET Architects Day - DNAD 2011
Page 218: NET Architects Day - DNAD 2011
Page 219: NET Architects Day - DNAD 2011
Page 220: NET Architects Day - DNAD 2011
Page 221: NET Architects Day - DNAD 2011

</epílogo>