<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns="http://purl.org/rss/1.0/" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:foaf="http://xmlns.com/foaf/0.1/">
  <channel rdf:about="http://www.aaronland.info/weblog">
    <title>this is aaronland</title>
    <link>http://www.aaronland.info/weblog</link>
    <dcterms:modified>2008-08-27T09:18:15-07:00</dcterms:modified>
    <dc:creator>
      <foaf:Person>
        <foaf:name>Aaron Straup Cope</foaf:name>
        <foaf:page>http://www.aaronstraupcope.com</foaf:page>
      </foaf:Person>
    </dc:creator>
    <description>lacking allusions / invisible poetry (aka “Get a real web-browser, you lazy bum.”)</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.aaronland.info/weblog/2008/07/27/invisible#"/>
        <rdf:li rdf:resource="http://www.aaronland.info/weblog/2008/07/27/invisible#"/>
        <rdf:li rdf:resource="http://www.aaronland.info/weblog/2008/07/27/invisible#"/>
        <rdf:li rdf:resource="http://www.aaronland.info/weblog/2008/07/27/invisible#"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.aaronland.info/weblog/2008/07/27/invisible#pocketmmap">
    <link>http://www.aaronland.info/weblog/2008/07/27/invisible#pocketmmap</link>
    <title>pocketMMaps (with apologies to Andrew)</title>
    <description>
      <h:div xmlns="http://www.w3.org/1999/xhtml">
                <ins xmlns="" class="content" datetime="2008-08-27T08:00:13-0700">

                    <h1 class="geo maps modestmaps papernet pocketnet python">pocketMMaps (with apologies to Andrew)</h1>

                    <div class="image500">
                        <img src="http://farm4.static.flickr.com/3057/2803434018_c656f7675b.jpg" width="500" height="392" alt="Picture 1"/>
                    </div>

                    <p>I feel kind of bad calling them <q>pocketMMaps</q> since the name
                    is only a single, easily overlooked, letter away from the <a href="http://blog.mapufacture.com/2008/07/30/pocketmaps-paper-maps-of-dynamic-data/">pocketmaps that Andrew and Mikel built for
                    Mapufacture</a>. By the time it gets beyond being a
                    <code>0.1</code> release I may try to find a better moniker
                    but
                    since its written in Python and all the <a href="http://aaronland.info/papernet/">Papernet-related software</a> has a tradition of
                    stupid naming conventions second only to Python itself I
                    figured: Why not?</p> 
                    
                    <p>pocketMMaps is software for creating <a href="http://www.pocketmod.com/">PocketMod-style</a>
                    books for a map image too large to fit on a single page. Maps
                    are generated dynamically and then sliced in to (PocketMod) page-sized pieces and 
                    re-arranged on multiple sheets of paper so that when printed
                    and folded you get a little book with the map laid out in handy
                    2-page spreads. Just like the maps you see in the back of
                    travel guides. It may seem as though I have an obsession with
                    destroying the travel book industry but I don't, really. It's just that
                    their maps suck and their books are too big to fit in my
                    back pocket.</p>

                    <p>It works like this:</p>

                    <pre>
height = 11
width = 8.5
margin = .25
dpi = 144

bbox = (45.482882,-73.619899,45.532687,-73.547801)
zoom = 16

out = "montreal_pocketmmap.pdf"

pm = pocketMMap(height, width, margin, dpi)
pm.load_provider('<a href="http://code.flickr.com/blog/2008/08/25/flickr-heart-burning-man-heart-openstreetmap/">OPEN_STREET_MAP</a>')
pm.draw(bbox, zoom)
pm.save(out)</pre>

		   <p>When you're done, you end up with <a href="http://aaronland.info/weblog/2008/07/27/invisible/montreal_pocketmmap.pdf">a PDF file</a>.</p>

                   <div class="image500">
