SlideShare ist ein Scribd-Unternehmen logo
1 von 209
Downloaden Sie, um offline zu lesen
Discutindo Rails
 e Arquiteturas

  a apresentação já vai começar ...
Discutindo Rails
 e Arquiteturas
Fabio Akita
www.akitaonrails.com
  @akitaonrails
1 ano atrás       4 pessoas


                  20 pessoas
   Hoje
              + USD 1 Milhão/ano
1 ano atrás       4 pessoas


                  20 pessoas
   Hoje
              + USD 1 Milhão/ano
1 ano atrás       4 pessoas


                  20 pessoas
   Hoje
              + USD 1 Milhão/ano
~1990
Anos 80   Fim Anos 90   Século XXI
Anos 80               Fim Anos 90                    Século XXI

                                            Perl
Basic                 Pascal                              Java
                  C                   PHP

 dBase                    Delphi           Python         ABAP
   III
                                                                 Ruby
        Clipper
                                     ASP           .NET
                                                                 ObjC
                                    VB6
1.8.7
  1.9.2
1.9.3-dev
 2.3.12
  3.0.9
3.1-RC4
1.8.7
  1.9.2
1.9.3-dev
 2.3.12
  3.0.9
3.1-RC4
1.8.7
  1.9.2
1.9.3-dev
 2.3.12
  3.0.9
3.1-RC4
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Request

       Web Server


   Rack Middlewares


                    Routes

       Controller

View                Model
Response                Request

           Web Server


     Rack Middlewares


                        Routes

           Controller

  View                  Model
Response                Request

           Web Server


     Rack Middlewares
                                  Application
                                  Server Rack:
                        Routes
                                   Unicorn,
           Controller
                                  Passenger
  View                  Model
Web Server:

Response                Request     NginX
                                    Apache
           Web Server


     Rack Middlewares
                                  Application
                                  Server Rack:
                        Routes
                                   Unicorn,
           Controller
                                  Passenger
  View                  Model
NginX, Apache



     Reverse Proxy




   Unicorn, Passenger

ActiveRecord/DataMapper



     RDBMS/NoSQL
HAProxy
     NginX, Apache



     Reverse Proxy




   Unicorn, Passenger

ActiveRecord/DataMapper
     RestClient/Savon



     RDBMS/NoSQL
Web Services (REST, SOAP)
HAProxy
     NginX, Apache

                            Varnish
     Reverse Proxy




   Unicorn, Passenger

ActiveRecord/DataMapper
     RestClient/Savon



     RDBMS/NoSQL
Web Services (REST, SOAP)
HAProxy
     NginX, Apache

                             Varnish
     Reverse Proxy




   Unicorn, Passenger

ActiveRecord/DataMapper
     RestClient/Savon
                            Memcached

     RDBMS/NoSQL
Web Services (REST, SOAP)
Request   Request   Request     Request      Request   Request




HTTPD     HTTPD     HTTPD        HTTPD       HTTPD     HTTPD




 Rails     Rails     Rails           Rails    Rails     Rails
 App       App       App             App      App       App




                             RDBMS
Request   Request   Request     Request      Request   Request




HTTPD     HTTPD     HTTPD        HTTPD       HTTPD     HTTPD




 Rails     Rails     Rails           Rails    Rails     Rails
 App       App       App             App      App       App




                             RDBMS
Request   Request   Request     Request      Request   Request




HTTPD     HTTPD     HTTPD        HTTPD       HTTPD     HTTPD




 Rails     Rails     Rails           Rails    Rails     Rails
 App       App       App             App      App       App




 Mais curto                  RDBMS
 possível!
Thread Context Switch
Thread Context Switch
Rails
Request
          App
Eventos Assíncronos
Envio de mensagens
Request   Request   Request     Request      Request   Request




HTTPD     HTTPD     HTTPD        HTTPD       HTTPD     HTTPD




 Rails     Rails     Rails           Rails    Rails     Rails
 App       App       App             App      App       App




                             RDBMS
Request   Request   Request   Request   Request   Request




                          NginX




                        Async App




                         RDBMS
Request   Request   Request   Request   Request   Request




                          NginX




                        Async App
                                         “Look Ma!
                                        No Threads!”


                         RDBMS
Request   Request   Request   Request   Request   Request




                          NginX

                                          5k ~ 10k
                                          conexões

                        Async App
                                         “Look Ma!
                                        No Threads!”


                         RDBMS
