SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
Photos Around You
http://bit.ly/photos-around-you


Eric Ferraiuolo                      Twitter: @ericf
                                  Blog: 925html.com
Photos Around You is…
• Written in JavaScript
• Leveraging YUI 3.1,YQL, & Flickr
• Determining the user’s location
• Finding geo-tagged photos on Flickr
• Optimizing thumbnails using data-URIs
• Building a UI to view photos
YUI 3
         Yahoo! User Interface Library



• Yahoo!’s next-generation JavaScript library
• Powers the new Yahoo! homepage
• Current version: 3.1.0
• Open Source – on GitHub
 • http://github.com/yui/yui3/
YUI 3 – Cont.
•   Modular                 •   Selector driven

•   Self-aware Dependency   •   Performant
    Management
                            •   Custom Events
•   YUI().use() only
    what you need           •   Component and Widget
                                Infrastructure
•   YUI 2 in 3
                            •   Custom Modules
•   Gallery Modules
YUI 3 Modules Used
•     node                  •   gallery-jsonp

•     overlay               •   gallery-yql

•     substitute            •   gallery-markout

YUI().use('node', 'overlay', 'substitute',
'gallery-jsonp', 'gallery-yql', 'gallery-
markout', function(Y){

      // Everything is ready!

});
YQL
              Yahoo! Query Language

•   SELECT * FROM Internet
    SELECT * FROM flickr.photos.search WHERE
    text="cat" LIMIT 10

•   SQL-like syntax
•   HTTP GET ➞ JSON(P)
•   Yahoo!’s pipes are bigger than yours
•   Open Data Tables: Plugin your own web
    services http://datatables.org/
YQL – Cont.
• Supports: SELECT, INSERT, UPDATE,
  DELETE

• JOIN web services together:
  SELECT * FROM upcoming.events WHERE woeid
  IN (SELECT woeid FROM geo.places WHERE
  text="Boston, MA")

• Execute JavaScript on YQL’s Servers
Using YQL with YUI 3

var q = 'SELECT * FROM flickr.photos.search '+
        'WHERE text="cat"';

new Y.yql(q, function(r){

      r.query.results // Results as JSON

});
Flickr


…is Photos
User’s Location

• Need user’s location, client-side
• Feature detect W3C Geolocation API
• Fallback to IP-based
• Gather info about location
User’s Location
            via W3C Geolocation API

• Returns Lat/Lng
• Black-box implementation
• Firefox, iPhone, iPad, Android
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(
         locFromPos, locFromIP
    );
} else {
    locFromIP();
}
User’s Location
              via IP-based Lookup

• Less accurate
• All browsers
• Get user’s IP in JavaScript?
getIP = function (callback) {
    Y.jsonp('http://jsonip.appspot.com/',
    function(data){
        callback(data.ip);
    });
};
User’s Location
          Gathering Info About Location


 • WOEID (Where On Earth IDentifer)
 • Locality (e.g. Boston, MA)
YQL Query using Lat/Lon from Geolocation API
SELECT * FROM geo.places WHERE woeid IN (SELECT
place.woeid FROM flickr.places WHERE lat={lat}
AND lon={lon})



                     Credit: Christian Heilmann (@codepo8)
User’s Location
          Gathering Info About Location


 • WOEID (Where On Earth IDentifer)
 • Locality (e.g. Boston, MA)
YQL Query using IP
SELECT * FROM geo.places WHERE woeid IN (SELECT
place.woeid FROM flickr.places WHERE (lat, lon)
IN (SELECT Latitude, Longitude FROM ip.location
WHERE ip="{ip}"))


                     Credit: Christian Heilmann (@codepo8)
User’s Location
          Gathering Info About Location



            Lat-Lon/IP          Lat-Lon/IP

                                WOEID

Browser                   YQL                Y! Geo
                                Places API

             Loc Info            Loc Info
               Internet
Geo-Tagged Flickr Photos
           Search Flickr via YQL Query