<a href="http://www.flickr.com/photos/straup/2778663028/" title="(take two) by     straup, on Flickr"><img src="http://farm4.static.flickr.com/3057/2778663028_da66f19866.jpg" width="500" height="375" alt="(take two)"/></a>
                   </div>

                   <p>pocketMMaps are built on the shoulders of <a href="http://modestmaps.com/">ModestMaps</a>
                   and <a href="http://modestmaps.com/examples-python-ws/">ws-compose</a>,
                   hence the MM-iness of the naMMe. Sooner rather than
                   eventually I plan to import the code in to the <a href="http://modestmaps.mapstraction.com/trac/browser/trunk/py">ModestMaps
                   Python trunk</a> but it is still very early days
                   feature-wise. The current short list looks something like
                   this:</p> 

                   <ul class="rel">
                       <li>Add support for markers, dots, pinwins, etc. and
                       reference indexes just like <a href="http://www.aaronland.info/weblog/2007/01/24/bacon/#pocketnet">the
                   original <q>pocketnet</q></a>
                       and <a href="http://www.aaronland.info/weblog/2008/02/05/fox/#ws-modestmaps">ws-modestmaps</a>
                       libraries.</li>

                       <li>Wrapper code, or libraries, to generate a map and
                       plot points from a source KML, GeoRSS, whatever file just like <a href="http://www.aaronland.info/weblog/2007/05/21/playa/#mmpdf">the orginal mmPDF.php
                       library</a>. Hello, <a href="http://dopplr.pbwiki.com/method:tips">Dopplr tips</a>...</li>

                       <li>Better font handling and sizing with an eye towards
                       optionally using PIL so that <a href="http://www.aaronland.info/weblog/2008/07/27/invisible#historybox">pycairo</a> is
                       not a dependency.</li>

                       <li>Try and reconcile some of the more eggregious uses of
                       <code>lib_copy_and_paste</code> back in to either the
                       wscompose or ModestMaps branches.</li>

                       <li>Tangentially related, writing bloody <a href="http://docs.python.org/dist/setup-script.html">setup.py</a> files
                       for all the stuff in the ModestMaps Python trunk so you
                       don't have to run everything out of the same folder.</li>

                       <li>Support for the Metric system because, you
                       know, the whole world uses it.</li>

                       <li>Work out the gotchas and best practices for
                       especially large maps that span many sheets of
                       paper. Experience shows that a PocketMod book with
                       more than five nested sheets of paper kind of sucks.</li>

                       <li>ws-pocketmmap.</li>

                   </ul>

                   <p>In the meantime, if you are planning to spend the
                   day wandering around <a href="http://radar.oreilly.com/2008/08/flickr-burning-man-open-street-map.html">a new and unfamiliar neighbourhood and
                   just want a simple map</a> to print out and take with you, well, now you can.</p>

                   <p>Ladies and gentlemen, <a href="http://aaronland.info/python/pocketMMap/pocketMMap-0.1.tar.gz">pocketMMap.py
                   0.1</a></p>

                </ins>
            </h:div>
    </description>
  </item>
  <item rdf:about="http://www.aaronland.info/weblog/2008/07/27/invisible#flosm">
    <link>http://www.aaronland.info/weblog/2008/07/27/invisible#flosm</link>
    <title>http://icanhaz.com/flosm</title>
    <description>
      <h:div xmlns="http://www.w3.org/1999/xhtml">
                <ins xmlns="" class="content" datetime="2008-08-12T20:55:35-0700">

                    <h1 class="beijing china community flickr geo maps osm">http://icanhaz.com/flosm</h1>

                    <div class="image500">
                        <a href="http://blog.flickr.net/en/2008/08/12/around-the-world-and-back-again/"><img src="http://farm4.static.flickr.com/3257/2757842491_06182d7cae_o.png" width="548" height="634" alt="OSM maps for Beijing on Flickr"/></a>
                    </div>

                    <p>No, really.</p>
                </ins>
            </h:div>
    </description>
  </item>
  <item rdf:about="http://www.aaronland.info/weblog/2008/07/27/invisible#corrections">
    <link>http://www.aaronland.info/weblog/2008/07/27/invisible#corrections</link>
    <title>Dispatches From A
                    Town Called Patience</title>
    <description>
      <h:div xmlns="http://www.w3.org/1999/xhtml">
                <ins xmlns="" class="content" datetime="2008-08-09T12:21:34-0700">

                    <h1 class="airports community flickr geo maps reversegeocoding whosonfirst woe">Dispatches From A
                    Town Called Patience</h1>

                    <p>Depending on how charitable you are feeling <q>corrections</q> in Flickr are either an admission of
                    failure or
                    an embrace of everything good about community-driven data and
                    neo-geography.</p>

                    <p>A little bit of history:</p>

                    <div class="image500">
                        <a href="http://2007.xtech.org/public/schedule/detail/193" title="You are here: Creating location based services"><img src="http://farm4.static.flickr.com/3145/2746884889_78c3b4e001.jpg" width="500" height="384" alt="Hamster's                                                                                           talk                                                                                           at                                                                                            XTech 2007                                                                                           "/></a>
                    </div>

                    <p>The <a href="http://2007.xtech.org/public/schedule/detail/193">next two slides</a> go on to say <q>You
                    won't get more precise than neighbourhood</q> followed by
                    the even more depressing <q>Turning coordinates into
                    something useful is hard</q>. I don't remember how long it
                    had been since we'd finally stopped displaying
                    neighbourhoods for geotagged photos on Flickr when <a href="http://www.paranoidfish.org/">Paul</a>
                    gave that <a href="http://adactio.com/journal/1290/?magnolia-tag=xtech">presentation</a> but it highlighted why we
                    did.</p> 

                    <p>The reality is that we have always been surprisingly
                    successful at determining a photo's neighbourhood but
                    there have also always been mistakes and no one is very
                    tolerant of mistakes about <q>place</q>. Between
                    plane-living and the
                    Internets we may be midway
                    through the process of distilling every place on Earth down
                    to <a href="http://twitter.com/plasticbagUK/statuses/870239659">one
                    of a half-dozen archetypal city-states</a> but until that
                    happens trying to affect a person's relationship to the history
                    and geography of whatever piece of dirt they call home will
                    continue to be a source of tension.</p> 

                    <p>Or, if you went to ETech in 2007, being told your photos
                    were taken in the San Diego County Jail. <a href="http://lists.w3.org/Archives/Public/public-geolocation/2008Jun/0059.html">In a note to the W3C's mailing list on
                    geolocation APIs</a> on the subject of reverse-geocoding, I wrote:</p>

                    <blockquote class="hier">
                        <p>There is always going to be a bias of interpretation in the 
                        hierarchy of relationships you choose. This is okay, really.</p>
                        
                        <p>The simplest example is to contrast the way that Flickr and 
                        FireEagle handle <q>localities</q> since the two sites share an almost exact 
                        hierarchy of places. Flickr treats anything with neighbourhoods as a 
                        locality so in our model <a href="http://flickr.com/places/United+States/California/Duncans+Mills">Duncans
                        Mills, CA</a> (pop. 84) and <a href="http://flickr.com/places/Mexico/Distrito+Federal/Mexico+City">Mexico City</a> 
                        (pop. 19M) are assumed to be the same "type" of place.</p>
                        
                        <p>FireEagle does not. If you authorize an application to know your 
                        whereabouts at a <q>city</q> level there is an expectation that your actual 
                        location will be suitably fuzzed (assuming that
                        you share an expectation that cities are <q>big</q>) and in a town of 84 people 
                        there's not a lot of room to get fuzzy in.</p>

                        <p>Never mind so-called disputed places (Kashmir, the West Bank, Cyprus, 
                        etc.) all neighbourhoods are <q>disputed</q> around the edges. (This is often 
                        true of localities, as well.)</p>
                        
                        <p>For example, the rough consensus in San Francisco is that Delores street 
                        is the dividing line between the Mission and Noe Valley. That said there 
                        are those people who may live on the one side of the line and very much 
                        believe themselves to be living on the "other". <em>Our experience has been 
                        that there are few better ways to pick a fight than to tell someone what 
                        neighbourhood they are in (and being wrong).</em></p>
                        
                        <p>There is also the problem where the data simply doesn't exist yet or it 
                        is just old and dusty, sometimes wrong, and often plain weird : 
                        <a href="http://en.wikipedia.org/wiki/Manhattan_Valley">Manhattan Valley</a>, anyone?</p>
                    </blockquote>

                    <p>Multiply that by 80 million geotagged photos.</p>

                    <p>This is mostly what Dan and I were talking about when <a href="http://www.aaronland.info/weblog/2008/05/17/good/#thursday">we 
                    two-man-luged our way through a talk about reverse-geocoding</a>
                    at Where 2.0 this spring : Even if we did have a giant database
                    mapping every point on the planet (multipled by decimal
                    degrees, multiplied again by <q>zoom</q> levels) to a place
                    people still wouldn't agree on its contents.</p>

                    <p>As useful as the frustration of having photos geotagged
                    in my aparment show up in Noe Valley was to understanding
                    and improving some of the issues involved in making this
                    stuff work <em>at all</em> there is only so much human
                    subtlety you can, literally, codify in to a
                    computer program.</p>

                    <p>What if instead of simply trying to keep pace with all of
                    human history and predujice as a series of cascading
                    <code>if/else</code> statements we laid our cards —
                    the places that we think a pair of latitude and longitude
                    coordinates might be — on the
                    table and if we get it wrong give people the chance to
                    tell us what they meant and to learn from that? What if the
                    next time you geotagged a photo we compared where we think
                    that place is against the places that you've <em>told us</em>
                    are nearby? If not you, then your contacts? What if every
                    single person on Flickr points out that a neighbourhood, or
                    town, is just plain wrong?</p>

                    <div class="image500">
                        <a href="http://code.flickr.com/blog/2008/08/08/location-keeping-it-real-on-the-streets-yo/">
                        <img src="http://farm4.static.flickr.com/3171/2747559327_f341a8c40b_o.png" width="489" height="402" alt="Picture 1"/>
                        </a>
                    </div>

                    <p>Dan has written a pair of good <a href="http://blog.flickr.net/en/2008/08/08/introducing-a-new-way-to-geotag/">blog posts</a> describing
                    the nuts and bolts of how <q>corrections</q> works and in <a href="http://code.flickr.com/blog/2008/08/08/location-keeping-it-real-on-the-streets-yo/">the nerdier of
                    the two</a> he sums it up nicely by saying:</p>

                    <blockquote class="hier">
                        <p>On a slightly more philosophical level, it’s a never
                        ending process. We’ll never reach a point where we can
                        say “Right that’s in, all borders between places have
                        been decided”. But what we should end up with are
                        boundaries as defined by Flickr users.</p>

                        <p>...</p>

                        <p>For us, it’s a first small step into an experiment, and actually a pretty big
                        experiment as we’re potentially accepting “corrections” from our millions and
                        millions of users. We’re not quite sure how it’ll all turn out, but we’re armed
                        with Maths, Algorithms and kitten photos.</p>
                    </blockquote>

                    <p>For a lot of reasons (most good, some bad) corrections
                    took a long time to make it out the door. Then again, so did
                    geotagging itself and the important part is that it's
                    out. We
                    haven't deployed any of the code to test for nearby 
                    corrections since it's a bit of a chicken and egg problem
                    without, well, corrected data but that should follow soon
                    enough. It's a small thing, more like polish and detailing
                    than a full-on feature, and like <a href="http://code.flickr.com/blog/2008/07/18/wildcard-machine-tag-urls/">machine tags</a> 
                    I don't expect people to get excited about
                    it, right away, but once they need it I hope it will shine
                    for them.</p> 

                    <p>And we've started displaying neighbourhoods again.</p>

                    <div class="image500" style="margin-left:240px;border:1px dotted #ccc; padding:10px;max-width:240px;">
