SlideShare ist ein Scribd-Unternehmen logo
1 von 175
Downloaden Sie, um offline zu lesen
Rack
Middleware
m/
NEED
CHOICE
Jon Crosby
http://joncrosby.me
CloudKit
http://getcloudkit.com
rack-contrib

http://github.com/rack/rack-contrib
Engine Yard Solo
      “The platform for
on-demand management of your
   Ruby on Rails application
        in the cloud.”
Free during HackFest
Discount for Sign Up
CGI
app.cgi
WARNING
Contains Perl
old skool perl cgi
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
if ($cgi->param(‘action’) eq ‘all’) {
    my $sql = “select * from customer”;
    my $rows =
        $dbh->selectall_arrayref($sql);
    if (@$rows) {
        print “<table border=1>” .
              “<th>name</th>” .
...
Monolith
:-(
Rails
Merb
Sinatra
 Mack
Ramaze
Waves
Authentication
Single Sign-On
Caching
Authentication Example:
   OpenID + OAuth
Install Auth Plugin(s)
Install Auth Plugin(s)
Generate Controllers
Install Auth Plugin(s)
Generate Controllers
Generate Models
Install Auth Plugin(s)
Generate Controllers
Generate Models
Generate Migrations
Install Auth Plugin(s)
Generate Controllers
Generate Models
Generate Migrations
Modify Existing Controllers
Install Auth Plugin(s)
Generate Controllers
Generate Models
Generate Migrations
Modify Existing Controllers
Monkey Patch Rails
:-(
The Web
HTTP
Intermediaries



HTTP
Intermediaries   App



HTTP
Intermediaries   App



HTTP
Rack
HTTP
Intermediaries



HTTP
Middleware



HTTP
Middleware   App



HTTP
Rack is the Web
The Web is Rack
WSGI
SPEC
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
run lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
config.ru
$ rackup config.ru
$ curl http://localhost:9292
Hello
class App
  def call(env)
   [200, {...}, [...]]
  end
end
SPEC
$ rake SPEC
Rack::Lint
lambda { |env|
  [
    200,
    {
       ‘Content-Type’ => ‘text/plain’,
       ‘Content-Length’ => ‘5’
    },
    [‘Hello’]
  ]
}
env
REQUEST_METHOD
env[‘REQUEST_METHOD’]
GET
PUT
POST
DELETE
HEAD
OPTIONS
TRACE
PATH_INFO
/items/123
HTTP_*
HTTP_ACCEPT
application/json
rack.*
rack.input

(the input stream)
#gets
#each
#read
#rewind
yournamespace.*
request = Rack::Request.new(env)
request.post?
request.params[‘id’]
request[‘HTTP_IF_MATCH’]
m/
Middleware   App



HTTP
use MiddlewareA
use MiddlewareB
use MiddlewareC
run app
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
rack-contrib

http://github.com/rack/rack-contrib
Rack::Profiler
Rack::MailExceptions
Rack::JSONP
Rack::CSSHTTPRequest
Rack::Cache

http://github.com/rtomayko/rack-cache
Rack::NotFound
404
Middleware   App



HTTP
use MiddlewareA
use MiddlewareB
use MiddlewareC
run app
class App
  def call(env)
   [200, {...}, [...]]
  end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
class GoSlower
  def initialize(app)
   @app = app
  end

 def call(env)
  sleep(1)
  @app.call(env)
 end
end
use MiddlewareA
use MiddlewareB
use MiddlewareC
run app
Middleware   App



HTTP
Middleware   App



HTTP
Cooperative Middleware
URI Space
/*
/just-what-it-needs
CloudKit
Open Web
 JSON
Appliance
expose :notes, :todos
expose :notes, :todos
contain :notes, :todos
use Rack::Pool::Session
use CloudKit::OAuthFilter
use CloudKit::OpenIDFilter
use CloudKit::Service, :collections => [:notes, :todos]
(run DefaultApp)
CloudKit::OAuthFilter

       /oauth/*
CloudKit::OpenIDFilter
     /login
     /logout
     /openid_complete
CloudKit::Service
     /notes/*
     /todos/*
?
Browser


OAuth    OpenID   Service
Browser


OAuth    OpenID   Service
Browser


        {...}
OAuth            OpenID   Service
Browser


OAuth    OpenID   Service
Browser


OAuth    OpenID   Service

          {...}

          Login
Browser


OAuth    OpenID   Service
Browser


OAuth    OpenID   Service
Browser


OAuth    OpenID   Service
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


        {...}
OAuth           OpenID   Service
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


OAuth     OpenID     Service

           {...}

           Login
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


OAuth     OpenID     Service
Service or Desktop App


OAuth     OpenID     Service
Announcing
Middleware
 Presence
HTTP

Via
Via: 1.0 ricky, 1.1 ethel, 1.1 fred
Via: 1.0 ricky, 1.1 ethel, 1.1 fred
Via: 1.0 ricky, 1.1 ethel, 1.1 fred
Via: 1.0 ricky, 1.1 ethel, 1.1 fred
env[‘cloudkit.auth’] = 1
env[‘cloudkit.via’] << ‘cloudkit.filter.oauth’
env[‘cloudkit.via’] << ‘cloudkit.filter.openid’
env[‘cloudkit.user’] = ‘http://joncrosby.me’
Alternative Stacks
Rack::Map
map “/” do
 run Blog::Public
end

map “/db” do
 run Blog::DBAdmin
end
Rack::Map + Sinatra
require ‘sinatra/base’

module Blog
 class Public < Sinatra::Base
   get ‘/’ do
    erb :index
   end
 end
end
require ‘sinatra/base’

module Blog
 class Public < Sinatra::Base
   get ‘/’ do
    erb :index
   end
 end
end
require ‘sinatra/base’

module Blog
 class Public < Sinatra::Base
   get ‘/’ do
    erb :index
   end
 end
end
require ‘sinatra’

   for “apps”

 /* URI space
require ‘sinatra/base’

        MyClass < Sinatra::Base

Minimal Sinatra (routing, rendering, etc.)
m/
use MySinatraApp
run SomeOtherApp
Rack::Cascade
app1 = lambda { ... }
app2 = lambda { ... }
run Rack::Cascade.new([app1, app2])
Sinatra as Middleware
        in Rails
class X < Sinatra::Base
  get ‘/what’ do
   ‘what’
  end
end

Rails::Initializer.run do |config|
 config.use.middleware ‘X’
end
CloudKit in Rails
Rails::Initializer.run do |config|
 config.use.middleware ‘CloudKit::Service’, :collections => [:notes, :todos]
end
Middleware   App



HTTP
Middleware   App

       Rails

HTTP
Middleware   App

       Rails   Merb

HTTP
Middleware       App

       Rails   Merb   *

HTTP
New Unit of Composition
m/

Weitere ähnliche Inhalte

Was ist angesagt?

Inside Bokete: Web Application with Mojolicious and others
Inside Bokete:  Web Application with Mojolicious and othersInside Bokete:  Web Application with Mojolicious and others
Inside Bokete: Web Application with Mojolicious and othersYusuke Wada
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteBram Vogelaar
 
Serverless Ballerina
Serverless BallerinaServerless Ballerina
Serverless BallerinaBallerina
 
Flask patterns
Flask patternsFlask patterns
Flask patternsit-people
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stackBram Vogelaar
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsSolution4Future
 
Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Workhorse Computing
 
Client server part 12
Client server part 12Client server part 12
Client server part 12fadlihulopi
 
Puppet and the HashiStack
Puppet and the HashiStackPuppet and the HashiStack
Puppet and the HashiStackBram Vogelaar
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul ConnectBram Vogelaar
 
Creating Reusable Puppet Profiles
Creating Reusable Puppet ProfilesCreating Reusable Puppet Profiles
Creating Reusable Puppet ProfilesBram Vogelaar
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with PerlDave Cross
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perldeepfountainconsulting
 
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...King Foo
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHPKing Foo
 

Was ist angesagt? (20)

Inside Bokete: Web Application with Mojolicious and others
Inside Bokete:  Web Application with Mojolicious and othersInside Bokete:  Web Application with Mojolicious and others
Inside Bokete: Web Application with Mojolicious and others
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suite
 
Serverless Ballerina
Serverless BallerinaServerless Ballerina
Serverless Ballerina
 
Lies, Damn Lies, and Benchmarks
Lies, Damn Lies, and BenchmarksLies, Damn Lies, and Benchmarks
Lies, Damn Lies, and Benchmarks
 
Psr 7 symfony-day
Psr 7 symfony-dayPsr 7 symfony-day
Psr 7 symfony-day
 
Flask patterns
Flask patternsFlask patterns
Flask patterns
 
Pycon - Python for ethical hackers
Pycon - Python for ethical hackers Pycon - Python for ethical hackers
Pycon - Python for ethical hackers
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stack
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutions
 
Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.
 
Client server part 12
Client server part 12Client server part 12
Client server part 12
 
Puppet and the HashiStack
Puppet and the HashiStackPuppet and the HashiStack
Puppet and the HashiStack
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul Connect
 
Creating Reusable Puppet Profiles
Creating Reusable Puppet ProfilesCreating Reusable Puppet Profiles
Creating Reusable Puppet Profiles
 
AJAX Transport Layer
AJAX Transport LayerAJAX Transport Layer
AJAX Transport Layer
 
Modern Web Development with Perl
Modern Web Development with PerlModern Web Development with Perl
Modern Web Development with Perl
 
Asynchronous programming patterns in Perl
Asynchronous programming patterns in PerlAsynchronous programming patterns in Perl
Asynchronous programming patterns in Perl
 
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
 
Rest api with Python
Rest api with PythonRest api with Python
Rest api with Python
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHP
 

Andere mochten auch

Grape Presentation
Grape PresentationGrape Presentation
Grape Presentationchrishein
 
Restful API On Grape
Restful API On GrapeRestful API On Grape
Restful API On GrapeAndy Wang
 
The Grapes of Rapid (RubyConf 2010)
The Grapes of Rapid (RubyConf 2010)The Grapes of Rapid (RubyConf 2010)
The Grapes of Rapid (RubyConf 2010)Michael Bleigh
 
Building an API using Grape
Building an API using GrapeBuilding an API using Grape
Building an API using Grapevisnu priya
 
Rapid-ruby-api-on-grape
Rapid-ruby-api-on-grapeRapid-ruby-api-on-grape
Rapid-ruby-api-on-grapeAndy Wang
 
Building RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeBuilding RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeDaniel Doubrovkine
 
The Mysteries Of JavaScript-Fu (RailsConf Ediition)
The Mysteries Of JavaScript-Fu (RailsConf Ediition)The Mysteries Of JavaScript-Fu (RailsConf Ediition)
The Mysteries Of JavaScript-Fu (RailsConf Ediition)danwrong
 

Andere mochten auch (8)

Grape Presentation
Grape PresentationGrape Presentation
Grape Presentation
 
Restful API On Grape
Restful API On GrapeRestful API On Grape
Restful API On Grape
 
The Grapes of Rapid (RubyConf 2010)
The Grapes of Rapid (RubyConf 2010)The Grapes of Rapid (RubyConf 2010)
The Grapes of Rapid (RubyConf 2010)
 
Building an API using Grape
Building an API using GrapeBuilding an API using Grape
Building an API using Grape
 
Rapid-ruby-api-on-grape
Rapid-ruby-api-on-grapeRapid-ruby-api-on-grape
Rapid-ruby-api-on-grape
 
Building RESTful APIs w/ Grape
Building RESTful APIs w/ GrapeBuilding RESTful APIs w/ Grape
Building RESTful APIs w/ Grape
 
The Mysteries Of JavaScript-Fu (RailsConf Ediition)
The Mysteries Of JavaScript-Fu (RailsConf Ediition)The Mysteries Of JavaScript-Fu (RailsConf Ediition)
The Mysteries Of JavaScript-Fu (RailsConf Ediition)
 
Ruby On Grape
Ruby On GrapeRuby On Grape
Ruby On Grape
 

Ähnlich wie Rack Middleware

Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous MerbMatt Todd
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportBen Scofield
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareAlona Mekhovova
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)James Titcumb
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientAdam Wiggins
 
Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Robin Fernandes
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Atlassian
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyLaunchAny
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)James Titcumb
 
Get Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsGet Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsDavey Shafik
 
Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005Tugdual Grall
 
Scalalable Language for a Scalable Web
Scalalable Language for a Scalable WebScalalable Language for a Scalable Web
Scalalable Language for a Scalable WebTimothy Perrett
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascriptmpnkhan
 

Ähnlich wie Rack Middleware (20)

Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
 
And the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack SupportAnd the Greatest of These Is ... Rack Support
And the Greatest of These Is ... Rack Support
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Sinatra
SinatraSinatra
Sinatra
 
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
 
WordPress APIs
WordPress APIsWordPress APIs
WordPress APIs
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClient
 
Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in Ruby
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
 
Rack
RackRack
Rack
 
Get Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP StreamsGet Soaked - An In Depth Look At PHP Streams
Get Soaked - An In Depth Look At PHP Streams
 
Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005
 
Scalalable Language for a Scalable Web
Scalalable Language for a Scalable WebScalalable Language for a Scalable Web
Scalalable Language for a Scalable Web
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Plack at YAPC::NA 2010
Plack at YAPC::NA 2010Plack at YAPC::NA 2010
Plack at YAPC::NA 2010
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 

Mehr von LittleBIGRuby

Wii Ruby All Work And No Play Just Wont Do
Wii Ruby All Work And No Play Just Wont DoWii Ruby All Work And No Play Just Wont Do
Wii Ruby All Work And No Play Just Wont DoLittleBIGRuby
 
The Building Blocks Of Modularity
The Building Blocks Of ModularityThe Building Blocks Of Modularity
The Building Blocks Of ModularityLittleBIGRuby
 
Outside In Development With Cucumber
Outside In Development With CucumberOutside In Development With Cucumber
Outside In Development With CucumberLittleBIGRuby
 
Outside-In Development with Cucumber
Outside-In Development with CucumberOutside-In Development with Cucumber
Outside-In Development with CucumberLittleBIGRuby
 
La Dolce Vita Rubyista
La Dolce Vita RubyistaLa Dolce Vita Rubyista
La Dolce Vita RubyistaLittleBIGRuby
 
Practical Puppet Systems Building Systems 1
Practical Puppet Systems Building Systems 1Practical Puppet Systems Building Systems 1
Practical Puppet Systems Building Systems 1LittleBIGRuby
 
Compiling And Optimizing Scripting Languages
Compiling And Optimizing Scripting LanguagesCompiling And Optimizing Scripting Languages
Compiling And Optimizing Scripting LanguagesLittleBIGRuby
 

Mehr von LittleBIGRuby (10)

Wii Ruby All Work And No Play Just Wont Do
Wii Ruby All Work And No Play Just Wont DoWii Ruby All Work And No Play Just Wont Do
Wii Ruby All Work And No Play Just Wont Do
 
The Building Blocks Of Modularity
The Building Blocks Of ModularityThe Building Blocks Of Modularity
The Building Blocks Of Modularity
 
Outside In Development With Cucumber
Outside In Development With CucumberOutside In Development With Cucumber
Outside In Development With Cucumber
 
Outside-In Development with Cucumber
Outside-In Development with CucumberOutside-In Development with Cucumber
Outside-In Development with Cucumber
 
La Dolce Vita Rubyista
La Dolce Vita RubyistaLa Dolce Vita Rubyista
La Dolce Vita Rubyista
 
Practical Puppet Systems Building Systems 1
Practical Puppet Systems Building Systems 1Practical Puppet Systems Building Systems 1
Practical Puppet Systems Building Systems 1
 
Little Big Ruby
Little Big RubyLittle Big Ruby
Little Big Ruby
 
Compiling And Optimizing Scripting Languages
Compiling And Optimizing Scripting LanguagesCompiling And Optimizing Scripting Languages
Compiling And Optimizing Scripting Languages
 
Ffi
FfiFfi
Ffi
 
Sequel
SequelSequel
Sequel
 

Rack Middleware