Request   Request   Request   Request   Request   Request




                          NginX

                                          5k ~ 10k
                                          conexões
     Conexões
      Longas            Async App
                                         “Look Ma!
                                        No Threads!”


                         RDBMS
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
  end
end
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
  end
end
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
  end
end
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
  end
end
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
  end
end
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
  end
end
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
  end
end
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
  end
end
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
  end
end
<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>
<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>
<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>
myChannel.bind('coisa-criada', function(thing) {
  alert('Uma coisa foi criada: ' + thing.name);
});
myChannel.bind('coisa-criada', function(thing) {
  alert('Uma coisa foi criada: ' + thing.name);
});
myChannel.bind('coisa-criada', function(thing) {
  alert('Uma coisa foi criada: ' + thing.name);
});
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
  end
end
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
  end
end
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
  end
end
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
  end
end
Arquitetura de
Altíssima Concorrência
(
W. Edward Deming
IN GOD WE TRUST
Todos os outros devem trazer dados
EXPERIENCE BY ITSELF BRINGS
           NOTHING
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)




 P A
 D C
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)




 P A
 D C
      STANDARD
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)




 P A
 D C
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)




        P A
        D C
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)




                      P A
                      D C
Ciclo “Plan-Do-Check-Act”
       (melhoria contínua)



                             P A
                             D C
)
Perl
Python
PHP
Ruby
OMG!
2011

2010



2009




2008

2007   Ruby on Rails
3.0.9

2011     2.3.12
                               10
2010                   3.0.0
         2.2.3
                               12
2009
                       2.3.0

         2.1.2
                               4
                       2.2.0
          2.0.5                3
                       2.1.0
2008                           6
2007   Ruby on Rails   2.0.0
3.0.9

2011     2.3.12
2010                   3.0.0
         2.2.3
2009

         2.1.2
                       2.3.0
                               34
                       2.2.0   Versões!

          2.0.5
                       2.1.0
2008

2007   Ruby on Rails   2.0.0
Request



          Web Server




                      Rails
                      App


/public/stylesheets
Request



                      Web Server


Arquivos
Estáticos                         Rails
                                  App


            /public/stylesheets
Variáveis
$blue: #3bbfce;
$margin: 16px;            /* CSS */

.content-navigation {     .content-navigation {
  border-color: $blue;      border-color: #3bbfce;
  color:                    color: #2b9eab;
    darken($blue, 9%);    }
}
                          .border {
.border {                   padding: 8px;
  padding: $margin / 2;     margin: 8px;
  margin: $margin / 2;      border-color: #3bbfce;
  border-color: $blue;    }
}
Nesting
table.hl {               /* CSS */
  margin: 2em 0;
  td.ln {                table.hl {
    text-align: right;     margin: 2em 0;
  }                      }
}                        table.hl td.ln {
                           text-align: right;
li {                     }
  font: {
     family: serif;      li {
     weight: bold;         font-family: serif;
     size: 1.2em;          font-weight: bold;
  }                        font-size: 1.2em;
}                        }
Mixins
@mixin table-base {
  th {
                          /* CSS */
    text-align: center;
    font-weight: bold;
                          #data {
  }
  td, th {padding: 2px}     float: left;
}                           margin-left: 10px;
                          }
@mixin left($dist) {      #data th {
  float: left;              text-align: center;
  margin-left: $dist;       font-weight: bold;
}
                          }
                          #data td, #data th {
#data {
  @include left(10px);      padding: 2px;
  @include table-base;    }
}
Selector Inheritance
                       /* CSS */

.error {
                       .error, .badError {
  border: 1px #f00;
                         border: 1px #f00;
  background: #fdd;
                         background: #fdd;
}
                       }
