Sinatra Rack And Middleware
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Sinatra Rack And Middleware

on

  • 51,995 views

How I learned to make rack middleware using Sinatra

How I learned to make rack middleware using Sinatra

Statistics

Views

Total Views
51,995
Views on SlideShare
51,564
Embed Views
431

Actions

Likes
73
Downloads
475
Comments
1

10 Embeds 431

http://www.slideshare.net 388
http://qa.bistri.com 13
http://www.e-presentations.us 6
http://bistri.com 4
http://slidesync.herokuapp.com 4
http://www.techgig.com 4
https://bistri.com 4
http://localhost 3
https://qa.bistri.com 3
http://webcache.googleusercontent.com 2
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Sinatra Rack And Middleware Presentation Transcript

  • 1. sinatra, rack & middleware This is made “soon after” railsconf, so you’ll just have to deal with the railsconf references
  • 2. sinatra, rack & middleware Ben Schwarz @benschwarz http://github.com/benschwarz This is made “soon after” railsconf, so you’ll just have to deal with the railsconf references
  • 3. sinatra
  • 4. from the top
  • 5. ... is fucking sweet
  • 6. DSL
  • 7. Built on Rack More on that later
  • 8. Blake Mizerany @bmizerany
  • 9. Ever wondered what Blake Mizerany looks like at 8 am after a huge fucking bender in “old” vegas?
  • 10. Eyyeaahh.
  • 11. So, that DSL
  • 12. heres an example of the most simple sinatra application you could probably make. The ‘get’ referrers to the HTTP verb. You should probably recognise this from rails land. The next part is the “route”, here I’m just mapping the index / root. “erb :index” will render index.erb, sinatra also has haml support out of the box.
  • 13. heres an example of the most simple sinatra application you could probably make. The ‘get’ referrers to the HTTP verb. You should probably recognise this from rails land. The next part is the “route”, here I’m just mapping the index / root. “erb :index” will render index.erb, sinatra also has haml support out of the box.
  • 14. heres an example of the most simple sinatra application you could probably make. The ‘get’ referrers to the HTTP verb. You should probably recognise this from rails land. The next part is the “route”, here I’m just mapping the index / root. “erb :index” will render index.erb, sinatra also has haml support out of the box.
  • 15. heres an example of the most simple sinatra application you could probably make. The ‘get’ referrers to the HTTP verb. You should probably recognise this from rails land. The next part is the “route”, here I’m just mapping the index / root. “erb :index” will render index.erb, sinatra also has haml support out of the box.
  • 16. a ‘post’ example. you might notice the params hash is nothing new if you’ve come from rails land.
  • 17. a ‘post’ example. you might notice the params hash is nothing new if you’ve come from rails land.
  • 18. a ‘post’ example. you might notice the params hash is nothing new if you’ve come from rails land.
  • 19. a ‘post’ example. you might notice the params hash is nothing new if you’ve come from rails land.
  • 20. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 21. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 22. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 23. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 24. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 25. a slightly more advanced example. Here I create a mime type of :json and use before (read: like before_filter) to set the :json content type before all routes. The .to_json method isn’t Sinatra magic. In this case it comes from using datamappers’ aggrigates plugin, activerecord of course has this built in.
  • 26. This is called “Classic” Sinatra application style This means that the get and post (read: your application) is defined at the top level
  • 27. Apps can also be defined in another way. Modular apps are defined within their own namespace / class. They inherit from Sinatra::Base
  • 28. Apps can also be defined in another way. Modular apps are defined within their own namespace / class. They inherit from Sinatra::Base
  • 29. Thats a “Modular” Sinatra application I’ll get into modular apps a little more later
  • 30. Running it So by now, if you’re unfamiliar with rack or sinatra you’ll might be thinking, “but we just got passenger, ruby hosting has only now become ‘easy’”
  • 31. Development
  • 32. you could use the `rackup` command, but instead you should use ‘shotgun’ by Ryan Tomayko, it handles application reloading (which is not present within the sinatra codebase)
  • 33. Ryan Tomayko @rtomayko
  • 34. Ever wondered what Ryan Tomayko looks like at 8 am after a huge fucking bender in “old” vegas?
  • 35. Not much earlier (5am) Ryan sent his wife an email saying “Melbourne, we’re going”. She called in the morning to find out if he was mid-way across the pacific or not.
  • 36. Production
  • 37. Drop in a config.ru to your application root config.Rack-Up, rack uses this to load and configure rack applications and middleware
  • 38. this is a simple config.ru file. its for a ‘classic’ application
  • 39. For those “Modular” applications
  • 40. a rackup file (config.ru) example for a modular application
  • 41. Then drop it under passenger. Done Of course you’ll need to read some docs, but its so trivial its not even worth mentioning
  • 42. Heres the part where I hock my own warez Just some assorted things that I have found really fun or interesting in the last few months
  • 43. Amnesia Statistics for memcached instances
  • 44. So thats all your hits, misses and basic stats to tell you what the hell your memcached instances are doing. If they’re getting smashed. Etc. I know iseekgolf, a large australian golfing website have used it, along with some engineyard customers. github and flickr also checked it out which was pretty cool. Amnesia was a 2 session application, one for implementation, the next to add the graphs etc. I think I spent about 5 hours total on it.
  • 45. Munch Recipes from websites re-represented I showed this last month, its pretty simple so I’ll gloss over it.
  • 46. Basically a aggregate search engine for cooking sites
  • 47. Postie Postie was originally a rails app, ported to merb
  • 48. Pat Allan @pat Pat allan wrote it
  • 49. Postie A Rack middleware to provide postcode services I decided to make the next natural progression and re-write it as a rack middleware
  • 50. It has its own datamapper based sqlite backend. When a new build comes out, new data will be installed along with the gem. Its quite small though.
  • 51. Here is the basic api
  • 52. Here is the basic api
  • 53. Here is the basic api
  • 54. Hold on, rack middleware? If you thought we were talking about sinatra, well, you’re right.
  • 55. So how does that work?
  • 56. Sinatra runs on Rack
  • 57. Sinatra (wolf) Rack (sheeps clothing) This is a strange analogy. I don’t know.
  • 58. So when you go and define you app in “modular style”, it can be used as a rack middleware.
  • 59. a config.ru file to run your application as middleware, note the use of “use”.
  • 60. a config.ru file to run your application as middleware, note the use of “use”.
  • 61. a config.ru file to run your application as middleware, note the use of “use”.
  • 62. In rails land, you do it like this
  • 63. In rails land, you do it like this
  • 64. In rails land, you do it like this
  • 65. In rails land, you do it like this
  • 66. Selected middlewares
  • 67. Rack::Cache
  • 68. and again, its made by Ryan Tomayko
  • 69. Reverse proxy Like Squid or Varnish, but small and simple It’ll set correct http headers. Thats really important. The main basis of this is that your application pages can be cached by rack::cache and stop requests from even having to hit your ruby process.
  • 70. JSON-P Json-p is for when you want to get callbacks for your json / ajax requests from your server. The data will be returned wrapped within a callback method. This can make writing a javascript based interface much faster and easier to implement.
  • 71. instead of doing something like this
  • 72. you can add a callback parameter
  • 73. so instead of getting some result like we did earlier, a raw javascript / json “string” in the browser that needs to be eval’d and looked after
  • 74. you can get it back like this, it calls your method and can be handled more cleanly
  • 75. JSON-P part of rack-contrib Json-p is for when you want to get callbacks for your json / ajax requests from your server. The data will be returned wrapped within a callback method. This can make writing a javascript based interface much faster and easier to implement.
  • 76. Hancock The last one I’ll show is “hancock”
  • 77. A REAL implementation of single-sign-on Engine yard are using this internally and I really suggest that you read the code. There are some videos available online and it stands as the best example of sinatra based rack middleware. Hancock was the only real implementation of a sinatra based rack middleware that he sinatra committers could point me at. I used it as a basis for learning how to pack postie together.
  • 78. Thanks Special Thanks to Blake and Ryan for being good sports.
  • 79. Thanks http://sinatrarb.com http://twitter.com/bmizerany http://twitter.com/rtomayko http://github.com/benschwarz/amnesia http://github.com/benschwarz/munch http://github.com/benschwarz/postie http://github.com/rtomayko/shotgun http://github.com/rack/rack-contrib http://github.com/atmos/hancock/tree/master http://github.com/atmos/hancock-client/tree/master http://en.wikipedia.org/wiki/Single_sign-on Special Thanks to Blake and Ryan for being good sports.