<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-9309316</id><updated>2010-03-14T18:11:17.993-07:00</updated><title type='text'>joelapenna.com/blog</title><subtitle type='html'>Don't blame me, you're the one reading this.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default?start-index=26&amp;max-results=25'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://joelapenna.com/blog/atom.xml'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>565</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9309316.post-2642256047116995186</id><published>2010-03-14T18:11:00.001-07:00</published><updated>2010-03-14T18:11:18.046-07:00</updated><title type='text'>This blog has moved</title><content type='html'>
       This blog is now located at http://blog.joelapenna.com/.
       You will be automatically redirected in 30 seconds, or you may click &lt;a href='http://blog.joelapenna.com/'&gt;here&lt;/a&gt;.

       For feed subscribers, please update your feed subscriptions to
       http://blog.joelapenna.com/feeds/posts/default.
  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-2642256047116995186?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/2642256047116995186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2010/03/this-blog-has-moved#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2642256047116995186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2642256047116995186'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2010/03/this-blog-has-moved' title='This blog has moved'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3640711657920795070</id><published>2010-02-16T23:01:00.000-08:00</published><updated>2010-02-16T23:01:05.743-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alkaline Trio'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>This Addiction</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small;"&gt;&lt;div&gt;
Alkaline Trio released Agony and Irony two years ago to much disappointment and sadness amongst my group of friends. The music was too polished, to blatent and well... you can read what I had to say here: &lt;a href="http://www.joelapenna.com/blog/2008/07/alkaline-trio-breaks-my-heart"&gt;http://www.joelapenna.com/blog/2008/07/alkaline-trio-breaks-my-heart&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Tts just been a year and a half later but I'm pretty happy with what they've put out. One thing that bothered me most at that time was the divergence between their music and my life; I think I'm OK with that divergence now and I feel like the music this time around is less redicuolus and can more generically apply to listener's lives.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Given the general theme people speak of when describing this album is its throwback to old material much of what I've written here is along those lines.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This Addiction -- The first single off the album feels like it would fit between From Here to Infirmary and Good Mourning. Simple lyrics and riffs but more melodic than their previous efforts.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dine, Dine My Darling -- Hopeful sounding song typical of Dan's newer songs (like Blue Carolina). "But these drugs are lame..." what? Its really catchy and quick and I do like the word play.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Lead Posioning -- "We're bitter now but better friends." Another catch rhythm guitar and I would love to hear this one on Rock Band. WHAT THE FUCK THERE IS A HORN. I was trying to trace the sound in this song but can't place it. Then I heard the horns. Then I heard the opening riff from "Goodbye Forever." Pretty interesting!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dead on the Floor -- I'm immediately thinking "Radio," here. "Like two ships in the night we're colliding and sinking into the black seas of our love." -- No vampires, zombies or blood references. See? A bit more subtle. &amp;nbsp;"I got off the plane with my heart soaring now its falling like snow."&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The American Scream -- The last time Alk3 wrote a politically charged song, Warbrain I felt the song made little sense. This is a nice attempt but I don't associate politically motivated songs with alk3 but I still give this song a pass.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Off the Map -- "I'll lock it down and we'll make due." A song by Dan misunderstanding a situation and going so far off course everything looks peachy but he still can't tell if things are going to be OK. I'm cool with it.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Draculina -- I didn't like the opening verse but the chorus is pleasant enough but I especially dislike "I'm leaving for draculina, whoa oh oh oh." This is probably the worst track on the album. For poor language and over-harmonizing and whoa-oh-oh-ohs I'll delete it off my computer when I buy the album.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Eating me Alive -- Hi synth. You don't belong here. No thats not true; I like the psychadelic furs and that is who I'm going to have to say the music in this song comes from. I think I might actually like this song a lot. If John hughes were around we could have a cool movie with Alk3 on the soundtrack.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Piss and Vinegar -- "Feels like its raining all the time." I've heard that lyric before and I feel like I've heard this song before... uninteresting.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Dorothy -- Awesome opening riffs that immediately cut to a song that SHOULD have been on From here to Infirmary. So good.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Fine -- A really calm song to close out the albumn and while a song I'll listen to, I'll likely never put it on intentionally.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Overall, I'd say this album is not fast enough to say they've really gone back to their roots but has some really fun songs and they're doing some new things that don't suck which is quite a change from the last album. Then again, maybe I'm just wishing the album is better than it is.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3640711657920795070?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3640711657920795070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2010/02/this-addiction#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3640711657920795070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3640711657920795070'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2010/02/this-addiction' title='This Addiction'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-1893914218010123198</id><published>2009-11-08T16:52:00.001-08:00</published><updated>2009-11-08T17:03:05.628-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android Location APIs and why they anger me</title><content type='html'>The problem lies in the fact that as a end-developer I have to care about the various location inputs on a phone. I have to think about GPS vs Wifi vs Cell Tower LocationProviders in order to really take advantage of the phone's location capabilities. What basically happened was that my algorithm for picking a users location based on incoming location updates caused more accurate but out of date location updates to be preferred over slightly less accurate but much more recent updates.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
This is the code that defines my "best location" strategy. &amp;nbsp;&lt;a href="http://code.google.com/p/foursquared/source/browse/main/src/com/joelapenna/foursquared/location/BestLocationListener.java"&gt;http://code.google.com/p/foursquared/source/browse/main/src/com/joelapenna/foursquared/location/BestLocationListener.java&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
I basically have to deal with the fact that I might get location-from-gps after I get location-from-wifi-tower OR i might &amp;nbsp;get location-from-wifi-tower after I get location-from-gps so that the Last Known location may in some cases return a more or less accurate location than what the phone is really capable of reporting just because I wanted to be able to get a quick-kind-of-accurate-lock while I was trying to accquire a accurate-as-possible sort of lock.&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
How would I make this better?&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
I could see an API where instead of registering with individual location providers, you would query the system for a set of location updates. You would define that you want FINE location, but will accept COARSE updates first. You would have a getBestKnownLocation instead of a getLastKnownLocation that would return a location based on heuristics you might define when registering your location provider. &amp;nbsp;Visually, the updates you'd receive would look something like the growing/shrinking circles you get in the gmaps app when honing in on a location. Maybe the developer would request a "HyperLocalWhileWalkingAround" strategy that could be swapped with "PassiveUpdatesWhenLocationIsSignificentlyChanged." both of which could have knobs for controlling specifics of the strategy.&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
In short, I want to abstract away the code I have shown as an example above. As a end-developer, I don't care where the location comes from, just that I get a location but I do care, what the data looks like.&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-1893914218010123198?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/1893914218010123198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/11/android-location-apis-and-why-they#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/1893914218010123198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/1893914218010123198'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/11/android-location-apis-and-why-they' title='Android Location APIs and why they anger me'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-2831427615364868982</id><published>2009-11-02T10:31:00.000-08:00</published><updated>2009-11-02T10:36:08.507-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='michigan'/><title type='text'>Nine days of Nolstaga</title><content type='html'>I had a very special nine days in the Midwest. Probably some of the best nine days in the Midwest that I can remember. Things:&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;Concert with Chris - We've been seeing shows together for almost 10 years, and its been 8 since we first saw The Lawrence Arms opening for Alkaline Trio at the 2001 Halloween show. Just wow.&lt;/li&gt;
&lt;li&gt;Zombie Crawl with Chris, Andy, Jared and others - All sorts of DSF/Chicago drinking memories coming back to life.&lt;/li&gt;
&lt;li&gt;Week at home with family - Good to see everyone. I got a night out with my brother, mom and dad. Would have been nice to spend some time with Deni, but she was sick and then back at school.&lt;/li&gt;
&lt;li&gt;Driving to Michigan with Chris and Football Master - I spent years making trips to Michigan with Chris and many others. Doing it again, despite the 6 hour drive there, was fun -- I can feel you breathing.&lt;/li&gt;
&lt;li&gt;Halloween Parties in Michigan - I hope that there are and that there are not photos of the hyjinx that ensued Friday Night to Sunday afternoon. Great times with great people.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
I swear that every time I go to the midwest its going to be my last social visit. I don't know when that will ever really happen though. Every time I go, I leave hoping that the next trip will be as good as the trip just ending.&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-2831427615364868982?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/2831427615364868982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/11/nine-days-of-nolstaga#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2831427615364868982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2831427615364868982'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/11/nine-days-of-nolstaga' title='Nine days of Nolstaga'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3535505672482925307</id><published>2009-09-08T20:40:00.000-07:00</published><updated>2009-09-08T20:40:20.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Dutch! Foursquare! Translation! Exclaimations! Are! Overdone!</title><content type='html'>I just submitted a change to the foursquare-for-android repository that enables a Dutch translation of our foursquare-for-android app! Neat! Thanks Marco!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3535505672482925307?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3535505672482925307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/09/dutch-foursquare-translation#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3535505672482925307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3535505672482925307'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/09/dutch-foursquare-translation' title='Dutch! Foursquare! Translation! Exclaimations! Are! Overdone!'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-8197898498411071340</id><published>2009-08-10T17:00:00.000-07:00</published><updated>2009-08-10T17:00:02.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Foursquared Repo</title><content type='html'>Get the code or file bugs at: &lt;a href="http://foursquared.googlecode.com/"&gt;http://foursquared.googlecode.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-8197898498411071340?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://foursquared.googlecode.com' title='Foursquared Repo'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/8197898498411071340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/08/foursquared-repo#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8197898498411071340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8197898498411071340'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/08/foursquared-repo' title='Foursquared Repo'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3095775325575075512</id><published>2009-07-21T22:24:00.000-07:00</published><updated>2009-07-21T22:24:33.301-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>git</title><content type='html'>After spending 2 nights trying to fix my git repository that I broke following instructions on line about removing files from repo history, I'm back to a state where my repo is sane and no longer contains those files I was concerned about. In the course of doing this I had decided to migrate to mercurial, but damn, &lt;pre&gt;rebase --interactive&lt;/pre&gt; is very nifty. It allowed me to pretend that the offending commits never even happened! I am still going to switch to mercurial; now that my repo is cleaned up, I should be able to be schizophrenic and switch between which ever VCS I choose&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3095775325575075512?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3095775325575075512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/git#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3095775325575075512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3095775325575075512'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/git' title='git'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-2361275357290731489</id><published>2009-07-20T11:01:00.000-07:00</published><updated>2009-07-20T11:01:47.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Foursquare Screeny</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/search_venues_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/search_venues_activity.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-2361275357290731489?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/2361275357290731489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/foursquare-screeny#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2361275357290731489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2361275357290731489'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/foursquare-screeny' title='Foursquare Screeny'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3353496623394948742</id><published>2009-07-02T23:21:00.000-07:00</published><updated>2009-07-02T23:21:10.552-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Bookmarks Live Folder</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/blog/uploaded_images/livebookmarks-755501.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/blog/uploaded_images/livebookmarks-755499.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: 'Lucida Grande', sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande', sans-serif; font-size: 14px; line-height: 15px; white-space: pre-wrap;"&gt;Want a "live folder" for bookmarks on your android home screen?&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: 'Lucida Grande', sans-serif; font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; line-height: 15px; white-space: pre-wrap;"&gt;&lt;a href="http://market.android.com/search?q=pname:com.googlecode.livebookmarks"&gt;http://market.android.com/search?q=pname:com.googlecode.livebookmarks&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3353496623394948742?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://market.android.com/search?q=pname:com.googlecode.livebookmarks' title='Bookmarks Live Folder'/><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3353496623394948742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/bookmarks-live-folder#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3353496623394948742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3353496623394948742'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/bookmarks-live-folder' title='Bookmarks Live Folder'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-7437192510072005672</id><published>2009-07-02T00:13:00.000-07:00</published><updated>2009-07-02T00:14:15.581-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>New icon for Foursquared</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/blog/uploaded_images/icon-749365.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://joelapenna.com/blog/uploaded_images/icon-749364.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a href="http://chrisbrummel.com/"&gt;Chris&lt;/a&gt; made me an awesome icon for the app. In return he got an alpha release! How lucky is that! Now for the low low cost of a line of code or cool menu icons, you too can have some buggy android software!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-7437192510072005672?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/7437192510072005672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/new-icon-for-foursquared#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/7437192510072005672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/7437192510072005672'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/new-icon-for-foursquared' title='New icon for Foursquared'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-784422188007300326</id><published>2009-07-01T23:02:00.000-07:00</published><updated>2009-07-01T23:02:02.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android, Foursquare and Push Notifications</title><content type='html'>How to get push notifications on Android.
&lt;p /&gt;