<object type="application/x-shockwave-flash" width="240" height="180" data="http://www.flickr.com/apps/video/stewart.swf?v=55430" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" style=""> <param name="flashvars" value="intl_lang=en-us&amp;photo_secret=2668fd4598&amp;photo_id=2561027599"/>
<param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=55430"/>
<param name="bgcolor" value="#000000"/> <param name="allowFullScreen" value="true"/><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=55430" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;photo_secret=2668fd4598&amp;photo_id=2561027599" height="180" width="240"/></object>
                    </div>

                    <p>If corrections were difficult to explain to people,
                    describing the changes to way we handle airports — and
                    why we should even bother — was often like talking
                    to people in whale-song. Very quietly, last May, we updated
                    the reverse-geocoding logic to stop looking for the nearest
                    town when a photo is geotagged at an airport and instead
                    treat the airport itself <em>as</em> the town. The <a href="http://www.flickr.com/places">Places</a> pages were
                    all updated accordingly and now you can type in
                    <code>/places/3-LETTER-AIRPORT-CODE</code> and it will
                    pretty much do what you expect (barring those places that
                    need to be corrected, of which there are inevitably a
                    few).</p>

                    <p>We did this not (only) because I have long read and
                    admired the work of <a href="http://www.jgballard.com/airports.htm">J.G. Ballard</a>
                    but because it is the right thing to do. Though,
                    administratively, airports are generally associated with a
                    single municipal or regional entity they often serve a
                    range of towns and cities and the realities of contemporary
                    travel mean that they have evolved from being simple
                    gateways to <a href="http://books.google.com/books?id=Pp2vlbgmvJEC&amp;dq=airspaces&amp;source=gbs_summary_s&amp;cad=0">captial-P places</a> with their own culture, norms and
                    gravity.</p>

                    <div class="image500">
                        <a href="http://www.flickr.com/photos/61596789@N00/2642314900" title="Picture 1 by straup, on Flickr"><img src="http://farm4.static.flickr.com/3126/2746863015_b1986d6b6c.jpg" width="500" height="382" alt="Picture                            1"/></a>
                    </div>

                    <p> Whatever an airport may be for accounting
                    purposes it rarely matches contemporary expectations and experience; no one
                    wants to see pictures of <a href="http://www.hounslow.gov.uk/">Hounslow</a> when they go
                    to <a href="http://flickr.com/places/LHR">London Heathrow
                    Airport</a> and vice versa. The <a href="http://flickr.com/places/United+Kingdom/England/Hounslow">
                    latter still happens</a> unfortunately but the hope is that
                    by adding airport and corrections <q>knobs</q> (and a few
                    others still too soon to talk about) that users can adjust
                    things to their understanding of the world and 
                    we can begin to map facts on the ground rather than from on
                    high.</p>

                </ins>
            </h:div>
    </description>
  </item>
  <item rdf:about="http://www.aaronland.info/weblog/2008/07/27/invisible#historybox">
    <link>http://www.aaronland.info/weblog/2008/07/27/invisible#historybox</link>
    <title>History Boxes</title>
    <description>
      <h:div xmlns="http://www.w3.org/1999/xhtml">
                <ins xmlns="" class="content" datetime="2008-07-27T18:09:51-0700">

                    <h1 class="commons flickr geo maps modestmaps papernet perl                                python travel">History Boxes</h1>

                    <div class="image500">
                        <a href="http://www.flickr.com/photos/straup/2699497744/" title="200807241670.jpg by straup, on Flickr">
                        <img src="http://farm4.static.flickr.com/3123/2699497744_72e683683c.jpg" width="500" height="375" alt="200807241670.jpg"/></a>
                    </div>

                    <p>Two years ago, <a href="http://www.flickr.com/photos/straup/sets/72057594141964933/">we
                    went to Europe</a> and when we came back I made a book. Last
                    year, <a href="">we went to Europe</a> and when we came back
                    I made a book with maps. That was the germ which started <a href="http://www.aaronland.info/weblog/2007/06/08/pynchonite/#net-flickr-geo">Net:Flickr::Geo</a>
                    and later <a href="http://www.aaronland.info/weblog/2008/02/05/fox/#ws-modestmaps">my
                involvement with Modest Maps</a>.</p>

                <p>We <a href="http://flickr.com/photos/straup/sets/72157605484879954/">went
            to Europe again</a> this year and I left knowing that when we got
            back I would make
                another book, with fancy dithered maps, but
                that's as much as I'd thought about it. During the last two trips I
                had done a lot of work to position and render multiple images which
                ultimately ended with <q><a href="http://www.flickr.com/photos/mroth/2242281931/">poster maps</a></q>, a single large scale
                representation of a group of photos. As pleased as I am with <a href="http://flickr.com/photos/straup/2242308421/">poster
                maps</a> they are only good when played loud and not necessarily
                the best way to share photos from a <q>trip</q>.</p> 
 
                <div style="float:right;margin-left:20px; width:466px;max-width:466px;">
                    <a href="http://www.flickr.com/photos/straup/2708089989/" title="Nave, St. Andrew's (now and then) by straup, on Flickr">
                    <img src="http://farm4.static.flickr.com/3237/2708089989_4cff06d024_b.jpg" width="446" height="1024" alt="Nave, St. Andrew's (now and then)" style="border:1px dotted #ccc;padding:10px;"/></a>

                    <div style="margin-top:10px;font-family:sans-serif;font-size:10px;margin-bottom:10px">Photos, licensed under the <a href="http://flickr.com/creativecommons">Creative Commons</a> or
                the <a href="http://www.flickr.com/commons">No Known
                Copyright</a> licenses are by: <a href="http://www.flickr.com/photos/86537625@N00">Aaron
                Gustafson</a>, <a href="http://www.flickr.com/photos/10087938@N02">bennovakovic</a>,
                <a href="http://www.flickr.com/photos/20688578@N00">VirtualErn</a>,
                <a href="http://www.flickr.com/photos/99165974@N00">SneakyFeet</a>,
                <a href="http://www.flickr.com/photos/98983159@N00">Lachlan
                Hardy</a>, <a href="http://www.flickr.com/photos/24785917@N03">Powerhouse
                Museum Collection</a>, <a href="http://www.flickr.com/photos/10855397@N02">festivefrog</a>,
                <a href="http://www.flickr.com/photos/19349404@N00">goosmurf</a>
                and <a href="http://www.flickr.com/photos/14532742@N07">another_activist</a>.</div>

                </div>

                <p>Lack of wall space aside I also don't want to look at this stuff
                every day let alone be forced to stand up while I'm doing
                it. Having a book idling around the living room means I can pick
                it up and poke through while I'm on the phone or carry them in
                to the kitchen when I am feeling all weepy-eyed and nostaglic.</p>

                <p>I also now have <a href="http://flickr.com/photos/straup/collections/72157600011693939/">three
                years and just over as many books worth of photos from
                Europe</a> at this point. Since 
                I am a creature of habit many of the pictures are taken in
                proximity to one another so I thought it would be nice to create a poster
                map for a single photo, instead of a photo set, and show it in
                the <a href="http://flickr.com/photos/straup/2599169278/in/photostream/">nested among all the other photos that I had taken nearby,
                over time</a>.</p>

                <p><a href="http://flickr.com/photos/straup/tags/clustermap/">Cluster
                maps</a> for lack of any better name.</p>

                <p>I am especially intrigued by the idea of generating cluster
                maps year over year and watching the spaces that I revisit
                gradually fill in with the echoes of the past. A sort of slowed down
                timeline done in book form where jumping through the layers
                means putting one down one book and picking up another.</p>

                <p>This eventually led to <q>historical</q> cluster maps, like the one
                of <a href="http://www.flickr.com/photos/powerhouse_museum/2447194401/">the
                nave at St. Andrew's cathedral in downtown Sydney</a> shown to your
                right. Historical because it blends the results of two queries
                for nearby photos. The first, (n) days on either side of when
                the source photo was taken. The second, photos taken an equal
                numbers of days since right now.</p>

                <p>Cluster maps are not really suited to the firehose of photos
                available on Flickr since they mostly just end up being as large or
                larger than poster maps. As they are also constrained
                to a small area geographically (typically a 1km radius) you also run in to the problem
                where they are <q>raining</q> pinwins. What you're seeing in the
                cluster map of St. Andrew's are only photos that
                properly licensed for this sort of thing so you can imagine
                how many photos you'd get if you decided to not play by the
                rules (don't do that). </p>

                <p>At least not for print, anyway. This sort of thing might
                sing in the hands of a good Flash developer. Either way it was a
                pleasant exercise in visualizing the <q>history box</q> that
                Flickr has become. It always a bit frustrating talking to people
                — especially people who make hardware because that part is
                <a href="http://mike.teczno.com/notes/arduino-atkinson.html">still
                honest-to-god hard</a> — and pointing out that if they
                sent us a bounding box (via the <a href="http://www.flickr.com/services/api/">API</a>) we'd send them pictures! And getting
                blank stares.</p>

                <p>The thing that's kind of awesome about having 80
                million geotagged photos (give or take) most of which are public
                at a time when location aware devices are becoming useful enough
                to bother carrying around is that every (<q>every</q>) place on
                Earth becomes a kind of <a href="http://www.npr.org/templates/story/story.php?storyId=4244994">Auggie
                Wren portal</a>.</p>

                <p>If you think relentless chatter about <a href="http://www.aaronland.info/papernet">the
                Papernet</a> is bad I've been obsessed with Paul Auster's story
                about the shop owner who photographs one corner in Brooklyn
                every day for 20 years since I read it, well, just about 20
                years ago. I love that there is record of a shared experience of
                place with a complete stranger and I love to see how <a href="http://www.openstreetmap.org/user/Mark%20Williamson/diary/2629">the
                contours</a> have expanded and contracted. I love that the network
                explodes the notion of a photo album in to an omnipresence and 
                allow me to go for a walk with the past and — to
                simultaneously borrow and abuse
                <a href="http://flickr.com/photos/tags/neb/clusters/bencerveny-portrait/">Neb</a>'s
                observation — wrap the present in an onion-skin of subjectivities.</p>

                <div style="margin-left:220px;">

                    <a href="http://www.slideshare.net/blackbeltjones/designing-for-spacetime-ixda08" title="Designing for Spacetime, by Matt Jones"><img src="http://farm4.static.flickr.com/3063/2727329566_563ee0ff8e_m.jpg" width="240" height="197" alt="Picture                                                                                      1" style="border:1px                                                                                      dotted                                                                                      #ccc;                         padding:10px;"/></a>
                </div>

                <p>Well, that's the idea anyway.</p>

                <div style="margin-left:240px;">
                    <a href="http://www.flickr.com/photos/heather/2439476273/"><img src="http://farm3.static.flickr.com/2049/2439476273_57ac0fdd14_m.jpg" height="240" width="196" style="border:1px                         dotted #ccc; padding:10px;"/></a>
                </div>

                <p>The first pass will probably suck because the current vogue for
                so-called <a href="http://varnelis.net/articles/architecture_for_hertzian_space">Hertzian
                spaces</a> doesn't leave much room for anything except
                devices (or worse, optical-cum-neuro implants) nevermind the imagination. I had a conversation with <a href="http://visitsteve.com/">Steve
                Lambert</a> a while back about wanting to something along the lines of the <a href="http://antiadvertisingagency.com/our-mission">Anti-Advertising
                Agency</a>, to string up fast and cheap displays aroung the city
                to show nearby geotagged photos; real-live history boxes. He
                suggested using white-box ATM machines.</p>

                <p>Rather than devices which live in and are always announcing a perpetual present, maybe finding a
                norm and a practice to give all those dumb terminals that
                surround us the ability to display an awareness of their
                environment — nearby geotagged photos or something like a
                non-creepy version of
                <a href="http://radar.oreilly.com/2008/05/the-results-of-reality-mining.html">Leonard's
                BlueBall hack</a> as quasi screensavers on ATM displays — would be more fun, more compelling and more
                meaningful than a crush of people bumping in to each
                other as they awkwardly transpose their personal iPhone space on
                to the physical world.</p>

                <div class="image500">
                    <a href="http://en.battlestarwiki.org/wiki/Hybrid_utterances"><img src="http://farm3.static.flickr.com/2322/2727806100_def068e9e9.jpg" height="337" width="500"/></a>
                </div>

                <p>Which is a very long way of saying: The first part was <a href="http://tech.groups.yahoo.com/group/yws-flickr/message/4146">to
                    get radial queries working in the Flickr API</a>.</p>

                    <p>It only
                took 18 months following <a href="http://blog.flickr.net/en/2006/08/28/great-shot-whered-you-take-that/">the release of geotagging</a> so it is
                extra wonderful to see it become part of applications like <a href="http://www.connectedflow.com/blog/?p=98">Frasier
                Spier's Exposure</a> so quickly and 
                    <a href="http://twitter.com/mattb/statuses/862076966">Matt</a>
                    and <a href="http://designswarm.com/blog/2008/07/18/uneasy-intimacies/">Alex</a>'s
                    subsequent comments are the icing on the cake. The iPhone <a href="http://norman.walsh.name/2008/08/04/iPhone">may not save us</a> but
                we have to start somewhere (the peanut gallery should refer to my
                comments about hardware vendors above) and this sort of stuff is what makes
                it all worth it on both the good days and the bad days.</p>

                <p>Technically you've always been able to do something like
                radial queries using plain old bounding boxes but this ignores
                two truths. First, that bounding boxes are boring when they're
                not hard. Second, if you wanted to sort by proximity to the
                center of the box you needed to so manually which meant fetching
                all the results in advance of doing anything with
                them (like sorting them by distance). Pagination is hard when it's not boring.</p>

                <p>There's a lot to be said for just being able to do this:</p>

                <pre>

my $flickr = Net::Flickr::API-&gt;new(...);

my $photos = $flickr-&gt;api_call({
	'method' =&gt; 'flickr.photos.search',
	'args' =&gt; {
        	'lat' =&gt; 37.785377, 'lon' =&gt; -122.414852,
                'radius' =&gt; 2, 'tags' =&gt; 'kittens',
                'page' =&gt; 1, 'per_page' =&gt; 15,
	},
});  
                </pre>

                <p>With that problem out of the way I started the work of
                updating <a href="http://search.cpan.org/dist/Net-Flickr-Geo/">Net::Flickr::Geo</a> to fetch and layout all
                the photos.</p>

                <p>The choice to use the square (75 x 75 pixel)
                thumbnail for nearby photos was largely dictated by proximty of
                all the images to one another and to limit, as much as possible,
                the goal of preventing overlaps from sending everything shooting
                off the map. For that same reason thumbnails that share the same
                latitude and longitude and clumped together in single pinwin
                whose size is determined by the square root (and some fussing)
                of the total number of images.</p>

                    <div style="float:left; margin-right:20px;margin-bottom:10px;">
                        <a href="http://www.flickr.com/photos/straup/2599411504/" title="cluster map                                                                                          (for neb) by straup, on Flickr"><img src="http://farm4.static.flickr.com/3162/2599411504_d1f063ca59.jpg" width="500" height="476" alt="cluster                                                                                          map                                                                                          (for                                                                                      neb)" style="padding:10px;                             border:1px dotted #ccc;"/></a>
                    </div>

                <p>Like poster maps, cluster maps enforce the
                <a href="http://modestmaps.com/examples-python-ws/advanced/">ws-modestmaps</a> <code>bbox</code> method which says: Just get me
                all the tiles you need to display this bounding box at this zoom
                level. At some point, when there are tiles so granular you could
                read the morning's paper on them it should be possible use
                larger sized thumbnails and still stay within the map's
                <q>canvas</q> but not yet. There is still a maximum density (or clustering)
                after which point the map is dwarfed by the space needed to plot
                all the pinwins and there is no room left for anything interesting.</p>

                <p>The bounding box used to fetch the tiles is not the
                circle-squared of the radius but rather the furthest points of
                the entire result set. This means that the principal
                photo in a cluster map may not always be centered. I suppose it would easy
                enough to make this optional but at least in a book context with
                many cluster maps I like the variety of composition this adds to
                the collection of images.</p>

                <p>All things being equal, that's pretty much all there was to
                it. Dream up a new layout and ordering for the photos, update the Flickr API
                (would that it were always so easy) and tweak the code that
                calls it. Profit!</p> 

                <p>It's just that when I was generating test maps of photos from
                the <a href="http://flickr.com/photos/straup/sets/72157604100661498/">trip to SXSW this year</a> I couldn't help but
                notice (again) how ugly and <q>jaggy</q> the taller anchors for
                the pinwins were. Having long threatened to update ws-modestmaps
                to (optionally) use <a href="http://www.cairographics.org/pycairo/">the Python bindings for the Cairo vector
                graphics library</a> I figured that if I was going to spend the
                money to have a nice book printed I might as well also spend the
                time to create properly aliased pinwins.</p>
                
                <pre>
  22 |# DANGER WILL ROBINSON : YOU ARE ABOUT TO
  23 |# ENCOUNTER CODE THAT WILL MAKE YOU WEEP.
  24 |# I KNOW. I CRY EVERY TIME I LOOK AT IT.</pre>
                
                <p>That is from the top of the library that was generating the
                pinwins when I began. The only kind thing I can say about it is that it
                somehow managed to work for as long as it has without completely
                failing. It's two biggest problems were that it was originally
                developed in tandem with the rest of the ws-modestmaps code and
                carried all the scars of the many, various attempts to get
                everything working and was an absolute clusterfuck of best guesses
                and approximations for generating perspective shadows in the
                absence of being able to work out the matrix math to do it the
                right way. Math is hard and I chose to go shopping.</p> 

                <p>Of course, the first thing I did was try a straight,
                brute force, port of all the old cruft to Cairo. This worked
                well until I got to the part with the shadows, specifically
                rendering the rounded corners in perspective. The problem I've
                always had with matrix math (used to calculate all the various
                parameters needed to do stuff like a persective transformation)
                is the absence of any documentation that doesn't involve Math
                Shapes. I can find lots of example <q>code</q> but it seems to
                exist only in a theoritical world where demonstrating the
                concepts using actual numbers as inputs and outputs seems to be
                tantamount to admitting defeat.</p>

                <p>That's the bad news. The worse news was that reproducing the
                original pinwin shadow kludge, done using <a href="http://www.pythonware.com/products/pil/">the Python
                Imaging Library</a> in pycairo would be even uglier and I
                would have to live with the shame of having knowingly littered
                the world with such shitty and brittle code not once but
                twice. This isn't a <q>I was so dumb back then</q> scenario but
                rather <q>hear no evil, see no evil</q> material.</p>

                <div style="float:right;margin-left:30px;margin-bottom:10px;">
                    <img src="http://farm4.static.flickr.com/3083/2732558892_c62bd59005_o.png" height="445" width="376"/>
                </div>

                <p>After about two weeks of chipping away at a whole series of
                mostly incomprehensible matrix-related <q>tutorials</q> and
                one invaluable mailing list message written in plain English
                (which I've managed to misplace in the interim) I was able to
                glean just enough information to start doing tests where I could
                finally see the relationship between all these goofy-ass variables 
                and the actual thing I was creating.</p>

                <p>Because there's a lot to be said for just being able to do this:</p>

                <pre>
m = PinwinMarker(240, 180, 50)
m.cartoon_shadows = False

m.draw()
m.save("pinwin.png")</pre>

			<p>If you look carefully you may notice that
                        the shadows still seem a little odd near the base of the
                        anchor. That's because one of the side effects of
                        blurring the shadows is that the shadow itself ends up being
                        obliterated as it approaches the point. I decided that
                        it was better to add a little bit of quirkiness (the
                        length of the anchor is extended by some factor of
                        itself before it is blurred) at the base of the anchor
                        rather than having the shadow taper off midway from the
                        canvas which is what happens when you do it the right
                        way.</p>

                        <p>(You can also choose to disable blurry shadows at
                        which point everything syncs up nices and properly
                        again.)</p> 

                        <div style="float:left;margin-right:15px;margin-top:10px;margin-bottom:10px;">
                            <img src="http://farm4.static.flickr.com/3134/2731760539_20ea626314_o.png" height="434" width="366"/>
                        </div>

                        <p>Having finally acheived a true and proper Googlesthetic (sic) I
                        ultimately opted to leave the
                        <q>cartoon</q> version with their funny butler's platter
                        on a giraffe's neck shadows as the default. Both
                        versions now use the same perspective transformation for
                        the shadow's <q>canvas</q> (the bit where the image you
                        want to display is placed) but I still think the
                        goofy shadows are warmer, less distracting and better
                        suited for cluster maps where the pinwins are often
                        floating in whitespace.</p>

                        <p>Then, just when I though I was done <a href="http://geobloggers.com/">Dan</a> pointed out that
                        the shadow from one pinwin should never fall the anchor
                        of another. Having implemented his
                        suggestion I'm not sure I still agree but it does mean that
                        when you create a pinwin you can ask for any one of
                        three layers: the canvas, the shadow or the two
                        combined. ws-modestmaps does this by default first
                        adding all the shadows and doing a second pass with the
                        pinwin canvases.</p>

                        <p>You can see the effect above, in the
                        cluster map of Sydney, near the shadow of the
                        cathedral's nave. If you're like me you may find the
                        zebra-striping and the contrast a bit too harsh and be
                        thinking about making it optional in the next code
                        release.</p>

                        <p>All for a silly photo album. Oh yeah, remember the book?</p>

                        <p>Finally, something like a month and a half after
                        getting back from Europe I had several hundred test
                        images, a book with cluster maps (and funny bluish shadows because of the
                        way blacks and greys are printed these days) and all the code to
                        generate them committed to the CPAN and the ModestMaps SVN
                        tree. That is:</p>

			<ul class="rel" clear="all">
                            <li><a href="http://search.cpan.org/dist/Net-Flickr-Geo-0.72/">Net::Flickr::Geo.pm
                            0.72</a> — this contains <a href="http://search.cpan.org/dist/Net-Flickr-Geo/lib/Net/Flickr/Geo/ModestMaps.pm#CLUSTER_MAPS">new methods to 
                            generate cluster maps</a> for a single photo, an
                            entire photoset or an <q>historical</q> cluster map
                            for a photo.</li>
                            <li><a href="http://modestmaps.mapstraction.com/svn/trunk/py/wscompose/">ModestMaps,
                            rev. 637</a> — this contains no user-facing
                            changes, beside the way the shadows are drawn. Under
                            the hood ws-modestmaps will silently check to see if
                            <a href="http://www.cairographics.org/pycairo/">pycairo</a> is available and use it if
                            it is. The new pinwin code comes with a bunch of
                            knobs and toggles which I would like to expose in
                            ws-modestmaps but that is going to wait until I get
                            around to making the core service <a href="http://www.wsgi.org/wsgi/">WSGI</a> compliant.</li>
                        </ul>

                        <p>Two other packages have been released separately,
                        though they are both installed automatically as a
                        dependency or included by default with the software
                        listed above. They are:</p>

			<ul class="rel">
                            <li><a href="http://search.cpan.org/dist/Net-ModestMaps-1.1.tar.gz">Net::ModestMaps.pm
                            1.1</a> — a simple wrapper object for calling
                            a ws-modestmaps server in Perl (and preventing <a href="http://search.cpan.org/dist/libwww-perl/lib/LWP/UserAgent.pm">LWP::UserAgent</a> from freaking out when
                            it's passed several hundred HTTP response headers).</li>
                            <li><a href="http://aaronland.info/python/pwmarker/pymarker-1.0.tar.gz">pwmarker.py
                            1.0</a> — all the pinwin code discussed above
                            but packaged independently of Modest Maps. This will
                            work with both the Python Imaging Library or the
                            Python Cairo bindings but in either case requires
                            the former.</li>
                        </ul>

                        <div class="image500">
<a href="http://www.flickr.com/photos/straup/1661172522/" title="Untitled Peninsula #1192924160 by straup, on Flickr"><img src="http://farm3.static.flickr.com/2214/1661172522_057ab90859.jpg" width="500" height="375" alt="Untitled Peninsula #1192924160"/></a>
                        </div>

                        <p>Having recently had to rebuild my laptop from scratch
                        I can attest to the part where none of this is a simple
                        one-click install yet. My only defence is that there are only so many hours in
                        the day and these are the stars I am looking at, right now. If it's any help, at least on a
                        Mac it's a reasonably straightforward albeit lengthy
                        process using <a href="http://www.macports.org/">MacPorts</a> and the <a href="http://search.cpan.org/">CPAN</a> (assuming of
                        course you've also installed the OS X developer tools). These are some
                        of my notes:</p>

                        <pre>
# py25-cairo (macports; this will install Python)

# py25-pil (macports)

# libgd2 (macports; this will install Perl for some crazy reason)

# p5-GD (macports)

# p5-XML-LibXML (macports)

# p5-XML-XPath (macports; installs p5-XML-Parser)

# symlink all your Perl and Python related binaries from /opt/local/bin
  to /usr/bin and /usr/local/bin

# Bundle::CPAN (cpan)

# force install Geo::Distance (cpan; there's a bad test that I need to work
  around in N:F:G)

# Net::Flickr::Geo (cpan; installs the remaining Perl modules)</pre>

			<p>Software is for humans, right?</p>

			<p>Meanwhile, while all that was going on Andrew announced that <a href="http://blog.mapufacture.com/2008/07/30/pocketmaps-paper-maps-of-dynamic-data/">Mapufacture
                        has launched their PocketMaps feature</a>, which will
                        generate <a href="http://www.aaronland.info/weblog/2007/05/21/playa/#mmpdf">mmPDF-style</a> PocketMod booklets
                        for the maps you create on their site. If I ever manage
                        to finish writing this blog post the next bits to
                        bubble to the top of list should start to see a lot of
                        the work described above rolled back in to some of the
                        earlier Papernet begets PocketMod begets *-PDF related projects where all this nonsense
                        started in the first place.</p>

                        <div class="image500">
<a href="http://www.flickr.com/photos/straup/899236402/" title="Untitled Placeholder #1185400523 by straup, on Flickr"><img src="http://farm2.static.flickr.com/1378/899236402_e747bd2d0d.jpg" width="500" height="375" alt="Untitled Placeholder #1185400523"/></a>
                        </div>

                        <p style="margin-bottom:30px;">See also: The Tate's <a href="http://www.tate.org.uk/britain/yourcollection/">Your
                        Collection</a> pamphlets. Because they are <a href="http://www.tate.org.uk/britain/yourcollection/pdf/bigmeeting.pdf">fucking awesome</a>, that's why!</p>

                </ins>
            </h:div>
    </description>
  </item>
</rdf:RDF>