.error.intrusion {
  font-size: 1.3em;
                       .error.intrusion,
  font-weight: bold;
                       .badError.intrusion {
}
                         font-size: 1.3em;
                         font-weight: bold;
.badError {
                       }
  @extend .error;
  border-width: 3px;
                       .badError {
}
                         border-width: 3px;
                       }
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;
class Animal                                     child.__super__ = parent.prototype;
  constructor: (@name) ->                        return child;
                                              };
                                              Animal = (function() {
  move: (meters) ->                              function Animal(name) {
                                                    this.name = name;
    alert @name + " moved " + meters + "m."      }
                                                 Animal.prototype.move = function(meters) {
                                                    return alert(this.name + " moved " + meters + "m.");
class Snake extends Animal                       };
                                                 return Animal;
  move: ->                                    })();
    alert "Slithering..."                     Snake = (function() {
                                                 __extends(Snake, Animal);
    super 5                                      function Snake() {
                                                    Snake.__super__.constructor.apply(this, arguments);
                                                 }
class Horse extends Animal                       Snake.prototype.move = function() {
                                                    alert("Slithering...");
  move: ->                                          return Snake.__super__.move.call(this, 5);
    alert "Galloping..."                         };
                                                 return Snake;
    super 45                                  })();
                                              Horse = (function() {
                                                 __extends(Horse, Animal);
sam = new Snake "Sammy the Python"               function Horse() {
tom = new Horse "Tommy the Palomino"                Horse.__super__.constructor.apply(this, arguments);
                                                 }
                                                 Horse.prototype.move = function() {
                                                    alert("Galloping...");
sam.move()                                          return Horse.__super__.move.call(this, 45);
tom.move()                                       };
                                                 return Horse;
                                              })();
                                              sam = new Snake("Sammy the Python");
                                              tom = new Horse("Tommy the Palomino");
                                              sam.move();
                                              tom.move();
                                              loadrun
102
Request          Request


   Web Server       Web Server
(Desenvolvimento)   (Produção)




                               Rails
                               App




 /app/assets         /public
Request          Request


   Web Server       Web Server
(Desenvolvimento)   (Produção)




                               Rails
    Sprockets
                               App




 /app/assets         /public
Request          Request


   Web Server       Web Server
(Desenvolvimento)   (Produção)




                               Rails
    Sprockets
                               App

      Tilt




 /app/assets         /public
Request          Request


   Web Server       Web Server
(Desenvolvimento)   (Produção)




                               Rails
    Sprockets
                               App

       Tilt

     Ugli er



 /app/assets         /public
ENGINE                 FILE EXTENSIONS         REQUIRED LIBRARIES

ERB                    .erb, .rhtml
                                               none
Interpolated String    .str

Erubis                 .erb, .rhtml, .erubis   erubis

Haml                   .haml                   haml

Sass                   .sass
                                               sass
Scss                   .scss

Less CSS               .less                   less

Builder                .builder                builder

Liquid                 .liquid                 liquid

RDiscount                                      rdiscount

Redcarpet                                      redcarpet

BlueCloth              .markdown, .mkd, .md    bluecloth

Kramdown                                       kramdown

Maruku                                         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
jQuery       Tamanho   Tempo

 Original Size    621kb

Google Closure    234kb     6.5s

YUI Compressor    240kb     2.7s

   UglifyJS      235kb     1.3s
jQuery       Tamanho   Tempo

 Original Size    621kb

Google Closure    234kb     6.5s

YUI Compressor    240kb     2.7s

   UglifyJS      235kb     1.3s
jQuery       Tamanho   Tempo

 Original Size    621kb

Google Closure    234kb     6.5s

YUI Compressor    240kb     2.7s

   UglifyJS      235kb     1.3s
jQuery       Tamanho   Tempo

 Original Size    621kb

Google Closure    234kb     6.5s

YUI Compressor    240kb     2.7s

   UglifyJS      235kb     1.3s
jQuery       Tamanho   Tempo

 Original Size    621kb

Google Closure    234kb     6.5s

YUI Compressor    240kb     2.7s

   UglifyJS      235kb     1.3s
Rails 3.1:
Release Candidate
   (may 2011)
RubyConf
     Brasil
3 e 4 de Novembro
    www.rubyconf.com.br
<epílogo>
Como o cliente      Como o Líder de    Como o Analista     Como o Programador   Como o Consultor de
    explicou         Projeto entendeu      desenhou               escreveu        Negócios descreveu




Como o projeto foi   Como Operações     Como o cliente foi                          O que o cliente
                                                             Como foi o suporte
  documentado           instalou            cobrado                                realmente queria
Requerimentos:
 ENTENDIDO!
LOL
DESIGN
DESIGN
Pattern   PADRÃO
STANDARD


 Pattern   PADRÃO


 Default
“Pattern”
NÃO é “Standard”!
Christopher Alexander
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
2 + 2 = 5!
2 + 2 = 5!
2 + 2 = 4!
Bertrand Russel
Bertrand Russel
Aqui estão os fatos. Que   Aqui está a conclusão.
  conclusões podemos        Que fatos podemos
   chegar com eles?         suportar com eles?
80
20


     80
20


     80
20


     80
          “Long Tail”
Pedro Franceschi
     @pedroh96
15 anos


Pedro Franceschi
     @pedroh96