As we all are aware its possible to run apps in the background in Android. The way push notifications work for the google apps like gmail and gtalk are by way of TCP connections with long TTLs. This allows the phone to wake up intermittently as the gsm radio will do (on the measure of microseconds) to see if new data has arrived on the wire. This implementation though, requires its own backend and for each service doing it, we'd be draining the battery even further...
&lt;p /&gt;

Other work on Android Push:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://devtcg.blogspot.com/2009/01/push-services-implementing-persistent.html"&gt;Push services: Implementing persistent mobile TCP connections&lt;/a&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/android-random/source/browse/trunk/TestKeepAlive/src/org/devtcg/demo/keepalive/KeepAliveService.java?spec=svn219&amp;r=219"&gt;android-random project: KeepAliveService.java&lt;/a&gt;
&lt;/ul&gt;
&lt;p /&gt;

XMPP/Jabber is even worse. Not only is xmpp/jabber a very chatty protocol, but as it works with one long xml stream, the disconnected nature of a cell phone does not jive well with it... holding an open xmpp connection is probably a very bad idea.
&lt;p /&gt;

So where does this leave us with push notifications on Android if anything push we do is going to eat the battery and cause the user to uninstall the app?
&lt;p /&gt;

One option would be to send periodic position updates based on some limiter (the API only has a radius accuracy of no less than a mile. We wouldn't have to wake up all that frequently for the common case of people don't drive around during night time activities). Knowing this, most of the work can be done on the backend to calculate "interesting things," and for notifications, we can send the response over gtalk. Specifically gtalk because most Android phones already have that previously mentioned long-lived tcp session that we can piggy back on. The message could be something along the lines of:
&lt;p /&gt;

