0
REST        in peacePHP.TO.START, July 11 2011 - Turin
AGENDA             ● Vol. 1: REST in a nutshell               ○ Tenets               ○ Antipatterns             ● Vol. 2: ...
Sorry for the ugly slide.           There will be others.              Really sorry.PHP.TO.START, July 11 2011 - Turin
REST in a nutshell:       1. Client <> ServerPHP.TO.START, July 11 2011 - Turin
REST in a nutshell:                              2. StatelessPHP.TO.START, July 11 2011 - Turin
REST in a nutshell:             3. CacheablePHP.TO.START, July 11 2011 - Turin
REST in a nutshell:4. Layered systemPHP.TO.START, July 11 2011 - Turin
REST in a nutshell:                                 5. Uniform                                 interfacePHP.TO.START, July...
And obviously nobody had a cluePHP.TO.START, July 11 2011 - Turin
ANTIPATTERNSPHP.TO.START, July 11 2011 - Turin
1                        URIsPHP.TO.START, July 11 2011 - Turin
"REST is about cool URI design"http://apple.com/users/1/licenses/4.jsonPHP.TO.START, July 11 2011 - Turin
"REST is about cool URI design"http://apple.com/users/1/licenses/4.jsonPHP.TO.START, July 11 2011 - Turin
http://apple.com/site/en_US/showUsers.jsp?uid=1&license=4             is OK tooPHP.TO.START, July 11 2011 - Turin
butPHP.TO.START, July 11 2011 - Turin
cool URIs help you   think in term of resources                                     David ZuelkePHP.TO.START, July 11 2011...
2                   URIs (bis)PHP.TO.START, July 11 2011 - Turin
REST follows a URI schema                         GET /users                         POST /users                         P...
REST follows a URI schema                        GET /users                           POST /users                        P...
what if you change your              URL?PHP.TO.START, July 11 2011 - Turin
Yeah,           client is           brokenPHP.TO.START, July 11 2011 - Turin
RESTful clients should        be driven by services        hypermedia controls  Roy Fielding : http://roy.gbiv.com/untangl...
HATEOASPHP.TO.START, July 11 2011 - Turin
3                  POST is coolPHP.TO.START, July 11 2011 - Turin
said SOAP 1.1PHP.TO.START, July 11 2011 - Turin
said SOAP 1.1PHP.TO.START, July 11 2011 - Turin
loosing meaningful verbs at the protocol levelPHP.TO.START, July 11 2011 - Turin
loosing meaningful verbs at the protocol level          nothing cacheable by defaultPHP.TO.START, July 11 2011 - Turin
loosing meaningful verbs at the protocol level          nothing cacheable by default            what about bookmarking?PHP...
4            500 is your friendPHP.TO.START, July 11 2011 - Turin
said SOAP                        ( again )PHP.TO.START, July 11 2011 - Turin
GET /users/300                  Host: www.example.comPHP.TO.START, July 11 2011 - Turin
GET /users/300                  Host: www.example.com      HTTP/1.1 500 Internal Server Error      Etag: 1234      X-Power...
GET /users/300                  Host: www.example.com      HTTP/1.1 500 Internal Server Error      Etag: 1234      X-Power...
The HTTP protocol is awesome,     and lets you return meaningful and     universally-understood status codesPHP.TO.START, ...
404 Not FoundPHP.TO.START, July 11 2011 - Turin
404 Not Found                   OMG Link is broken?PHP.TO.START, July 11 2011 - Turin
202 AcceptedPHP.TO.START, July 11 2011 - Turin
202 Accepted You get an immediate OK, and the operation will hopefully completePHP.TO.START, July 11 2011 - Turin
PausePHP.TO.START, July 11 2011 - Turin
World Wide           WebPHP.TO.START, July 11 2011 - Turin
the largest data-exchange network on the planetPHP.TO.START, July 11 2011 - Turin
And meanwhile, at Facebook... 12TB of new data every day        (1 year ago)           500 million usersPHP.TO.START, July...
And meanwhile, at Google...           1 billion    unique monthly googlersPHP.TO.START, July 11 2011 - Turin
via   HTTP             , baby!PHP.TO.START, July 11 2011 - Turin
HTTP in a nutshell:       1. Client <> ServerPHP.TO.START, July 11 2011 - Turin
HTTP in a nutshell:                              2. StatelessPHP.TO.START, July 11 2011 - Turin
HTTP in a nutshell:3. widespread cache spec   http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.htmlPHP.TO.START, July 11 ...
HTTP in a nutshell:              Lao Tze Song using Firefox              5                   Company proxy                ...
HTTP in a nutshell:          5. it is the uniform interface          between clients and serversPHP.TO.START, July 11 2011...
HTTP bleeds RESTPHP.TO.START, July 11 2011 - Turin
1.         caching & scalabilityPHP.TO.START, July 11 2011 - Turin
Types of cache                         Local                    Shared/proxy               Shared/reverse proxyPHP.TO.STAR...
Types of cache                         Local                    Shared/proxy               Shared/reverse proxyPHP.TO.STAR...
PHP.TO.START, July 11 2011 - Turin
Types of cache                         Local                  Shared/proxy               Shared/reverse proxyPHP.TO.START,...
PHP.TO.START, July 11 2011 - Turin
Types of cache                         Local                    Shared/proxy            Shared/reverse proxyPHP.TO.START, ...
PHP.TO.START, July 11 2011 - Turin
on the server sidePHP.TO.START, July 11 2011 - Turin
Caching with               Expiration               (example)PHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK     Host: www.example.com     Expires: 0PHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK     Host: www.example.com     Expires: 0PHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK     Host: www.example.com     Expires: Tue, 31 Jan 2011 01:00 GMTPHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK         Host: www.example.com         Cache-Control: max-age=60, publicPHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK         Host: www.example.com         Cache-Control: max-age=60, publicPHP.TO.START, July 11 2011 - Turin
HTTP/1.1 200 OK         Host: www.example.com         Cache-Control: max-age=60, public                Cacheable for 60 se...
HTTP/1.1 200 OK         Host: www.example.com         Cache-Control: max-age=60, public        Cacheable by both local and...
but hey, you sayPHP.TO.START, July 11 2011 - Turin
HTTPs cache fails when dealing with really dynamic  pages, because consumers will always have to hit the   origin server, ...
Nope                     NopePHP.TO.START, July 11 2011 - Turin
ESI was built for that             http://www.w3.org/TR/esi-langPHP.TO.START, July 11 2011 - Turin
<esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
<esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
<esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
1s (tweets)            3600 postPHP.TO.START, July 11 2011 - Turin
<esi:include src=tweets.html />    <esi:include src=article/12.html                    />PHP.TO.START, July 11 2011 - Turin
So what does HTTP cache is meant to solve?PHP.TO.START, July 11 2011 - Turin
Less workPHP.TO.START, July 11 2011 - Turin
http://www.flickr.com/photos/snakphotography/5004775320/sizes/o/in/photostream/  because the hard work is delegated to the...
evolvePHP.TO.START, July 11 2011 - Turin
because cache is abstracted from the applicationPHP.TO.START, July 11 2011 - Turin
loose couplingPHP.TO.START, July 11 2011 - Turin
because caching is bound to the protocol, HTTP, notto your implementation ( Sf, RoR, Django )PHP.TO.START, July 11 2011 - ...
2.     adaptability & durabilityPHP.TO.START, July 11 2011 - Turin
Hypermedia              another long-time friendPHP.TO.START, July 11 2011 - Turin
Links              outrageously semplifyingPHP.TO.START, July 11 2011 - Turin
<link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
<link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
<link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
<link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
POST /users                 Host: www.example.                 com      HTTP/1.1 201 Created      Host: www.example.com   ...
POST /users                 Host: www.example.                 com      HTTP/1.1 201 Created      Host: www.example.com   ...
POST /users                 Host: www.example.                 com      HTTP/1.1 201 Created      Host: www.example.com   ...
POST /users                 Host: www.example.                 com      HTTP/1.1 201 Created      Host: www.example.com   ...
consumers of your API are able to follow             the changes of your designPHP.TO.START, July 11 2011 - Turin
everything seems            cool         But why REST?PHP.TO.START, July 11 2011 - Turin
Pros          PerformancesPHP.TO.START, July 11 2011 - Turin
ProsScalabilityPHP.TO.START, July 11 2011 - Turin
Pros                                     DurabilityPHP.TO.START, July 11 2011 - Turin
amazon.itPHP.TO.START, July 11 2011 - Turin
REST-IT      https://groups.google.com/forum/#!forum/rest-itPHP.TO.START, July 11 2011 - Turin
Alessandro Nadalin
Alessandro Nadalin         odino.org
Alessandro Nadalin         odino.org        @_odino_
Alessandro Nadalin         odino.org        @_odino_
ThanksAlessandro Nadalin         odino.org        @_odino_
Credits                   http://www.flickr.com/photos/larachris/16564077/sizes/o/in/photostream/              http://www....
REST in peace @ PHP.TO.START 07-11-2011
Upcoming SlideShare
Loading in...5
×