9 anos


Pedro Franceschi
     @pedroh96
6 anos


Pedro Franceschi
     @pedroh96
Pedro Franceschi
     @pedroh96
<epílogo>
Obrigado!
 www.akitaonrails.com
 u.akita.ws/rsonrails11




 .com.br
Obrigado!


 www.akitaonrails.com
 u.akita.ws/rsonrails11

 .com.br

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (20)

Dev In Rio 2009
Dev In Rio 2009Dev In Rio 2009
Dev In Rio 2009
 
Sao Carlos - Ruby on Rails
Sao Carlos - Ruby on RailsSao Carlos - Ruby on Rails
Sao Carlos - Ruby on Rails
 
Ruby on Rails na Unip
Ruby on Rails na UnipRuby on Rails na Unip
Ruby on Rails na Unip
 
Usp Ribeirao - Ruby on Rails
Usp Ribeirao - Ruby on RailsUsp Ribeirao - Ruby on Rails
Usp Ribeirao - Ruby on Rails
 
Edted 2010 Dicas de Web
Edted 2010 Dicas de WebEdted 2010 Dicas de Web
Edted 2010 Dicas de Web
 
languages.map(&:latest).reduce(&:future).sort.first - Rupy Campinas 2015
languages.map(&:latest).reduce(&:future).sort.first - Rupy Campinas 2015languages.map(&:latest).reduce(&:future).sort.first - Rupy Campinas 2015
languages.map(&:latest).reduce(&:future).sort.first - Rupy Campinas 2015
 
Restrição == inovação - 17o Encontro Locaweb SP
Restrição == inovação  - 17o Encontro Locaweb SPRestrição == inovação  - 17o Encontro Locaweb SP
Restrição == inovação - 17o Encontro Locaweb SP
 
"Elixir of Life" - Dev In Santos
"Elixir of Life" - Dev In Santos"Elixir of Life" - Dev In Santos
"Elixir of Life" - Dev In Santos
 
Workshop de Ruby - UFSCar 2011
Workshop de Ruby - UFSCar 2011Workshop de Ruby - UFSCar 2011
Workshop de Ruby - UFSCar 2011
 
Manual de excel 2010
Manual de excel 2010Manual de excel 2010
Manual de excel 2010
 
Noveno c
Noveno cNoveno c
Noveno c
 
comercio
comerciocomercio
comercio
 
Conclusiones 3er Congreso Enfermedad de Parkinson
Conclusiones 3er Congreso Enfermedad de ParkinsonConclusiones 3er Congreso Enfermedad de Parkinson
Conclusiones 3er Congreso Enfermedad de Parkinson
 
Estados de la materia
Estados de la materiaEstados de la materia
Estados de la materia
 
Testemunho
TestemunhoTestemunho
Testemunho
 
Revista SaintDominioner nº 7
Revista SaintDominioner nº 7Revista SaintDominioner nº 7
Revista SaintDominioner nº 7
 
A importância do Messias
A importância  do MessiasA importância  do Messias
A importância do Messias
 
Anticonceptivos por Laura Vera
Anticonceptivos por Laura VeraAnticonceptivos por Laura Vera
Anticonceptivos por Laura Vera
 
Experiências do Verdadeiro Pai na juventude
Experiências do Verdadeiro Pai na juventudeExperiências do Verdadeiro Pai na juventude
Experiências do Verdadeiro Pai na juventude
 
Boletin ehs marzo 2015
Boletin ehs marzo 2015Boletin ehs marzo 2015
Boletin ehs marzo 2015
 

Ähnlich wie Rs on Rails 2011

adrian coyler open tour keynote
adrian coyler open tour keynoteadrian coyler open tour keynote
adrian coyler open tour keynote
marklucovsky
 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29
Alexandre Morgaut
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpin
rajivmordani
 

Ähnlich wie Rs on Rails 2011 (20)

.NET Architects Day - DNAD 2011
.NET Architects Day - DNAD 2011.NET Architects Day - DNAD 2011
.NET Architects Day - DNAD 2011
 
09 - Fábio Akita - Além do rails
09 - Fábio Akita - Além do rails09 - Fábio Akita - Além do rails
09 - Fábio Akita - Além do rails
 
Rails.20110405
Rails.20110405Rails.20110405
Rails.20110405
 
Sociable Software
Sociable SoftwareSociable Software
Sociable Software
 
