CINXE.COM

February | 2009 | code.flickr.com

<!DOCTYPE html> <!--[if IE 6]> <html id="ie6" lang="en-US"> <![endif]--> <!--[if IE 7]> <html id="ie7" lang="en-US"> <![endif]--> <!--[if IE 8]> <html id="ie8" lang="en-US"> <![endif]--> <!--[if !(IE 6) & !(IE 7) & !(IE 8)]><!--> <html lang="en-US"> <!--<![endif]--> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width" /> <title> February | 2009 | code.flickr.com </title> <link rel="profile" href="https://gmpg.org/xfn/11" /> <link rel="stylesheet" type="text/css" media="all" href="https://code.flickr.net/wp-content/themes/flickr-code/style.css?ver=20190507" /> <link rel="pingback" href="https://code.flickr.net/xmlrpc.php"> <!--[if lt IE 9]> <script src="https://code.flickr.net/wp-content/themes/twentyeleven/js/html5.js?ver=3.7.0" type="text/javascript"></script> <![endif]--> <meta name='robots' content='max-image-preview:large' /> <link rel='dns-prefetch' href='//stats.wp.com' /> <link rel="alternate" type="application/rss+xml" title="code.flickr.com &raquo; Feed" href="https://code.flickr.net/feed/" /> <link rel="alternate" type="application/rss+xml" title="code.flickr.com &raquo; Comments Feed" href="https://code.flickr.net/comments/feed/" /> <script type="text/javascript"> window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/code.flickr.net\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.3.5"}}; /*! This file is auto-generated */ !function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c\udfff","\ud83e\udef1\ud83c\udffb\u200b\ud83e\udef2\ud83c\udfff")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings); </script> <style type="text/css"> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <link rel='stylesheet' id='all-css-0' href='https://code.flickr.net/wp-includes/css/dist/block-library/style.min.css?m=1732205989g' type='text/css' media='all' /> <style id='wp-block-library-inline-css'> .has-text-align-justify{text-align:justify;} </style> <style id='wp-block-library-theme-inline-css'> .wp-block-audio figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio figcaption{color:hsla(0,0%,100%,.65)}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed figcaption{color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:hsla(0,0%,100%,.65)}.wp-block-image figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-image figcaption{color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote.has-text-align-right{border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote.has-text-align-center{border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote.is-style-plain{border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video figcaption{color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video figcaption{color:hsla(0,0%,100%,.65)}.wp-block-video{margin:0 0 1em}.wp-block-template-part.has-background{margin-bottom:0;margin-top:0;padding:1.25em 2.375em} </style> <link rel='stylesheet' id='all-css-4' href='https://code.flickr.net/_static/??-eJzTLy/QzcxLzilNSS3WzyrWz01NyUxMzUnNTc0rQeEU5CRWphbp5qSmJyZX6uVm5uklFxfr6OPTDpRD5sM02efaGpobGxkZmFpaGgAARKUu4Q==' type='text/css' media='all' /> <style id='jetpack-sharing-buttons-style-inline-css'> .jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em} </style> <style id='classic-theme-styles-inline-css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css'> body{--wp--preset--color--black: #000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--blue: #1982d1;--wp--preset--color--dark-gray: #373737;--wp--preset--color--medium-gray: #666;--wp--preset--color--light-gray: #e2e2e2;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} .wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} .wp-block-pullquote{font-size: 1.5em;line-height: 1.6;} </style> <link rel='stylesheet' id='all-css-10' href='https://code.flickr.net/_static/??-eJzTLy/QTc7PK0nNK9EvyUjNTS3WLykHcipTc1LLUvP0i0sqc1L1kouLdfQxVablZCZnFwFFU1LxK0QxMiknPzm7GKTUPtfW0NzI0NDQxMDUEABaNTMI' type='text/css' media='all' /> <script type="text/javascript" src="https://code.flickr.net/_static/??-eJzTLy/QzcxLzilNSS3WzyrWT8ksLtEvS81LyS/SB0oV5OdUpmXm5ADVpBaV6OVm5ullFevo49FUlJqeClSbWJJfpFtUmleSmZtKjDYku/Aqz8jPzy6GqrDPtTU0NzYyMjC1tDTIAgApC0op" ></script><script src='https://code.flickr.net/wp-includes/js/dist/i18n.min.js?ver=7701b0c3857f914212ef' id='wp-i18n-js'></script> <script id="wp-i18n-js-after" type="text/javascript"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); </script> <script src='https://code.flickr.net/wp-content/mu-plugins/jetpack-13.1/jetpack_vendor/automattic/jetpack-assets/build/i18n-loader.js?minify=true&#038;ver=ee939953aa2115e2ca59' id='wp-jp-i18n-loader-js'></script> <script id="wp-jp-i18n-loader-js-after" type="text/javascript"> wp.jpI18nLoader.state = {"baseUrl":"https://code.flickr.net/wp-content/languages/","locale":"en_US","domainMap":{"jetpack-admin-ui":"plugins/jetpack","jetpack-assets":"plugins/jetpack","jetpack-backup-pkg":"plugins/jetpack","jetpack-blaze":"plugins/jetpack","jetpack-boost-core":"plugins/jetpack","jetpack-boost-speed-score":"plugins/jetpack","jetpack-compat":"plugins/jetpack","jetpack-config":"plugins/jetpack","jetpack-connection":"plugins/jetpack","jetpack-forms":"plugins/jetpack","jetpack-google-fonts-provider":"plugins/jetpack","jetpack-idc":"plugins/jetpack","jetpack-image-cdn":"plugins/jetpack","jetpack-import":"plugins/jetpack","jetpack-ip":"plugins/jetpack","jetpack-jitm":"plugins/jetpack","jetpack-licensing":"plugins/jetpack","jetpack-my-jetpack":"plugins/jetpack","jetpack-password-checker":"plugins/jetpack","jetpack-plugins-installer":"plugins/jetpack","jetpack-post-list":"plugins/jetpack","jetpack-publicize-pkg":"plugins/jetpack","jetpack-search-pkg":"plugins/jetpack","jetpack-stats":"plugins/jetpack","jetpack-stats-admin":"plugins/jetpack","jetpack-sync":"plugins/jetpack","jetpack-videopress-pkg":"plugins/jetpack","jetpack-waf":"plugins/jetpack","jetpack-wordads":"plugins/jetpack"},"domainPaths":{"jetpack-admin-ui":"jetpack_vendor/automattic/jetpack-admin-ui/","jetpack-assets":"jetpack_vendor/automattic/jetpack-assets/","jetpack-backup-pkg":"jetpack_vendor/automattic/jetpack-backup/","jetpack-blaze":"jetpack_vendor/automattic/jetpack-blaze/","jetpack-boost-core":"jetpack_vendor/automattic/jetpack-boost-core/","jetpack-boost-speed-score":"jetpack_vendor/automattic/jetpack-boost-speed-score/","jetpack-compat":"jetpack_vendor/automattic/jetpack-compat/","jetpack-config":"jetpack_vendor/automattic/jetpack-config/","jetpack-connection":"jetpack_vendor/automattic/jetpack-connection/","jetpack-forms":"jetpack_vendor/automattic/jetpack-forms/","jetpack-google-fonts-provider":"jetpack_vendor/automattic/jetpack-google-fonts-provider/","jetpack-idc":"jetpack_vendor/automattic/jetpack-identity-crisis/","jetpack-image-cdn":"jetpack_vendor/automattic/jetpack-image-cdn/","jetpack-import":"jetpack_vendor/automattic/jetpack-import/","jetpack-ip":"jetpack_vendor/automattic/jetpack-ip/","jetpack-jitm":"jetpack_vendor/automattic/jetpack-jitm/","jetpack-licensing":"jetpack_vendor/automattic/jetpack-licensing/","jetpack-my-jetpack":"jetpack_vendor/automattic/jetpack-my-jetpack/","jetpack-password-checker":"jetpack_vendor/automattic/jetpack-password-checker/","jetpack-plugins-installer":"jetpack_vendor/automattic/jetpack-plugins-installer/","jetpack-post-list":"jetpack_vendor/automattic/jetpack-post-list/","jetpack-publicize-pkg":"jetpack_vendor/automattic/jetpack-publicize/","jetpack-search-pkg":"jetpack_vendor/automattic/jetpack-search/","jetpack-stats":"jetpack_vendor/automattic/jetpack-stats/","jetpack-stats-admin":"jetpack_vendor/automattic/jetpack-stats-admin/","jetpack-sync":"jetpack_vendor/automattic/jetpack-sync/","jetpack-videopress-pkg":"jetpack_vendor/automattic/jetpack-videopress/","jetpack-waf":"jetpack_vendor/automattic/jetpack-waf/","jetpack-wordads":"jetpack_vendor/automattic/jetpack-wordads/"}}; </script> <link rel="https://api.w.org/" href="https://code.flickr.net/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://code.flickr.net/xmlrpc.php?rsd" /> <meta name="generator" content="WordPress 6.3.5" /> <style>img#wpstats{display:none}</style> <style type="text/css" id="twentyeleven-header-css"> #site-title, #site-description { position: absolute; clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ clip: rect(1px, 1px, 1px, 1px); } </style> <link rel="stylesheet" type="text/css" id="wp-custom-css" href="https://code.flickr.net/?custom-css=e0fbe57d10" /></head> <body class="archive date custom-background wp-embed-responsive jps-theme-flickr-code two-column right-sidebar"> <div class="skip-link"><a class="assistive-text" href="#content">Skip to primary content</a></div><div class="skip-link"><a class="assistive-text" href="#secondary">Skip to secondary content</a></div><div id="page" class="hfeed"> <header id="branding"> <hgroup> <h1 id="site-title"><span><a href="https://code.flickr.net/" rel="home">code.flickr.com</a></span></h1> <h2 id="site-description"></h2> </hgroup> <a href="https://code.flickr.net/"> <img src="https://wp.flickr.net/wp-content/uploads/sites/3/2012/09/code-flickr-com-drawn-header-grey-large.png" width="1000" height="157" alt="code.flickr.com" /> </a> <div class="only-search with-image"> <form method="get" id="searchform" action="https://code.flickr.net/"> <label for="s" class="assistive-text">Search</label> <input type="text" class="field" name="s" id="s" placeholder="Search" /> <input type="submit" class="submit" name="submit" id="searchsubmit" value="Search" /> </form> </div> <nav id="access"> <h3 class="assistive-text">Main menu</h3> <div class="menu-menu-container"><ul id="menu-menu" class="menu"><li id="menu-item-2084" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2084"><a href="http://www.flickr.com/">Flickr</a></li> <li id="menu-item-2085" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2085"><a href="http://blog.flickr.net/">Flickr Blog</a></li> <li id="menu-item-2250" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2250"><a href="http://twitter.com/flickr">@flickr</a></li> <li id="menu-item-2086" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2086"><a href="http://twitter.com/flickrapi">@flickrapi</a></li> <li id="menu-item-2087" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2087"><a href="https://www.flickr.com/services/developer/">Developer Guidelines</a></li> <li id="menu-item-2088" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2088"><a href="http://www.flickr.com/services/api/">API</a></li> <li id="menu-item-2089" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-2089"><a href="http://www.flickr.com/jobs/">Jobs</a></li> </ul></div> </nav><!-- #access --> </header><!-- #branding --> <div id="main"> <section id="primary"> <div id="content" role="main"> <header class="page-header"> <h1 class="page-title"> Monthly Archives: <span>February 2009</span> </h1> </header> <article id="post-638" class="post-638 post type-post status-publish format-standard hentry category-uncategorized tag-flash tag-frontend tag-javascript tag-uploadr tag-yui"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/26/yui-blog-improving-the-flickr-upload-exprience-with-yui-uploader/" rel="bookmark">YUI Blog: Improving The Flickr Upload Exprience With YUI Uploader</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/26/yui-blog-improving-the-flickr-upload-exprience-with-yui-uploader/" title="9:15 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-26T21:15:28-08:00">February 26, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/scottschiller/" title="View all posts by Scott Schiller" rel="author">Scott Schiller</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <div style="float:right;display:inline;width:195px;margin-left:1em"><a href="http://www.flickr.com/photos/34001301@N00/220050655/" title="water pipe by chris_00815, on Flickr" style="background:#fff"><img decoding="async" src="http://farm1.static.flickr.com/63/220050655_4977f63b4c_m.jpg" width="180" height="240" alt="water pipe" style="margin:0.5em 0px 0px 0.5em;padding:0.25em;border:1px solid #ddeeff;background:#f0f9ff;"></a></p> <p style="font-family:helvetica,arial,verdana;font-size:x-small;color:#666;padding-left:1em;padding-right:1em;padding-top:0.1em">Visual analogy of simultaneous file uploading. Also, internet/pipe joke goes here.</p> </div> <p>As a site which has many nifty JavaScript-driven features, Flickr makes good use of the <a href="http://developer.yahoo.com/yui">Yahoo! User Interface library</a> for much of its JavaScript DOM, Event handling and Ajax functionality.</p> <p>One of the fancier widgets we&#8217;ve implemented is a flashy browser-based Web Uploadr which uses the <a href="http://developer.yahoo.com/yui/uploader/">YUI Uploader</a> component (a combination of JavaScript and Flash) which allows for faster batch uploads, progress reporting, a nicer UI and overall improved user experience.</p> <p>Head over to the YUI Blog and check out <a href="http://yuiblog.com/blog/2009/02/26/flickr-uploadr/">how Flickr uses YUI Uploader</a> to provide a faster, shinier upload experience.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://code.flickr.net/tag/flash/" rel="tag">flash</a>, <a href="https://code.flickr.net/tag/frontend/" rel="tag">frontend</a>, <a href="https://code.flickr.net/tag/javascript/" rel="tag">javascript</a>, <a href="https://code.flickr.net/tag/uploadr/" rel="tag">uploadr</a>, <a href="https://code.flickr.net/tag/yui/" rel="tag">yui</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-638 --> <article id="post-597" class="post-597 post type-post status-publish format-standard hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/18/found-in-space/" rel="bookmark">Found in space</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/18/found-in-space/" title="8:33 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-18T20:33:45-08:00">February 18, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <div style="float: right; margin: 0em 0em 1em 1em; padding: 0.25em; border: 1px solid #cccccc; font-size: small;"><a href="http://www.flickr.com/photos/djmccrady/3227773708/in/pool-astrometry"><img decoding="async" alt="Image of the Jellyfish Nebula, annotated by Astrometry.net robot" src="http://farm4.static.flickr.com/3535/3290487549_e107745b37_o.png" width="200" height="210" /></a><br /><a href="http://www.flickr.com/photos/djmccrady/3227773708/in/pool-astrometry">The Jellyfish Nebula</a>, by <a href="http://www.flickr.com/photos/djmccrady/">DJMcCrady</a>,<br /> with annotation by Astrometry.net </div> <p>A robot intelligence has invaded Flickr. The “blind astrometry server” is a program which monitors the <a href="http://www.flickr.com/groups/astrometry/">Astrometry</a> group on Flickr, looking for new photos of the night sky. It then analyzes each photo, and from the unique star positions shown it figures out what part of the sky was photographed and what interesting planets, galaxies or nebulae are contained within. Not only does the photographer get a high-quality description of what’s in their photo, but the main <a href="http://astrometry.net/">Astrometry.net project</a> gets a new image to add to its storehouse of knowledge.</p> <p>Needless to say this is one of the coolest uses of Flickr groups and the API that we&#8217;ve ever seen. I recently discussed the project with team member <a href="http://stumm.ca/">Christopher Stumm</a>, since he was the one who had the idea to hook it into Flickr.</p> <p><b>With Astrometry.net, you’re distributing the work of cataloguing the sky to amateurs. Are we still in an age where the average person can make contributions to astronomical science?</b></p> <div style="float: left; border: 1px solid #cccccc; height: auto; margin: 0em 1em 1em 0em; padding: 0.25em"> <div alt="image of Christopher Stumm" style="float: left; background: url(http://farm1.static.flickr.com/43/79978376_1ddb6a87c0.jpg?v=0) no-repeat scroll -215px -30px; width: 100px; height: 133px;"></div> <p style="margin-top: 140px; font-size: small;"> <caption>Christopher Stumm</p> </div> <p>Definitely. There&#8217;s a large number of excellent amateur setups out there, and they discover supernovae and minor planets regularly. Although science-grade data is generated, it can be difficult to use because it&#8217;s hard to find, and there&#8217;s typically no useful meta-data. We&#8217;re hoping to help with that problem.</p> <p>The catalog we use to solve images was put together from surveys during the last 50 years &#8211; that&#8217;s a long time! We believe that if the information generated by the amateur astronomer community is harnessed we could build an open-source sky survey much faster. </p> <p>On top of that, we would be able see what areas of the sky have interesting activity. Right now we&#8217;re using images from around the web to calculate the path <a href="http://flickr.com/search/?q=comet+holmes">comet Holmes</a> took through the sky.</p> <p><b>Your <a href="http://cosmo.nyu.edu/hogg/research/2006/09/28/astrometry_google.pdf">scale and rotation invariant hashing algorithm</a> is fiendishly clever. Where does it come from?</b></p> <p>It&#8217;s an adaptation of an old idea in computer vision &#8212; <a href="http://en.wikipedia.org/wiki/Geometric_hashing">&#8220;geometric hashing&#8221;</a> &#8212; to astronomical images. It was originally created by researchers who were trying to model associative memory; &#8220;that shape reminds me of something I&#8217;ve seen before&#8221;. The idea works great for astronomical pictures, because stars are easy to locate exactly. By adding a fast search method for similar-shaped arrangements of stars, and a check that eliminates coincidental matches, we&#8217;re able to match an image against the whole sky, usually in a matter of seconds.</p> <p>Actually, sometimes we still do get false matches, but it turns out that that&#8217;s almost always because of some problem in either the image or our reference. These are places where we could use many amateur astronomer images to patch our reference catalog.</p> <p><b>Have there been any surprises about the data you&#8217;ve received, or the response you&#8217;ve gotten? Any discoveries?</b></p> <p>One thing that has surprised me has been the amount of positive feedback we&#8217;ve gotten. The project was covered on a few sites including <a href="http://kottke.org/08/11/star-location-service">kottke.org</a>, <a href="http://reddit.com/">Reddit</a>, and O&#8217;Reilly&#8217;s <a href="http://blog.makezine.com/archive/2008/11/the_astrometry_pool_on_fl.html"><i>Make</i> magazine</a>. After reading about it people had to test it out, so we saw pictures from people&#8217;s back yards, some people tried to fool the system by inputting hand-drawn images, and one person even passed in a screen shot from an iPhone application which shows you the night sky.</p> <p>The submissions range from amazingly high quality to images where someone just took their camera and pointed it at the night sky with <a href="http://www.flickr.com/photos/philna/3057464949/in/pool-astrometry">some trees and a house included too</a>. I was surprised how robust our solver was to some of the obstructions we find in the images. </p> <p>Overall I think it shows people are curious about the sky, but it can be pretty very overwhelming due to its sheer size. Hopefully we help make it a little more approachable by showing people what&#8217;s in their picture.</p> <p><b>Why Flickr? How has the experience been?</b></p> <p><a href="http://www.flickr.com/photos/stumm/">I was a Flickr user</a>, liked the service, and believed it offered much of what we were looking for at the time. Flickr had a huge user base which meant it was familiar and would be easy for users to upload images, submit them to our group, and offered basically unlimited scalability. </p> <p>The image annotations offered by Flickr were really the icing on the cake and made the whole feature much more compelling, especially to people who aren&#8217;t astronomy buffs such as myself. On top of that the API made it easy to hook into. I can&#8217;t really complain about anything so far with the whole experience, it&#8217;s been a lot of fun.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-597 --> <article id="post-590" class="post-590 post type-post status-publish format-standard hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/16/mise-en-hack/" rel="bookmark">Mise en hack</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/16/mise-en-hack/" title="4:47 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-16T16:47:01-08:00">February 16, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p>Our very own <a href="http://flickr.com/photos/wafer/">waferbaby</a> has been rocking it out with his series, <a href="http://waferbaby.com/setup">&#8220;The Setup&#8221;</a>, on hacker <i>mise en place</i>. (and by hacker we mean in every sense of the word, from <a href="http://waferbaby.com/setup/2009/02/13/_why">_why the lucky stiff</a>, to <a href="http://waferbaby.com/setup/2009/01/09/yacht">YACHT</a>, to <a href="http://waferbaby.com/setup/2009/01/28/david-lanham">David Lanham</a>)</p> <p>And if you missed it, waferbaby had the Flickr dev team do our own little version of the &#8220;The Setup&#8221; last May, published for posterity at <a href="http://code.flickr.com/blog/2008/05/29/trickr-or-humanising-the-developers-part-1/">Trickr, or Humanising the Developers (Part 1)</a> and <a href="http://code.flickr.com/blog/2008/06/30/trickr-or-humanising-the-developers-part-2/">(Part 2)</a></p> <p><a href="http://waferbaby.com/setup">The Setup</a>, check it out.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-590 --> <article id="post-588" class="post-588 post type-post status-publish format-standard hentry category-change-log"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/14/changelog-delete-tag-cross-things-inspired-by-delete-tag-cross-things/" rel="bookmark">[changelog] Delete Tag Cross Things inspired by Delete Tag Cross Things</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/14/changelog-delete-tag-cross-things-inspired-by-delete-tag-cross-things/" title="10:58 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-14T22:58:16-08:00">February 14, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p>Proving that no change is too small for [changelog] (and that I need to keep on top of them a little more) as spotted over in the Help Forum: <a href="http://www.flickr.com/help/forum/en-us/91101">&#8220;tags look different&#8221; thread</a>, a change in the deleting &#8220;x&#8221; on Tags.</p> <p><a href="http://www.flickr.com/photos/68756453@N00/">Dunstan</a> and <a href="http://www.flickr.com/photos/81183458@N00/">Ross</a> snuck^H^H^H^H^H rolled out the change out on Friday and it looks something like this &#8230;</p> <div style="text-align:center;"><img decoding="async" fetchpriority="high" src="http://farm4.static.flickr.com/3378/3280009738_ef6a213e1e.jpg" alt="delete tag" border="0" width="327" height="168" /></div> <p>Worth noting that Dunstan goes on <a href="http://www.flickr.com/help/forum/en-us/91101/#reply597799">to say</a> &#8220;<i>They all might end up a bit smaller, and a bit lighter. We&#8217;ll just live with them for a little bit and see how they go.</i>&#8221; &#8230; at which point I&#8217;ll post another changelog or not, depending on what happens :)</p> <p>As no change is without a protest group feel free to register your outrage over in the <a href="http://www.flickr.com/groups/against/">Flickreenos Against **New Xs**</a> Group. Or at least until the next change comes out, at which point the protest group will move onto that.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/change-log/" rel="category tag">changelog</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-588 --> <article id="post-584" class="post-584 post type-post status-publish format-standard hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/14/dorks/" rel="bookmark">Dorks!</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/14/dorks/" title="1:53 am" rel="bookmark"><time class="entry-date" datetime="2009-02-14T01:53:19-08:00">February 14, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p><a href="http://flickr.com/photos/tags/1234567890/">http://flickr.com/photos/tags/1234567890/</a></p> <p>☆\(*^▽^*)/☆</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-584 --> <article id="post-422" class="post-422 post type-post status-publish format-standard hentry category-uncategorized tag-5-questions tag-5questions"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/13/5-questions-for-david-wilkinson/" rel="bookmark">5 Questions for David Wilkinson</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/13/5-questions-for-david-wilkinson/" title="4:14 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-13T16:14:46-08:00">February 13, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p><a href="http://www.flickr.com/photos/dopiaza/82522808/" title="Me, by Sue by dopiaza, on Flickr"><img decoding="async" loading="lazy" src="http://farm1.static.flickr.com/41/82522808_174b09cd6d_t.jpg" width="100" height="67" alt="Me, by Sue" style="float: right; margin-left: 20px; margin-bottom: 20px;" /></a></p> <p>On the <a href="http://code.flickr.com/blog/2008/11/19/5-questions-for-gustavo/">last 5 Questions</a> I posted, I ended with &#8220;Thank you, Gustavo. Next up (unless Kellan gets in first!) dopiaza.&#8221; Well <a href="http://www.flickr.com/photos/kellan">Kellan</a> did indeed get in first, with both <a href="http://code.flickr.com/blog/2009/01/15/5-questions-for-jonnie-hallman/">Jonnie Hallman</a> and <a href="http://code.flickr.com/blog/2009/01/22/5-questions-for-fraser-speirs/">Fraser Speirs</a>. So now, without any more procrastination, I present David Wilkinson, &#8220;<a href="http://www.utata.org/">Utata&#8217;s</a> architect&#8221; as described by Gustavo &#8230;</p> <p><b>1. What are you currently building that integrates with Flickr, or a past favorite that you think is cool, neat, popular and worth telling folks about? Or both.</b></p> <p><i>David:</i> I guess one of the most visible things that I’ve built so far is the Utata web site (<a href="http://www.utata.org/">http://www.utata.org/</a>) and the tools that surround that. <a href="http://www.flickr.com/groups/utata/">Utata, the Flickr group</a>, is a pretty lively community, with over 16,000 members and a <a href="http://www.flickr.com/groups/utata/pool/">pool</a> of over 270,000 photos. In Utata, we like to encourage people to participate, and our web site expands on the group pool and discussion threads on Flickr with a variety of projects for members to participate in, blogs that feature photos picked from the pool, and a wide variety of articles, notices and links. The key thing we&#8217;ve tried to do in Utata is to ensure that participation is simple and straightforward. Anyone can come along and <a href="http://www.utata.org/participate.php">join in</a> &#8211; the only requirement is that you have a Flickr account.</p> <p><a href="http://www.utata.org/"><img decoding="async" src="http://www.utata.org/badge/film/rectangle-white.jpg" border="0" alt="Utata" title="Utata" /></a></p> <p>Some of the most popular parts of Utata are undoubtedly the group projects &#8211; there are typically about three or four group projects in progress at any time, each with their own theme. To take part in a project, all members need to do is tag their photo with the specified project tag and it will then automatically get included in the project pages on the Utata web site. We do all of the hard work of keeping track of which photos are in which project, and presenting the project pages to the world. It is participation made easy &#8211; &#8220;tag and run&#8221;.</p> <p>To make all that happen, there&#8217;s a whole pile of stuff in place behind the scenes. We have a sizeable set of PHP classes, a bunch of perl scripts and a MySQL database, that between them keep track of who all the Utata members are and which photos have been added to which project. The end result of all of this is a pretty smooth and largely automated system. A bunch of cron scripts keep the project database up to date and we have a private administration site that allows Utata administrators to quickly and easily perform a wide variety of tasks: they can set up and publish new projects, create polls, update member details, post new blog entries and so on. We also have HAL, the <a href="http://www.flickr.com/people/utatabot/">UtataBot</a>, who keeps a watchful eye on the group pool, making sure that members abide by the rules and that we don&#8217;t just become a general dumping ground <i>[RevDanCatt: here&#8217;s another pool cleaning bot, <a href="http://www.flickr.com/people/hipbot">hipbot</a>]</i>. There are also the Utata badges that show off the latest contributions to the group pool. Actually, it&#8217;s only now, as I sit and write this list, that I realise just how much code there is sitting there on the Utata servers.</p> <p><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3105/3120496739_6a02b9144b.jpg" width="500" height="341" alt="Project" /></p> <p>One of the key parts of the system is the list of projects and their entries. Utata is a popular site, and it&#8217;s clearly not feasible to go back to Flickr to search for project entries each time a page is viewed, so a good deal of the code that runs Utata is devoted to maintaining our local copy of that data &#8211; keeping the cached data up to date and retrieving less commonly used elements from Flickr on demand as various pages are viewed. Given the number of projects held on Utata, and the size of the membership, it&#8217;s important to make efficient use of the cache, and I&#8217;ve tried a number of different strategies to minimise the number of API calls required. The biggest thorn in my side here is the limitation in <a href="http://www.flickr.com/services/api/flickr.photos.search.html">flickr.photos.search</a> that you can only ever get back the first 4000 photos for a tag-based search. I have some work-arounds to get around that, but if that limitation was ever increased I could make the whole thing far more efficient.</p> <p>An interesting, but little known fact about Utata, is that it has its <a href="http://www.utata.org/services/api/">own API</a>, which if you were to take a close look at, might well look rather familiar &#8211; it uses the Flickr API as its role model. There are only has a limited number of methods right now, but the framework allows more to be added quite easily. The idea behind the API is to enable other interesting applications to be written. There are only a few of these external applications in existence at the moment &#8211; there&#8217;s a stand-alone project browser, which I don&#8217;t think anyone other than me uses. A more interesting one is the Utatascreensaver, which cycles through photos from the Utata project of your choice.</p> <p>As well as Utata, I dabble with a variety of other projects. The main thing I’m working on right now is a revamp of my Set Manager (<a href="http://www.dopiaza.org/flickr/setmgr/">http://www.dopiaza.org/flickr/setmgr/</a>). One of the first comments I ever posted to Flickr Ideas was a request for Smart Sets – sets that could dynamically update themselves. You can think of them as the photographic equivalent of SmartPlaylists in iTunes. At the time, I was just starting to experiment with the Flickr API, so I decided to try my hand at building an application to create sets automatically. It’s not especially complicated, it’s really just a simple wrapper around flickr.photos.search, but it has certainly struck a chord with people, with currently over 25,000 authenticated users. It hasn&#8217;t changed very much since it was first written, so I figured it was time to give it something of an overhaul.</p> <p><a href="http://www.flickr.com/photos/dopiaza/3093024292/" title="Set Manager by dopiaza, on Flickr"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3270/3093024292_e551b804ce.jpg" width="500" height="460" alt="Set Manager" /></a></p> <p>I&#8217;ve recently been playing around with Adobe&#8217;s Flex framework and decided that revamping the set manager would give me a good excuse to get to learn more about Flex and understand how it all hangs together &#8211; and so Version 2 of the set manager is now well under way. This new version allows you to not only build sets based on tags, interestingness, date and so on, it also allows you build sets based around location &#8211; the places API provides a very easy way to get access to all of the photos in a given location. For a more visual approach to set building, I&#8217;ve also hooked in Google Maps (sorry, Yahoo!) using their rather nifty Flash component to allow areas of interest to be easily chosen. This new Set Manager also piggy-backs on some of the work I did on Utata &#8211; it now exposes an API, built using the same framework as the Utata API, to allow the Flex application to communicate with the server.</p> <p>Most of the Set Manager revamp has now been completed, and few Flickr stalwarts have been helping test it all out. The plan is to get this new version up and running by the end of the year &#8211; all I need is a little more spare time to finish things off&#8230;</p> <p><b>2. What are the best tricks or tips you&#8217;ve learned working with the Flickr API?</b></p> <p><i>David:</i> <a href="http://code.flickr.com/blog/2008/11/19/5-questions-for-gustavo/">Gustavo</a> sneaked in ahead of me here and got in first with some of the best answers, but the main one is worth repeating &#8211; cache your data. Every API call you make can add several seconds on to the run time of your application or the load time of your web page, so you should really think carefully about whether each API call is necessary. If you think you&#8217;re going to need that data again in the near future, store it away somewhere &#8211; in a database, in the user&#8217;s session, anywhere. A good caching strategy can make the difference between a snappy responsive web site and a painfully slow, treacle-laden disaster.</p> <p>One thing that seems to catch out a lot of people is the 4000 item limit to searches, which seems to be poorly documented (i.e., not at all). If you&#8217;re not aware of this limitation, it can suddenly rear it&#8217;s ugly head when you&#8217;re least expecting it &#8211; and usually when it&#8217;s least convenient. I remember the first time a Utata tag exceeded 4000 photos (the utatafeature tag currently returns over 16000 photos) and that certainly caused a few headaches. The only solution to this problem seems to be to construct your searches so that they&#8217;re sure to return less than 4000 matches. For the Utata tag searches, I ended up breaking the search down into a set of searches using smaller date ranges and aggregated the results. It&#8217;s not perfect, but it seems to be holding up.</p> <p>And if you build an application or tool and release it out into the world, be prepared for an endless stream of emails from people who want it to do something just a little bit different from what it does right now&#8230;</p> <p><b>3. As a Flickr developer what would you like to see Flickr do more of and why?</b></p> <p><a href="http://www.flickr.com/photos/malingering/356400109/" title="Run Zumi! Run like the wind! by Malingering, on Flickr"><img decoding="async" loading="lazy" src="http://farm1.static.flickr.com/145/356400109_35eae35f53.jpg" width="500" height="315" alt="Run Zumi! Run like the wind!" /></a></p> <p><i>David:</i> Well, more Kitten Tuesdays are clearly an obvious priority. Apart from that? Well, here goes:</p> <p>One of the biggest things I would like to see is a better way for Flickr members to allow API access to their photos. At the moment, users can either opt in or opt out of third-party API searches &#8211; it&#8217;s an all or nothing thing. There are good reasons for wanting to opt out of searches. It is all too easy, for example, to get an API key and create a rogue application: one that might display photos in an unwelcome context &#8211; on a commercial web site, perhaps. Of course, applications that violateFlickr&#8217;s terms of service tend to get shut down pretty quickly, but someone has to spot them and bring them to Flickr&#8217;s attention before that can happen. Threads regularly appear in the help forum about this, and many people choose to opt-out of public API searches to avoid having their photos show up in places they don&#8217;t expect. The problem with opting out is that members can then no longer make use of some of the applications and services that they would actually like to have access to their photos. Utata is a good example &#8211; we have many members who would like to take part in the projects but can&#8217;t because they are not willing to opt back in to API searches on a global basis.</p> <p>I would like to see the current opt-out system expanded to allow members who opt out to then opt back in to API searches for selected applications &#8211; an API application white list, if you like. That would allow people to explicitly choose which applications were trusted and so grant them access.</p> <p>There are a few changes to existing API methods that I&#8217;d really like to see:</p> <p>&#8211; That 4000 photo limit I keep mentioning &#8211; it would be really nice if that could be lifted, even if only for certain search types, such as time-ordered.</p> <p>&#8211; <a href="http://www.flickr.com/services/api/flickr.photos.getInfo.html">flickr.photos.getInfo</a> returns a whole host of useful information about a photo, but if I want to display that photo somewhere, I also invariably need to know what sizes are available to me. flickr.photos.getSizes gives me that, but that&#8217;s now two API calls. I almost always end up calling these two methods as a pair &#8211; it would be really nice if flickr.photos.getInfo could optionally return the sizes as well.</p> <p>&#8211; One of the most common feature requests I get for my set manager is the ability to sort by number of favourites, or by views, or by number of comments. Allowing <a href="http://www.flickr.com/services/api/flickr.photos.search.html">flickr.photos.search</a> to do this would make a lot of people very happy.</p> <p>&#8211; and I know it&#8217;s been mentioned quite recently, but searching on EXIF data would be very nice&#8230;</p> <p><b>4. What excites you about Flick and hacking? What do you think you&#8217;ll build next or would like someone else to build so you don&#8217;t have to?</b></p> <p><i>David:</i> The thing I love about Flickr is that it&#8217;s not just about the photographs. The social network &#8211; that jumbled mass of communities that live within Flickr &#8211; is really the thing that makes Flickr so compelling. Without those interactions and relationships between people, Flickr would be just another web site full of photos, but as <a href="http://www.flickr.com/photos/gustavog/9708628/">Gustavo&#8217;s graphs</a> featured in the last 5 Questions help demonstrate, there&#8217;s much more depth to Flickr than a simple on-line photo gallery. It is quite fun building tools to help people perform particular tasks more easily &#8211; creating sets, uploading photos, managing group subscription, and so on &#8211; but all that&#8217;s not a patch the satisfaction gained from building tools that help whole new communities develop. That&#8217;s what makes Flickr for me: the people.</p> <p>What will I build next? I don&#8217;t know. There&#8217;s always something to tinker with, and you never quite know where that tinkering will lead. The whole shapes thing looks quite interesting, but I haven&#8217;t had chance to really have a proper look at that yet. That might well be next on my list to play with &#8211; who knows?</p> <p><b>5. Besides your own, what Flickr projects and hacks do you use on a regular basis? Who should we interview next?</b></p> <p><i>David:</i> The Flickr tool I&#8217;m using the most right now is Jeffrey Friedl&#8217;s &#8216;Export to Flickr&#8217; Lightroom Plug-in (<a href="http://regex.info/blog/lightroom-goodies/flickr/">http://regex.info/blog/lightroom-goodies/flickr/</a>). It&#8217;s a super little application &#8211; it integrates seamlessly with Adobe Lightroom, and does a brilliant job of streamlining the upload process. It&#8217;s a very well thought out piece of software &#8211; definitely my favourite Flickr tool of 2008.</p> <p><a href="http://www.flickr.com/photos/snapeverything/2563530571/" title="Testing Jeffrey Friedl’s Lightroom Export Plugin for Flickr by Axel Bührmann, on Flickr"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3193/2563530571_fd93c1b7ee.jpg" width="500" height="333" alt="Testing Jeffrey Friedl’s Lightroom Export Plugin for Flickr" /></a></p> <p>Who to interview next? Sam Judson (<a href="http://www.flickr.com/photos/samjudson/">http://www.flickr.com/photos/samjudson/</a>). Sam was technical editor on my Flickr Mashups book (did I forget to mention that I wrote a whole book on building Flickr applications? <a href="http://www.wrox.com/WileyCDA/WroxTitle/Flickr-Mashups.productCd-0470097744.html">Flickr Mashups</a>, published by Wrox. Buy one now.). Anyway, as I was saying, Sam was technical editor on my book, and did a great job there, helping point some of my most embarrassing errors before they gotcommitted to print. He knows lots about the API and has been using it for even longer than me. He&#8217;s the author of the FlickrNet API library (<a href="http://www.codeplex.com/FlickrNet">http://www.codeplex.com/FlickrNet</a>) and a regular contributor to both the <a href="http://flickr.com/groups/api/">Flickr API group</a> and the <a href="http://tech.groups.yahoo.com/group/yws-flickr/">developer mailing list</a>.</p> <p><i>Dan:</i> Thank you, David, and sorry about taking <i>forever</i> to post your answers :) Next up <a href="http://www.flickr.com/photos/samjudson">Sam Judson</a>.</p> <p>Photos by <a href="http://www.flickr.com/photos/dopiaza/">dopiaza,</a> <a href="http://www.flickr.com/photos/malingering/">Malingering</a> and <a href="http://www.flickr.com/photos/snapeverything/">Axel Bührmann</a>.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://code.flickr.net/tag/5-questions/" rel="tag">5 questions</a>, <a href="https://code.flickr.net/tag/5questions/" rel="tag">5questions</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-422 --> <article id="post-557" class="post-557 post type-post status-publish format-standard hentry category-change-log category-geo"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/13/changelog-yahoo-updated-map-tiles-and-some-osm-ones/" rel="bookmark">[changelog] Yahoo! updated map tiles and some OSM ones.</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/13/changelog-yahoo-updated-map-tiles-and-some-osm-ones/" title="12:41 am" rel="bookmark"><time class="entry-date" datetime="2009-02-13T00:41:40-08:00">February 13, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p>Recently Yahoo!! released new map tiles &#8230; ah heck, actually it was a couple of months ago, I just suck at writing blog posts &#8230; <i>anyway</i>, here&#8217;s their post from last December: <a href="http://www.ygeoblog.com/blog/2008/12/16/yahoo-maps-new-international-coverage/">Yahoo! Maps &#8211; New International Coverage</a> which goes on to say &#8230;</p> <blockquote><p><i>&#8220;We’ve added detailed coverage to 45 new countries, with new data in a further 30 countries, to make it easier for you to navigate to exotic locales as you plan for your winter travel.&#8221;</i></p></blockquote> <p>I&#8217;m as keen as the next person to have 45 new countries, so I bumped our version of the maps API used over here at Flickr to make use of the new tiles.</p> <p>Which gives us more to work with for many bits of Albania, Andorra, Argentina, Australia, Austria, Bahrain, Belarus, Belgium, Bosnia &#038; Herzegovina, Botswana, Brazil, Bulgaria, Canada, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Gibraltar, Greece, Hong Kong, Hungary, Iceland, India, Indonesia, Ireland, Italy, Kuwait, Latvia, Lesotho, Liechtenstein, Lithuania, Luxembourg, Macau-China, Macedonia, Malaysia, Malta, Mexico, Moldova, Monaco, Montenegro, Namibia, Netherlands, New Zealand, Norway, Oman, Philippines, Poland, Portugal, Qatar, Romania, Russia, San Marino, Saudi Arabia, Serbia, Singapore, Slovakia, Slovenia, South Africa, South Korea, Spain, Swaziland, Sweden, Switzerland, Taiwan, Thailand, Turkey, US, United Arab Emirates, United Kingdom and [catch breath], Vietnam.</p> <p>Often we&#8217;ll try to improve our coverage with the help of (the frankly awesome) <a href="http://www.openstreetmap.org/">OpenStreetMap<a> (OSM) peeps, as previously mentioned in; <a href="http://blog.flickr.net/en/2008/08/12/around-the-world-and-back-again/">Around the World and Back Again,</a> <a href="http://code.flickr.com/blog/2008/08/25/flickr-heart-burning-man-heart-openstreetmap/">Flickr [heart] Burning Man [heart] OpenStreetMap</a> and <a href="http://blog.flickr.net/en/2008/10/30/more-cities/">More new map tiles</a>.</p> <p>With this roll out we&#8217;ve actually removed some OSM tiles. Mexico City, Rio de Janeiro, Sao Paulo are now covered in more detail by Yahoo! &#8230; here&#8217;s the tiles for Mexico City &#8230;</p> <p><a href="http://www.flickr.com/photos/35468159852@N01/3275534502" title="View 'Mexico City - Yahoo Map Tiles' on Flickr.com"></p> <div style="text-align:center;"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3338/3275534502_b57a8c4859.jpg" alt="Mexico City - Yahoo Map Tiles" border="0" width="500" height="406" /></div> <p></a></p> <p>&#8230; which as you can see are pretty good.</p> <p>But from OpenStreetMap we&#8217;ve added <a href="http://www.flickr.com/map?&#038;fLat=5.5617&#038;fLon=-0.2061&#038;zl=5">Accra</a>, <a href="http://www.flickr.com/map?&#038;fLat=36.7589&#038;fLon=3.0692&#038;zl=6">Algiers</a>, <a href="http://www.flickr.com/map?&#038;fLat=30.0593&#038;fLon=31.263&#038;zl=6">Cairo</a>, <a href="http://www.flickr.com/map?&#038;fLat=-17.8233&#038;fLon=31.0502&#038;zl=5">Harare</a>, <a href="http://www.flickr.com/map?&#038;fLat=-4.3322&#038;fLon=15.2917&#038;zl=5">Kinshasa</a>, <a href="http://www.flickr.com/map?&#038;fLat=2.0354&#038;fLon=45.3404&#038;zl=5">Mogadishu</a> and <a href="http://www.flickr.com/map?&#038;fLat=-1.2772&#038;fLon=36.8109&#038;zl=5">Nairobi</a>, you can see the before and after for Nairobi below &#8230;</p> <p><b>Before</b><br /> <a href="http://www.flickr.com/photos/35468159852@N01/3275448058" title="View 'Nairobi - Yahoo Tiles' on Flickr.com"></p> <div style="text-align:center;"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3431/3275448058_459e1d275c.jpg" alt="Nairobi - Yahoo Tiles" border="0" width="500" height="406" /></div> <p></a></p> <p><b>After, with OSM Tiles</b><br /> <a href="http://www.flickr.com/photos/35468159852@N01/3274627401" title="View 'Nairobi OSM tiles' on Flickr.com"></p> <div style="text-align:center;"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3462/3274627401_1c74ac59c9.jpg" alt="Nairobi OSM tiles" border="0" width="500" height="406" /></div> <p></a></p> <p>&#8230; which as you can see are also pretty good :)</p> <p>Clearly we can&#8217;t spend forever swapping tiles in and out, well maybe we can, but at some point there&#8217;ll probably be a better way of managing this kind of thing.</p> <p>In the meantime though, this being the code blog, and just for fun, here&#8217;s a little bit of what happens in the world of JavaScript.</p> <p><b>Warning, some code ahead!</b></p> <p>This check_map function is called each time you move, zoom or switch map views &#8230;</p> <pre> check_map: function(map_obj, parent_node) { // Grab the focus, zoomlevel and maptype of the current view var lat_lon = map_obj.getCenterLatLon(); var zl = map_obj.getZoomLevel(); var map_type = map_obj.getCurrentMapType(); </pre> <p>Then we check the location against a list of places we want to load OSM tiles for, we could do this any number of ways, but pragmatically this just works (scroll the below code all the way to the right for the interesting bits, if you&#8217;re not reading this in an RSS feed) &#8230;</p> <pre> // Now see if we match any of these following tests to work out if we need to switch to osm or not. // The meta-test is if we are in MAP mode. var in_the_zone = false; if (map_type == 'YAHOO_MAP') { if (zl < 8 &#038;&#038; lat_lon.Lat >= 39.8558502197 && lat_lon.Lat <= 40.0156097412 &#038;&#038; lat_lon.Lon >= 116.2662734985 && lat_lon.Lon <= 116.4829177856) in_the_zone = true; // Beijing if (zl < 7 &#038;&#038; lat_lon.Lat >= 40.735551 && lat_lon.Lat <= 40.807533 &#038;&#038; lat_lon.Lon >= -119.272041 && lat_lon.Lon <= -119.163379) in_the_zone = true; // Black Rock City, 2008 if (zl < 9 &#038;&#038; lat_lon.Lat >= 35.46290704974905 && lat_lon.Lat <= 36.02799998329552 &#038;&#038; lat_lon.Lon >= 139.21875 && lat_lon.Lon <= 140.27069091796875) in_the_zone = true; // Tokyo if (zl < 8 &#038;&#038; lat_lon.Lat >= -34.6944313049 && lat_lon.Lat <= -34.4146499634 &#038;&#038; lat_lon.Lon >= -58.6389389038 && lat_lon.Lon <= -58.2992210388) in_the_zone = true; // Buenos Aires // Yahoo Better if (zl < 8 &#038;&#038; lat_lon.Lat >= 18.9466495514 && lat_lon.Lat <= 19.6985702515 &#038;&#038; lat_lon.Lon >= -99.5071487427 && lat_lon.Lon <= -98.7429122925) in_the_zone = true; // Mexico City // Yahoo Better if (zl < 8 &#038;&#038; lat_lon.Lat >= -23.0837802887 && lat_lon.Lat <= -22.7662200928 &#038;&#038; lat_lon.Lon >= -43.7946395874 && lat_lon.Lon <= -43.1328392029) in_the_zone = true; // Rio de Janeiro // Yahoo Better if (zl < 8 &#038;&#038; lat_lon.Lat >= -24.0083808899 && lat_lon.Lat <= -23.3576107025 &#038;&#038; lat_lon.Lon >= -46.8253898621 && lat_lon.Lon <= -46.3648300171) in_the_zone = true; // Sao Paulo if (zl < 8 &#038;&#038; lat_lon.Lat >= -35.2210502625 && lat_lon.Lat <= -34.6507987976 &#038;&#038; lat_lon.Lon >= 138.4653778076 && lat_lon.Lon <= 138.7634735107) in_the_zone = true; // Adelaide if (zl < 8 &#038;&#038; lat_lon.Lat >= -34.1896095276 && lat_lon.Lat <= -33.5781402588 &#038;&#038; lat_lon.Lon >= 150.5171661377 && lat_lon.Lon <= 151.3425750732) in_the_zone = true; // Sydney if (zl < 8 &#038;&#038; lat_lon.Lat >= -27.8130893707 && lat_lon.Lat <= -27.0251598358 &#038;&#038; lat_lon.Lon >= 152.6393127441 && lat_lon.Lon <= 153.3230438232) in_the_zone = true; // Brisbane if (zl < 8 &#038;&#038; lat_lon.Lat >= -35.4803314209 && lat_lon.Lat <= -35.1245193481 &#038;&#038; lat_lon.Lon >= 148.9959259033 && lat_lon.Lon <= 149.2332458496) in_the_zone = true; // Canberra if (zl < 8 &#038;&#038; lat_lon.Lat >= -38.4112510681 && lat_lon.Lat <= -37.5401115417 &#038;&#038; lat_lon.Lon >= 144.5532073975 && lat_lon.Lon <= 145.5077362061) in_the_zone = true; // Melbourne if (zl < 8 &#038;&#038; lat_lon.Lat >= 33.2156982422 && lat_lon.Lat <= 33.4300994873 &#038;&#038; lat_lon.Lon >= 44.2592010498 && lat_lon.Lon <= 44.5364112854) in_the_zone = true; // baghdad if (zl < 8 &#038;&#038; lat_lon.Lat >= 34.4611015320 && lat_lon.Lat <= 34.5925598145 &#038;&#038; lat_lon.Lon >= 69.0997009277 && lat_lon.Lon <= 69.2699813843) in_the_zone = true; // kabul if (zl < 10 &#038;&#038; lat_lon.Lat >= -4.3634901047 && lat_lon.Lat <= -4.3009300232 &#038;&#038; lat_lon.Lon >= 15.2374696732 && lat_lon.Lon <= 15.3460502625) in_the_zone = true; // kinshasa if (zl < 10 &#038;&#038; lat_lon.Lat >= 2.0093801022 && lat_lon.Lat <= 2.0614199638 &#038;&#038; lat_lon.Lon >= 45.3139114380 && lat_lon.Lon <= 45.3669013977) in_the_zone = true; // mogadishu if (zl < 10 &#038;&#038; lat_lon.Lat >= -17.8511505127 && lat_lon.Lat <= -17.7955493927 &#038;&#038; lat_lon.Lon >= 31.0210304260 && lat_lon.Lon <= 31.0794296265) in_the_zone = true; // harare if (zl < 10 &#038;&#038; lat_lon.Lat >= -1.3165600300 && lat_lon.Lat <= -1.2379800081 &#038;&#038; lat_lon.Lon >= 36.7483406067 && lat_lon.Lon <= 36.8735618591) in_the_zone = true; // nairobi if (zl < 10 &#038;&#038; lat_lon.Lat >= 5.5237197876 && lat_lon.Lat <= 5.5998301506 &#038;&#038; lat_lon.Lon >= -0.2535800040 && lat_lon.Lon <= -0.1586299986) in_the_zone = true; // accra if (zl < 10 &#038;&#038; lat_lon.Lat >= 30.0068798065 && lat_lon.Lat <= 30.1119003296 &#038;&#038; lat_lon.Lon >= 31.2149791718 && lat_lon.Lon <= 31.3111705780) in_the_zone = true; // cairo if (zl < 10 &#038;&#038; lat_lon.Lat >= 36.6997604370 && lat_lon.Lat <= 36.8181610107 &#038;&#038; lat_lon.Lon >= 2.9909501076 && lat_lon.Lon <= 3.1476099491) in_the_zone = true; // algiers } </pre> <p>If we found a match up there, then "in_the_zone" would have been set, in which case we'll check to see if were already showing osm tiles, if not we'll tell the YAHOO API to use our OSM tiles rather than the YAHOO ones ...</p> <pre> // ok, if we've match one of the above tests then we are in osm land ... if (in_the_zone) { // if we aren't already osming, then we need to switch the map tiles. if (!this.osming) { // Say that we are now osming this.osming = true; // Put the new tiles in YMapConfig.tileReg=['/our_openstreetmap_tile_broker.xxx?t=m&','/our_openstreetmap_tile_broker.xxx?t=m&']; // Tell the maps to clear out the tile cache and load in the new tiles. map_obj._cleanTileCache(); map_obj._callTiles(); } } else { </pre> <p>"YMapConfig.tileReg=" tells the map API to load tiles from us rather than the default ones, hint, you should set this to <i>your own</i> tile server ;)</p> <p>"_cleanTileCache()" and "_callTiles()" are two undocumented functions (and therefor may break at some point) that allows you to force the map to load in new tiles. Otherwise the current view of the map will still show the Yahoo tiles and not use the new ones until you next pan the map around. Again there's probably a better way of doing this, but there's still a lot to be said for it-just-works!</p> <p>The next bit runs if we're not "in the zone" to see if we need to turn the OSM tiles back off. </p> <pre> // otherwise we are not looking at an osm spot, in which case check to see if // we *were* looking at one, and if so, turn it all off again if (this.osming == true) { // say that we are no longer osming this.osming = false; // turn the tiles back YMapConfig.tileReg=this.oldTileReg; // Tell the maps to clear out the tile cache and load in the new tiles. map_obj._cleanTileCache(); map_obj._callTiles(); } } </pre> <p>Which is roughly the opposite of turning them on. The only thing to note is that is the line ...</p> <pre> YMapConfig.tileReg=this.oldTileReg </pre> <p>... when we created the map I used this ...</p> <pre> // record what the old tiles were this.oldTileReg=YMapConfig.tileReg; </pre> <p>... to record where YMapConfig thinks it aught to be loading tiles from when in map view (as opposed to hybrid or satellite view) so it can be reset when you need it.</p> <p>And that's pretty much it. I've chopped out some distracting bits here or there to make it clearer and no-one else is likely to do it like this, but I find sharing to be cathartic (adjective not noun) :)</p> <p>For a smidge of further reading this is a handy article from A List Apart: <a href="http://www.alistapart.com/articles/takecontrolofyourmaps">Take Control of Your Maps</a> by Paul Smith.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/change-log/" rel="category tag">changelog</a>, <a href="https://code.flickr.net/category/geo/" rel="category tag">geo</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-557 --> <article id="post-550" class="post-550 post type-post status-publish format-standard hentry category-kittens tag-kittentuesday"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/10/birthday-kitten-tuesday/" rel="bookmark">Birthday Kitten Tuesday</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/10/birthday-kitten-tuesday/" title="11:39 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-10T23:39:48-08:00">February 10, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p>It&#8217;s been a while since we last had a <a href="http://code.flickr.com/blog/tag/kittentuesday/">Kitten Tuesday</a> so how better to bring it back for a week than with a Birthday?!</p> <p align="center"><a title="DSC_0359 by anselor, on Flickr" href="http://www.flickr.com/photos/anselor/127773548/" title="DSC_0359 by anselor, on Flickr"><img decoding="async" loading="lazy" src="http://farm1.static.flickr.com/45/127773548_775e726995.jpg" alt="DSC_0359" width="333" height="500" /> </a></p> <p><a href="http://blog.flickr.net/en/2009/02/10/5-years-ago-today/">Five years ago today</a> Flickr was launched, powered by hardworking nerds &#8230;</p> <p>&#8230; five years later it&#8217;s now powered by <a href="http://www.flickr.com/about">hardworking nerds,</a> <a href="http://www.flickr.com/explore/interesting/7days/">Magic Donkeys,</a> <a href="http://www.flickr.com/explore/panda">Pandas,</a> <a href="http://www.flickr.com/services/api/">APIs,</a> <a href="http://www.flickr.com/fun/buddies.gne">Users</a> and <a href="http://flickr.com/evil">Evil Cats.</a></p> <p>Yay us!</p> <p>Photo by <a href="http://www.flickr.com/photos/anselor/">anselor</a></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/kittens/" rel="category tag">kittens</a> </span> <span class="sep"> | </span> <span class="tag-links"> <span class="entry-utility-prep entry-utility-prep-tag-links">Tagged</span> <a href="https://code.flickr.net/tag/kittentuesday/" rel="tag">kittentuesday</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-550 --> <article id="post-517" class="post-517 post type-post status-publish format-standard hentry category-uncategorized"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/09/things-im-standing-next-to/" rel="bookmark">Things I&#8217;m Standing Next To</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/09/things-im-standing-next-to/" title="6:46 pm" rel="bookmark"><time class="entry-date" datetime="2009-02-09T18:46:02-08:00">February 9, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p><a href="http://www.flickr.com/photos/straup/3171285346/" title="mb by straup, on Flickr"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3132/3171285346_2fafea54a6.jpg" width="500" height="500" alt="mb" style="border:1px dotted #ccc;padding:10px;margin-top:20px;margin-bottom:20px;" /></a></p> <blockquote style="margin-bottom:20px;padding-left:30px;padding-right:50px;text-align:justify;"> <p style="font-style:italic;">&#8220;The problem with these geolocative services is that they assume you&#8217;re a precise, rational human, behaving as economists expect. No latitude for the unexpected; they&#8217;re determined to replace every unnecessary human interaction with the helpful guide in your pocket.&#8221;</p> <p style="font-size:small;text-align:right;">&#8212; <a href="http://scraplab.net/2009/02/06/hereish-nowish.html">Tom Taylor</a></p> </blockquote> <p>Back in <a href="http://tech.groups.yahoo.com/group/yws-flickr/message/4146">June of 2008</a> we added the ability to <a href="http://code.flickr.com/blog/2008/09/04/whos-on-first/">perform radial queries in the photos.search API method</a>. One of the earliest developers to use this feature was <a href="http://code.flickr.com/blog/2009/01/22/5-questions-for-fraser-speirs/">Frasier Speirs</a> who used it for the <q>Near Me</q> feature of <a href="http://speirs.org/2008/12/22/darkslide-15-post-mortem/" style="font-style:italic;">Darkslide</a>, his Flickr application for the iPhone originally named <a href="http://www.connectedflow.com/blog/?p=98" style="font-style:italic;">Exposure</a>.</p> <p>It is difficult to overstate how impressive, and important, tools like <a href="http://www.paulhagon.com/then&#038;now">Google Earth</a> and <a href="http://electronicmuseum.org.uk/2009/01/31/crowd-sourcing-photosynth/">PhotoSynth</a> are visualizing geographies and in pushing the boundaries of what is possible both technically and conceptually. But both do so at the expense of what Scott McCloud calls &#8220;<a href="http://www.krisjordan.com/2008/09/09/why-the-google-chrome-comic-rocked-scott-mcclouds-invisible-art/">the magic in the gutter</a>&#8220;. On the subject of the gutter, the space between the individual panels in a comic book, McCloud <a href="http://www.scottmccloud.com/store/books/uc.html">writes</a>:</p> <blockquote style="font-style:italic;padding-left:30px;padding-right:50px;text-align:justify;margin-top:20px;margin-bottom:20px;"> <p>&#8220;From an axe-murderer pursuing a frightened man in one panel to an ambiguous shriek in the next, what happened? You killed a character in your mind. The artist did nothing of the sort. Closure is the work done by a reader which takes two juxtaposed images and unifies them into a single idea.&#8221;</p> </blockquote> <p>That&#8217;s one of the things I like the most about &#8220;Near Me&#8221; and the ability to perform radial queries using the Flickr API: It affords a representation of place spun from a thicker, coarser, yarn. Less precise, maybe, but richer in its own way. With radial queries there is the knowledge that all the photos were taken close to one another &#8212; so close in some cases you can almost walk down a city block from one photo to the next &#8212; but the results are <a href="http://vimeo.com/2721992">staggered</a>, often overlapping one another, indoors and outdoors in time and space.</p> <p>That staggering is <a href="http://speedbird.wordpress.com/2008/05/04/the-long-here-and-the-big-now/">the breathing room</a>, the gutter, that lets viewers discover, imagine and create their own connections, their own closures, from not just a one history of a place but also <a href="http://magicalnihilism.wordpress.com/2008/10/11/bionic-noticing-on-irving-street/">the patterning</a> of all those who&#8217;ve passed through it.</p> <blockquote style="font-style:italic;padding-left:30px;padding-right:50px;text-align:justify;margin-top:20px;margin-bottom:20px;"> <p>&#8220;Whether mapping lost lakes of a different era or tracing the edges of disappeared lagoons that still haunt the streets of San Francisco &#8212; or reminding urbanites of the sport-fishing possibilities beneath Manhattan &#8212; we are alive within laminations we will never fully map or comprehend.&#8221;</p> <p style="font-size:small;text-align:right;">&#8212; <a href="http://bldgblog.blogspot.com/2009/02/watermarks.html">Geoff Manaugh</a></p> </blockquote> <p>Earlier last week we enabled a quiet little feature that, hopefully, allows you to navigate some of that same mystery and serendipity in the <a href="http://code.flickr.com/blog/2009/02/04/100000000-geotagged-photos-plus/">100 million geotagged photos</a> on Flickr. We call it &#8220;nearby&#8221; and it is available for any geotagged photo on the site.</p> <p>Nearby starts with a geotagged photo and then queries for other geotagged photos within a one kilometer radius. You can order the results by time and distance and interestingness but the important part is that they are photos, well, <a href="http://www.nearfuturelaboratory.com/2009/02/09/locative-play/">nearby to the photo you are looking at</a>. Nearby is a deliberately fuzzy concept. Nearby in St. Peter&#8217;s Square in Rome might mean the person directly in front of you. Nearby in the streets of a small town might be the beautiful garden behind the fence and around the corner. Nearby encourages people to poke around and discover their surroundings, as though they were on foot and everything was just a short walk away.</p> <p>For example, I went to London recently and I while I was there the lovely crew at <a href="http://www.dopplr.com/">Dopplr</a> took me around the corner from their offices to the <a href="http://flickr.com/search/?q=Whitecross+street+market">Whitecross Street Market</a> for lunch. We oggled the cheese and I had a chorizo sandwich and we all took lots of pictures. This is a <a href="http://flickr.com/photos/straup/3215909195">picture of my sandwich</a> and these are the photos taken nearby, including one of me taking a picture of my sandwich:</p> <p> <a href="http://www.flickr.com/photos/straup/3258732602/" title="Nearby! by straup, on Flickr"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3444/3258732602_1b61a7aae2.jpg" width="500" height="457" alt="Nearby!" style="border:1px dotted #ccc;padding:10px;margin-top:20px;margin-bottom:10px;"/></a></p> <p style="text-align:right;font-style:italic;font-size:small;">I have no idea what&#8217;s up with the creepy smile. I blame&#8230; the jet-lag.</p> <p>If you look carefully at the screenshot above, you can see that I&#8217;ve defined &#8220;nearby&#8221; to mean only photos taken by my contacts on the same day and sorted by their distance from my delicious sandwich. This is a very specific and personal view and its value for me is as a record of a shared experience with friends. But if I strip away all the conditions and visit <a href="http://www.flickr.com/photos/straup/3215909195/nearby">the default &#8220;nearby&#8221; page</a> today I can see the snow that&#8217;s recently fallen on London and the graffiti that I walked passed, but didn&#8217;t photograph, in Shoreditch and <a href="http://flickr.com/photos/bees/3260677920/nearby/?by=owner&#038;taken=recent&#038;sort=datetaken&#038;contacts=1&#038;page=1&#038;show=detail">Cal hanging out in the Moo/Dopplr offices</a>.</p> <p>I can watch the place around my photo grow up while also nosing around in <a href="http://www.flickr.com/photos/mathowie/306330464/">the shoebox of its past</a> and, at the same time, someone else can see that I ate a sandwich <a href="http://www.flickr.com/map?&#038;fLat=51.5232&#038;fLon=-0.0929&#038;zl=1">on Whitecross street</a>.</p> <p>The default search criteria for nearby is all photos taken in the last month sorted by date taken (most recent, first) but there are lots of different ways to define what nearby looks like using the available filters:</p> <p style="font-style:italic;">Who took a photo? (For the sake of brevity, &#8220;you&#8221; can also be taken to mean another photographer.)</p> <ul style="margin-left:30px;margin-bottom:20px;"> <li>Everyone</li> <li>Everyone by you</li> <li>Only you</li> <li>Only your contacts</li> </ul> <p style="font-style:italic;">When was it taken?</p> <ul style="margin-left:30px;margin-bottom:20px;"> <li>In the last month</li> <li>Today, you know <q>today</q></li> <li>The day that the photo was taken</li> <li>All time</li> </ul> <p style="font-style:italic;">How should those photos be sorted?</p> <ul style="margin-left:30px;margin-bottom:20px;"> <li>Date taken</li> <li>By distance from the center point</li> <li>By interestingness</li> </ul> <p>More sophisticated filters, like explicit date ranges, aren&#8217;t yet avaliable but we&#8217;re definitely thinking about them and we&#8217;d love to hear how people would like to use nearby.</p> <p>The links for nearby pages are currently only available from the modal &#8220;map&#8221; dialog on individual photo pages or by URL hacking which is really just fancy talk for adding <strong>/nearby</strong> to the URL of any (geotagged) photo page.</p> <p> <img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3417/3258305909_e2aef8bb9d.jpg" width="500" height="445" alt="Picture 1" style="border:1px dotted #ccc;padding:10px;margin-top:20px;margin-bottom:20px;" /></p> <p>Here&#8217;s a picture of another sandwich, this time a <a href="http://www.flickr.com/photos/tags/cheesesteak/clusters/philadelphia-philly-food/">Philly Cheesesteak</a>, taken in San Francisco&#8217;s Mission district:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/photos/straup/3199232007/">http://www.flickr.com/photos/straup/3199232007/</a></p> <p>And here are nearby photos:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/photos/straup/3199232007/nearby">http://www.flickr.com/photos/straup/3199232007<strong>/nearby</strong></a></p> <p>Or a photo of the <a href="http://www.flickr.com/photos/powerhouse_museum/3022876525/">Sydney Cricket Ground</a>, from the Powerhouse Museum&#8217;s Collection, taken in 1900:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/photos/powerhouse_museum/3022876525/">http://www.flickr.com/photos/powerhouse_museum/3022876525/</a></p> <p>And photos taken nearby, on the very same grounds, 100 years later:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/photos/powerhouse_museum/3022876525/nearby/?taken=alltime&#038;sort=distance">http://www.flickr.com/photos/powerhouse_museum/3022876525<strong>/nearby?taken=alltime&#038;sort=distance</strong></a></p> <div> <p> <a href="http://www.flickr.com/photos/81602598@N00/156344104/" title="2005-06 Sydney Cricket Test 2 by brettm8, on Flickr"><img decoding="async" loading="lazy" src="http://farm1.static.flickr.com/73/156344104_ff145d02cb_m.jpg" width="240" height="160" alt="2005-06 Sydney Cricket Test 2" style="border:1px dotted #ccc;padding:5px;margin-top:20px;margin-bottom:20px;float:right;margin-right:10px;"/></a></p> <p> <a href="http://www.flickr.com/photos/powerhouse_museum/3022876525/" title="The Lawn, Association Ground (now Sydney Cricket Ground) by Powerhouse Museum Collection, on Flickr"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3006/3022876525_5fdf3f3522_m.jpg" width="240" height="185" alt="The Lawn, Association Ground (now Sydney Cricket Ground)" style="border:1px dotted #ccc;padding:5px;margin-top:20px;margin-bottom:20px;float:right;margin-right:10px;" /></a></p> <p> <br clear="all" /> </div> <p style="font-size:small;font-style:italic;text-align:right;">photos by <a href="http://www.flickr.com/photos/powerhouse_museum/3022876525/">Tyrrell Photographic Collection, Powerhouse Museum</a> and <a href="http://www.flickr.com/photos/81602598@N00/156344104/">brettm8</a></p> <p>Just like that! Well okay, we added a couple query parameters (to that last link) which most people aren&#8217;t ever going to do but you get the idea.</p> <p>We&#8217;ve also added a special page, which you can link to with any old latitude and longitude and and we&#8217;ll show you photos near that point. This isn&#8217;t a page that we expect people to visit directly (typing all those numbers in the location bar is pretty boring, really) but rather we hope that it will be used by third-party applications and devices which are location aware and can fire up a web browser.</p> <p>For example, if I were wandering around the <a href="http://www.metmuseum.org/">Metropolitan Museum of Art</a>, in New York City:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/nearby/40.779274,-73.963265?show=detail&#038;fromfilter=1&#038;by=everyone&#038;taken=recent&#038;sort=distance">http://www.flickr.com/nearby/<strong>40.779274,-73.963265</strong></a></p> <p>In the not so distant future, when <a href="http://dougt.wordpress.com/2008/08/08/geolocation-today/">web browsers are able to read your location</a> using a GPS signal or wifi triangulation then <span style="font-style:italic;">[REDACTED BY KITTENS]</span> but for now this is just a little something to bridge the difference and a hook for people to use in their applications.</p> <p>In the Easter Egg department we&#8217;ve also added support for <a href="http://www.geohash.org/">geohashes</a> to the special &#8220;lat, lon&#8221; pages. The <a href="http://en.wikipedia.org/wiki/Geohash">Wikipedia entry for geohashes</a> describes them as &#8220;a hierarchical spatial data structure which subdivides space into buckets of grid shape &#8230; offering properties like arbitrary precision and the possibility of gradually removing characters from the end of the code to reduce its size (and gradually lose precision).&#8221; They&#8217;re also just short(er).</p> <p> <img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3410/3259120656_49c4714b87.jpg" width="500" height="473" alt="Picture 20" style="border:1px dotted #ccc;padding:10px;margin-top:20px;margin-bottom:20px;"/></p> <p>When hashed, <em>40.779274,-73.963265</em> becomes <em>dr5ruzts7p8k</em> which is all kinds of weird but that is true of all URL shortening services. Anyway, if the length of your URLs is an issue and the extra 8 characters are really going to make a difference you can sacrifice some of the built-in semantics in the longer version and use the following to link to the same photos from the Met:</p> <p style="font-family:sans-serif;border:1px solid #ccc; padding:5px;text-align:center;"><a href="http://www.flickr.com/nearby/dr5ruzts7p8k?show=detail&#038;fromfilter=1&#038;by=everyone&#038;taken=recent&#038;sort=distance">http://www.flickr.com/nearby/<strong>dr5ruzts7p8k</strong></a></p> <p>Finally, during the time its taken me to write this blog post I came across the <a href="http://snarkmarket.com/blog/">SnarkMarket</a> blog and a piece quoting <a href="http://snarkmarket.com/blog/snarkives/books_writing_such/personality_and_urban_affection/">Ed Folsom&#8217;s account of Walt Whitman&#8217;s experience of &#8220;urban affection&#8221;</a> which I think is a nice ribbon to wrap it all up with:</p> <blockquote style="font-style:italic;padding-left:30px;padding-right:50px;text-align:justify;margin-top:20px;margin-bottom:20px;"> <p>Whitman feels the power of the city of strangers. He&#8217;s looking at a city of strangers and how something we might now call urban affection begins to develop. How do you come to care for people that you have never seen before and that you may never see again?</p> <p>Every day we encounter people, eyes make contact, we brush by people, physically come into contact with them, and may never see them again.</p> <p>&#8230;</p> <p>&#8220;If I were doing that activity that person would be me. If I were wandering the other way, rather than this way, that person could be me.&#8221;</p> </blockquote> <p> <a href="http://www.flickr.com/photos/paulhammond/384895811/nearby/?by=everyone&#038;taken=alltime&#038;sort=distance&#038;page=1&#038;show=detail"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3345/3261797099_27b3746db1_o.jpg" width="500" height="692" alt="ph-full" style="border:1px dotted #ccc;padding:10px;margin-top:10px;margin-bottom:10px;" /></a></p> <p style="font-size:small;font-style:italic;text-align:right;">photos by <a href="http://www.flickr.com/photos/paulhammond/384895811/nearby/?by=everyone&#038;taken=alltime&#038;sort=distance&#038;page=1&#038;show=detail">Paul Hammond</a></p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/uncategorized/" rel="category tag">Uncategorized</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-517 --> <article id="post-509" class="post-509 post type-post status-publish format-standard hentry category-geo"> <header class="entry-header"> <h1 class="entry-title"><a href="https://code.flickr.net/2009/02/04/100000000-geotagged-photos-plus/" rel="bookmark">100,000,000 geotagged photos (plus)</a></h1> <div class="entry-meta"> <span class="sep">Posted on </span><a href="https://code.flickr.net/2009/02/04/100000000-geotagged-photos-plus/" title="3:00 am" rel="bookmark"><time class="entry-date" datetime="2009-02-04T03:00:19-08:00">February 4, 2009</time></a><span class="by-author"> <span class="sep"> by </span> <span class="author vcard"><a class="url fn n" href="https://code.flickr.net/author/flickrphotography/" title="View all posts by Kay Kremerskothen" rel="author">Kay Kremerskothen</a></span></span> </div><!-- .entry-meta --> </header><!-- .entry-header --> <div class="entry-content"> <p>Over the weekend we broke the Hundred Million geotagged photos, actually 100,868,302 at last count, mark. If we remember that we passed the <a href="http://blog.flickr.net/en/2008/11/03/3-billion/">3 billion photos recently</a> and round the figure down a little that means (<i>does calculations on fingers</i>) that around 3.333% of photos have geo data, or one in every 30 photos that get uploaded.</p> <p>In the last two and a half years there have been roughly as many geotagged photos as the total photos upload to Flickr in <i>its</i> first two years of existence. </p> <p>Of those, around two thirds have public geotags and can be searched for on the map or via the API, and about 33 million have some level of private geotags.</p> <p><a href="http://www.flickr.com/map?&#038;fLat=34.1618&#038;fLon=24.2578&#038;zl=16" title="View 'Flickr: Explore everyone's photos on a Map' on Flickr.com"></p> <div style="text-align:center;"><img decoding="async" loading="lazy" src="http://farm4.static.flickr.com/3338/3253534514_854826dd8c.jpg" alt="Flickr: Explore everyone's photos on a Map" border="0" width="500" height="342" /></div> <p></a></p> <p>I should probably mention at this point that if you go directly <a href="http://www.flickr.com/map">to the map</a> and click the dots icon in the top right that you&#8217;ll see a smaller number.</p> <p>This is because we added a rolling upload-date to the initial search to return the most interesting photos in the last month or so, rather than always have the same (all-time) photos show up forever, possibly reinforcing their interestingness.</p> <p>Anyway, not bad really.</p> </div><!-- .entry-content --> <footer class="entry-meta"> <span class="cat-links"> <span class="entry-utility-prep entry-utility-prep-cat-links">Posted in</span> <a href="https://code.flickr.net/category/geo/" rel="category tag">geo</a> </span> </footer><!-- .entry-meta --> </article><!-- #post-509 --> </div><!-- #content --> </section><!-- #primary --> <div id="secondary" class="widget-area" role="complementary"> <aside id="jetpack-search-filters-3" class="widget jetpack-filters widget_search"> <div id="jetpack-search-filters-3-wrapper" class="jetpack-instant-search-wrapper"> <div class="jetpack-search-form"> <form method="get" id="searchform" action="https://code.flickr.net/"> <label for="s" class="assistive-text">Search</label> <input type="text" class="field" name="s" id="s" placeholder="Search" /> <input type="submit" class="submit" name="submit" id="searchsubmit" value="Search" /> <input type="hidden" name="orderby" value="" /><input type="hidden" name="order" value="" /></form> </div> <h4 class="jetpack-search-filters-widget__sub-heading"> Categories </h4> <ul class="jetpack-search-filters-widget__filter-list"> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="category" data-val="uncategorized"> Uncategorized&nbsp;(136) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="category" data-val="geo"> geo&nbsp;(12) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="category" data-val="kittens"> kittens&nbsp;(10) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="category" data-val="change-log"> changelog&nbsp;(7) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="category" data-val="uploadr"> uploadr&nbsp;(6) </a> </li> </ul> <h4 class="jetpack-search-filters-widget__sub-heading"> Tags </h4> <ul class="jetpack-search-filters-widget__filter-list"> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="post_tag" data-val="api"> api&nbsp;(24) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="post_tag" data-val="geo"> geo&nbsp;(13) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="post_tag" data-val="machine-tags"> machine tags&nbsp;(10) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="post_tag" data-val="javascript"> javascript&nbsp;(9) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="taxonomy" data-taxonomy="post_tag" data-val="kittentuesday"> kittentuesday&nbsp;(8) </a> </li> </ul> <h4 class="jetpack-search-filters-widget__sub-heading"> Year </h4> <ul class="jetpack-search-filters-widget__filter-list"> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="year_post_date" data-val="2022-01-01 00:00:00" > 2022&nbsp;(2) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="year_post_date" data-val="2021-01-01 00:00:00" > 2021&nbsp;(1) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="year_post_date" data-val="2018-01-01 00:00:00" > 2018&nbsp;(1) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="year_post_date" data-val="2017-01-01 00:00:00" > 2017&nbsp;(2) </a> </li> <li> <a href="#" class="jetpack-search-filter__link" data-filter-type="year_post_date" data-val="2016-01-01 00:00:00" > 2016&nbsp;(5) </a> </li> </ul> </div></aside> <aside id="recent-posts-2" class="widget widget_recent_entries"> <h3 class="widget-title">Recent Posts</h3> <ul> <li> <a href="https://code.flickr.net/2022/02/14/safer-internet-day-and-open-source-codes-of-conduct/">Safer Internet Day and Open Source Codes of Conduct</a> </li> <li> <a href="https://code.flickr.net/2022/01/04/a-pluggable-solution-for-api-observability-on-our-php-system/">A Pluggable Solution for API Observability on our PHP System</a> </li> <li> <a href="https://code.flickr.net/2021/11/22/flickr-engineering-team-vision-guiding-principles/">Flickr Engineering Team Vision &#038; Guiding Principles</a> </li> <li> <a href="https://code.flickr.net/2018/04/20/together/">Together</a> </li> <li> <a href="https://code.flickr.net/2017/03/07/introducing-similarity-search-at-flickr/">Introducing Similarity Search at Flickr</a> </li> </ul> </aside><aside id="archives-2" class="widget widget_archive"><h3 class="widget-title">Archives</h3> <ul> <li><a href='https://code.flickr.net/2022/02/'>February 2022</a></li> <li><a href='https://code.flickr.net/2022/01/'>January 2022</a></li> <li><a href='https://code.flickr.net/2021/11/'>November 2021</a></li> <li><a href='https://code.flickr.net/2018/04/'>April 2018</a></li> <li><a href='https://code.flickr.net/2017/03/'>March 2017</a></li> <li><a href='https://code.flickr.net/2017/01/'>January 2017</a></li> <li><a href='https://code.flickr.net/2016/09/'>September 2016</a></li> <li><a href='https://code.flickr.net/2016/05/'>May 2016</a></li> <li><a href='https://code.flickr.net/2016/04/'>April 2016</a></li> <li><a href='https://code.flickr.net/2016/03/'>March 2016</a></li> <li><a href='https://code.flickr.net/2015/12/'>December 2015</a></li> <li><a href='https://code.flickr.net/2015/11/'>November 2015</a></li> <li><a href='https://code.flickr.net/2015/09/'>September 2015</a></li> <li><a href='https://code.flickr.net/2015/07/'>July 2015</a></li> <li><a href='https://code.flickr.net/2015/06/'>June 2015</a></li> <li><a href='https://code.flickr.net/2015/03/'>March 2015</a></li> <li><a href='https://code.flickr.net/2014/10/'>October 2014</a></li> <li><a href='https://code.flickr.net/2014/08/'>August 2014</a></li> <li><a href='https://code.flickr.net/2014/07/'>July 2014</a></li> <li><a href='https://code.flickr.net/2014/05/'>May 2014</a></li> <li><a href='https://code.flickr.net/2014/04/'>April 2014</a></li> <li><a href='https://code.flickr.net/2014/02/'>February 2014</a></li> <li><a href='https://code.flickr.net/2013/09/'>September 2013</a></li> <li><a href='https://code.flickr.net/2013/06/'>June 2013</a></li> <li><a href='https://code.flickr.net/2013/03/'>March 2013</a></li> <li><a href='https://code.flickr.net/2012/12/'>December 2012</a></li> <li><a href='https://code.flickr.net/2012/10/'>October 2012</a></li> <li><a href='https://code.flickr.net/2012/07/'>July 2012</a></li> <li><a href='https://code.flickr.net/2012/06/'>June 2012</a></li> <li><a href='https://code.flickr.net/2012/05/'>May 2012</a></li> <li><a href='https://code.flickr.net/2012/04/'>April 2012</a></li> <li><a href='https://code.flickr.net/2012/02/'>February 2012</a></li> <li><a href='https://code.flickr.net/2012/01/'>January 2012</a></li> <li><a href='https://code.flickr.net/2011/12/'>December 2011</a></li> <li><a href='https://code.flickr.net/2011/10/'>October 2011</a></li> <li><a href='https://code.flickr.net/2011/09/'>September 2011</a></li> <li><a href='https://code.flickr.net/2011/08/'>August 2011</a></li> <li><a href='https://code.flickr.net/2011/07/'>July 2011</a></li> <li><a href='https://code.flickr.net/2011/06/'>June 2011</a></li> <li><a href='https://code.flickr.net/2011/03/'>March 2011</a></li> <li><a href='https://code.flickr.net/2011/02/'>February 2011</a></li> <li><a href='https://code.flickr.net/2011/01/'>January 2011</a></li> <li><a href='https://code.flickr.net/2010/11/'>November 2010</a></li> <li><a href='https://code.flickr.net/2010/10/'>October 2010</a></li> <li><a href='https://code.flickr.net/2010/09/'>September 2010</a></li> <li><a href='https://code.flickr.net/2010/08/'>August 2010</a></li> <li><a href='https://code.flickr.net/2010/07/'>July 2010</a></li> <li><a href='https://code.flickr.net/2010/05/'>May 2010</a></li> <li><a href='https://code.flickr.net/2010/04/'>April 2010</a></li> <li><a href='https://code.flickr.net/2010/03/'>March 2010</a></li> <li><a href='https://code.flickr.net/2010/02/'>February 2010</a></li> <li><a href='https://code.flickr.net/2010/01/'>January 2010</a></li> <li><a href='https://code.flickr.net/2009/12/'>December 2009</a></li> <li><a href='https://code.flickr.net/2009/11/'>November 2009</a></li> <li><a href='https://code.flickr.net/2009/10/'>October 2009</a></li> <li><a href='https://code.flickr.net/2009/09/'>September 2009</a></li> <li><a href='https://code.flickr.net/2009/07/'>July 2009</a></li> <li><a href='https://code.flickr.net/2009/06/'>June 2009</a></li> <li><a href='https://code.flickr.net/2009/05/'>May 2009</a></li> <li><a href='https://code.flickr.net/2009/04/'>April 2009</a></li> <li><a href='https://code.flickr.net/2009/03/'>March 2009</a></li> <li><a href='https://code.flickr.net/2009/02/' aria-current="page">February 2009</a></li> <li><a href='https://code.flickr.net/2009/01/'>January 2009</a></li> <li><a href='https://code.flickr.net/2008/12/'>December 2008</a></li> <li><a href='https://code.flickr.net/2008/11/'>November 2008</a></li> <li><a href='https://code.flickr.net/2008/10/'>October 2008</a></li> <li><a href='https://code.flickr.net/2008/09/'>September 2008</a></li> <li><a href='https://code.flickr.net/2008/08/'>August 2008</a></li> <li><a href='https://code.flickr.net/2008/07/'>July 2008</a></li> <li><a href='https://code.flickr.net/2008/06/'>June 2008</a></li> <li><a href='https://code.flickr.net/2008/05/'>May 2008</a></li> <li><a href='https://code.flickr.net/2008/04/'>April 2008</a></li> </ul> </aside><aside id="categories-2" class="widget widget_categories"><h3 class="widget-title">Categories</h3> <ul> <li class="cat-item cat-item-11749740"><a href="https://code.flickr.net/category/api-2/">API</a> </li> <li class="cat-item cat-item-564792"><a href="https://code.flickr.net/category/change-log/">changelog</a> </li> <li class="cat-item cat-item-5784"><a href="https://code.flickr.net/category/event/">event</a> </li> <li class="cat-item cat-item-29160"><a href="https://code.flickr.net/category/geo/">geo</a> </li> <li class="cat-item cat-item-139037766"><a href="https://code.flickr.net/category/hadoop/">hadoop</a> </li> <li class="cat-item cat-item-32"><a href="https://code.flickr.net/category/infrastructure/">infrastructure</a> </li> <li class="cat-item cat-item-139037765"><a href="https://code.flickr.net/category/kittens/">kittens</a> </li> <li class="cat-item cat-item-20156"><a href="https://code.flickr.net/category/labs/">labs</a> </li> <li class="cat-item cat-item-171"><a href="https://code.flickr.net/category/meta/">meta</a> </li> <li class="cat-item cat-item-7092"><a href="https://code.flickr.net/category/metrics/">metrics</a> </li> <li class="cat-item cat-item-139037764"><a href="https://code.flickr.net/category/open-source/">open source</a> </li> <li class="cat-item cat-item-1930"><a href="https://code.flickr.net/category/performance/">performance</a> </li> <li class="cat-item cat-item-304"><a href="https://code.flickr.net/category/photos/">photos</a> </li> <li class="cat-item cat-item-2373"><a href="https://code.flickr.net/category/search/">search</a> </li> <li class="cat-item cat-item-1"><a href="https://code.flickr.net/category/uncategorized/">Uncategorized</a> </li> <li class="cat-item cat-item-249276"><a href="https://code.flickr.net/category/uploadr/">uploadr</a> </li> <li class="cat-item cat-item-412"><a href="https://code.flickr.net/category/video/">video</a> </li> <li class="cat-item cat-item-830560"><a href="https://code.flickr.net/category/xulrunner/">xulrunner</a> </li> </ul> </aside><aside id="meta-2" class="widget widget_meta"><h3 class="widget-title">Meta</h3> <ul> <li><a href="https://code.flickr.net/wp-login.php">Log in</a></li> <li><a href="https://code.flickr.net/feed/">Entries feed</a></li> <li><a href="https://code.flickr.net/comments/feed/">Comments feed</a></li> <li><a href="https://wordpress.org/">WordPress.org</a></li> </ul> </aside> </div><!-- #secondary .widget-area --> </div><!-- #main --> <footer id="colophon" role="contentinfo"> <div id="site-generator"> &copy; 2024 Flickr, Inc. All rights reserved. | Powered by <a href="https://wpvip.com/?utm_source=vip_powered_wpcom&#038;utm_medium=web&#038;utm_campaign=VIP%20Footer%20Credit&#038;utm_term=code.flickr.net" rel="generator nofollow" class="powered-by-wpcom">WordPress VIP</a> </div> </footer><!-- #colophon --> </div><!-- #page --> <div class="jetpack-instant-search__widget-area" style="display: none"> <div id="jetpack-search-filters-2" class="widget jetpack-filters widget_search"> <div id="jetpack-search-filters-2-wrapper" class="jetpack-instant-search-wrapper"> </div></div> </div> <script type="text/javascript" src="https://code.flickr.net/wp-includes/js/dist/url.min.js?m=1732205990g" ></script><script id="jetpack-instant-search-js-before" type="text/javascript"> var JetpackInstantSearchOptions=JSON.parse(decodeURIComponent("%7B%22overlayOptions%22%3A%7B%22colorTheme%22%3A%22light%22%2C%22enableInfScroll%22%3Atrue%2C%22enableFilteringOpensOverlay%22%3Atrue%2C%22enablePostDate%22%3Atrue%2C%22enableSort%22%3Atrue%2C%22highlightColor%22%3A%22%23FFC%22%2C%22overlayTrigger%22%3A%22submit%22%2C%22resultFormat%22%3A%22expanded%22%2C%22showPoweredBy%22%3Atrue%2C%22defaultSort%22%3A%22relevance%22%2C%22excludedPostTypes%22%3A%5B%5D%7D%2C%22homeUrl%22%3A%22https%3A%5C%2F%5C%2Fcode.flickr.net%22%2C%22locale%22%3A%22en-US%22%2C%22postsPerPage%22%3A10%2C%22siteId%22%3A185426273%2C%22postTypes%22%3A%7B%22post%22%3A%7B%22singular_name%22%3A%22Post%22%2C%22name%22%3A%22Posts%22%7D%2C%22page%22%3A%7B%22singular_name%22%3A%22Page%22%2C%22name%22%3A%22Pages%22%7D%2C%22attachment%22%3A%7B%22singular_name%22%3A%22Media%22%2C%22name%22%3A%22Media%22%7D%7D%2C%22webpackPublicPath%22%3A%22https%3A%5C%2F%5C%2Fcode.flickr.net%5C%2Fwp-content%5C%2Fmu-plugins%5C%2Fjetpack-13.1%5C%2Fjetpack_vendor%5C%2Fautomattic%5C%2Fjetpack-search%5C%2Fbuild%5C%2Finstant-search%5C%2F%22%2C%22isPhotonEnabled%22%3Afalse%2C%22isFreePlan%22%3Afalse%2C%22apiRoot%22%3A%22https%3A%5C%2F%5C%2Fcode.flickr.net%5C%2Fwp-json%5C%2F%22%2C%22apiNonce%22%3A%2278aeb3be76%22%2C%22isPrivateSite%22%3Afalse%2C%22isWpcom%22%3Afalse%2C%22hasOverlayWidgets%22%3Atrue%2C%22widgets%22%3A%5B%7B%22filters%22%3A%5B%7B%22name%22%3A%22Bylines%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22byline%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-2%22%2C%22filter_id%22%3A%22taxonomy_0%22%7D%2C%7B%22name%22%3A%22Categories%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22category%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-2%22%2C%22filter_id%22%3A%22taxonomy_1%22%7D%2C%7B%22name%22%3A%22Tags%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22post_tag%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-2%22%2C%22filter_id%22%3A%22taxonomy_2%22%7D%2C%7B%22name%22%3A%22Year%22%2C%22type%22%3A%22date_histogram%22%2C%22count%22%3A5%2C%22field%22%3A%22post_date%22%2C%22interval%22%3A%22year%22%2C%22widget_id%22%3A%22jetpack-search-filters-2%22%2C%22filter_id%22%3A%22date_histogram_3%22%7D%5D%2C%22widget_id%22%3A%22jetpack-search-filters-2%22%7D%5D%2C%22widgetsOutsideOverlay%22%3A%5B%7B%22filters%22%3A%5B%7B%22name%22%3A%22Bylines%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22byline%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-3%22%2C%22filter_id%22%3A%22taxonomy_4%22%7D%2C%7B%22name%22%3A%22Categories%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22category%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-3%22%2C%22filter_id%22%3A%22taxonomy_5%22%7D%2C%7B%22name%22%3A%22Tags%22%2C%22type%22%3A%22taxonomy%22%2C%22taxonomy%22%3A%22post_tag%22%2C%22count%22%3A5%2C%22widget_id%22%3A%22jetpack-search-filters-3%22%2C%22filter_id%22%3A%22taxonomy_6%22%7D%2C%7B%22name%22%3A%22Year%22%2C%22type%22%3A%22date_histogram%22%2C%22count%22%3A5%2C%22field%22%3A%22post_date%22%2C%22interval%22%3A%22year%22%2C%22widget_id%22%3A%22jetpack-search-filters-3%22%2C%22filter_id%22%3A%22date_histogram_7%22%7D%5D%2C%22widget_id%22%3A%22jetpack-search-filters-3%22%7D%5D%2C%22hasNonSearchWidgets%22%3Afalse%2C%22preventTrackingCookiesReset%22%3Afalse%7D")); </script> <script src='https://code.flickr.net/wp-content/mu-plugins/jetpack-13.1/jetpack_vendor/automattic/jetpack-search/build/instant-search/jp-search.js?minify=false&#038;ver=32fdf369306ecec73d70' id='jetpack-instant-search-js'></script> <script src='//stats.wp.com/w.js?ver=202447' id='jp-tracks-js'></script> <script src='https://stats.wp.com/e-202447.js' id='jetpack-stats-js' data-wp-strategy='defer'></script> <script id="jetpack-stats-js-after" type="text/javascript"> _stq = window._stq || []; _stq.push([ "view", JSON.parse("{\"v\":\"ext\",\"blog\":\"185426273\",\"post\":\"0\",\"tz\":\"-8\",\"srv\":\"code.flickr.net\",\"hp\":\"vip\",\"j\":\"1:13.1.4\"}") ]); _stq.push([ "clickTrackerInit", "185426273", "0" ]); </script> <script async src="https://embedr.flickr.com/assets/client-code.js" charset="utf-8"></script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10