REST in peace @ Codemotion 2011
Upcoming SlideShare
Loading in...5
×
 

REST in peace @ Codemotion 2011

on

  • 3,938 views

Presentation at the 2011 Codemotion (formerly known as the italian JavaDay) about RESTful architectures and caching with Edge Side Includes specification.

Presentation at the 2011 Codemotion (formerly known as the italian JavaDay) about RESTful architectures and caching with Edge Side Includes specification.

Statistics

Views

Total Views
3,938
Views on SlideShare
3,536
Embed Views
402

Actions

Likes
4
Downloads
58
Comments
0

8 Embeds 402

http://www.codemotion.it 117
http://odino.org 112
http://www.odino.org 56
http://www.digitallycultured.it 53
http://2011.codemotion.it 44
http://127.0.0.1:4000 13
http://codemotion.it 6
http://codemotion.macaronilab.com 1
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

REST in peace @ Codemotion 2011 REST in peace @ Codemotion 2011 Presentation Transcript

  • REST in peace Rome, March 5th 2011Licensed under CC license
  • Agenda Rest in a nutshell ESI in a nutshell The uniform interface Pros/Cons Bad APIs ESI + REST ProblemsLicensed under CC license Rome, March 5th 2011
  • Sorry for the ugly slide. There will be others. Really sorry.Licensed under CC license Rome, March 5th 2011
  • Lets go!Licensed under CC license Rome, March 5th 2011
  • Lets go back!Licensed under CC license Rome, March 5th 2011
  • 2000 Fieldings dissertation: REpresentational State Transfer http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htmLicensed under CC license Rome, March 5th 2011
  • REST in a nutshell:Licensed under CC license Rome, March 5th 2011
  • REST in a nutshell: 1. Client <> ServerLicensed under CC license Rome, March 5th 2011
  • REST in a nutshell: 2. StatelessLicensed under CC license Rome, March 5th 2011
  • Recover and failover paradiseLicensed under CC license Rome, March 5th 2011
  • What about the user session?Licensed under CC license Rome, March 5th 2011
  • Must dieLicensed under CC license Rome, March 5th 2011
  • What about the user cookies?Licensed under CC license Rome, March 5th 2011
  • Should dieLicensed under CC license Rome, March 5th 2011
  • Wondering why?Licensed under CC license Rome, March 5th 2011
  • Wondering why? Send a cookie via FTP. http://www.google.it/search?sourceid=chrome&client=ubuntu&channel=cs&ie=UTF-8&q=ftp+cookies And http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm#sec_6_3_4_2Licensed under CC license Rome, March 5th 2011
  • REST in a nutshell: 3. CacheableLicensed under CC license Rome, March 5th 2011
  • REST in a nutshell: When dealing with safe methods, the response should be able to tell the client, or whatever stands behind the request, how to cache it.Licensed under CC license Rome, March 5th 2011
  • REST in a nutshell: 4. Layered systemLicensed under CC license Rome, March 5th 2011
  • REST in a nutshell: 5. Uniform interfaceLicensed under CC license Rome, March 5th 2011
  • Uniform interface hierarchic resource identification HTTP verbs to perform operations manipulation through representation HATEOASLicensed under CC license Rome, March 5th 2011
  • Richardson maturity model hierarchic resource identification HTTP verbs to perform operations manipulation through representation HATEOAS Really well explained by Fowler: http://martinfowler. com/articles/richardsonMaturityModel.html#level0Licensed under CC license Rome, March 5th 2011
  • Richardson maturity model mess hierarchic resource identification HTTP verbs to perform operations HATEOASLicensed under CC license Rome, March 5th 2011
  • Richardson maturity model 0. mess hierarchic resource identification HTTP verbs to perform operations HATEOASLicensed under CC license Rome, March 5th 2011
  • 0 Using HTTPLicensed under CC license Rome, March 5th 2011
  • Without giving a f***Licensed under CC license Rome, March 5th 2011
  • Richardson maturity model 1. 0. mess hierarchic resource identification HTTP verbs to perform operations HATEOASLicensed under CC license Rome, March 5th 2011
  • 1 mytastyproduct.com/users mytastyproduct.com/users/1/licenses/4Licensed under CC license Rome, March 5th 2011
  • Richardson maturity model 1. 0. mess hierarchic resource identification 2. HTTP verbs to perform operations HATEOASLicensed under CC license Rome, March 5th 2011
  • 2Licensed under CC license Rome, March 5th 2011
  • Richardson maturity model 1. 0. mess hierarchic resource identification 2. HTTP verbs to perform operations 3. HATEOASLicensed under CC license Rome, March 5th 2011
  • 3. GOD http://www.slideshare.net/trilancer/why-hateoas-1547275Licensed under CC license Rome, March 5th 2011
  • HyperlinksLicensed under CC license Rome, March 5th 2011
  • Hypermedia formats http://amundsen.com/hypermedia/Licensed under CC license Rome, March 5th 2011
  • Single entry pointLicensed under CC license Rome, March 5th 2011
  • Uniform interface is interesting. Everyone seem to have its own RESTful "service". But no one seem to entirely implement a uniform interface.Licensed under CC license Rome, March 5th 2011
  • Uniform interface is interesting. Everyone seem to have its own RESTful "service". But no one seem to entirely implement a uniform interface. That means... ...?Licensed under CC license Rome, March 5th 2011
  • No RESTful stuffLicensed under CC license Rome, March 5th 2011
  • But dont be too religious.Licensed under CC license Rome, March 5th 2011
  • But dont be too religious.Cookies stuff included.REST gets raped everyday,get over it.Licensed under CC license Rome, March 5th 2011
  • CounterorderLicensed under CC license Rome, March 5th 2011
  • Lets be religious bout that!Licensed under CC license Rome, March 5th 2011
  • Just for a couple minutes :)Licensed under CC license Rome, March 5th 2011
  • API #failLicensed under CC license Rome, March 5th 2011
  • Licensed under CC license Rome, March 5th 2011
  • flickr.com/people/{user-id}Licensed under CC license Rome, March 5th 2011
  • flickr.com/photos/{user-id}Licensed under CC license Rome, March 5th 2011
  • flickr.com/photos/{user-id} flickr.com/users/{user-id}/photos/Licensed under CC license Rome, March 5th 2011
  • flickr.photos.deleteLicensed under CC license Rome, March 5th 2011
  • wow, a delete!Licensed under CC license Rome, March 5th 2011
  • POSTLicensed under CC license Rome, March 5th 2011
  • Is that even legal?Licensed under CC license Rome, March 5th 2011
  • Licensed under CC license Rome, March 5th 2011
  • GET /api.twitter.com/1/users/show.formatLicensed under CC license Rome, March 5th 2011
  • GET /api.twitter.com/1/users/show.format GET /api.twitter.com/1/users/ HTTP Accept header: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.htmlLicensed under CC license Rome, March 5th 2011
  • GET /api.twitter.com/1/users/search.format?query...Licensed under CC license Rome, March 5th 2011
  • GET /api.twitter.com/1/users/search.format?query... GET /api.twitter.com/1/users?name=jackLicensed under CC license Rome, March 5th 2011
  • Licensed under CC license Rome, March 5th 2011
  • Only JSON responsesLicensed under CC license Rome, March 5th 2011
  • JSON is evilLicensed under CC license Rome, March 5th 2011
  • { "date": "2011-01-01", "stock": "100", "price": "12" }Licensed under CC license Rome, March 5th 2011
  • The business evolvesLicensed under CC license Rome, March 5th 2011
  • { "date": "2011-01-01", "stock": "100", "price": [ {"currency": "EUR", "amount": "12"}, {"currency": "USD", "amount": "10"} ] } Credits: http://twitter.com/#!/odracciLicensed under CC license Rome, March 5th 2011
  • Yeah, client is brokenLicensed under CC license Rome, March 5th 2011
  • No goodLicensed under CC license Rome, March 5th 2011
  • BTW <xml...> <product...> <price currency="EUR">25</price> <price currency="USD">23</price> </product> </xml>Licensed under CC license Rome, March 5th 2011
  • Well, getting back to...Licensed under CC license Rome, March 5th 2011
  • Licensed under CC license Rome, March 5th 2011
  • Create a new classhttp://<server>:[<port>]/class/<database>/<class-name>Licensed under CC license Rome, March 5th 2011
  • Response?Licensed under CC license Rome, March 5th 2011
  • HTTP/1.1 201 Created Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Date: Fri Feb 18 03:21:09 CET 2011 Content-Type: text/plain Server: OrientDB Server v.0.9.24 Connection: Keep-Alive Set-Cookie: OSESSIONID=OS12979956697985725150466358620636; Path=/; HttpOnly CONTENT-LENGTH: 221Licensed under CC license Rome, March 5th 2011
  • CAN I HAZ HATEOAZ?Licensed under CC license Rome, March 5th 2011
  • HTTP 201 Created Location /bla bla bla bla... http://en.wikipedia.org/wiki/HTTP_locationLicensed under CC license Rome, March 5th 2011
  • I am really ashamed of having bothered you for 78 slides to say how to perform a GETLicensed under CC license Rome, March 5th 2011
  • ESI in peace Rome, March 5th 2011Licensed under CC license Rome, March 5th 2011
  • Edge Side Includes A de facto standard for bla bla bla...Licensed under CC license Rome, March 5th 2011
  • Edge Side Includes A de facto standard for bla bla bla... Server side includes ( not SSI! ) usually handled by the architectures ESI processor. http://www.w3.org/TR/esi-lang http://www.w3.org/TR/edge-archLicensed under CC license Rome, March 5th 2011
  • Include <esi:include src="http://codemotion.it/talks/1" />Licensed under CC license Rome, March 5th 2011
  • Try/Catch<esi:try> <esi:attempt> <esi:comment text="The REST talk"/> <esi:include src="http://codemotion.it/talks/1" /> </esi:attempt>Licensed under CC license Rome, March 5th 2011
  • Fallback<esi:try> <esi:attempt> <esi:comment text="The REST talk"/> <esi:include src="http://codemotion.it/talks/1" /> </esi:attempt> <esi:except> <esi:comment text="fallback"/> <p>epic fail</p> </esi:except></esi:try> Licensed under CC license Rome, March 5th 2011
  • PitfallsLicensed under CC license Rome, March 5th 2011
  • Pitfalls Processor configurationLicensed under CC license Rome, March 5th 2011
  • Pitfalls Processor configuration Implementation of fallbacks for handling errorsLicensed under CC license Rome, March 5th 2011
  • Pitfalls Processor configuration Implementation of fallbacks for handling errors it relies on the processor, which gains importance, for creating any single response ( not really true :-) )Licensed under CC license Rome, March 5th 2011
  • ProsLicensed under CC license Rome, March 5th 2011
  • ProsLicensed under CC license Performances Rome, March 5th 2011
  • ProsEffective gateway cacheLicensed under CC license Rome, March 5th 2011
  • Pros ScalabilityLicensed under CC license Rome, March 5th 2011
  • Which leads us to...Licensed under CC license Rome, March 5th 2011
  • REST+ESI in peace Rome, March 5th 2011Licensed under CC license Rome, March 5th 2011
  • This is a responseLicensed under CC license Rome, March 5th 2011
  • aggregating many resourcesLicensed under CC license Rome, March 5th 2011
  • So heres a resource.Licensed under CC license Rome, March 5th 2011
  • So heres a resource. Or, better, its representation.Licensed under CC license Rome, March 5th 2011
  • Five minutes cache 2 days cacheLicensed under CC license Rome, March 5th 2011
  • Lets write our own caching systemLicensed under CC license Rome, March 5th 2011
  • because we need to cache differentresources with different expiring intervals odino@odino-phenom:~$ ab -n 1000 -c 10 http://127. 0.0.1/tmp/esi.php This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http: //www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requestsLicensed under CC license Rome, March 5th 2011
  • Hell no!Licensed under CC license Rome, March 5th 2011
  • USE ESI and HTTP cacheLicensed under CC license Rome, March 5th 2011
  • Understanding the web cache http://www.mnot.net/cache_docs/#WORK HTTP cache http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.htmlLicensed under CC license Rome, March 5th 2011
  • Without a single LoCLicensed under CC license Rome, March 5th 2011
  • ehm...Licensed under CC license Rome, March 5th 2011
  • With a few LoCs, gotta admitLicensed under CC license Rome, March 5th 2011
  • The ArchitectureLicensed under CC license Rome, March 5th 2011
  • Client Reverse proxy / ESI processor Application DatabaseLicensed under CC license Rome, March 5th 2011
  • No problems, uh?Licensed under CC license Rome, March 5th 2011
  • HellLicensed under CC license no! Rome, March 5th 2011
  • 1. ComplexityLicensed under CC license Rome, March 5th 2011
  • 1. ComplexityResolved by your needsLicensed under CC license Rome, March 5th 2011
  • 2. CachingLicensed under CC license Rome, March 5th 2011
  • 2. Caching Resolved by the gateway cache aka your reverse proxy aka, most of the time, VarnishLicensed under CC license Rome, March 5th 2011
  • You know Varnish, dont you?Licensed under CC license Rome, March 5th 2011
  • Without varnish Concurrency Level: 10 Time taken for tests: 1.467 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 5476471 bytes HTML transferred: 5285280 bytes Requests per second: 681.69 [#/sec] (mean) Time per request: 14.670 [ms] (mean) Time per request: 1.467 [ms] (mean, across all concurrent requests) Transfer rate: 3645.73 [Kbytes/sec] receivedLicensed under CC license Rome, March 5th 2011
  • With varnish Concurrency Level: 10 Time taken for tests: 0.179 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 5479938 bytes HTML transferred: 5288556 bytes Requests per second: 5587.65 [#/sec] (mean) Time per request: 1.790 [ms] (mean) Time per request: 0.179 [ms] (mean, across all concurrent requests) Transfer rate: 29902.34 [Kbytes/sec] receivedLicensed under CC license Rome, March 5th 2011
  • AWESOME huh?Licensed under CC license Rome, March 5th 2011
  • NO.Licensed under CC license Rome, March 5th 2011
  • Wheres my HATEOAS, again?Licensed under CC license Rome, March 5th 2011
  • Defining a request header in ESI <esi:environment> <esi:request_header name="Accept" value="text/vnd.odino.xhtml"/> </esi:environment>Licensed under CC license Rome, March 5th 2011
  • Defining a request header in ESI <esi:environment> <esi:request_header name="Accept" value="text/vnd.odino.xhtml"/> </esi:environment> Content NegotiationLicensed under CC license Rome, March 5th 2011
  • Awful supportLicensed under CC license Rome, March 5th 2011
  • Client Reverse proxy ? ApplicationLicensed under CC license Rome, March 5th 2011
  • Client Reverse proxy ESI processor ApplicationLicensed under CC license Rome, March 5th 2011
  • Some freaking crazy people built a webserverLicensed under CC license Rome, March 5th 2011
  • in PHPLicensed under CC license Rome, March 5th 2011
  • with the RAD framework Symfony2 http://symfony-reloaded.org/ https://github.com/pminnieur/ServerBundleLicensed under CC license Rome, March 5th 2011
  • That means you should be able to write your own reverse proxy acting as an ESI processor. I mean, if they were able to write a webserver...Licensed under CC license Rome, March 5th 2011
  • in PHPLicensed under CC license Rome, March 5th 2011
  • you have no excusesLicensed under CC license Rome, March 5th 2011
  • But pleaseLicensed under CC license Rome, March 5th 2011
  • Make it support all the ESI stuffLicensed under CC license Rome, March 5th 2011
  • Not like Varnish http://www.varnish-cache.org/trac/wiki/ESIfeaturesLicensed under CC license Rome, March 5th 2011
  • Extended content negotiationLicensed under CC license Rome, March 5th 2011
  • text/vnd.xhtml+xml;profile=esi Chapter 8: http://www.rfc-editor.org/rfc/rfc3236.txtLicensed under CC license Rome, March 5th 2011
  • Response to the proc text/vnd.xhtml+xml;profile=esi <head> .... </head> <body> <esi ... /> </body>Licensed under CC license Rome, March 5th 2011
  • Profile is used because the browser wont render such this kind of formats:Licensed under CC license Rome, March 5th 2011
  • text/vnd.xhesiml+xmlLicensed under CC license Rome, March 5th 2011
  • Response for fragments text/vnd.xhesiml+xml <div> .... </div> <span> <esi ... /> </span>Licensed under CC license Rome, March 5th 2011
  • Client Reverse proxy Supporting all the ESI ESI processor specification http://www.w3.org/TR/esi-lang ApplicationLicensed under CC license Rome, March 5th 2011
  • Overhead?Licensed under CC license Rome, March 5th 2011
  • Is that a problem?Licensed under CC license Rome, March 5th 2011
  • Client Reverse proxy Supporting all the ESI ESI processor specification http://www.w3.org/TR/esi-lang ApplicationLicensed under CC license Rome, March 5th 2011
  • Varnish is there for a reasonLicensed under CC license Rome, March 5th 2011
  • Because at thatLicensed under CC license Rome, March 5th 2011
  • Varnish ROCKS!Licensed under CC license Rome, March 5th 2011
  • Ready to include a resource with our custom hypermedia format <esi:environment> <esi:request_header name="Accept" value="text/vnd.blablabla"/> </esi:environment>Licensed under CC license Rome, March 5th 2011
  • But dont screw everything forgetting the remaining parts of HATEOAS, like hypermedia relations. http://www.slideshare.net/adorepump/hateoas-the-confusing-bit-from-rest http://tech.groups.yahoo.com/group/rest-discuss/message/17011Licensed under CC license Rome, March 5th 2011
  • So, with aLicensed under CC license Rome, March 5th 2011
  • LayeredLicensed under CC license Rome, March 5th 2011
  • CacheableLicensed under CC license Rome, March 5th 2011
  • StatelessLicensed under CC license Rome, March 5th 2011
  • Driven byLicensed under CC license Rome, March 5th 2011
  • Uniform interfaceLicensed under CC license Rome, March 5th 2011
  • and hypermediaLicensed under CC license Rome, March 5th 2011
  • architectureLicensed under CC license Rome, March 5th 2011
  • OhLicensed under CC license dear Rome, March 5th 2011
  • Richardson maturity model level 3Licensed under CC license Rome, March 5th 2011
  • Again...Licensed under CC license Rome, March 5th 2011
  • ProsLicensed under CC license Performances Rome, March 5th 2011
  • Pros ScalabilityLicensed under CC license Rome, March 5th 2011
  • Pros DurabilityLicensed under CC license Rome, March 5th 2011
  • Where to REST in peace Rome, March 5th 2011Licensed under CC license Rome, March 5th 2011
  • any webserviceLicensed under CC license Rome, March 5th 2011
  • machine to machineLicensed under CC license Rome, March 5th 2011
  • Be the next AtomPub http://bitworking.org/projects/atom/rfc5023.htmlLicensed under CC license Rome, March 5th 2011
  • Actually...Licensed under CC license Rome, March 5th 2011
  • Licensed under CC license Rome, March 5th 2011
  • "REST is software design on the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at short-term design, and usually awful at long-term design. " Roy FieldingLicensed under CC license Rome, March 5th 2011
  • Put a bit of REST everywhereLicensed under CC license Rome, March 5th 2011
  • http://articles.sfgate.com/2011-02-20/opinion/28613184_1_news-network-cable-and-satellite-website http://tech.groups.yahoo.com/group/rest-discuss/message/17370 +2.500% trafficLicensed under CC license Rome, March 5th 2011
  • Rules of good designLicensed under CC license Rome, March 5th 2011
  • No need to be religiousLicensed under CC license Rome, March 5th 2011
  • This talk sucks in peace Rome, March 5th 2011Licensed under CC license Rome, March 5th 2011
  • 1Licensed under CC license Rome, March 5th 2011
  • Agile development vs RESTLicensed under CC license Rome, March 5th 2011
  • Agile development vs REST mmmmmmmmmmmm................ http://www.odino.org/288/restful-and-agile-love-hate-loveLicensed under CC license Rome, March 5th 2011
  • 2Licensed under CC license Rome, March 5th 2011
  • Browsers suckLicensed under CC license Rome, March 5th 2011
  • HTTP authentication http://www.odino.org/238/mockups-of-web-authentication-the-rest-rescueLicensed under CC license Rome, March 5th 2011
  • 3Licensed under CC license Rome, March 5th 2011
  • HTML5Licensed under CC license Rome, March 5th 2011
  • Everybody loves itLicensed under CC license Rome, March 5th 2011
  • I HATE HTML5Licensed under CC license Rome, March 5th 2011
  • Original specification: "support for PUT and DELETE verbs"Licensed under CC license Rome, March 5th 2011
  • People went insaneLicensed under CC license Rome, March 5th 2011
  • Current status?Licensed under CC license Rome, March 5th 2011
  • RemovedLicensed under CC license Rome, March 5th 2011
  • There are no use casesLicensed under CC license Rome, March 5th 2011
  • They saidLicensed under CC license Rome, March 5th 2011
  • http://www.w3.org/TR/2010/WD-html5-diff-20101019/#changes-2010-06-24Licensed under CC license Rome, March 5th 2011
  • Then people got madLicensed under CC license Rome, March 5th 2011
  • A disclaimer in peace Rome, March 5th 2011Licensed under CC license Rome, March 5th 2011
  • JSON does not suck. At all. http://www.slideshare.net/Wombert/xml-versus-the-new-kids-on-the-block-phpbnl11-20110129Licensed under CC license Rome, March 5th 2011
  • Varnish does not suck. At all.Licensed under CC license Rome, March 5th 2011
  • HTML5 does not suck. At all. http://www.html5rocks.com/Licensed under CC license Rome, March 5th 2011
  • OrientDB rocks Ask Luca Garulli, he might be in this room http://www.orientechnologies.com/Licensed under CC license Rome, March 5th 2011
  • Everything is a tradeoffLicensed under CC license Rome, March 5th 2011
  • Hints?Licensed under CC license Rome, March 5th 2011
  • David Zuelke knows bestLicensed under CC license Rome, March 5th 2011
  • Design HTTP interfaces and RESTful webserviceshttp://www.slideshare.net/Wombert/designing-http-interfaces-and-restful-web-services-phpbnl11-20110128Licensed under CC license Rome, March 5th 2011
  • Others know bestLicensed under CC license Rome, March 5th 2011
  • 300 RESTful boring slides :) http://www.slideshare.net/guilhermecaelum/rest-in-practice REST as the DBMS of the web http://www.slideshare.net/dnene/rest-representational-state-transfer-explainedLicensed under CC license Rome, March 5th 2011
  • amazon.itLicensed under CC license Rome, March 5th 2011
  • Thanks! Alessandro Nadalin odino.org
  • @_odino_ #codemotionLicensed under CC license Rome, March 5th 2011
  • 12 - 14 May, Verona
  • Credits http://www.flickr.com/photos/larachris/16564077/sizes/o/in/photostream/ http://www.flickr.com/photos/ashatenbroeke/4367373081/sizes/z/in/photostream/ http://www.flickr.com/photos/yourdon/3140270189/sizes/l/in/photostream/ http://www.flickr.com/photos/jox1989/4964706072/sizes/l/in/photostream/ http://www.flickr.com/photos/brainfg/168506259/sizes/o/in/photostream/ http://www.flickr.com/photos/norte_it/3897091546/sizes/o/in/photostream/ http://www.zdnet.com/blog/service-oriented/soap-versus-rest-a-matter-of-style/3568http://www.flickr.com/photos/turtlemom_nancy/2046347762/sizes/l/in/photostream/ http://www.flickr.com/photos/juanpg/3333385784/sizes/z/in/photostream/ http://www.flickr.com/photos/congvo/301678287/sizes/l/in/photostream/ http://www.flickr.com/photos/ihasb33r/2573196546/sizes/z/in/photostream/ http://www.flickr.com/photos/martin_heigan/4544138976/sizes/o/in/photostream/ http://www.flickr.com/photos/cknara/4195099999/sizes/o/in/photostream/ http://www.flickr.com/photos/1080p/3076529265/sizes/l/in/photostream/ http://www.flickr.com/photos/adamrice/280300202/sizes/l/in/photostream/ http://www.flickr.com/photos/tomer_a/541411897/sizes/o/in/photostream/ http://www.flickr.com/photos/subpra/4514008262/sizes/l/in/photostream/ http://www.flickr.com/photos/lippincott/2539720043/sizes/l/in/photostream/ http://www.flickr.com/photos/rawryder/5086090931/sizes/l/in/photostream/ http://www.flickr.com/photos/robboudon/5312731161/sizes/l/in/photostream/ http://www.flickr.com/photos/bc-burnslibrary/4158243488/sizes/o/in/photostream/http://www.flickr.com/photos/13606325@N08/2416993706/sizes/o/in/photostream/ http://www.flickr.com/photos/neothezion/5135841069/sizes/l/in/photostream/ http://www.flickr.com/photos/planetschwa/2494067809/ http://www.flickr.com/photos/thomasthomas/258931782/