Mike Taulty MIX10 Silverlight 4 Patterns Frameworks
Mike Taulty MIX10 Silverlight 4 Patterns FrameworksMike Taulty MIX10 Silverlight 4 Patterns Frameworks
Mike Taulty MIX10 Silverlight 4 Patterns Frameworks
 
RoR 101: Session 3
RoR 101: Session 3RoR 101: Session 3
RoR 101: Session 3
 
spray: REST on Akka (Scala Days)
spray: REST on Akka (Scala Days)spray: REST on Akka (Scala Days)
spray: REST on Akka (Scala Days)
 
Connected Web Systems
Connected Web SystemsConnected Web Systems
Connected Web Systems
 
Ember.js 101 - JSChannel NCR
Ember.js 101 - JSChannel NCREmber.js 101 - JSChannel NCR
Ember.js 101 - JSChannel NCR
 
adrian coyler open tour keynote
adrian coyler open tour keynoteadrian coyler open tour keynote
adrian coyler open tour keynote
 
(ATS4-DEV04) Protocols as RESTful Services and RESTful URL Routing
(ATS4-DEV04) Protocols as RESTful Services and RESTful URL Routing(ATS4-DEV04) Protocols as RESTful Services and RESTful URL Routing
(ATS4-DEV04) Protocols as RESTful Services and RESTful URL Routing
 
Building WebSocket and Server Side Events Applications using Atmosphere
Building WebSocket and Server Side Events Applications using AtmosphereBuilding WebSocket and Server Side Events Applications using Atmosphere
Building WebSocket and Server Side Events Applications using Atmosphere
 
(ATS4-DEV10) Creating Pipeline Pilot Components by Wrapping Third-Party Tools
(ATS4-DEV10) Creating Pipeline Pilot Components by Wrapping Third-Party Tools(ATS4-DEV10) Creating Pipeline Pilot Components by Wrapping Third-Party Tools
(ATS4-DEV10) Creating Pipeline Pilot Components by Wrapping Third-Party Tools
 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29
 
RoR 101: Session 4
RoR 101: Session 4RoR 101: Session 4
RoR 101: Session 4
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpin
 
Rails request & middlewares
Rails request & middlewaresRails request & middlewares
Rails request & middlewares
 
Modern Architectures with Spring and JavaScript
Modern Architectures with Spring and JavaScriptModern Architectures with Spring and JavaScript
Modern Architectures with Spring and JavaScript
 
APIdays San Francisco, 06/22/2013
APIdays San Francisco, 06/22/2013APIdays San Francisco, 06/22/2013
APIdays San Francisco, 06/22/2013
 
From Web APIs to Cross-Device Web Sites
From Web APIs to Cross-Device Web SitesFrom Web APIs to Cross-Device Web Sites
From Web APIs to Cross-Device Web Sites
 

Mehr von Fabio Akita

Mehr von Fabio Akita (20)

Devconf 2019 - São Carlos
Devconf 2019 - São CarlosDevconf 2019 - São Carlos
Devconf 2019 - São Carlos
 
Meetup Nerdzão - English Talk about Languages
Meetup Nerdzão  - English Talk about LanguagesMeetup Nerdzão  - English Talk about Languages
Meetup Nerdzão - English Talk about Languages
 
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
Desmistificando Blockchains p/ Developers - Criciuma Dev Conf 2018
 
Desmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SPDesmistificando Blockchains - 20o Encontro Locaweb SP
Desmistificando Blockchains - 20o Encontro Locaweb SP
 
Desmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter GoianiaDesmistificando Blockchains - Insiter Goiania
Desmistificando Blockchains - Insiter Goiania
 
Blockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7MastersBlockchain em 7 minutos - 7Masters
Blockchain em 7 minutos - 7Masters
 
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
Elixir  -Tolerância a Falhas para Adultos - GDG CampinasElixir  -Tolerância a Falhas para Adultos - GDG Campinas
Elixir -Tolerância a Falhas para Adultos - GDG Campinas
 
Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017Desmistificando Mitos de Tech Startups - Intercon 2017
Desmistificando Mitos de Tech Startups - Intercon 2017
 
30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby30 Days to Elixir and Crystal and Back to Ruby
30 Days to Elixir and Crystal and Back to Ruby
 
Uma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TIUma Discussão sobre a Carreira de TI
Uma Discussão sobre a Carreira de TI
 
THE CONF - Opening Keynote
THE CONF - Opening KeynoteTHE CONF - Opening Keynote
THE CONF - Opening Keynote
 
A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017A Journey through New Languages - Rancho Dev 2017
A Journey through New Languages - Rancho Dev 2017
 
Desmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - APDesmistificando Mitos de Startups - Sebrae - AP
Desmistificando Mitos de Startups - Sebrae - AP
 
A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017A Journey through New Languages - Guru Sorocaba 2017
A Journey through New Languages - Guru Sorocaba 2017
 
A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017A Journey through New Languages - Insiter 2017
A Journey through New Languages - Insiter 2017
 
A Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech DayA Journey through New Languages - Locaweb Tech Day
A Journey through New Languages - Locaweb Tech Day
 
A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016A Journey through new Languages - Intercon 2016
A Journey through new Languages - Intercon 2016
 
Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016Premature Optimization 2.0 - Intercon 2016
Premature Optimization 2.0 - Intercon 2016
 
Conexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização PrematuraConexão Kinghost - Otimização Prematura
Conexão Kinghost - Otimização Prematura
 
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All EvilThe Open Commerce Conference - Premature Optimisation: The Root of All Evil
The Open Commerce Conference - Premature Optimisation: The Root of All Evil
 

Kürzlich hochgeladen

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 

Rs on Rails 2011

  • 1. Discutindo Rails e Arquiteturas a apresentação já vai começar ...
  • 2. Discutindo Rails e Arquiteturas
  • 4.
  • 5. 1 ano atrás 4 pessoas 20 pessoas Hoje + USD 1 Milhão/ano
  • 6. 1 ano atrás 4 pessoas 20 pessoas Hoje + USD 1 Milhão/ano
  • 7. 1 ano atrás 4 pessoas 20 pessoas Hoje + USD 1 Milhão/ano
  • 9. Anos 80 Fim Anos 90 Século XXI
  • 10. Anos 80 Fim Anos 90 Século XXI Perl Basic Pascal Java C PHP dBase Delphi Python ABAP III Ruby Clipper ASP .NET ObjC VB6
  • 11.
  • 12. 1.8.7 1.9.2 1.9.3-dev 2.3.12 3.0.9 3.1-RC4
  • 13. 1.8.7 1.9.2 1.9.3-dev 2.3.12 3.0.9 3.1-RC4
  • 14. 1.8.7 1.9.2 1.9.3-dev 2.3.12 3.0.9 3.1-RC4
  • 15. Request Web Server Rack Middlewares Routes Controller View Model
  • 16. Request Web Server Rack Middlewares Routes Controller View Model
  • 17. Request Web Server Rack Middlewares Routes Controller View Model
  • 18. Request Web Server Rack Middlewares Routes Controller View Model
  • 19. Request Web Server Rack Middlewares Routes Controller View Model
  • 20. Request Web Server Rack Middlewares Routes Controller View Model
  • 21. Request Web Server Rack Middlewares Routes Controller View Model
  • 22. Request Web Server Rack Middlewares Routes Controller View Model
  • 23. Request Web Server Rack Middlewares Routes Controller View Model
  • 24. Request Web Server Rack Middlewares Routes Controller View Model
  • 25. Request Web Server Rack Middlewares Routes Controller View Model
  • 26. Response Request Web Server Rack Middlewares Routes Controller View Model
  • 27. Response Request Web Server Rack Middlewares Application Server Rack: Routes Unicorn, Controller Passenger View Model
  • 28. Web Server: Response Request NginX Apache Web Server Rack Middlewares Application Server Rack: Routes Unicorn, Controller Passenger View Model
  • 29. NginX, Apache Reverse Proxy Unicorn, Passenger ActiveRecord/DataMapper RDBMS/NoSQL
  • 30. HAProxy NginX, Apache Reverse Proxy Unicorn, Passenger ActiveRecord/DataMapper RestClient/Savon RDBMS/NoSQL Web Services (REST, SOAP)
  • 31. HAProxy NginX, Apache Varnish Reverse Proxy Unicorn, Passenger ActiveRecord/DataMapper RestClient/Savon RDBMS/NoSQL Web Services (REST, SOAP)
  • 32. HAProxy NginX, Apache Varnish Reverse Proxy Unicorn, Passenger ActiveRecord/DataMapper RestClient/Savon Memcached RDBMS/NoSQL Web Services (REST, SOAP)
  • 33. Request Request Request Request Request Request HTTPD HTTPD HTTPD HTTPD HTTPD HTTPD Rails Rails Rails Rails Rails Rails App App App App App App RDBMS
  • 34. Request Request Request Request Request Request HTTPD HTTPD HTTPD HTTPD HTTPD HTTPD Rails Rails Rails Rails Rails Rails App App App App App App RDBMS
  • 35. Request Request Request Request Request Request HTTPD HTTPD HTTPD HTTPD HTTPD HTTPD Rails Rails Rails Rails Rails Rails App App App App App App Mais curto RDBMS possível!
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 46. Request Request Request Request Request Request HTTPD HTTPD HTTPD HTTPD HTTPD HTTPD Rails Rails Rails Rails Rails Rails App App App App App App RDBMS
  • 47. Request Request Request Request Request Request NginX Async App RDBMS
  • 48. Request Request Request Request Request Request NginX Async App “Look Ma! No Threads!” RDBMS
  • 49. Request Request Request Request Request Request NginX 5k ~ 10k conexões Async App “Look Ma! No Threads!” RDBMS
  • 50. Request Request Request Request Request Request NginX 5k ~ 10k conexões Conexões Longas Async App “Look Ma! No Threads!” RDBMS
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56. 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 end end
  • 57. 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 end end
  • 58. 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 end end
  • 59. 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 end end
  • 60. 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 end end
  • 61. 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 end end
  • 62. 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 end end
  • 63. 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 end end
  • 64. 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 end end
  • 65.
  • 66. <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>
  • 67. <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>
  • 68. <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>
  • 69. myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name); });
  • 70. myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name); });
  • 71. myChannel.bind('coisa-criada', function(thing) { alert('Uma coisa foi criada: ' + thing.name); });
  • 72. 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 end end
  • 73. 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 end end
  • 74. 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 end end
  • 75. 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 end end
  • 76.
  • 78. (
  • 80.
  • 81. IN GOD WE TRUST Todos os outros devem trazer dados
  • 82.
  • 83. EXPERIENCE BY ITSELF BRINGS NOTHING
  • 84. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C
  • 85. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C STANDARD
  • 86. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C
  • 87. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C
  • 88. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C
  • 89. Ciclo “Plan-Do-Check-Act” (melhoria contínua) P A D C
  • 90. )
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98. Perl
  • 99.
  • 100. Python
  • 101.
  • 102. PHP
  • 103.
  • 104. Ruby
  • 105. OMG!
  • 106. 2011 2010 2009 2008 2007 Ruby on Rails
  • 107. 3.0.9 2011 2.3.12 10 2010 3.0.0 2.2.3 12 2009 2.3.0 2.1.2 4 2.2.0 2.0.5 3 2.1.0 2008 6 2007 Ruby on Rails 2.0.0
  • 108. 3.0.9 2011 2.3.12 2010 3.0.0 2.2.3 2009 2.1.2 2.3.0 34 2.2.0 Versões! 2.0.5 2.1.0 2008 2007 Ruby on Rails 2.0.0
  • 109.
  • 110. Request Web Server Rails App /public/stylesheets
  • 111. Request Web Server Arquivos Estáticos Rails App /public/stylesheets
  • 112.
  • 113. Variáveis $blue: #3bbfce; $margin: 16px; /* CSS */ .content-navigation { .content-navigation { border-color: $blue; border-color: #3bbfce; color: color: #2b9eab; darken($blue, 9%); } } .border { .border { padding: 8px; padding: $margin / 2; margin: 8px; margin: $margin / 2; border-color: #3bbfce; border-color: $blue; } }
  • 114. Nesting table.hl { /* CSS */ margin: 2em 0; td.ln { table.hl { text-align: right; margin: 2em 0; } } } table.hl td.ln { text-align: right; li { } font: { family: serif; li { weight: bold; font-family: serif; size: 1.2em; font-weight: bold; } font-size: 1.2em; } }
  • 115. Mixins @mixin table-base { th { /* CSS */ text-align: center; font-weight: bold; #data { } td, th {padding: 2px} float: left; } margin-left: 10px; } @mixin left($dist) { #data th { float: left; text-align: center; margin-left: $dist; font-weight: bold; } } #data td, #data th { #data { @include left(10px); padding: 2px; @include table-base; } }
  • 116. Selector Inheritance /* CSS */ .error { .error, .badError { border: 1px #f00; border: 1px #f00; background: #fdd; background: #fdd; } } .error.intrusion { font-size: 1.3em; .error.intrusion, font-weight: bold; .badError.intrusion { } font-size: 1.3em; font-weight: bold; .badError { } @extend .error; border-width: 3px; .badError { } border-width: 3px; }
  • 117.
  • 118. 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()
  • 119. 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; class Animal child.__super__ = parent.prototype; constructor: (@name) -> return child; }; Animal = (function() { move: (meters) -> function Animal(name) { this.name = name; alert @name + " moved " + meters + "m." } Animal.prototype.move = function(meters) { return alert(this.name + " moved " + meters + "m."); class Snake extends Animal }; return Animal; move: -> })(); alert "Slithering..." Snake = (function() { __extends(Snake, Animal); super 5 function Snake() { Snake.__super__.constructor.apply(this, arguments); } class Horse extends Animal Snake.prototype.move = function() { alert("Slithering..."); move: -> return Snake.__super__.move.call(this, 5); alert "Galloping..." }; return Snake; super 45 })(); Horse = (function() { __extends(Horse, Animal); sam = new Snake "Sammy the Python" function Horse() { tom = new Horse "Tommy the Palomino" Horse.__super__.constructor.apply(this, arguments); } Horse.prototype.move = function() { alert("Galloping..."); sam.move() return Horse.__super__.move.call(this, 45); tom.move() }; return Horse; })(); sam = new Snake("Sammy the Python"); tom = new Horse("Tommy the Palomino"); sam.move(); tom.move(); loadrun
  • 120.
  • 121.
  • 122. 102
  • 123. Request Request Web Server Web Server (Desenvolvimento) (Produção) Rails App /app/assets /public
  • 124. Request Request Web Server Web Server (Desenvolvimento) (Produção) Rails Sprockets App /app/assets /public
  • 125. Request Request Web Server Web Server (Desenvolvimento) (Produção) Rails Sprockets App Tilt /app/assets /public
  • 126. Request Request Web Server Web Server (Desenvolvimento) (Produção) Rails Sprockets App Tilt Ugli er /app/assets /public
  • 127. ENGINE FILE EXTENSIONS REQUIRED LIBRARIES ERB .erb, .rhtml none Interpolated String .str Erubis .erb, .rhtml, .erubis erubis Haml .haml haml Sass .sass sass Scss .scss Less CSS .less less Builder .builder builder Liquid .liquid liquid RDiscount rdiscount Redcarpet redcarpet BlueCloth .markdown, .mkd, .md bluecloth Kramdown kramdown Maruku 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
  • 128.
  • 129. jQuery Tamanho Tempo Original Size 621kb Google Closure 234kb 6.5s YUI Compressor 240kb 2.7s UglifyJS 235kb 1.3s
  • 130. jQuery Tamanho Tempo Original Size 621kb Google Closure 234kb 6.5s YUI Compressor 240kb 2.7s UglifyJS 235kb 1.3s
  • 131. jQuery Tamanho Tempo Original Size 621kb Google Closure 234kb 6.5s YUI Compressor 240kb 2.7s UglifyJS 235kb 1.3s
  • 132. jQuery Tamanho Tempo Original Size 621kb Google Closure 234kb 6.5s YUI Compressor 240kb 2.7s UglifyJS 235kb 1.3s
  • 133. jQuery Tamanho Tempo Original Size 621kb Google Closure 234kb 6.5s YUI Compressor 240kb 2.7s UglifyJS 235kb 1.3s
  • 134.
  • 135.
  • 136.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143. RubyConf Brasil 3 e 4 de Novembro www.rubyconf.com.br
  • 145.
  • 146.
  • 147. Como o cliente Como o Líder de Como o Analista Como o Programador Como o Consultor de explicou Projeto entendeu desenhou escreveu Negócios descreveu Como o projeto foi Como Operações Como o cliente foi O que o cliente Como foi o suporte documentado instalou cobrado realmente queria
  • 149.
  • 150. LOL
  • 151. DESIGN
  • 152. DESIGN
  • 153.
  • 154.
  • 155. Pattern PADRÃO
  • 156. STANDARD Pattern PADRÃO Default
  • 158.
  • 159.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166. 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
  • 167.
  • 168. 2 + 2 = 5!
  • 169. 2 + 2 = 5!
  • 170. 2 + 2 = 4!
  • 171.
  • 174.
  • 175.
  • 176.
  • 177. Aqui estão os fatos. Que Aqui está a conclusão. conclusões podemos Que fatos podemos chegar com eles? suportar com eles?
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189. 80
  • 190. 20 80
  • 191. 20 80
  • 192. 20 80 “Long Tail”
  • 193.
  • 194.
  • 195.
  • 196.
  • 197. Pedro Franceschi @pedroh96
  • 201. Pedro Franceschi @pedroh96
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.