&amp;lt;a href="foursquare://com.playfoursquare.api.NotificationsAuthority/notification/12345?click=user"&amp;gt;Mike M.&amp;lt;/a&amp;gt; is hanging out at &amp;lt;a href="foursquare://com.playfoursquare.api.NotificationsAuthority/notification/notification/12345?click=venue"&amp;gt;Mike's Bar and Grill&amp;lt;/a&amp;gt;.
&lt;p /&gt;

Users clicking on the link would be directed to the android foursquare app, where we could display awesome information.
&lt;p /&gt;

I'd have to try this out to see if it actually works and how an android app would register as a global URI handler but it should be do-able.
&lt;p /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-784422188007300326?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/784422188007300326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/android-foursquare-and-push#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/784422188007300326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/784422188007300326'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/android-foursquare-and-push' title='Android, Foursquare and Push Notifications'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-7496874290686887270</id><published>2009-07-01T10:07:00.000-07:00</published><updated>2009-07-01T10:07:39.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Foursquared Help</title><content type='html'>I'm looking for help on foursquared.  I can start fleshing out some starter
bugs and features so that anyone interested can just jump right in and code.
&lt;p /&gt;
I've been hating git since I started using it and may end up migrating the SCM
to HG on Google Code... I just feel more comfortable with both tools... Still
not sure. If I have any external contributors it will really force my hand as I
don't want to have to deal with emailed diffs and patches.
&lt;p /&gt;
I'm not asking for testers because at the pace I'm going, the problems
and features I'm trying to implement take up my allocated time plus a
bit more.  Increasing the water hose of bug reports and feature requests
would just drown me. On the other hand, I did put together some crash
reporting infrastructure while I was on the airplane so that when I do
release, I can get automated bug reports:
&lt;a href="http://joelapenna.com/blog/labels/dumpcatcher"&gt;http://joelapenna.com/blog/labels/dumpcatcher&lt;/a&gt; (the code is at
&lt;a href="http://dumpcatcher.googlecode.com"&gt;http://dumpcatcher.googlecode.com&lt;/a&gt;)
&lt;p /&gt;
Right now I'm working on some troubling network connectivity issues (after some
period of usage, all HTTP requests start hanging). After I resolve these issues
I will be readed for limited testing... I'm content to release
non-feature-complete if only to get some people looking at the app who might be
developers.
&lt;p /&gt;
I'm thinking that feature-wise the release will include the five screens
I've sent before: &lt;a href="http://joelapenna.com/foursquared/"&gt;http://joelapenna.com/foursquared/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-7496874290686887270?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/7496874290686887270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/07/foursquared-help#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/7496874290686887270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/7496874290686887270'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/07/foursquared-help' title='Foursquared Help'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-2468276172103050365</id><published>2009-06-30T21:15:00.000-07:00</published><updated>2009-06-30T21:15:59.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Fighting LiveFolders</title><content type='html'>Cupcake introduced "Live Folders" to the android world and since then I've wondered why the phone does not come with a LiveFolder implementation for bookmarks by default. In an effort to try and get code into core-android I set out to write it, but I've been struggling with all sorts of issues.
&lt;p /&gt;
&lt;ol&gt;
&lt;li&gt; ContentProvider.query returns a CursorWrapper, not a real cursor, which means if an existing content provider does not provide a live folders implementation and you want to write your own little content provider to proxy the requests with correctly formatted responses you'll have to implement your own cursor to delegate to the cursor wrapper.