• Paged result-sets
• Use WOEID of the user’s location
• Sort-by “interestingness”
SELECT * FROM flickr.photos.search({start},
{num}) WHERE woe_id="{woeid}" AND
radius_units="mi" AND sort="interestingness-
desc" AND extras="path_alias"
Geo-Tagged Flickr Photos
          Search Flickr via YQL Query




          Photo Data          Search API
Browser                 YQL                Flickr
             Internet
Thumbnail Data-URIs
          Too Many HTTP Requests


               Image Requests




Browser                            Flickr
                    Internet
Thumbnail Data-URIs
    Delegate YQL to Download Thumbnails


                              Images



          Data URIs
Browser                 YQL            Flickr
             Internet
Thumbnail Data-URIs

•   Removed HTTP image requests to Flickr

•   YQL GETs Flickr images, Batches Data URIs

•   Reduced HTTP requests 10x

    •   1 YQL Request = 10 Image Data URIs
Photos UI

• Loading indicators between YQL requests
• Render grid of thumbnails
• Use photo data to construct Overlay
• ‘More’ Button to fetch additional photos
Photo UI – Cont.

• Event Delegation
 • 1 Event Handler for all thumbnail clicks
• Heavy use of CSS3
• Tested with: IE 8, Firefox 3.5, Safari 4,
  Chrome 4, iPhone, iPad
Questions?

•   http://925html.com/code/photos-around-you/
•   Eric Ferraiuolo
    •   http://925html.com
    •   @ericf on Twitter
Photo Credits
•   http://www.flickr.com/photos/pearbiter/2075091856

•   http://www.flickr.com/photos/leecullivan/399317018

•   http://www.flickr.com/photos/beantown/3085045889

•   http://www.flickr.com/photos/roncaglia/2481739143

•   http://www.flickr.com/photos/28625089@N03/2923851272

•   http://www.flickr.com/photos/colonnade/859769177

•   http://www.flickr.com/photos/emdurso/402898976

•   http://www.flickr.com/photos/riacale/1736524005

•   http://www.flickr.com/photos/31332713@N04/3086715585

•   http://www.flickr.com/photos/gershamabob/78717025

Contenu connexe

Similaire à Photos Around You with YUI 3, YQL & Flickr

Query the web with YQL
Query the web with YQLQuery the web with YQL
Query the web with YQLramace
 
YQL and Geo
YQL and GeoYQL and Geo
YQL and Geomambo91
 
コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門潤一 加藤
 
e10sとアプリ間通信
e10sとアプリ間通信e10sとアプリ間通信
e10sとアプリ間通信Makoto Kato
 
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012YQL: Hacking on steroids - Yahoo! Open Hack Day 2012
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012Saurabh Sahni
 
YQL & Yahoo! APIs - Open Hack India 2011
YQL & Yahoo! APIs - Open Hack India 2011YQL & Yahoo! APIs - Open Hack India 2011
YQL & Yahoo! APIs - Open Hack India 2011Saurabh Sahni
 
Hacking up location aware apps
Hacking up location aware appsHacking up location aware apps
Hacking up location aware appsAnshu Prateek
 
Developing AR and VR Experiences with Unity
Developing AR and VR Experiences with UnityDeveloping AR and VR Experiences with Unity
Developing AR and VR Experiences with UnityMark Billinghurst
 

Similaire à Photos Around You with YUI 3, YQL & Flickr (20)

Query the web with YQL
Query the web with YQLQuery the web with YQL
Query the web with YQL
 
YQL & Yahoo! Apis
YQL & Yahoo! ApisYQL & Yahoo! Apis
YQL & Yahoo! Apis
 
Yql ans geo
Yql ans geoYql ans geo
Yql ans geo
 
YQL Case Study
YQL Case StudyYQL Case Study
YQL Case Study
 
YQL and Geo
YQL and GeoYQL and Geo
YQL and Geo
 