REST in peace @ PHP.TO.START 07-11-2011

3,238

Published on

A brief "excursus" on the REST architectural style, with antipatterns and examples based on th

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
3,238
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "REST in peace @ PHP.TO.START 07-11-2011"

  1. 1. REST in peacePHP.TO.START, July 11 2011 - Turin
  2. 2. AGENDA ● Vol. 1: REST in a nutshell ○ Tenets ○ Antipatterns ● Vol. 2: To the rescue ○ HTTP cache ○ HATEOASPHP.TO.START, July 11 2011 - Turin
  3. 3. Sorry for the ugly slide. There will be others. Really sorry.PHP.TO.START, July 11 2011 - Turin
  4. 4. REST in a nutshell: 1. Client <> ServerPHP.TO.START, July 11 2011 - Turin
  5. 5. REST in a nutshell: 2. StatelessPHP.TO.START, July 11 2011 - Turin
  6. 6. REST in a nutshell: 3. CacheablePHP.TO.START, July 11 2011 - Turin
  7. 7. REST in a nutshell:4. Layered systemPHP.TO.START, July 11 2011 - Turin
  8. 8. REST in a nutshell: 5. Uniform interfacePHP.TO.START, July 11 2011 - Turin
  9. 9. And obviously nobody had a cluePHP.TO.START, July 11 2011 - Turin
  10. 10. ANTIPATTERNSPHP.TO.START, July 11 2011 - Turin
  11. 11. 1 URIsPHP.TO.START, July 11 2011 - Turin
  12. 12. "REST is about cool URI design"http://apple.com/users/1/licenses/4.jsonPHP.TO.START, July 11 2011 - Turin
  13. 13. "REST is about cool URI design"http://apple.com/users/1/licenses/4.jsonPHP.TO.START, July 11 2011 - Turin
  14. 14. http://apple.com/site/en_US/showUsers.jsp?uid=1&license=4 is OK tooPHP.TO.START, July 11 2011 - Turin
  15. 15. butPHP.TO.START, July 11 2011 - Turin
  16. 16. cool URIs help you think in term of resources David ZuelkePHP.TO.START, July 11 2011 - Turin
  17. 17. 2 URIs (bis)PHP.TO.START, July 11 2011 - Turin
  18. 18. REST follows a URI schema GET /users POST /users PUT /users/{id} DELETE /users/{id} ...PHP.TO.START, July 11 2011 - Turin
  19. 19. REST follows a URI schema GET /users POST /users PUT /users/{id} DELETE /users/{id} ...PHP.TO.START, July 11 2011 - Turin
  20. 20. what if you change your URL?PHP.TO.START, July 11 2011 - Turin
  21. 21. Yeah, client is brokenPHP.TO.START, July 11 2011 - Turin
  22. 22. RESTful clients should be driven by services hypermedia controls Roy Fielding : http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-drivenPHP.TO.START, July 11 2011 - Turin
  23. 23. HATEOASPHP.TO.START, July 11 2011 - Turin
  24. 24. 3 POST is coolPHP.TO.START, July 11 2011 - Turin
  25. 25. said SOAP 1.1PHP.TO.START, July 11 2011 - Turin
  26. 26. said SOAP 1.1PHP.TO.START, July 11 2011 - Turin
  27. 27. loosing meaningful verbs at the protocol levelPHP.TO.START, July 11 2011 - Turin
  28. 28. loosing meaningful verbs at the protocol level nothing cacheable by defaultPHP.TO.START, July 11 2011 - Turin
  29. 29. loosing meaningful verbs at the protocol level nothing cacheable by default what about bookmarking?PHP.TO.START, July 11 2011 - Turin
  30. 30. 4 500 is your friendPHP.TO.START, July 11 2011 - Turin
  31. 31. said SOAP ( again )PHP.TO.START, July 11 2011 - Turin
  32. 32. GET /users/300 Host: www.example.comPHP.TO.START, July 11 2011 - Turin
  33. 33. GET /users/300 Host: www.example.com HTTP/1.1 500 Internal Server Error Etag: 1234 X-Powered-By: php/5.3 ... The record cannot be foundPHP.TO.START, July 11 2011 - Turin
  34. 34. GET /users/300 Host: www.example.com HTTP/1.1 500 Internal Server Error Etag: 1234 X-Powered-By: php/5.3 ... The record cannot be foundPHP.TO.START, July 11 2011 - Turin
  35. 35. The HTTP protocol is awesome, and lets you return meaningful and universally-understood status codesPHP.TO.START, July 11 2011 - Turin
  36. 36. 404 Not FoundPHP.TO.START, July 11 2011 - Turin
  37. 37. 404 Not Found OMG Link is broken?PHP.TO.START, July 11 2011 - Turin
  38. 38. 202 AcceptedPHP.TO.START, July 11 2011 - Turin
  39. 39. 202 Accepted You get an immediate OK, and the operation will hopefully completePHP.TO.START, July 11 2011 - Turin
  40. 40. PausePHP.TO.START, July 11 2011 - Turin
  41. 41. World Wide WebPHP.TO.START, July 11 2011 - Turin
  42. 42. the largest data-exchange network on the planetPHP.TO.START, July 11 2011 - Turin
  43. 43. And meanwhile, at Facebook... 12TB of new data every day (1 year ago) 500 million usersPHP.TO.START, July 11 2011 - Turin
  44. 44. And meanwhile, at Google... 1 billion unique monthly googlersPHP.TO.START, July 11 2011 - Turin
  45. 45. via HTTP , baby!PHP.TO.START, July 11 2011 - Turin
  46. 46. HTTP in a nutshell: 1. Client <> ServerPHP.TO.START, July 11 2011 - Turin
  47. 47. HTTP in a nutshell: 2. StatelessPHP.TO.START, July 11 2011 - Turin
  48. 48. HTTP in a nutshell:3. widespread cache spec http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.htmlPHP.TO.START, July 11 2011 - Turin
  49. 49. HTTP in a nutshell: Lao Tze Song using Firefox 5 Company proxy Great chinese (fire)wall Reverse proxy Origin server4. Layered systemPHP.TO.START, July 11 2011 - Turin
  50. 50. HTTP in a nutshell: 5. it is the uniform interface between clients and serversPHP.TO.START, July 11 2011 - Turin
  51. 51. HTTP bleeds RESTPHP.TO.START, July 11 2011 - Turin
  52. 52. 1. caching & scalabilityPHP.TO.START, July 11 2011 - Turin
  53. 53. Types of cache Local Shared/proxy Shared/reverse proxyPHP.TO.START, July 11 2011 - Turin
  54. 54. Types of cache Local Shared/proxy Shared/reverse proxyPHP.TO.START, July 11 2011 - Turin
  55. 55. PHP.TO.START, July 11 2011 - Turin
  56. 56. Types of cache Local Shared/proxy Shared/reverse proxyPHP.TO.START, July 11 2011 - Turin
  57. 57. PHP.TO.START, July 11 2011 - Turin
  58. 58. Types of cache Local Shared/proxy Shared/reverse proxyPHP.TO.START, July 11 2011 - Turin
  59. 59. PHP.TO.START, July 11 2011 - Turin
  60. 60. on the server sidePHP.TO.START, July 11 2011 - Turin
  61. 61. Caching with Expiration (example)PHP.TO.START, July 11 2011 - Turin
  62. 62. HTTP/1.1 200 OK Host: www.example.com Expires: 0PHP.TO.START, July 11 2011 - Turin
  63. 63. HTTP/1.1 200 OK Host: www.example.com Expires: 0PHP.TO.START, July 11 2011 - Turin
  64. 64. HTTP/1.1 200 OK Host: www.example.com Expires: Tue, 31 Jan 2011 01:00 GMTPHP.TO.START, July 11 2011 - Turin
  65. 65. HTTP/1.1 200 OK Host: www.example.com Cache-Control: max-age=60, publicPHP.TO.START, July 11 2011 - Turin
  66. 66. HTTP/1.1 200 OK Host: www.example.com Cache-Control: max-age=60, publicPHP.TO.START, July 11 2011 - Turin
  67. 67. HTTP/1.1 200 OK Host: www.example.com Cache-Control: max-age=60, public Cacheable for 60 secondsPHP.TO.START, July 11 2011 - Turin
  68. 68. HTTP/1.1 200 OK Host: www.example.com Cache-Control: max-age=60, public Cacheable by both local and shared cachesPHP.TO.START, July 11 2011 - Turin
  69. 69. but hey, you sayPHP.TO.START, July 11 2011 - Turin
  70. 70. HTTPs cache fails when dealing with really dynamic pages, because consumers will always have to hit the origin server, although a part of the page would be cacheable ( header and footer, for example )PHP.TO.START, July 11 2011 - Turin
  71. 71. Nope NopePHP.TO.START, July 11 2011 - Turin
  72. 72. ESI was built for that http://www.w3.org/TR/esi-langPHP.TO.START, July 11 2011 - Turin
  73. 73. <esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
  74. 74. <esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
  75. 75. <esi:include src="http://php2start.com/talks/1" />PHP.TO.START, July 11 2011 - Turin
  76. 76. 1s (tweets) 3600 postPHP.TO.START, July 11 2011 - Turin
  77. 77. <esi:include src=tweets.html /> <esi:include src=article/12.html />PHP.TO.START, July 11 2011 - Turin
  78. 78. So what does HTTP cache is meant to solve?PHP.TO.START, July 11 2011 - Turin
  79. 79. Less workPHP.TO.START, July 11 2011 - Turin
  80. 80. http://www.flickr.com/photos/snakphotography/5004775320/sizes/o/in/photostream/ because the hard work is delegated to the browser/proxy PHP.TO.START, July 11 2011 - Turin
  81. 81. evolvePHP.TO.START, July 11 2011 - Turin
  82. 82. because cache is abstracted from the applicationPHP.TO.START, July 11 2011 - Turin
  83. 83. loose couplingPHP.TO.START, July 11 2011 - Turin
  84. 84. because caching is bound to the protocol, HTTP, notto your implementation ( Sf, RoR, Django )PHP.TO.START, July 11 2011 - Turin
  85. 85. 2. adaptability & durabilityPHP.TO.START, July 11 2011 - Turin
  86. 86. Hypermedia another long-time friendPHP.TO.START, July 11 2011 - Turin
  87. 87. Links outrageously semplifyingPHP.TO.START, July 11 2011 - Turin
  88. 88. <link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
  89. 89. <link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
  90. 90. <link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
  91. 91. <link rel="payment" href="/checkout" type="text/html" ... />PHP.TO.START, July 11 2011 - Turin
  92. 92. POST /users Host: www.example. com HTTP/1.1 201 Created Host: www.example.com Etag: 1234 X-Powered-By: php/5.3 Location: /users/1PHP.TO.START, July 11 2011 - Turin
  93. 93. POST /users Host: www.example. com HTTP/1.1 201 Created Host: www.example.com Etag: 1234 X-Powered-By: php/5.3 Location: /users/1PHP.TO.START, July 11 2011 - Turin
  94. 94. POST /users Host: www.example. com HTTP/1.1 201 Created Host: www.example.com Etag: 1234 X-Powered-By: php/5.3 Location: /new-users-db/1PHP.TO.START, July 11 2011 - Turin
  95. 95. POST /users Host: www.example. com HTTP/1.1 201 Created Host: www.example.com Etag: 1234 X-Powered-By: php/5.3 Location: /new-users-db/1PHP.TO.START, July 11 2011 - Turin
  96. 96. consumers of your API are able to follow the changes of your designPHP.TO.START, July 11 2011 - Turin
  97. 97. everything seems cool But why REST?PHP.TO.START, July 11 2011 - Turin
  98. 98. Pros PerformancesPHP.TO.START, July 11 2011 - Turin
  99. 99. ProsScalabilityPHP.TO.START, July 11 2011 - Turin
  100. 100. Pros DurabilityPHP.TO.START, July 11 2011 - Turin
  101. 101. amazon.itPHP.TO.START, July 11 2011 - Turin
  102. 102. REST-IT https://groups.google.com/forum/#!forum/rest-itPHP.TO.START, July 11 2011 - Turin
  103. 103. Alessandro Nadalin
  104. 104. Alessandro Nadalin odino.org
  105. 105. Alessandro Nadalin odino.org @_odino_
  106. 106. Alessandro Nadalin odino.org @_odino_
  107. 107. ThanksAlessandro Nadalin odino.org @_odino_
  108. 108. 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/3568 http://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/ http://www.flickr.com/photos/rustyboxcars/2629631562/sizes/l/in/photostream/ http://www.flickr.com/photos/ell-r-brown/4138727474/sizes/l/in/photostream/ http://www.flickr.com/photos/noah123/5082076630/sizes/z/in/photostream/ http://www.flickr.com/photos/jungle_boy/220181177/sizes/l/in/photostream/ http://www.flickr.com/photos/prettydaisies/872539081/sizes/l/in/photostream/ http://www.flickr.com/photos/kaptainkobold/76256150/sizes/o/in/photostream/ http://www.flickr.com/photos/uomoincravatta/1438372865/sizes/z/in/photostream/PHP.TO.START, July 11 2011 - Turin
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×