I resolved this by creating a MatrixCursor in my content provider into which I copy the columns from the BrowserProvider.
&lt;pre&gt;
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI,
                Browser.HISTORY_PROJECTION, "bookmark = 1", null, null);

        String[] liveFolderColumnNames = {
                LiveFolders._ID, LiveFolders.NAME, LiveFolders.ICON_PACKAGE,
                LiveFolders.ICON_RESOURCE,
        };
        MatrixCursor mc = new MatrixCursor(liveFolderColumnNames, c.getCount());

        int columnCount = c.getColumnNames().length;
        while (c.moveToNext()) {
            Object[] row = {
                    c.getString(Browser.HISTORY_PROJECTION_ID_INDEX),
                    c.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX),
                    getContext().getPackageName(), R.drawable.ic_launcher_shortcut_browser_bookmark
            };
            mc.addRow(row);
        }
        return mc;
    }
&lt;/pre&gt;

&lt;li&gt;I can't figure out how in hell I'm supposed to use ICON_BITMAP to set an icon for each item in the LiveFolder -- Looking at the source code it looks like its expecting a byte[], which I am in fact providing, but then the provider is having difficult constructing a bitmap out of that data and NPE's trying to (and I don't know why it is doing so) thumbnail the icon!
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-2468276172103050365?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/2468276172103050365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/fighting-livefolders#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2468276172103050365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/2468276172103050365'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/fighting-livefolders' title='Fighting LiveFolders'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3687204711299908983</id><published>2009-06-29T09:09:00.001-07:00</published><updated>2009-06-29T09:09:19.606-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Dumpcatcher: Uncaught Exceptions and Client IDs</title><content type='html'>Alright, about halfway through my flight and I now have an Uncaught exception handler that will post messages to dumpcatcher.
&lt;p /&gt;
It doesn't work with android at the momement... There is a thread I know I have to read on android-developers. I think I starred it because I knew I'd find it uuseful.
&lt;p /&gt;                                                                            
The first user of this class was going to be Foursquared, but it turns out the code I wrote doesn't work.
&lt;p /&gt;
I quickly added the ability to create a client id attached to each crash in order to allow me track each individual client and in the process refactored a bit of the code here and there. I'll have to remeber to update the design doc as I have made some changes to the design after noticing flaws in my original work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3687204711299908983?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3687204711299908983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-uncaught-exceptions-and#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3687204711299908983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3687204711299908983'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-uncaught-exceptions-and' title='Dumpcatcher: Uncaught Exceptions and Client IDs'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-5600573193364837132</id><published>2009-06-28T20:40:00.000-07:00</published><updated>2009-06-28T20:43:24.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><title type='text'>Dumpcatcher: Java Client</title><content type='html'>I'm on my way back from Cambodia... More on that later...
&lt;p /&gt;
After spending about two-three hours working on hmac signing with Java I now have a working Dumpcatcher client for Java, this is similar to the python client &lt;pre&gt;clients/python/logging/handler.py:Dumpcatcher&lt;/pre&gt; in that its usage is:
&lt;pre&gt;
Dumpcatcher dc = new Dumpcatcher(PRODUCT_KEY, SECRET, "http://localhost:8080/add", 2);
HttpResponse response = dc.sendCrash(
    new NameValuePair("short", "Some short dump"),
    new NameValuePair("long", "some long dump")
)
    assertNotNull(response);
    assertEquals(200, response.getStatusLine().getStatusCode());