YQL - HackU IIT Madras 2012
YQL - HackU IIT Madras 2012YQL - HackU IIT Madras 2012
YQL - HackU IIT Madras 2012
 
Yql hacku iitd_2012
Yql hacku iitd_2012Yql hacku iitd_2012
Yql hacku iitd_2012
 
BREN_ADMIN_20100729_001
BREN_ADMIN_20100729_001BREN_ADMIN_20100729_001
BREN_ADMIN_20100729_001
 
Hacking location aware hacks HackU IIT Bombay
Hacking location aware hacks HackU IIT BombayHacking location aware hacks HackU IIT Bombay
Hacking location aware hacks HackU IIT Bombay
 
Locate your hacks
Locate your hacksLocate your hacks
Locate your hacks
 
コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門
 
Hacking up location aware apps
Hacking up location aware appsHacking up location aware apps
Hacking up location aware apps
 
e10sとアプリ間通信
e10sとアプリ間通信e10sとアプリ間通信
e10sとアプリ間通信
 
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012YQL: Hacking on steroids - Yahoo! Open Hack Day 2012
YQL: Hacking on steroids - Yahoo! Open Hack Day 2012
 
Hacking location aware apps
Hacking location aware appsHacking location aware apps
Hacking location aware apps
 
YQL & Yahoo! APIs - Open Hack India 2011
YQL & Yahoo! APIs - Open Hack India 2011YQL & Yahoo! APIs - Open Hack India 2011
YQL & Yahoo! APIs - Open Hack India 2011
 
Hacking up location aware apps
Hacking up location aware appsHacking up location aware apps
Hacking up location aware apps
 
Developing AR and VR Experiences with Unity
Developing AR and VR Experiences with UnityDeveloping AR and VR Experiences with Unity
Developing AR and VR Experiences with Unity
 
Mobile AR Tutorial
Mobile AR TutorialMobile AR Tutorial
Mobile AR Tutorial
 
Widget Workshop
Widget WorkshopWidget Workshop
Widget Workshop
 

Dernier

Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Dernier (20)

Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 

