SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
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
Photos Around You
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

Weitere ähnliche Inhalte

Ähnlich wie Photos Around You

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
 

Ähnlich wie Photos Around You (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
 
Locate your hacks
Locate your hacksLocate your hacks
Locate your hacks
 
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
 
コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門コードで学ぶドメイン駆動設計入門
コードで学ぶドメイン駆動設計入門
 
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
 

Kürzlich hochgeladen

IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsSafe Software
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding TeamAdam Moalla
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 

Kürzlich hochgeladen (20)

IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
20150722 - AGV
20150722 - AGV20150722 - AGV
20150722 - AGV
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 

Photos Around You

  • 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
  • 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