&lt;/pre&gt;
&lt;p /&gt;
Have a look: &lt;a href="http://code.google.com/p/dumpcatcher/source/browse/clients/java/src/com/googlecode/dumpcatcher/logging/Dumpcatcher.java?r=20090629r0"&gt;http://code.google.com/p/dumpcatcher/source/browse/clients/java/src/com/googlecode/dumpcatcher/logging/Dumpcatcher.java?r=20090629r0&lt;/a&gt;
&lt;p /&gt;
Now onto making a logging client for this guy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-5600573193364837132?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/5600573193364837132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-java-client#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5600573193364837132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5600573193364837132'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-java-client' title='Dumpcatcher: Java Client'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-4803814661356022648</id><published>2009-06-22T21:25:00.003-07:00</published><updated>2009-06-22T22:13:15.646-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Dumpcatcher: Python Client</title><content type='html'>For the python dumpcatcher client I decided to go with the standard python logging infrastructure. While there was definitely something lacking in the python documentation for logging.py I found all the information I needed with a combination of the docs and the source code itself.

Creating a python client for the dumpcatcher is now pretty simple:

&lt;pre&gt;
import handler  # from dumpcatcher.clients.python.logging

logger = logging.getLogger('my_tag')
logger.setLevel(logging.DEBUG)  
logger.addHandler(
      DumpcatcherHandler('agtkdW1wY2F0Y2hlcnINCxIHUHJvZHVjdBgCDA',
                         '9b6c65910428419db0d0b730278b72e3',
                         'http://localhost:8080/add',
                         5))


try:
  'a' + 1  # TypeError!
except Exception, e:
  logger.exception('Oh man! Look at this!')
&lt;/pre&gt;

The output of which looks something like:
&lt;table&gt;
  &lt;tr&gt;
 &lt;td&gt;2009-06-21 06:36:57&lt;/td&gt;
 &lt;td&gt;demo&lt;/td&gt;
 &lt;td&gt;40&lt;/td&gt;
 &lt;td&gt;&lt;pre&gt;handler.py:110:broken Oh man! Look at this!&lt;/pre&gt;&lt;/td&gt;
 &lt;td&gt;&lt;pre&gt;handler.py:110:broken Oh man! Look at this!
Traceback (most recent call last):
File &amp;quot;/home/jlapenna/code/dumpcatcher/clients/python/logging/handler.py&amp;quot;, line 108, in broken
  &amp;#39;a&amp;#39; + 1