Photos Around You with YUI 3, YQL & Flickr

  • 1. Photos Around You http://bit.ly/photos-around-you Eric Ferraiuolo Twitter: @ericf Blog: 925html.com
  • 2. Photos Around You is… • Written in JavaScript • Leveraging YUI 3.1,YQL, & Flickr • Determining the user’s location • Finding geo-tagged photos on Flickr • Optimizing thumbnails using data-URIs • Building a UI to view photos
  • 3.
  • 4. YUI 3 Yahoo! User Interface Library • Yahoo!’s next-generation JavaScript library • Powers the new Yahoo! homepage • Current version: 3.1.0 • Open Source – on GitHub • http://github.com/yui/yui3/
  • 5. YUI 3 – Cont. • Modular • Selector driven • Self-aware Dependency • Performant Management • Custom Events • YUI().use() only what you need • Component and Widget Infrastructure • YUI 2 in 3 • Custom Modules • Gallery Modules
  • 6. YUI 3 Modules Used • node • gallery-jsonp • overlay • gallery-yql • substitute • gallery-markout YUI().use('node', 'overlay', 'substitute', 'gallery-jsonp', 'gallery-yql', 'gallery- markout', function(Y){ // Everything is ready! });
  • 7. YQL Yahoo! Query Language • SELECT * FROM Internet SELECT * FROM flickr.photos.search WHERE text="cat" LIMIT 10 • SQL-like syntax • HTTP GET ➞ JSON(P) • Yahoo!’s pipes are bigger than yours • Open Data Tables: Plugin your own web services http://datatables.org/
  • 8. YQL – Cont. • Supports: SELECT, INSERT, UPDATE, DELETE • JOIN web services together: SELECT * FROM upcoming.events WHERE woeid IN (SELECT woeid FROM geo.places WHERE text="Boston, MA") • Execute JavaScript on YQL’s Servers
  • 9. Using YQL with YUI 3 var q = 'SELECT * FROM flickr.photos.search '+ 'WHERE text="cat"'; new Y.yql(q, function(r){ r.query.results // Results as JSON });
  • 11. User’s Location • Need user’s location, client-side • Feature detect W3C Geolocation API • Fallback to IP-based • Gather info about location
  • 12. User’s Location via W3C Geolocation API • Returns Lat/Lng • Black-box implementation • Firefox, iPhone, iPad, Android if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( locFromPos, locFromIP ); } else { locFromIP(); }
  • 13. User’s Location via IP-based Lookup • Less accurate • All browsers • Get user’s IP in JavaScript? getIP = function (callback) { Y.jsonp('http://jsonip.appspot.com/', function(data){ callback(data.ip); }); };
  • 14. User’s Location Gathering Info About Location • WOEID (Where On Earth IDentifer) • Locality (e.g. Boston, MA) YQL Query using Lat/Lon from Geolocation API SELECT * FROM geo.places WHERE woeid IN (SELECT place.woeid FROM flickr.places WHERE lat={lat} AND lon={lon}) Credit: Christian Heilmann (@codepo8)
  • 15. User’s Location Gathering Info About Location • WOEID (Where On Earth IDentifer) • Locality (e.g. Boston, MA) YQL Query using IP SELECT * FROM geo.places WHERE woeid IN (SELECT place.woeid FROM flickr.places WHERE (lat, lon) IN (SELECT Latitude, Longitude FROM ip.location WHERE ip="{ip}")) Credit: Christian Heilmann (@codepo8)
  • 16. User’s Location Gathering Info About Location Lat-Lon/IP Lat-Lon/IP WOEID Browser YQL Y! Geo Places API Loc Info Loc Info Internet
  • 17. Geo-Tagged Flickr Photos Search Flickr via YQL Query • Paged result-sets • Use WOEID of the user’s location • Sort-by “interestingness” SELECT * FROM flickr.photos.search({start}, {num}) WHERE woe_id="{woeid}" AND radius_units="mi" AND sort="interestingness- desc" AND extras="path_alias"
  • 18. Geo-Tagged Flickr Photos Search Flickr via YQL Query Photo Data Search API Browser YQL Flickr Internet
  • 19. Thumbnail Data-URIs Too Many HTTP Requests Image Requests Browser Flickr Internet
  • 20. Thumbnail Data-URIs Delegate YQL to Download Thumbnails Images Data URIs Browser YQL Flickr Internet
  • 21. Thumbnail Data-URIs • Removed HTTP image requests to Flickr • YQL GETs Flickr images, Batches Data URIs • Reduced HTTP requests 10x • 1 YQL Request = 10 Image Data URIs
  • 22. Photos UI • Loading indicators between YQL requests • Render grid of thumbnails • Use photo data to construct Overlay • ‘More’ Button to fetch additional photos
  • 23. Photo UI – Cont. • Event Delegation • 1 Event Handler for all thumbnail clicks • Heavy use of CSS3 • Tested with: IE 8, Firefox 3.5, Safari 4, Chrome 4, iPhone, iPad
  • 24. Questions? • http://925html.com/code/photos-around-you/ • Eric Ferraiuolo • http://925html.com • @ericf on Twitter
  • 25. Photo Credits • http://www.flickr.com/photos/pearbiter/2075091856 • http://www.flickr.com/photos/leecullivan/399317018 • http://www.flickr.com/photos/beantown/3085045889 • http://www.flickr.com/photos/roncaglia/2481739143 • http://www.flickr.com/photos/28625089@N03/2923851272 • http://www.flickr.com/photos/colonnade/859769177 • http://www.flickr.com/photos/emdurso/402898976 • http://www.flickr.com/photos/riacale/1736524005 • http://www.flickr.com/photos/31332713@N04/3086715585 • http://www.flickr.com/photos/gershamabob/78717025