Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Rack
          Middleware
Tuesday, March 17, 2009
m/
Tuesday, March 17, 2009
NEED
Tuesday, March 17, 2009
CHOICE
Tuesday, March 17, 2009
Jon Crosby
      http://joncrosby.me
Tuesday, March 17, 2009
CloudKit
           http://getcloudkit.com

Tuesday, March 17, 2009
rack-contrib

             http://github.com/rack/rack-contrib




Tuesday, March 17, 2009
Tuesday, March 17, 2009
Engine Yard Solo
                                “The platform for
                          on-demand management of your
...
Free during HackFest


Tuesday, March 17, 2009
Discount for Sign Up


Tuesday, March 17, 2009
CGI
Tuesday, March 17, 2009
app.cgi
Tuesday, March 17, 2009
WARNING
Tuesday, March 17, 2009
Contains Perl

Tuesday, March 17, 2009
old skool perl cgi

Tuesday, March 17, 2009
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
if ($cgi->param(‘action’) eq ‘all’) {
        my $sql = “select * from customer”;
        my $rows =
            $dbh->sel...
Monolith
Tuesday, March 17, 2009
:-(
Tuesday, March 17, 2009
Rails
Tuesday, March 17, 2009
Merb
                          Sinatra
                           Mack
                          Ramaze
                  ...
Authentication



Tuesday, March 17, 2009
Single Sign-On



Tuesday, March 17, 2009
Caching



Tuesday, March 17, 2009
Authentication Example:
            OpenID + OAuth


Tuesday, March 17, 2009
Install Auth Plugin(s)




Tuesday, March 17, 2009
Install Auth Plugin(s)
                          Generate Controllers




Tuesday, March 17, 2009
Install Auth Plugin(s)
                          Generate Controllers
                          Generate Models




Tuesda...
Install Auth Plugin(s)
                          Generate Controllers
                          Generate Models
          ...
Install Auth Plugin(s)
                          Generate Controllers
                          Generate Models
          ...
Install Auth Plugin(s)
                          Generate Controllers
                          Generate Models
          ...
:-(
Tuesday, March 17, 2009
The Web

Tuesday, March 17, 2009
Tuesday, March 17, 2009
HTTP




Tuesday, March 17, 2009
Intermediaries



         HTTP




Tuesday, March 17, 2009
Intermediaries   App



         HTTP




Tuesday, March 17, 2009
Intermediaries   App



         HTTP




Tuesday, March 17, 2009
Rack
Tuesday, March 17, 2009
Tuesday, March 17, 2009
HTTP




Tuesday, March 17, 2009
Intermediaries



         HTTP




Tuesday, March 17, 2009
Middleware



         HTTP




Tuesday, March 17, 2009
Middleware   App



         HTTP




Tuesday, March 17, 2009
Rack is the Web

Tuesday, March 17, 2009
The Web is Rack

Tuesday, March 17, 2009
WSGI
Tuesday, March 17, 2009
SPEC
Tuesday, March 17, 2009
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
run lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
         ...
config.ru

Tuesday, March 17, 2009
$ rackup config.ru


Tuesday, March 17, 2009
$ curl http://localhost:9292



Tuesday, March 17, 2009
Hello
Tuesday, March 17, 2009
class App
                            def call(env)
                             [200, {...}, [...]]
                     ...
SPEC
Tuesday, March 17, 2009
$ rake SPEC


Tuesday, March 17, 2009
Rack::Lint
Tuesday, March 17, 2009
lambda { |env|
           [
             200,
             {
                ‘Content-Type’ => ‘text/plain’,
             ...
env
Tuesday, March 17, 2009
REQUEST_METHOD



Tuesday, March 17, 2009
env[‘REQUEST_METHOD’]




Tuesday, March 17, 2009
GET
                          PUT
                          POST
                          DELETE
                        ...
PATH_INFO



Tuesday, March 17, 2009
/items/123



Tuesday, March 17, 2009
HTTP_*



Tuesday, March 17, 2009
HTTP_ACCEPT



Tuesday, March 17, 2009
application/json



Tuesday, March 17, 2009
rack.*



Tuesday, March 17, 2009
rack.input

                          (the input stream)




Tuesday, March 17, 2009
#gets
                          #each
                          #read
                          #rewind

Tuesday, March 17...
yournamespace.*



Tuesday, March 17, 2009
request = Rack::Request.new(env)




Tuesday, March 17, 2009
request.post?




Tuesday, March 17, 2009
request.params[‘id’]




Tuesday, March 17, 2009
request[‘HTTP_IF_MATCH’]




Tuesday, March 17, 2009
m/
Tuesday, March 17, 2009
Middleware   App



         HTTP




Tuesday, March 17, 2009
use MiddlewareA
                          use MiddlewareB
                          use MiddlewareC
                      ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
rack-contrib

             http://github.com/rack/rack-contrib




Tuesday, March 17, 2009
Rack::Profiler



Tuesday, March 17, 2009
Rack::MailExceptions



Tuesday, March 17, 2009
Rack::JSONP



Tuesday, March 17, 2009
Rack::CSSHTTPRequest



Tuesday, March 17, 2009
Rack::Cache

     http://github.com/rtomayko/rack-cache



Tuesday, March 17, 2009
Rack::NotFound



Tuesday, March 17, 2009
404



Tuesday, March 17, 2009
Middleware   App



         HTTP




Tuesday, March 17, 2009
use MiddlewareA
                          use MiddlewareB
                          use MiddlewareC
                      ...
class App
                            def call(env)
                             [200, {...}, [...]]
                     ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
class GoSlower
                            def initialize(app)
                             @app = app
                   ...
use MiddlewareA
                          use MiddlewareB
                          use MiddlewareC
                      ...
Middleware   App



         HTTP




Tuesday, March 17, 2009
Middleware   App



         HTTP




Tuesday, March 17, 2009
Cooperative Middleware



Tuesday, March 17, 2009
URI Space



Tuesday, March 17, 2009
/*



Tuesday, March 17, 2009
/just-what-it-needs




Tuesday, March 17, 2009
CloudKit



Tuesday, March 17, 2009
Open Web
                           JSON
                          Appliance

Tuesday, March 17, 2009
expose :notes, :todos




Tuesday, March 17, 2009
expose :notes, :todos




Tuesday, March 17, 2009
contain :notes, :todos




Tuesday, March 17, 2009
use Rack::Pool::Session
    use CloudKit::OAuthFilter
    use CloudKit::OpenIDFilter
    use CloudKit::Service, :collectio...
CloudKit::OAuthFilter

                          /oauth/*




Tuesday, March 17, 2009
CloudKit::OpenIDFilter
                          /login
                          /logout
                          /openi...
CloudKit::Service
                               /notes/*
                               /todos/*




Tuesday, March 17, 2...
?
Tuesday, March 17, 2009
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Browser


                                  {...}
                          OAuth            OpenID   Service




Tuesday,...
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Browser


                          OAuth    OpenID   Service

                                    {...}

                ...
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Browser


                          OAuth    OpenID   Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


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


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service

                                     {......
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Service or Desktop App


                          OAuth     OpenID     Service




Tuesday, March 17, 2009
Announcing
                          Middleware
                           Presence

Tuesday, March 17, 2009
HTTP

                          Via

Tuesday, March 17, 2009
Via: 1.0 ricky, 1.1 ethel, 1.1 fred




Tuesday, March 17, 2009
Via: 1.0 ricky, 1.1 ethel, 1.1 fred




Tuesday, March 17, 2009
Via: 1.0 ricky, 1.1 ethel, 1.1 fred




Tuesday, March 17, 2009
Via: 1.0 ricky, 1.1 ethel, 1.1 fred




Tuesday, March 17, 2009
env[‘cloudkit.auth’] = 1




Tuesday, March 17, 2009
env[‘cloudkit.via’] << ‘cloudkit.filter.oauth’




Tuesday, March 17, 2009
env[‘cloudkit.via’] << ‘cloudkit.filter.openid’




Tuesday, March 17, 2009
env[‘cloudkit.user’] = ‘http://joncrosby.me’




Tuesday, March 17, 2009
Alternative Stacks



Tuesday, March 17, 2009
Rack::Map



Tuesday, March 17, 2009
map “/” do
                           run Blog::Public
                          end

                          map “/db” ...
Rack::Map + Sinatra



Tuesday, March 17, 2009
require ‘sinatra/base’

                          module Blog
                           class Public < Sinatra::Base
    ...
require ‘sinatra/base’

                          module Blog
                           class Public < Sinatra::Base
    ...
require ‘sinatra/base’

                          module Blog
                           class Public < Sinatra::Base
    ...
require ‘sinatra’

                             for “apps”

                           /* URI space


Tuesday, March 17, 2...
require ‘sinatra/base’

                          MyClass < Sinatra::Base

   Minimal Sinatra (routing, rendering, etc.)

...
m/
Tuesday, March 17, 2009
use MySinatraApp
                          run SomeOtherApp




Tuesday, March 17, 2009
Rack::Cascade



Tuesday, March 17, 2009
app1 = lambda { ... }
       app2 = lambda { ... }
       run Rack::Cascade.new([app1, app2])




Tuesday, March 17, 2009
Sinatra as Middleware
                         in Rails


Tuesday, March 17, 2009
class X < Sinatra::Base
             get ‘/what’ do
              ‘what’
             end
           end

           Rails...
CloudKit in Rails



Tuesday, March 17, 2009
Rails::Initializer.run do |config|
  config.use.middleware ‘CloudKit::Service’, :collections => [:notes, :todos]
 end




Tu...
Middleware   App



         HTTP




Tuesday, March 17, 2009
Middleware   App

                          Rails

         HTTP




Tuesday, March 17, 2009
Middleware   App

                          Rails   Merb

         HTTP




Tuesday, March 17, 2009
Middleware       App

                          Rails   Merb   *

         HTTP




Tuesday, March 17, 2009
New Unit of Composition



Tuesday, March 17, 2009
m/
Tuesday, March 17, 2009
Upcoming SlideShare
Loading in …5
×

Rack Middleware

15,449 views

Published on

These slides are taken from my talk titled "In a World of Middleware, Who Needs Monolithic Applications?" presented at MountainWest Ruby Conf 2009, held March 13-14 in Salt Lake City, UT.

Published in: Technology

Rack Middleware

  1. Rack Middleware Tuesday, March 17, 2009
  2. m/ Tuesday, March 17, 2009
  3. NEED Tuesday, March 17, 2009
  4. CHOICE Tuesday, March 17, 2009
  5. Jon Crosby http://joncrosby.me Tuesday, March 17, 2009
  6. CloudKit http://getcloudkit.com Tuesday, March 17, 2009
  7. rack-contrib http://github.com/rack/rack-contrib Tuesday, March 17, 2009
  8. Tuesday, March 17, 2009
  9. Engine Yard Solo “The platform for on-demand management of your Ruby on Rails application in the cloud.” Tuesday, March 17, 2009
  10. Free during HackFest Tuesday, March 17, 2009
  11. Discount for Sign Up Tuesday, March 17, 2009
  12. CGI Tuesday, March 17, 2009
  13. app.cgi Tuesday, March 17, 2009
  14. WARNING Tuesday, March 17, 2009
  15. Contains Perl Tuesday, March 17, 2009
  16. old skool perl cgi Tuesday, March 17, 2009
  17. 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>” . ... Tuesday, March 17, 2009
  18. 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>” . ... Tuesday, March 17, 2009
  19. 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>” . ... Tuesday, March 17, 2009
  20. 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>” . ... Tuesday, March 17, 2009
  21. 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>” . ... Tuesday, March 17, 2009
  22. 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>” . ... Tuesday, March 17, 2009
  23. Monolith Tuesday, March 17, 2009
  24. :-( Tuesday, March 17, 2009
  25. Rails Tuesday, March 17, 2009
  26. Merb Sinatra Mack Ramaze Waves Tuesday, March 17, 2009
  27. Authentication Tuesday, March 17, 2009
  28. Single Sign-On Tuesday, March 17, 2009
  29. Caching Tuesday, March 17, 2009
  30. Authentication Example: OpenID + OAuth Tuesday, March 17, 2009
  31. Install Auth Plugin(s) Tuesday, March 17, 2009
  32. Install Auth Plugin(s) Generate Controllers Tuesday, March 17, 2009
  33. Install Auth Plugin(s) Generate Controllers Generate Models Tuesday, March 17, 2009
  34. Install Auth Plugin(s) Generate Controllers Generate Models Generate Migrations Tuesday, March 17, 2009
  35. Install Auth Plugin(s) Generate Controllers Generate Models Generate Migrations Modify Existing Controllers Tuesday, March 17, 2009
  36. Install Auth Plugin(s) Generate Controllers Generate Models Generate Migrations Modify Existing Controllers Monkey Patch Rails Tuesday, March 17, 2009
  37. :-( Tuesday, March 17, 2009
  38. The Web Tuesday, March 17, 2009
  39. Tuesday, March 17, 2009
  40. HTTP Tuesday, March 17, 2009
  41. Intermediaries HTTP Tuesday, March 17, 2009
  42. Intermediaries App HTTP Tuesday, March 17, 2009
  43. Intermediaries App HTTP Tuesday, March 17, 2009
  44. Rack Tuesday, March 17, 2009
  45. Tuesday, March 17, 2009
  46. HTTP Tuesday, March 17, 2009
  47. Intermediaries HTTP Tuesday, March 17, 2009
  48. Middleware HTTP Tuesday, March 17, 2009
  49. Middleware App HTTP Tuesday, March 17, 2009
  50. Rack is the Web Tuesday, March 17, 2009
  51. The Web is Rack Tuesday, March 17, 2009
  52. WSGI Tuesday, March 17, 2009
  53. SPEC Tuesday, March 17, 2009
  54. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  55. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  56. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  57. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  58. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  59. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  60. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  61. run lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  62. config.ru Tuesday, March 17, 2009
  63. $ rackup config.ru Tuesday, March 17, 2009
  64. $ curl http://localhost:9292 Tuesday, March 17, 2009
  65. Hello Tuesday, March 17, 2009
  66. class App def call(env) [200, {...}, [...]] end end Tuesday, March 17, 2009
  67. SPEC Tuesday, March 17, 2009
  68. $ rake SPEC Tuesday, March 17, 2009
  69. Rack::Lint Tuesday, March 17, 2009
  70. lambda { |env| [ 200, { ‘Content-Type’ => ‘text/plain’, ‘Content-Length’ => ‘5’ }, [‘Hello’] ] } Tuesday, March 17, 2009
  71. env Tuesday, March 17, 2009
  72. REQUEST_METHOD Tuesday, March 17, 2009
  73. env[‘REQUEST_METHOD’] Tuesday, March 17, 2009
  74. GET PUT POST DELETE HEAD OPTIONS TRACE Tuesday, March 17, 2009
  75. PATH_INFO Tuesday, March 17, 2009
  76. /items/123 Tuesday, March 17, 2009
  77. HTTP_* Tuesday, March 17, 2009
  78. HTTP_ACCEPT Tuesday, March 17, 2009
  79. application/json Tuesday, March 17, 2009
  80. rack.* Tuesday, March 17, 2009
  81. rack.input (the input stream) Tuesday, March 17, 2009
  82. #gets #each #read #rewind Tuesday, March 17, 2009
  83. yournamespace.* Tuesday, March 17, 2009
  84. request = Rack::Request.new(env) Tuesday, March 17, 2009
  85. request.post? Tuesday, March 17, 2009
  86. request.params[‘id’] Tuesday, March 17, 2009
  87. request[‘HTTP_IF_MATCH’] Tuesday, March 17, 2009
  88. m/ Tuesday, March 17, 2009
  89. Middleware App HTTP Tuesday, March 17, 2009
  90. use MiddlewareA use MiddlewareB use MiddlewareC run app Tuesday, March 17, 2009
  91. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  92. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  93. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  94. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  95. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  96. rack-contrib http://github.com/rack/rack-contrib Tuesday, March 17, 2009
  97. Rack::Profiler Tuesday, March 17, 2009
  98. Rack::MailExceptions Tuesday, March 17, 2009
  99. Rack::JSONP Tuesday, March 17, 2009
  100. Rack::CSSHTTPRequest Tuesday, March 17, 2009
  101. Rack::Cache http://github.com/rtomayko/rack-cache Tuesday, March 17, 2009
  102. Rack::NotFound Tuesday, March 17, 2009
  103. 404 Tuesday, March 17, 2009
  104. Middleware App HTTP Tuesday, March 17, 2009
  105. use MiddlewareA use MiddlewareB use MiddlewareC run app Tuesday, March 17, 2009
  106. class App def call(env) [200, {...}, [...]] end end Tuesday, March 17, 2009
  107. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  108. class GoSlower def initialize(app) @app = app end def call(env) sleep(1) @app.call(env) end end Tuesday, March 17, 2009
  109. use MiddlewareA use MiddlewareB use MiddlewareC run app Tuesday, March 17, 2009
  110. Middleware App HTTP Tuesday, March 17, 2009
  111. Middleware App HTTP Tuesday, March 17, 2009
  112. Cooperative Middleware Tuesday, March 17, 2009
  113. URI Space Tuesday, March 17, 2009
  114. /* Tuesday, March 17, 2009
  115. /just-what-it-needs Tuesday, March 17, 2009
  116. CloudKit Tuesday, March 17, 2009
  117. Open Web JSON Appliance Tuesday, March 17, 2009
  118. expose :notes, :todos Tuesday, March 17, 2009
  119. expose :notes, :todos Tuesday, March 17, 2009
  120. contain :notes, :todos Tuesday, March 17, 2009
  121. use Rack::Pool::Session use CloudKit::OAuthFilter use CloudKit::OpenIDFilter use CloudKit::Service, :collections => [:notes, :todos] (run DefaultApp) Tuesday, March 17, 2009
  122. CloudKit::OAuthFilter /oauth/* Tuesday, March 17, 2009
  123. CloudKit::OpenIDFilter /login /logout /openid_complete Tuesday, March 17, 2009
  124. CloudKit::Service /notes/* /todos/* Tuesday, March 17, 2009
  125. ? Tuesday, March 17, 2009
  126. Browser OAuth OpenID Service Tuesday, March 17, 2009
  127. Browser OAuth OpenID Service Tuesday, March 17, 2009
  128. Browser {...} OAuth OpenID Service Tuesday, March 17, 2009
  129. Browser OAuth OpenID Service Tuesday, March 17, 2009
  130. Browser OAuth OpenID Service {...} Login Tuesday, March 17, 2009
  131. Browser OAuth OpenID Service Tuesday, March 17, 2009
  132. Browser OAuth OpenID Service Tuesday, March 17, 2009
  133. Browser OAuth OpenID Service Tuesday, March 17, 2009
  134. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  135. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  136. Service or Desktop App {...} OAuth OpenID Service Tuesday, March 17, 2009
  137. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  138. Service or Desktop App OAuth OpenID Service {...} Login Tuesday, March 17, 2009
  139. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  140. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  141. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  142. Service or Desktop App OAuth OpenID Service Tuesday, March 17, 2009
  143. Announcing Middleware Presence Tuesday, March 17, 2009
  144. HTTP Via Tuesday, March 17, 2009
  145. Via: 1.0 ricky, 1.1 ethel, 1.1 fred Tuesday, March 17, 2009
  146. Via: 1.0 ricky, 1.1 ethel, 1.1 fred Tuesday, March 17, 2009
  147. Via: 1.0 ricky, 1.1 ethel, 1.1 fred Tuesday, March 17, 2009
  148. Via: 1.0 ricky, 1.1 ethel, 1.1 fred Tuesday, March 17, 2009
  149. env[‘cloudkit.auth’] = 1 Tuesday, March 17, 2009
  150. env[‘cloudkit.via’] << ‘cloudkit.filter.oauth’ Tuesday, March 17, 2009
  151. env[‘cloudkit.via’] << ‘cloudkit.filter.openid’ Tuesday, March 17, 2009
  152. env[‘cloudkit.user’] = ‘http://joncrosby.me’ Tuesday, March 17, 2009
  153. Alternative Stacks Tuesday, March 17, 2009
  154. Rack::Map Tuesday, March 17, 2009
  155. map “/” do run Blog::Public end map “/db” do run Blog::DBAdmin end Tuesday, March 17, 2009
  156. Rack::Map + Sinatra Tuesday, March 17, 2009
  157. require ‘sinatra/base’ module Blog class Public < Sinatra::Base get ‘/’ do erb :index end end end Tuesday, March 17, 2009
  158. require ‘sinatra/base’ module Blog class Public < Sinatra::Base get ‘/’ do erb :index end end end Tuesday, March 17, 2009
  159. require ‘sinatra/base’ module Blog class Public < Sinatra::Base get ‘/’ do erb :index end end end Tuesday, March 17, 2009
  160. require ‘sinatra’ for “apps” /* URI space Tuesday, March 17, 2009
  161. require ‘sinatra/base’ MyClass < Sinatra::Base Minimal Sinatra (routing, rendering, etc.) Tuesday, March 17, 2009
  162. m/ Tuesday, March 17, 2009
  163. use MySinatraApp run SomeOtherApp Tuesday, March 17, 2009
  164. Rack::Cascade Tuesday, March 17, 2009
  165. app1 = lambda { ... } app2 = lambda { ... } run Rack::Cascade.new([app1, app2]) Tuesday, March 17, 2009
  166. Sinatra as Middleware in Rails Tuesday, March 17, 2009
  167. class X < Sinatra::Base get ‘/what’ do ‘what’ end end Rails::Initializer.run do |config| config.use.middleware ‘X’ end Tuesday, March 17, 2009
  168. CloudKit in Rails Tuesday, March 17, 2009
  169. Rails::Initializer.run do |config| config.use.middleware ‘CloudKit::Service’, :collections => [:notes, :todos] end Tuesday, March 17, 2009
  170. Middleware App HTTP Tuesday, March 17, 2009
  171. Middleware App Rails HTTP Tuesday, March 17, 2009
  172. Middleware App Rails Merb HTTP Tuesday, March 17, 2009
  173. Middleware App Rails Merb * HTTP Tuesday, March 17, 2009
  174. New Unit of Composition Tuesday, March 17, 2009
  175. m/ Tuesday, March 17, 2009

×