TypeError: cannot concatenate &amp;#39;str&amp;#39; and &amp;#39;int&amp;#39; objects
File &amp;quot;/home/jlapenna/code/dumpcatcher/clients/python/logging/handler.py&amp;quot;, line 110, in broken
  logger.exception(&amp;#39;Oh man! Look at this!&amp;#39;)&lt;/pre&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;


Looking at this now, it seems that all I have left is the java client and data aggregation before I'm feature complete!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-4803814661356022648?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/4803814661356022648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-python-client#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/4803814661356022648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/4803814661356022648'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-python-client' title='Dumpcatcher: Python Client'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-5001378904486120019</id><published>2009-06-22T21:24:00.000-07:00</published><updated>2009-06-22T21:24:10.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Dumpcatcher: Python HTTP and Dates libraries</title><content type='html'>Sheesh,&lt;br /&gt;&lt;br /&gt;Python really shows its age when you have to deal with dates, http and urls. I was able to implement my signing and verification bit of code just now and it was quite a pain. I have a sample client in clients/python/example.py and the endpoint/crash.Add handler should show you the inverse side of the handshake.&lt;br /&gt;&lt;br /&gt;The thing that was definitely most challenging was writing the example client. Because the python libraries for http, etc evolved over time there are about seventy-five ways to do an http request instead of python's normal "one."&lt;br /&gt;&lt;br /&gt;Same can be said for datetime modules. Long ago when we had to use mx time there was a DateTime object, now its built into python so everything should be peachy? Yeah, date handling in python was improved by this change but timezones are still outrageous! Considering I'm now about 10 hours off UTC, I have had to think about how to submit a request in string form. For now though I'm going to punt and require that times submitted are in the UTC time zone. &lt;br /&gt;&lt;br /&gt;Now that I've got that baked in, I can acutally write the code that logs the requests to the data store. After that, I need to write a bit of code to do sorting and aggregating of the crash dump data.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-5001378904486120019?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/5001378904486120019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-python-http-and-dates#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5001378904486120019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5001378904486120019'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-python-http-and-dates' title='Dumpcatcher: Python HTTP and Dates libraries'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-151129944296832978</id><published>2009-06-22T21:22:00.004-07:00</published><updated>2009-06-22T21:22:55.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Dumpcatcher: HTML</title><content type='html'>Wow, its been quite a while since I've written any HTML. Probably about one year. Its also been that long since I last used AppEngine and as a result I'm really, really rusty.&lt;br /&gt;&lt;br /&gt;I'm now about 3 hours into the hack-a-thon (on a plane instead of of a coffee shop) and I have about 10 hours of battery life remaining.&lt;br /&gt;&lt;br /&gt;Things I've learned so far:&lt;br /&gt;&lt;br /&gt;I totally forgot the basic IO operations for the app engine data store and with this kind of knowledge its actually pretty hard to re-learn -- I remember such random bits and pieces I forget which parts are bad memory or actuality.&lt;br /&gt;&lt;br /&gt;The design doc was fun to write, I had to think about a few different problems that I figured I would encounter. I even realized that my initial idea for request signing had some security vunerabilities which I had to think about how to resolve.&lt;br /&gt;&lt;br /&gt;I have one third of the whole project done, but its the smallest one third. Users are now able to register their account and create an unlimited number of products.&lt;br /&gt;&lt;br /&gt;Next, I need to write the server side component of crash logging. Eg, when a user submits a crash the request must be authorizedand then it needs to get into the datastore.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-151129944296832978?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/151129944296832978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/151129944296832978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/151129944296832978'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-html' title='Dumpcatcher: HTML'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-889973063429203135</id><published>2009-06-22T21:22:00.000-07:00</published><updated>2009-06-22T21:22:26.891-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Dumpcatcher: Design Doc</title><content type='html'>&lt;p&gt;As I do with any project at work, I want to put together a short doc describing the scope and scale at which I will write this app. &lt;/p&gt;
&lt;h1&gt;
    Summary
&lt;/h1&gt;
&lt;p&gt;Dumpcatcher is a simple web service that takes authorized requests from remote clients and logs key-value pairs in its datastore for future analysis. These pairs are typically an aribitrary identifier and an exception/stack-trace. &lt;/p&gt;
&lt;h2&gt;
    Features
&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Crash Stack Message storage &lt;/li&gt;&lt;blockquote&gt;Clients must be able to submit stack traces (well, arbitrary strings)
        along with various bits of meta-data. Version, app name, etc.
    &lt;/blockquote&gt;
    &lt;li&gt;Client libraries for Python, Java &lt;/li&gt;&lt;blockquote&gt;I am targeting my &amp;lt;a
        href=&amp;quot;&lt;a href="http://joelapenna.com/git/foursquared.git" rel="nofollow"&gt;http://joelapenna.com/git/foursquared.git&lt;/a&gt;&amp;quot;&amp;gt;Foursquared Android
        Client
        &lt;p&gt;
            &lt;span class="error"&gt;Unknown end tag for &amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;/p&gt;
        as well as any other pet projects I may use in the future.
    &lt;/blockquote&gt;
    &lt;li&gt;Data Aggregation &lt;/li&gt;&lt;blockquote&gt;I plan on allowing data aggregation by exception type, custom label and
        line.
    &lt;/blockquote&gt;
    &lt;li&gt;Authenticated Client Requests &lt;/li&gt;&lt;blockquote&gt;All requests by clients must be sent by authorized clients to prevent the
        service from becoming a black hole for spam.  Design:
    &lt;/blockquote&gt;
&lt;/ul&gt;
&lt;h2&gt;
    Design
&lt;/h2&gt;
&lt;p&gt;App Engine has a very simple data store and webapp framework that I intend to utiltize for the basic functionality of the app. &lt;/p&gt;
&lt;h3&gt;
    Users
&lt;/h3&gt;
&lt;p&gt;Users represent a single Google Id and a particular developer using the system. &lt;/p&gt;
&lt;h3&gt;
    Products
&lt;/h3&gt;
&lt;p&gt;A product is an application that uses the dumpcatcher to log crashes. A user may have multiple products. &lt;/p&gt;&lt;p&gt;Each product registered will have two values associated with it, a productKey which will be passed as a paramter in all HTTP requests to the server and a secret which will be used to HMAC sign a request. &lt;/p&gt;&lt;p&gt;Product secrets will be randomly generated UUIDs. &lt;/p&gt;
&lt;h3&gt;
    HTTP Request
&lt;/h3&gt;
&lt;p&gt;All requests to the dumpcatcher service will be secured with an HMAC hash. The hash will be keyed by a unique identifier provided to the client &lt;/p&gt;
&lt;h4&gt;
    productKey
&lt;/h4&gt;
&lt;p&gt;Each client -&amp;gt; server request will include a productKey, an identifier used to differentiate between different products using the service. &lt;/p&gt;
&lt;h4&gt;
    HMAC
&lt;/h4&gt;
&lt;p&gt;All requests must be submitted with an HMAC-SHA1 hex digest of the request query paramters as well as an increasing &amp;quot;request&amp;quot; identifer. The message consists of a standard http &amp;quot;query&amp;quot;, sorted by keyname and quoted, request &lt;/p&gt;
&lt;p&gt;
    For: &lt;a href="http://localhost/add?product_keyd=1234&amp;amp;some=pair&amp;amp;other=pair" rel="nofollow"&gt;http://localhost/add?product_keyd=1234&amp;amp;some=pair&amp;amp;other=pair&lt;/a&gt; we would construct the digest like so: 
&lt;/p&gt;
&lt;p&gt;TODO(jlapenna): Probably don&amp;#x27;t want to split on &amp;amp; if the contents of the request might contain one though, they should already be encoded. Something like that... &lt;/p&gt;&lt;blockquote&gt;sorted_query = &amp;#x27;&amp;#x27;.join(sorted(request.query_string.split(&amp;#x27;&amp;amp;&amp;#x27;)))
    hash = hmac.new(&amp;#x27;SOME KEY&amp;#x27;, sorted_query, hashlib.SHA1)
&lt;/blockquote&gt;
&lt;p&gt;
    And, as such, the actual request made to the server will be: 
    &lt;blockquote&gt;
        &amp;#x27;&lt;a href="http://localhost/add?product_key=12345&amp;amp;some=pair&amp;amp;other=pair&amp;amp;hmac=%(hash)s" rel="nofollow"&gt;http://localhost/add?product_key=12345&amp;amp;some=pair&amp;amp;other=pair&amp;amp;hmac=%(hash)s&lt;/a&gt;&amp;#x27;
    &lt;/blockquote&gt;
&lt;/p&gt;
&lt;p&gt;On the backend the server will take the reverse steps and using the secret associated with the provided productKey, will verify the authenticity of the request by encoding the query paramters the same way it is done on the client, keying the result by secret associated with the provided productKey. &lt;/p&gt;
&lt;h3&gt;
    Datastore
&lt;/h3&gt;
&lt;p&gt;Initially there will be three models, one corresponding to &amp;quot;crashes,&amp;quot; another to &amp;quot;users&amp;quot; and the third to &amp;quot;products.&amp;quot; &lt;/p&gt;&lt;p&gt;Each user will be associated with a specific Google ID but a single Google ID can have many products. &lt;/p&gt;
&lt;h3&gt;
    Security
&lt;/h3&gt;
&lt;p&gt;Security and validity of client-&amp;gt; server requests will be handled via the usage of HTTPS for securing communications and for HMAC to verify authenticity of a client request. &lt;/p&gt;
&lt;h4&gt;
    Replay Attack
&lt;/h4&gt;
&lt;p&gt;An attacker with access to the HTTP stream a client -&amp;gt; server request is sent over will be able to execute a replay attack by capturing the HTTP post made by the client and submitting it as its own, at any rate he so desires. &lt;/p&gt;&lt;p&gt;The solution as such is to only allow requests over HTTPS. This gains the added advantage of preventing any private data from leaking via a network observer packet sniffing. &lt;/p&gt;
&lt;h2&gt;
    Caveats
&lt;/h2&gt;
&lt;p&gt;It is likely and highly reasonable that an app like this exists in a highly more polished and featureful way. I chose this project because I felt like it would be a good way to explore some new technologies and have a fun time; not because this is in any way &amp;quot;new&amp;quot; or &amp;quot;exciting&amp;quot; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-889973063429203135?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/889973063429203135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-design-doc#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/889973063429203135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/889973063429203135'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher-design-doc' title='Dumpcatcher: Design Doc'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-8335303743490925070</id><published>2009-06-19T11:06:00.000-07:00</published><updated>2009-06-28T20:44:28.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='dumpcatcher'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Dumpcatcher</title><content type='html'>I took the day off in order to spend it writing some code. My goal for today is to finish with a fully-functional exception catcher for my projects so that I don't have to require users to send me tracebacks or exceptions when they occur.
&lt;p /&gt;
I started by registering &lt;a href="http://dumpcatcher.appspot.com"&gt;http://dumpcatcher.appspot.com&lt;/a&gt;. I will be pushing frequently to this site as I add features. I chose App Engine because I like that its hassle-free application deployment. Launch the app, run it, walk away and it should just work!
&lt;p /&gt;
Second, I registered &lt;a href="http://dumpcatcher.googlecode.com"&gt;http://dumpcatcher.googlecode.com&lt;/a&gt;. I will be pushing the code here pretty much just as frequently as I push the site. I chose Mercurial as the SCM because I am sick and tired of git.
&lt;p /&gt;
So... Let me begin...
&lt;p /&gt;
&lt;strong&gt;Addendum: I actually ended up going into work instead of taking the day off and coded this on a flight to Cambodia.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-8335303743490925070?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/8335303743490925070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8335303743490925070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8335303743490925070'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/dumpcatcher' title='Dumpcatcher'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-8963818877913449318</id><published>2009-06-15T23:25:00.000-07:00</published><updated>2009-06-16T00:03:22.521-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foursquare'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Foursquared!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/search_venues_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/search_venues_activity.png" width="133" /&gt;&lt;/a&gt;
&lt;/div&gt;
In early April I started working on an Android client for &lt;a href="http://www.playfoursquare.com/"&gt;Foursquare&lt;/a&gt; I started out with an idea that I could screenscrape enough of the mobile app to make a worthy native api but I was quick to discover other nefarious methods to get at the API that Foursquare was using on the iPhone client. Armed with wireshark and a couple of python scripts, I was able to auto-generate a Java API based on data samples pulled from the TCP dump.


&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/search_venues_map_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/search_venues_map_activity.png" width="133" /&gt;&lt;/a&gt;
&lt;/div&gt;
Over the next several weeks I started designing a UI for the app. First and foremost I developed a venue search + checkin activity. I then implmentented another screen to scratch an itch, the CheckinsActivty. This is neat because it displays in a list and in a map which each of your foursquare friends may be.

&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/checkins_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/checkins_activity.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;
I had to take a break from the UI work when I started talking with the foursquare people intesting their public API. After several days of fighting with Apache's HttpClient and &lt;a href="http://oauth-signpost.googlecode.com/"&gt;oauth-signpost&lt;/a&gt; (Signpost, by the way, is awesome -- The problems were all in my implementation).

&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/venue_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/venue_activity.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;
Now its mid-June and I've gotten back to working on UI features; I wrote a "UserActivity" yesterday that displays information about a user. At the moment this information is limited to their name, city and badges acquired. I've also started recovering (fixing bugs) from a lot of refactoring I've been doing in the UI to simplify the design.

&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/foursquared/user_activity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/foursquared/user_activity.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;
I have to start work on figuring out what I want the app to do... In the short term and the medium term. The end state is pretty clear -- feature parity with the iPhone client and a pretty UI to boot. After that there are cool pie in the sky ideas but I'll probably be bored of working on the client by the time I get there.&lt;br /&gt;
&lt;br /&gt;
&lt;p /&gt;
Join the &lt;a href="http://groups.google.com/group/foursquared"&gt;Foursquared Mailing List&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-8963818877913449318?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/8963818877913449318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/06/foursquared#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8963818877913449318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/8963818877913449318'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/06/foursquared' title='Foursquared!'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-5956577515438769635</id><published>2009-05-24T15:54:00.000-07:00</published><updated>2009-05-24T15:54:00.317-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='amsterdam'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Twitter blah blah blah</title><content type='html'>This weekend I was in Amsterdam and one of the cool things about this trip opposed to last year's tour-de-Europe was that I was checking twitter along the way. I'd stop at a cafe for a beer or a snack and pull out my phone. I'd reload the search.twitter.com page I had in the browser with &lt;a href="http://search.twitter.com/search?q=amsterdam"&gt;q=amsterdam&lt;/a&gt; and I could get an up to the minute feed of what was going on in the city *right then and there*. I was also able to solicit suggestions from other people using the service and found a set of cool and not so cool things to do in the city! The coolest was that I found out the &lt;a href="http://www.worldpressphoto.org/"&gt;World Photo Press Exhibition&lt;/a&gt; was going on (incidentally in the old church within the red-light district).
&lt;p /&gt;
I can see where this is going and hopefully in the future I'll be able to filter out the boring "Look at me, I'm in insert-location-here" tweets and get a more useful result set but even now it was quite fun looking to see what was going on around me that was just out of sight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-5956577515438769635?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/5956577515438769635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/05/twitter-blah-blah-blah#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5956577515438769635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/5956577515438769635'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/05/twitter-blah-blah-blah' title='Twitter blah blah blah'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-6110501262242495023</id><published>2009-04-23T02:02:00.000-07:00</published><updated>2009-04-23T02:02:00.011-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Coming Soon!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/blog/uploaded_images/ss42-772659.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joelapenna.com/blog/uploaded_images/ss42-772536.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-6110501262242495023?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/6110501262242495023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/04/coming-soon#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/6110501262242495023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/6110501262242495023'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/04/coming-soon' title='Coming Soon!'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-3077446478877684402</id><published>2009-04-05T10:11:00.000-07:00</published><updated>2009-04-05T10:13:37.254-07:00</updated><title type='text'>Lately</title><content type='html'>Lately I've been:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Playing Kickball&lt;/li&gt;
&lt;li&gt;Hacking on Android/phone stuff&lt;/li&gt;
&lt;li&gt;Building cellular networks&lt;/li&gt;
&lt;li&gt;Slacking at work&lt;/li&gt;
&lt;li&gt;Working at work&lt;/li&gt;
&lt;li&gt;Drinking a bit too much, then just the right amount.&lt;/li&gt;
&lt;li&gt;Walking around&lt;/li&gt;
&lt;li&gt;Eating BBQ while watching a basketball game&lt;/li&gt;
&lt;li&gt;Exploritorium'ing the Outside&lt;/li&gt;
&lt;li&gt;Planning&lt;/li&gt;
&lt;li&gt;Scheming&lt;/li&gt;
&lt;li&gt;Reading: 2 books a month (only once was I behind schedule!) &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
Things I haven't been doing:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt; Taxes&lt;/li&gt;
&lt;li&gt;Selling my car&lt;/li&gt;
&lt;li&gt;Keeping in contact&lt;/li&gt;
&lt;li&gt;Running around &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-3077446478877684402?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/3077446478877684402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/04/lately#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3077446478877684402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/3077446478877684402'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/04/lately' title='Lately'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9309316.post-474972083576546216</id><published>2009-03-26T18:27:00.001-07:00</published><updated>2009-03-26T18:27:28.782-07:00</updated><title type='text'>Sweet Icon, TC!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://joelapenna.com/blog/uploaded_images/9ephant8-728589.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://joelapenna.com/blog/uploaded_images/9ephant8-728586.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9309316-474972083576546216?l=joelapenna.com%2Fblog' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/474972083576546216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://joelapenna.com/blog/2009/03/sweet-icon-tc#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/474972083576546216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9309316/posts/default/474972083576546216'/><link rel='alternate' type='text/html' href='http://joelapenna.com/blog/2009/03/sweet-icon-tc' title='Sweet Icon, TC!'/><author><name>Joe LaPenna</name><uri>http://www.blogger.com/profile/11526131812102669119</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14019527737768587425'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>