<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-5954182327773213751</id><updated>2013-06-03T00:03:23.659-05:00</updated><category term="baseball" /><category term="exercise" /><category term="observations" /><category term="funny" /><category term="books" /><category term="Image" /><category term="programming" /><category term="madison" /><category term="projects" /><category term="opengov" /><category term="posterous" /><category term="gov2.0" /><category term="creative" /><category term="travel" /><category term="jobs" /><category term="appengine" /><category term="sharendipity" /><category term="ringerous" /><category term="software" /><category term="twilio" /><category term="quantified-self" /><category term="smsmybus" /><category term="redsox" /><category term="gov20" /><category term="family" /><category term="sports" /><category term="design" /><category term="kids" /><category term="google" /><category term="startups" /><title type="text">Greg Tracy</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default?start-index=26&amp;max-results=25" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>246</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/GregTracy" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="gregtracy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-8887390013200671545</id><published>2013-06-02T23:56:00.000-05:00</published><updated>2013-06-03T00:03:23.675-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="gov2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="smsmybus" /><title type="text">Celebrating National Day of Civic Hacking</title><content type="html">This weekend was &lt;a href="http://hackforchange.org/" target="_blank"&gt;National Day of Civic Hacking&lt;/a&gt;. An incredibly well organized, distributed and disconnected network of events across the country where people came together to build tools and policies to make their communities better.&lt;br /&gt;&lt;br /&gt;I love this type of work. It's the inspiration behind &lt;a href="http://smsmybus.com/" target="_blank"&gt;SMSMyBus&lt;/a&gt;, the &lt;a href="http://api.smsmybus.com/" target="_blank"&gt;underlying API&lt;/a&gt;&amp;nbsp;that powers 40+ transit applications, and our local civic hacking organization, &lt;a href="http://hackingmadison.org/" target="_blank"&gt;HackingMadison&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although we didn't get an event organized for Madison, I wanted to contribute something. I had a few hours each morning this weekend to mash my keyboard on a project so I picked something small. There has always been a lot of interest around the data in the transit API so I decided to expose some of it by visualizing the API requests in real-time.&lt;br /&gt;&lt;br /&gt;The browser app displays a Google Map and drops red circles on the bus stop locations as API requests come in for those stops. Fun. Simple. Transparent.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://api.smsmybus.com/map" target="_blank"&gt;&lt;img border="0" height="376" src="http://4.bp.blogspot.com/-5dX-6sCb12Q/Uawg6auh0uI/AAAAAAAAEqs/FbyYEnqAP0A/s640/Screen+Shot+2013-06-02+at+9.22.55+PM.png" width="640" /&gt;&lt;/a&gt;&lt;a href="http://api.smsmybus.com/map"&gt;http://api.smsmybus.com/map&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/8887390013200671545/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2013/06/celebrating-national-day-of-civic.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8887390013200671545" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8887390013200671545" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2013/06/celebrating-national-day-of-civic.html" title="Celebrating National Day of Civic Hacking" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-5dX-6sCb12Q/Uawg6auh0uI/AAAAAAAAEqs/FbyYEnqAP0A/s72-c/Screen+Shot+2013-06-02+at+9.22.55+PM.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-8419424999377024197</id><published>2013-03-24T17:45:00.001-05:00</published><updated>2013-03-24T17:45:46.044-05:00</updated><title type="text">Life should be a bowl of ice cream</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-8jzkb8X9drQ/T9E9_F3lQcI/AAAAAAAAC7A/EvAwNkfOJBs/s1600/IMG_2685.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="358" src="http://2.bp.blogspot.com/-8jzkb8X9drQ/T9E9_F3lQcI/AAAAAAAAC7A/EvAwNkfOJBs/s640/IMG_2685.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A public service announcement for my peers... Enjoy your parents. Spend time with them like it's your last.&lt;br /&gt;&lt;br /&gt;My dad is visiting this weekend and we're not doing anything important. We watch basketball. Drink beer. Compare career notes. Turn society's debates into math problems. Tour the city like tourists. Run errands. Sit in silence. And eat ice cream.&lt;br /&gt;&lt;br /&gt;It's wonderful.&lt;br /&gt;&lt;br /&gt;The truth is, these visits are numbered. His mobility is decreasing and his mental acumen is dulling. Enough to make everyone quite sad if we stopped to focus on it. If we stopped to stress on any of the messy, strained bits of families that weave into the fabric of life, we would miss opportunities like this weekend.&lt;br /&gt;&lt;br /&gt;But we don't. And that is the secret sauce of the wonderful.&lt;br /&gt;&lt;br /&gt;These moments have been unfortunately aided by tragic events. The &lt;a href="http://blog.gregtracy.com/2012/07/cancer-stole-one-of-good-ones-today.html" target="_blank"&gt;loss of a sister and daughter&lt;/a&gt; and premature mortality that Parkinson's brings changes your lens.&lt;br /&gt;&lt;br /&gt;That's the tragedy behind the tragedy. What if you didn't need to have your lens prescribed?&lt;br /&gt;&lt;br /&gt;That's your challenge. Look passed the messy stuff. Scoop your dad ice cream. Sit back. And enjoy the simple part of life.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/8419424999377024197/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2013/03/life-should-be-bowl-of-ice-cream.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8419424999377024197" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8419424999377024197" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2013/03/life-should-be-bowl-of-ice-cream.html" title="Life should be a bowl of ice cream" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-8jzkb8X9drQ/T9E9_F3lQcI/AAAAAAAAC7A/EvAwNkfOJBs/s72-c/IMG_2685.JPG" height="72" width="72" /><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-2127079412815300232</id><published>2012-11-18T10:41:00.000-06:00</published><updated>2012-11-18T10:41:00.560-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Goodbye Posterous. Hello Blogger.</title><content type="html">I've been hosting my blog on &lt;a href="http://posterous.com/" target="_blank"&gt;Posterous&lt;/a&gt; since I started writing in 2008. Earlier in the year, they &lt;a href="http://blog.posterous.com/big-news" target="_blank"&gt;sold&lt;/a&gt; the business to &lt;a href="http://twitter.com/" target="_blank"&gt;Twitter&lt;/a&gt; with no guarantees that the service would be around long term.&lt;br /&gt;&lt;br /&gt;I kept waiting for them to offer a tool to extract/port content and it hasn't arrived. So I decided to scratch an itch and do it myself. I ported my blog to &lt;a href="http://www.blogger.com/" target="_blank"&gt;Blogger&lt;/a&gt; this weekend and here's how I did it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Problem scope&lt;/h3&gt;The blog content is the easy(ish) part, but if you want to preserve the links to the original content, it can be tricky. Depending on your search engine and social media traffic, those thinks can be valuable.&lt;br /&gt;&lt;br /&gt;First, every blogging platform uses its own slug path structure. Second, if your blog is in a subdomain, you have to find a way to preserve that subdomain with the addresses on the new blogging platform.&amp;nbsp;For example, the &lt;a href="http://blog.gregtracy.com/2012/01/adding-parking-to-madison-api-homebrew.html"&gt;parking API post&lt;/a&gt; has two different URIs.&lt;br /&gt;&lt;br /&gt;Posterous :&lt;br /&gt;&lt;br /&gt;www.gregtracy.com/adding-parking-to-the-madison-api-homebrew&lt;br /&gt;&lt;br /&gt;Blogger :&lt;br /&gt;&lt;br /&gt;blog.gregtracy.com/2012/01/adding-parking-to-madison-api-homebrew.html&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Migrating content&lt;/h3&gt;&lt;div&gt;Content migration is a tedious process. But the current option for getting Posterous content to Blogger is well documented on the web.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Import Posterous content into Wordpress&amp;nbsp;&lt;/li&gt;&lt;li&gt;Export Wordpress to an XML file&lt;/li&gt;&lt;li&gt;Use &lt;a href="http://wordpress2blogger.appspot.com/" target="_blank"&gt;wordpress2blogger&lt;/a&gt; to transform the XML file for Blogger import&lt;/li&gt;&lt;li&gt;Import XML file into Blogger&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;This flow is documented in detail &lt;a href="http://blog.jelastic.com/2012/04/05/how-to-move-your-posterous-blog-to-wordpress-or-blogger/" target="_blank"&gt;here&lt;/a&gt;. Lifehacker has also &lt;a href="http://lifehacker.com/5892776/how-to-back-up-and-migrate-your-posterous-spaces-to-tumblr-blogger-or-wordpress" target="_blank"&gt;documented&lt;/a&gt; a process for migrating content using the auto-post feature inside Posterous, but it is tedious.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It doesn't necessarily end there, however. There are two glaring problems that make this process linger on forever. First, the content is poorly formatted so you'll find yourself editing posts in Blogger to clean up formatting. Second, multimedia sometimes doesn't import correctly or references files on Posterous or Wordpress so you need to upload that content to Blogger.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Someone will eventually build a migrator by mashing up the Posterous API with the Blogger API to make this all go away. In a different life, I might have taken the time to do it. But until someone does, the content migration is a little messy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Building the redirector&lt;/h3&gt;&lt;div&gt;This was the piece I was most interested in because it's simple and fun to build.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Use the &lt;a href="https://posterous.com/api" target="_blank"&gt;Posterous API&lt;/a&gt; to get a list of all post URI slugs and their post dates&lt;/li&gt;&lt;li&gt;Construct a slug map for Posterous URIs to Blogger URIs utilizing the dates and slugs&lt;/li&gt;&lt;li&gt;Build an app that takes any Posterous URI slug and redirects the page to the Blogger URI&lt;/li&gt;&lt;li&gt;Setup DNS so your old blog points to your app&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h4&gt;Posterous listing&lt;/h4&gt;&lt;div&gt;I wrote the following nodejs app to grab the full list of public posts from Posterous.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/4013806.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Blogger listing&lt;/h4&gt;&lt;div&gt;If you can get access to the Blogger API, which requires a special request to the Blogger team, you can do the same thing I did with Posterous. The challenge is finding the ways Blogger changes slugs. For example, they remove "the" and "a" from most post slugs.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finding these differences is tedious so I actually recommend making sure you get the mapping correct for your top ten blog posts and then just crowd source the rest. Keep track of the page misses with logging (see below for my solution) and then update the map as you find mistakes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the end, the map looks something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;{ 'awesome-post-title-wins : { date : '/2012/11/' , blogger_slug : 'awesome-post-title' }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With those details, you can get from any legacy slug - /awesome-post-title-wins - to any Blogger URI - /2012/11/awesome-post-title&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Redirector application&lt;/h4&gt;&lt;div&gt;I chose to use &lt;a href="http://appengine.google.com/" target="_blank"&gt;Google App Engine&lt;/a&gt; to host my redirector, but you could use anything. The logic is very simple. Just lookup the inbound request in your slug map and redirect to the Blogger URI. It looks a lot like the following.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/4014715.js"&gt; &lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My full implementation, including the slug map can be &lt;a href="https://github.com/gtracy/gregtracy-proxy" target="_blank"&gt;found on github&lt;/a&gt;. My implementation also includes a miss tracker which is what I've used for understanding which redirects are failing. I'm persisting the routes and a counter for the number of occurrences to understand what's missing. I can find all of the misses using the datastore viewer in the App Engine dashboard.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;The incidentals&lt;/h4&gt;&lt;div&gt;There are a couple of&amp;nbsp;miscellaneous resources that you'll need to add to your map file as well.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;RSS feed&lt;/li&gt;&lt;li&gt;favicon.ico&lt;/li&gt;&lt;li&gt;robots.txt&lt;/li&gt;&lt;li&gt;Apple touch icons&lt;/li&gt;&lt;li&gt;Posterous "tags" (Blogger "labels")&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;All of those can be redirected, but creating static files for your favicon and apple touch icons allow you to personalize that content better on your new domain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Domain mapping&lt;/h3&gt;Now that you have an application that redirects content to Blogger, you need to map that application to your old domain. In my case, I updated the DNS for www.gregtracy.com to point to my app. The combination of App Engine and Google Apps makes this very easy.&lt;br /&gt;&lt;br /&gt;Inside your App Engine dashboard, select "Application Settings" and use "Add Domain" to map the application to your subdomain. These steps walk you all the way through DNS setup.&lt;br /&gt;&lt;br /&gt;That's it. What details did I miss? &amp;nbsp;&lt;a href="http://blog.gregtracy.com/"&gt;http://blog.gregtracy.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/2127079412815300232/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2012/11/goodbye-posterous-hello-blogger.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2127079412815300232" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2127079412815300232" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2012/11/goodbye-posterous-hello-blogger.html" title="Goodbye Posterous. Hello Blogger." /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-796961677223498098</id><published>2012-07-16T20:03:00.000-05:00</published><updated>2013-04-08T17:34:55.357-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="family" /><title type="text">Cancer stole one of the good ones today</title><content type="html">&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;Around 1,500 people die from cancer every day.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;But today that number feels different. Today, my own sister became a statistic. &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;Marla Tracy Pak was diagnosed with &lt;a href="http://en.wikipedia.org/wiki/Glioblastoma_multiforme" target="_blank"&gt;glioblastoma multiforme&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;last August. Fought an ugly and losing battle for 10 months, and left us today, leaving a big void in the TracyPak Tribe. &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;I was asked to do a PechKucha talk the day I got the news last August. I called an audible and instead of talking about civic hacking, I talked about human qualities that make families, tribes and communities better. The qualities that my sister had.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;I neglected to share that presentation last year, but here are the highlights...&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;ol style="margin-bottom: 0; margin-top: 0;"&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Be kind to every person you interact with and talk to strangers like you’ve met them before.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Have empathy.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Support the things your friends are passionate about regardless of your opinion.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Celebrate nostalgia within your tribe.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Spoil your nieces, nephews and neighbors’ kids.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Converse with others with infinite optimism in your voice.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Send surprise packages to people.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Call an out of town friend or sibling and setup a long-weekend visit just because you can.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;strong style="font-family: Times; font-size: medium; font-weight: normal;"&gt;&lt;span style="background-color: transparent; vertical-align: baseline;"&gt;Make a choice to relate to people rather than drawing contrasts.&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;Success in your personal relationships defines who you are. We should all be a little bit more like Marla.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7FWpZl6sSEI/UPxspIFVGnI/AAAAAAAADXc/CKuEs6H8ZLU/s1600/marla-girls.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/-7FWpZl6sSEI/UPxspIFVGnI/AAAAAAAADXc/CKuEs6H8ZLU/s640/marla-girls.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 15px; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/796961677223498098/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2012/07/cancer-stole-one-of-good-ones-today.html#comment-form" title="19 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/796961677223498098" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/796961677223498098" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2012/07/cancer-stole-one-of-good-ones-today.html" title="Cancer stole one of the good ones today" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-7FWpZl6sSEI/UPxspIFVGnI/AAAAAAAADXc/CKuEs6H8ZLU/s72-c/marla-girls.jpeg" height="72" width="72" /><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-6315893311252181105</id><published>2012-02-18T16:29:00.000-06:00</published><updated>2013-01-20T16:18:22.731-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title type="text">Spam blockers and colors</title><content type="html">The Astronomy Picture of the Day &lt;a href="http://apodemail.appspot.com/"&gt;email service&lt;/a&gt; I created several years ago has been getting pummeled by spam critters. I was getting up to five signups a day with bogus email addresses. Most of them came from Hotmail, AOL and Yahoo. With the &lt;a href="http://www.gregtracy.com/app-engines-place-as-a-developer-playground"&gt;new pricing structure&lt;/a&gt; of &lt;a href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt;, it was beginning to cost me in the pocketbook so I had to address it.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The solution I came up with was part spam filter and part fundraiser. I decided to draw more attention to the PayPal donate button by requiring new signups to type the color of the button into one of the form fields. A couple of interesting things happened.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;First, the rate of donations didn't change. I've had one modest donation in two weeks.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Second, the spam ended. Overnight. It was fantastic.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Most interestingly, the little test showed fun insight into how we all see colors. When I originally wrote the test, the answer was "yellow". At the very last minute I decided that I should throw in "orange" as a possible answer as well and it was a good thing I did. Since deploying that change 15 days ago, there have been 51 signups - 26 orange and 25 yellow. I don't know why, but his fascinates me. It seems obvious to me that it is yellow. :)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;What color do you see?&lt;/div&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-h3dIy4g-Qxk/UPxtFyErf2I/AAAAAAAADXk/xVK1HB05TkI/s1600/color-spam.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://3.bp.blogspot.com/-h3dIy4g-Qxk/UPxtFyErf2I/AAAAAAAADXk/xVK1HB05TkI/s640/color-spam.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/6315893311252181105/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2012/02/spam-blockers-and-colors.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6315893311252181105" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6315893311252181105" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2012/02/spam-blockers-and-colors.html" title="Spam blockers and colors" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-h3dIy4g-Qxk/UPxtFyErf2I/AAAAAAAADXk/xVK1HB05TkI/s72-c/color-spam.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-3712219104014073169</id><published>2012-01-02T17:35:00.000-06:00</published><updated>2013-01-20T16:23:55.136-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="gov2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="opengov" /><title type="text">Adding parking to the Madison API homebrew</title><content type="html">It started with this tweet.&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;a href="http://2.bp.blogspot.com/-5Z2hWH3Ysus/UPxtq3bYsBI/AAAAAAAADXs/-lBzfsmzgUE/s1600/parking-tweet.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://2.bp.blogspot.com/-5Z2hWH3Ysus/UPxtq3bYsBI/AAAAAAAADXs/-lBzfsmzgUE/s640/parking-tweet.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... and then I found myself on the couch during New Year's Eve with a really bad movie. Laptop out... &amp;nbsp;in the wee hours of the New Year, I released a new web service for Madison. It provides a simple JSON wrapper around Madison's recently released data for &lt;a href="http://www.cityofmadison.com/parkingUtility/garagesLots/availability/" target="_blank"&gt;parking availability on the isthmus&lt;/a&gt;. I added it to the list of services available in the &lt;a href="http://smsmybus.com/api" target="_blank"&gt;SMSMyBus API&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;a href="http://smsmybus.com/api/v1/getparking" target="_blank"&gt;http://smsmybus.com/api/v1/getparking&lt;/a&gt;&lt;br /&gt;I was greeted in the morning by a lot of great feedback so I hooked it up to the &lt;a href="http://smsmybus.com/" target="_blank"&gt;SMSMyBus&lt;/a&gt; interfaces - SMS, xmpp and email - to create an app for it. For example, you can find the percentage of open spaces in downtown lots by texting 'parking' to the service...&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;img alt="Parking-app" height="480" src="http://getfile.posterous.com/getfile/files.posterous.com/temp-2012-01-02/ibnpjyjEDuzihfHiItAGueIEeFrxyurdppJbrjobiygmxfkDrmbaanIApwmm/parking-app.jpeg" width="320" /&gt;&lt;/div&gt;&lt;br /&gt;... but what I really hope for, is that others take this and build something creative with it. &lt;br /&gt;&lt;div&gt;Although it's great to get so much positive feedback from the Madison community on these little projects, it's really (really) important to recognize that the work I've done with the API is going in the wrong direction in many ways. I'd rather be building the apps on top of services created by Madison. Eventually, this great city of ours needs to stop building websites and start producing the core feeds that I've done. That's the foundation. That is the &lt;a href="http://shop.oreilly.com/product/9780596804367.do" target="_blank"&gt;government as a platform&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/3712219104014073169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2012/01/adding-parking-to-madison-api-homebrew.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3712219104014073169" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3712219104014073169" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2012/01/adding-parking-to-madison-api-homebrew.html" title="Adding parking to the Madison API homebrew" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-5Z2hWH3Ysus/UPxtq3bYsBI/AAAAAAAADXs/-lBzfsmzgUE/s72-c/parking-tweet.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-6443426364971538977</id><published>2011-11-25T09:33:00.000-06:00</published><updated>2012-11-06T15:18:03.814-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="quantified-self" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><category scheme="http://www.blogger.com/atom/ns#" term="family" /><title type="text">It's been two months since I canceled my data plan</title><content type="html">Nearly two months ago, I &lt;a href="http://www.gregtracy.com/i-just-canceled-my-data-plan" target="_blank"&gt;wrote that I had canceled the data plan&lt;/a&gt; on my mobile phone. I'm reporting back that it has been a smashing success. I love being connected... to the people around me rather than the interwebs.&lt;br /&gt;&lt;br /&gt;If you're disciplined about keeping the phone in your pocket, good for you. If you're not, this might be an option for you.&lt;br /&gt;&lt;br /&gt;The experiment was given an extra boost when two weeks into the experiment I promptly lost my non-smart phone. Brilliant move in retrospect. I avoided the nervous, fidgety grabbing of the phone to look to see if a new message arrived. One might say that I went cold turkey, and it likely made the whole transition easier. So easy, in fact, I often questioned whether I needed any kind of phone at all!&lt;br /&gt;&lt;br /&gt;That's not to say that the data plan isn't missed. My expectations were pretty spot on. I miss Google Maps and posting photos for the family. Here are the few notes I've jotted down along the way...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;The pot&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Let's get it right out there... I miss having reading material when I'm on the pot. If you have a smart phone, you know what I'm talking about.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;My calendar&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I miss access to my calendar... I haven't missed big meetings, but I have missed those non-vital but still important events that aren't necessarily on my radar every day. I've looked into the &lt;a href="http://code.google.com/apis/calendar/" target="_blank"&gt;Google API&lt;/a&gt; to get access via &lt;a href="http://twilio.com/" target="_blank"&gt;SMS&lt;/a&gt; and will try to implement this one.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Twitter&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I'd like to find a better desktop tool for &lt;a href="http://twitter.com/" target="_blank"&gt;Twitter&lt;/a&gt;. Now that I see less of it throughout the day, it would be nice to find a tool that helps me catchup on some feeds I don't want to miss.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Email&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Email becomes less important - which is good. Everyone talks about the email tax where you can't control inbound email. I've found that by sending less and reading less frequently, I've been able to lower the burden of managing email. It now comes in well controlled bursts - those blocks of time that I dedicate to my inbox. I've also become ruthless with unsubscribe options.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Better focus&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I haven't quantified this, but it feels like I have better focus through less distraction. If you're not pulling your phone out all the time to check in on your online life, you've improved your chances of focusing on a specific task whether it's work, a game with the kids or cleaning up around the house.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;You all have become more annoying&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I'm now way more annoyed by people who choose their phones over me. Whether it's to take a phone call, respond to a text message and check the sports scores, it's nothing short of annoying. I don't know how much I did this to other people two months ago, but I'm glad I don't do it anymore.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/6443426364971538977/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/11/it-been-two-months-since-i-canceled-by.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6443426364971538977" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6443426364971538977" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/11/it-been-two-months-since-i-canceled-by.html" title="It&amp;#39;s been two months since I canceled my data plan" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-1115616127325053756</id><published>2011-11-06T03:40:00.000-06:00</published><updated>2013-01-09T11:33:52.937-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="gov2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="opengov" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title type="text">Revisiting Google App Engine's pricing changes</title><content type="html">&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;This post revisits my &lt;a href="http://www.gregtracy.com/app-engines-place-as-a-developer-playground" target="_blank"&gt;earlier evaluation&lt;/a&gt; of Google App Engine's &lt;a href="http://code.google.com/appengine/kb/postpreviewpricing.html" target="_blank"&gt;post-preview pricing changes&lt;/a&gt; and how it affected my project, &lt;a href="http://www.smsmybus.com/" target="_blank"&gt;SMSMyBus&lt;/a&gt;. As I noted, the app was projected to cost between $6 and $7 dollars &lt;strong&gt;&lt;em&gt;per day&lt;/em&gt;&lt;/strong&gt; under the new platform pricing.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;Since that post, I’ve been rolling out small, incremental changes to optimize the code and combat all of the known issues. I’m thrilled to report that I have the price down to $0/day. And I’m once again impressed by the snappy and reliable App Engine platform.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;Looking back on the changes, I can say that I was doing some bad things, some abusive things, and App Engine was making some bad choices as well. But the end result proves that if its developers optimize and do smart things, they are rewarded. App Engine remains a &lt;/span&gt;&lt;strong style="font-family: Arial; font-size: 11pt;"&gt;great&lt;/strong&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt; solution for my transit API service.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;Here’s a history of the changes over the last two months that got me down to $0/day...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: x-large;"&gt;Platform Configuration&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;1. Instance allocation&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;The new pricing model charges applications based on their use of instances (hardware resources where your application is running) rather than CPU utilization. A key to keeping your instance cost down is to simply reduce the number of instances that are spinning. Duh. So I grabbed the instance slider in the application settings and yanked it to the left. This doesn't prevent scaling, it just limits my billing for normal traffic flow.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;2. Delete data&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;App Engine data storage (for your database) costs $0.008/GByte-day. Doesn’t sound too expensive, but I had been storing every single API call I had ever gotten. I thought it would be useful for API developers and for analytics. My drive to $0 outweighed that, however, so I deleted all of the history data and got under the free quota for storage.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: x-large;"&gt;Application Configuration&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;3. Memcached the application's route listings&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;I was surprised to find that I wasn’t doing this already, but there it was. I have a data structure that maps bus routes and bus stops to scheduling data on the Metro website and it never changes. In some cases - like the static calls from the &lt;/span&gt;&lt;a href="http://www.gregtracy.com/when-pet-projects-grow-up-and-become-somethin" style="font-family: Arial; font-size: 11pt;" target="_blank"&gt;kiosk clients&lt;/a&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt; - I was looking up route listing details in the datastore once every minute!! Fail. I used memcache to keep the common queries in memory and avoid the extra datastore reads.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;4. Limit access during off hours&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;One thing that never changes is when the Metro service is running. There are five+ hours a day where the buses aren’t on the street. But some clients are still asking for data. I stubbed out most of the API during these off hours before the code ever gets close to making a datastore or memcache call.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;These four changes brought me down to $0.70 per day. Bam!&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Arial; font-size: x-large;"&gt;Algorithm Changes&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;5. Asynchronous screen grabs&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;If you don’t know, behind the API curtain is an ugly screen scraping task that extracts the arrival estimates from the Metro website. So when a client requests arrival data for a stop, the app goes off and requests multiple web pages, machine-reads the information and aggregates all of the results.&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;The original implementation of the &lt;a href="http://www.smsmybus.com/" target="_blank"&gt;SMS interface&lt;/a&gt; did this by creating multiple tasks (one for each route traveling through the respective stop). When a task ran, it stored the results in the datastore. An aggregator task would read those results out of the datastore and piece together the response to the caller.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;When the API was created, I couldn’t use background tasks because I had to respond with results in the same HTTP context. That’s when I discovered the great feature, &lt;a href="http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html" target="_blank"&gt;asynchronous url fetch&lt;/a&gt;. This essentially let me grab all of the different Metro web pages at the same time. But when I implemented this, I continued to use the datastore as the mechanism for storing and retrieving results. This was just lazy. Under the old pricing, I wasn’t incented to change it other then the fact that it was a bit slow.&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;Under the new pricing model, this solution was very expensive. The API is continuously running this aggregation algorithm - constantly writing and reading to the datastore for model instances that have a lifespan of under a minute!&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="background-color: transparent; font-family: Arial; font-size: 11pt; text-decoration: none; vertical-align: baseline;"&gt;I rolled out a change that removed the use of the datastore and instead sorted the aggregated results in memory. This had a &lt;strong&gt;&lt;em&gt;dramatic&lt;/em&gt;&lt;/strong&gt; effect on my API quota for datastore reads and writes as well as overall performance and latency for my users. Especially the write operations, where you get penalized by an order of magnitude for this type of behavior because index updates work against your API quota as well.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;6. Dogfood&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px;"&gt;After optimizing the API, I realized that the original SMSMyBus apps (SMS, chat, email and phone interfaces for the Metro) were now the long pole. Those apps were implemented before the API existed so they weren’t benefiting from the API optimizations. Solution... re-implement to use the SMSMyBus API.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;It should have been done long ago simply as a validation exercise of the API methods. Credit to the eligence and simplicity of the API - this port was simple and only took a couple of hours.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;These two changes brought me down to $0.10/day. Badda-bing.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Arial; font-size: x-large;"&gt;AppStats&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;7. Run Appstats on all application interfaces&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;The last stop on the optimization train was &lt;/span&gt;&lt;a href="http://code.google.com/appengine/docs/python/tools/appstats.html" style="font-family: Arial; font-size: 11pt;" target="_blank"&gt;Appstats&lt;/a&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;. A truly great tool in the App Engine toolbox. In just a &lt;/span&gt;&lt;a href="http://googleappengine.blogspot.com/2010/03/easy-performance-profiling-with.html" style="font-family: Arial; font-size: 11pt;" target="_blank"&gt;matter of minutes&lt;/a&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;, you can find the hidden datastore operations that are dragging you down. In my case, it led me to one area that wasn’t being memcached at all. And it revealed an area that was simply using the memcache incorrectly! Love this tool...&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;This change brought me down $0.00/day. Winning.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family: Arial; font-size: 11pt; vertical-align: baseline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family: Arial; font-size: x-large;"&gt;Results&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;App Engine remains a great platform for developers that don’t abuse it and take the time to optimize their applications.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;The SMSMyBus API now serves over 6,000 transit requests per day. It’s fast, reliable and flat out fun to use. I’m as proud as ever that I brought this to Madison.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 11pt;"&gt;Next step... find a way to fund my SMS users. :)&lt;/span&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/1115616127325053756/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/11/revisiting-google-app-engine-pricing.html#comment-form" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1115616127325053756" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1115616127325053756" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/11/revisiting-google-app-engine-pricing.html" title="Revisiting Google App Engine&amp;#39;s pricing changes" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-3244452270810419084</id><published>2011-10-02T21:55:00.000-05:00</published><updated>2012-11-10T08:40:27.957-06:00</updated><title type="text">I just canceled my data plan</title><content type="html">... and here are some of the good things that I expect to happen:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I'll be more engaged when I'm with my kids&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll have more money in pocket each month&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll spend more time writing&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll spend more time reading books&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll text more with my family&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll think more about the things needing thinking about&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll talk to more strangers when I'm waiting in lines&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll build more Twilio apps that give me access to apps via SMS&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll be unplugged from work&lt;/li&gt;&lt;/ol&gt;And here are the bad things that I expect will happen:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;When I'm traveling, I'll get lost more without the benefit of Google Maps in my pocket&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll post fewer mobile photos that I think others would enjoy&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll miss out on serendipitous information flow I get on Twitter&amp;nbsp;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;My Twilio bill will go up with more SMS apps getting built&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll be unplugged from work (yes, that is double-edged)&lt;/li&gt;&lt;/ol&gt;It's only been two hours but it feels good so far. Text me in two weeks and ask me how I feel then. :)&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/3244452270810419084/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/10/i-just-canceled-my-data-plan.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3244452270810419084" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3244452270810419084" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/10/i-just-canceled-my-data-plan.html" title="I just canceled my data plan" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-2247098261271263412</id><published>2011-09-11T11:17:00.000-05:00</published><updated>2013-01-20T16:25:06.774-06:00</updated><title type="text">Twilio + Google Docs meets MadCamp</title><content type="html">&lt;div class="p_embed p_image_embed"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tyLaK6Hg3z0/UJcWbk8kb4I/AAAAAAAADME/uDCROKGGaE4/s1600/6098741464_b7899aab76_b.jpg.scaled.1000.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="424" src="http://3.bp.blogspot.com/-tyLaK6Hg3z0/UJcWbk8kb4I/AAAAAAAADME/uDCROKGGaE4/s640/6098741464_b7899aab76_b.jpg.scaled.1000.jpeg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We had another terrific &lt;a href="http://www.barcampmadison.org/"&gt;Barcamp&lt;/a&gt; event (dubbed "MadCamp") this year. Supported by great sponsors, a great community of learners willing to share their time, and the tireless effort of &lt;a href="http://madison.imby.info/p/Philip.Crawford"&gt;Phillip Crawford&lt;/a&gt; to pull it all together; it was a proud day for Madison.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.uli.com/"&gt;Urban Land Interest&lt;/a&gt; provided a great venue right on the &lt;a href="http://maps.google.com/maps?q=1+s.+pinckney+st.+madison,wi&amp;amp;hl=en&amp;amp;ll=43.075487,-89.382105&amp;amp;spn=0.011003,0.02105&amp;amp;sll=43.074824,-89.38199&amp;amp;sspn=0.011003,0.02105&amp;amp;vpsrc=0&amp;amp;gl=us&amp;amp;t=m&amp;amp;z=16"&gt;Capital Square&lt;/a&gt;. But it wasn't without its challenges. &lt;a href="http://goo.gl/IKAvc"&gt;MadCamp sessions&lt;/a&gt; were spread out across three floors - with six simultaneous sessions. Attendees had the challenge of getting back to the &lt;a href="http://goo.gl/IKAvc"&gt;session board&lt;/a&gt; on the first floor and reviewing the options, finding the next room and still use the fifteen minute break to network with other attendees. To limit the burden of foot travel, we did two things. &lt;br /&gt;&lt;br /&gt;First, we put the session board &lt;a href="http://goo.gl/IKAvc"&gt;online using Google Docs&lt;/a&gt; and projected it on a giant wall on the first floor. This not only enabled people to view it from anywhere on their own devices, but it allowed multiple people to edit it at the same time.&lt;br /&gt;&lt;br /&gt;Second, now that the session board was online we were able to setup a notification system that could read from Google Docs via the &lt;a href="http://code.google.com/apis/gdata/"&gt;Google Data API&lt;/a&gt;. The &lt;a href="http://github.com/gtracy/madcamp-notifier"&gt;MadCamp Notifier&lt;/a&gt; was born. The notifier would use the &lt;a href="http://www.twilio.com/sms"&gt;Twilio SMS API&lt;/a&gt; to send every (subscribed) attendee a list of the next set of sessions every hour that included the session title as well as the room number.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1209748.js?file=gistfile1.txt"&gt;&lt;/script&gt; &lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="lines"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td width="100%"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;a href="https://twitter.com/#!/southpolesteve"&gt;Steven Faulkner&lt;/a&gt; had the great idea of including a feedback interface so attendees could text in feedback for the individual presenters at the end of a session. A difficult habit to create in a condensed amount of time, but some folks did provide some thoughtful feedback throughout the day.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;script src="https://gist.github.com/1209756.js?file=gistfile1.txt"&gt;&lt;/script&gt; &lt;br /&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So I think there's a product here somewhere. A better way to organize and connect with others at an event. A free idea! Who's going to take it? If you want a head start, here's the MadCamp code... &lt;a href="http://github.com/gtracy/madcamp-notifier" target="_blank"&gt;http://github.com/gtracy/madcamp-notifier&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Incidentally, both &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt; and &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; were sponsors of MadCamp so in many ways, this app was our thank you note.&lt;br /&gt;&lt;br /&gt;Photo Credit: &lt;a href="http://rasterweb.net/raster/"&gt;Pete Prodoehl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://raw.github.com/moski/gist-Blogger/master/public/gistLoader.js" type="text/javascript"&gt;&lt;/script&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/2247098261271263412/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/09/twilio-google-docs-meets-madcamp.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2247098261271263412" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2247098261271263412" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/09/twilio-google-docs-meets-madcamp.html" title="Twilio + Google Docs meets MadCamp" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-tyLaK6Hg3z0/UJcWbk8kb4I/AAAAAAAADME/uDCROKGGaE4/s72-c/6098741464_b7899aab76_b.jpg.scaled.1000.jpeg" height="72" width="72" /><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-3805061311062845216</id><published>2011-09-10T18:34:00.000-05:00</published><updated>2012-11-10T08:43:36.064-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="gov2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="opengov" /><title type="text">Madison Transit API snags a giant new user</title><content type="html">Over a year ago, I smiled when I found &lt;a href="http://smsmybus.com/"&gt;SMSMyBus&lt;/a&gt; getting repurposed in the form of a kiosk at the &lt;a href="http://www.motherfools.com/"&gt;Mother Fool's Coffeehouse&lt;/a&gt;.&amp;nbsp; I &lt;a href="http://www.gregtracy.com/when-pet-projects-grow-up-and-become-somethin"&gt;wrote then&lt;/a&gt; about the personal satisfaction of seeing a pet project growing into something bigger.&lt;br /&gt;&lt;br /&gt;Well, last week, that satisfaction blossomed into gratification when I learned that the &lt;a href="http://www.wisc.edu/"&gt;University of Wisconsin&lt;/a&gt; had included the &lt;a href="http://www.smsmybus.com/api/"&gt;SMSMyBus API&lt;/a&gt; in &lt;a href="http://www.news.wisc.edu/19738"&gt;the latest version of their app&lt;/a&gt; released for the 2011 academic year. Now students using the app can get real time bus arrival estimates throughout the city rather than relying on the fixed schedule right from their iPhone and Android devices.&lt;br /&gt;&lt;br /&gt;Super proud.&lt;br /&gt;&lt;br /&gt;Mostly because this is exactly the kind of application that can get the attention of the &lt;a href="http://mymetrobus.com/"&gt;Metro&lt;/a&gt; and the &lt;a href="http://cityofmadison.com/"&gt;City of Madison&lt;/a&gt; as an example of what can be accomplished if more public data becomes accessible in an easy to consume (programmable APIs) interface.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://cityofmadison.com/mayor/"&gt;Dear Mayor&lt;/a&gt;, please take note. We can achieve more, do so at a lower cost, and generate more economic development if we work together.</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/3805061311062845216/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/09/madison-transit-api-snags-giant-new-user.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3805061311062845216" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3805061311062845216" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/09/madison-transit-api-snags-giant-new-user.html" title="Madison Transit API snags a giant new user" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-6671632166447284979</id><published>2011-09-05T10:28:00.000-05:00</published><updated>2012-11-04T19:08:26.483-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title type="text">App Engine's place as a developer playground</title><content type="html">&lt;p&gt;The &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; developer community is a &lt;a href="http://blog.ugorji.net/2011/09/google-app-engine-new-pricing-sucks.html"&gt;hot mess&lt;/a&gt; this week over the new &lt;a href="http://www.google.com/enterprise/cloud/appengine/pricing.html"&gt;pricing plan&lt;/a&gt; for the platform. And for good reason. Many developers are seeing their hosting expenses going up by as much as &lt;a href="http://goo.gl/gDYdu"&gt;500%&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;If you're looking for a post that is trashing the App Engine team, you can move along. You won't find it here. These guys are smart and considerate. If you spend any time interacting with them on &lt;a href="http://stackoverflow.com/questions/tagged/google-app-engine"&gt;StackOverflow&lt;/a&gt;, &lt;a href="http://code.google.com/appengine/community.html"&gt;email&lt;/a&gt; or in person at &lt;a href="http://google.com/googleio"&gt;Google IO&lt;/a&gt;, you understand this. In fact, just using the platform for a project you can appreciate their outlook and passion for their product and users. That's not to say they don't have room to improve. But enough with the negativity already!&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;Effects of new pricing on my projects&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;There have been a lot of people &lt;a href="http://point7.wordpress.com/2011/09/03/the-amazing-story-of-appengine-and-the-two-orders-of-magnitude/"&gt;posting&lt;/a&gt; about their apps and revealing the effects of the new pricing on them. I wanted to do the same as a reference point. Note that my use of App Engine has primarily been for &lt;a href="http://www.gregtracy.com/tag/projects"&gt;personal projects&lt;/a&gt;. Some have web front-ends, some have &lt;a href="http://twilio.com/sms"&gt;SMS interfaces&lt;/a&gt;, some are just based on background tasks and others come and go while I experiment with ideas or calendar events. I still think most of &lt;a href="http://projects.gregtracy.com"&gt;these experiments&lt;/a&gt; are well suited for App Engine, but I need to take a hard look at the more successful apps to figure out a long-term strategy because they are not scaling well with the new pricing plan.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;I'll share two examples - both philanthropic projects - comparing the effects of the new pricing.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;Astronomy Picture of the Day&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;This &lt;a href="http://apodemail.appspot.com"&gt;app&lt;/a&gt; had originally been written in Perl as a grad student and was hosted at the &lt;a href="http://cs.wisc.edu"&gt;University of Wisconsin&lt;/a&gt;. I decided to port the application as the vehicle for learning App Engine and Python so it was the &lt;a href="http://www.gregtracy.com/google-app-engine-a-first-timers-experience"&gt;first app I ever wrote on the platform&lt;/a&gt;. It's primarily a background app. Every afternoon it runs a job that scrapes the contents of the &lt;a href="http://apod.nasa.gov/apod"&gt;APOD site&lt;/a&gt; and packages it into an email and sends it off to all subscribers. There's a simple web frontend that lets anyone sign up. There are currently 1900+ subscribers.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The app is free to run on the platform today and will cost $0.19/day - or $0.03 per user per year - after the price changes. 100% of those costs can be attributed to the use of the Mail API.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;My only complaint about this app is that the change seems extreme. Going from 2,000 free emails to 100 feels like an attempt to curb the spamming community. And for the charity projects like this, all of the good net citizens are the losers with this change.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;SMSMyBus&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;This &lt;a href="http://www.smsmybus.com"&gt;app&lt;/a&gt; was originally built to provide a better interface for the &lt;a href="http://mymetrobus.com"&gt;Madison Metro bus service&lt;/a&gt;. It provides real-time arrival times for buses via &lt;a href="http://twilio.com/sms"&gt;SMS&lt;/a&gt;, chat, email and phone. But then it blossomed into a full-featured &lt;a href="http://www.gregtracy.com/56599543"&gt;API&lt;/a&gt; for the Metro for other developers.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The app costs $0.01/day to operate today (excluding the SMS interface). It is estimated to cost $6.79/day after the price change. $2,478/year. Yah. That's a whopping 67,800% increase. Shebang.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The root cause of essentially all the cost can be attributed to the main API call that returns arrival times at a particular bus stop - &lt;a href="http://www.smsmybus.com/api/schedule.html"&gt;getarrivals&lt;/a&gt; - and some of the clients call this repeatedly (like every two minutes). It is also where the confusion starts for me with respect to the new pricing.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;Frontend instance hours&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Frontend instance hours is projected to be $5.68/day, 84% of the bill. This represents the platform's &lt;a href="http://code.google.com/appengine/docs/adminconsole/performancesettings.html"&gt;transition&lt;/a&gt; from billing for CPU usage to billing for the contention of instance usage. I get it that they need to do this. They were using the wrong resource metric for monitoring before.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;But how do I go from a $0.00 cost for resource consumption to $5.68/day?!? That kind of increment just feels insane. How about $0 to $0.50? Or $0 to $1?&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;Datastore writes&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Datastore writes is projected to be $1.00/day, 14% of the bill. This is harder for me to resolve for a couple of reasons. First, I can't find any cost under the current pricing plan for these operations even though the app's profile is fairly consistent. So I struggle, conceptually, with how this has suddenly become an issue for the app.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Second, $1/day equates to 1M writes/day in the datastore and I simply can't figure out where all of those writes are coming from. My back of the napkin math shows 40,000 writes. I'm totally baffled by this projection.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:small;"&gt;&lt;strong&gt;The rest of it&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The rest of the projected cost is a combination of storage and datastore read operations. I can eliminate the former if I simply store less data I wanted to use for analytics. It saves me money, but in the end, ignoring some of the data hurts the developers that use the API.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;Optimizing&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Now it's my job to go in and take another stab at optimizing the code and start with the getarrivals API call. I thought I had &lt;a href="http://www.gregtracy.com/adventures-in-performance-tuning-on-google-ap"&gt;good habits&lt;/a&gt; with this so I was a little embarrassed when I found an obvious hole in the query path for route listings. There's a fairly repetitive query that was not being memcached - oops! Now fixed.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The second thing I'm experimenting with is the application's instance configuration. By default, I was letting the platform's scheduler determine my load patterns and create new instances whenever necessary. But I've made two changes. First, I took the scheduler out of 'auto' mode and set the maximum number of idle instances to one, and I've cranked up the minimum latency for the pending request queue to 250ms. In theory, each of these changes should drive the cost down because I should be using less frontend instance time throughout the day.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Let's see what happens! As I do my part with optimization, I'd like to see the App Engine do their part and move to the middle as well. :)&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;What to do next&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;I'm guessing that the App Engine platform simply priced things wrong the first time. I think the concept of platform as a service that exploits existing Google infrastructure was a smart, but geeky idea that was poorly modeled or had bad assumptions about its use/abuse. Ironically, the idea didn't scale well and they've been forced to admit that early assumptions on how to price it were just wrong.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;The good part about this move...&lt;/strong&gt; developers are forced to take a deep dive into optimization. Something i've written about before and have been doing again since the clock started on the pricing changes. This not only makes for a better platform for Google and project sharing the resources, but it makes for a better net as a whole. Faster is better.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;The bad part...&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;Developers will be forced to dead pool worthy projects that don't have a business model.&amp;nbsp;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Developers will be forced to port apps to other platforms. That could be a painful pill to swallow for developers when they aren't money making projects&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Developers may be sacrificing analytics to avoid datastore bloat and access charges.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-size:medium;"&gt;&lt;strong&gt;What the App Engine team should do about it&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;Provide better pricing structures for philanthropic and open source projects. App Engine is a great platform for these things and it provides a great playground for developers to support important projects at a low cost while also learning about a platform they can adopt for larger, commercial project down the road. &lt;a href="http://code.google.com/appengine/kb/postpreviewpricing.html#special_programs_non_profit_usage"&gt;They've hinted at this&lt;/a&gt; but will they do it? - &lt;a href="http://code.google.com/appengine/kb/postpreviewpricing.html#special_programs_non_profit_usage"&gt;http://code.google.com/appengine/kb/postpreviewpricing.html#special_programs_...&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Provide more runway for optimization. A couple of weeks to get the sleeves rolled up and optimize their apps just isn't enough time.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Provide better analysis tools to highlight problems&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Take baby steps. Must they really take these giant leaps in pricing?&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Roll out Python 2.7 to support concurrent requests in Python projects.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;In the process of writing this post I found some great resources...&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;A nice FAQ from App Engine on the new pricing plan - &lt;a href="http://code.google.com/appengine/kb/postpreviewpricing.html"&gt;http://code.google.com/appengine/kb/postpreviewpricing.html&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;A nice resource to help you understand how to manage your app's instance utilization; the real cost bottleneck - &lt;a href="http://code.google.com/appengine/docs/adminconsole/performancesettings.html"&gt;http://code.google.com/appengine/docs/adminconsole/performancesettings.html&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;An excellent post from another developer tackling this problem - &lt;a href="http://point7.wordpress.com/2011/09/03/the-amazing-story-of-appengine-and-the-two-orders-of-magnitude/"&gt;http://point7.wordpress.com/2011/09/03/the-amazing-story-of-appengine-and-the-two-orders-of-magnitude/&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/6671632166447284979/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/09/app-engine-place-as-developer-playground.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6671632166447284979" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6671632166447284979" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/09/app-engine-place-as-developer-playground.html" title="App Engine&amp;#39;s place as a developer playground" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-6113591347050414340</id><published>2011-09-03T09:24:00.000-05:00</published><updated>2013-04-26T19:44:39.861-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="twilio" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title type="text">Madison Transit API Homebrew</title><content type="html">A post on my &lt;a href="http://www.smsmybus.com/api/"&gt;Madison Transit API&lt;/a&gt; homebrew is long overdue. It was an incredibly fun project and when you see how it has enabled others, you realize how much more compelling it is then the simple &lt;a href="http://smsmybus.com/"&gt;SMS app&lt;/a&gt; I had originally created.&lt;br /&gt;The API has been out for a long time, but there was very little usage early on. I'm not sure what sparked the flame but in the last few months or so there has been a lot of interest and lot of activity from developers. It dawned on me that I've yet to write about it.&amp;nbsp;And that's a shame because the API is actually the most clever piece of the whole SMSMyBus effort.&lt;br /&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;In the beginning&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;In the beginning, there was a very specific goal of creating an SMS app that delivered real-time arrival estimates. That was it. It was in response to my own need - as a commuter - for such an app. It was also going to be an entry into the &lt;a href="http://www.twilio.com/"&gt;Twilio&lt;/a&gt; developer &lt;a href="http://www.blogger.com/twilio.com/contests/"&gt;contest&lt;/a&gt; that was run the week they released the &lt;a href="http://www.twilio.com/api/sms"&gt;SMS API&lt;/a&gt; publicly.&lt;br /&gt;I knew going in that the &lt;a href="http://mymetrobus.com/"&gt;Metro&lt;/a&gt; didn't provide a formal API or even an XML feed, but I'd done enough HTML screen scraping before to know how to overcome it. Little did I know how tedious that would become with the Metro data. So what started out as a simple texting application turned into a day of cursing the poorly formatted HTML I found on my screen. And every minute of the way I could be heard asking the same question, "Why doesn't the Metro have an API?!?"&lt;br /&gt;When I finished, I swore that I would never let anyone else suffer the pain that I endured so decided to abstract the work I did for the texting app and provide access to my data so other developers could get to the transit data through a standard web service interface.&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: medium;"&gt;Why it's clever&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;The ugly work of screen scraping was now done and buried in the implementation of the SMS application. But by creating a couple of other web handlers, I could easily make the same scheduling data accessible via a web service call.&lt;br /&gt;For example - &lt;a href="http://www.smsmybus.com/api/v1/getarrivals?key=nomar&amp;amp;stopID=1101"&gt;http://www.smsmybus.com/api/v1/getarrivals?key=nomar&amp;amp;stopID=1101&lt;/a&gt; - will return real-time arrival estimates for routes traveling through the stop at Main and Carrol on the square. That's the way every developer wants to query data from a web service.&lt;br /&gt;With a little more scraping, I could also find the physical location of every stop (latitude and longitude) so developers could query the location of stops by a stop ID and could also query all nearby stops based on a lat/long coordinate. In the end, there was a pretty impressive looking transit API - simple to use and understand for new developers. And it didn't matter if it was ugly in its technique of screen scraping inside the implementation. It had a clean interface for the developers.&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;Supported API methods include...&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;getarrivals - Get real-time arrival estimates for any stop ID with the option of filtering by route ID.&lt;br /&gt;getroutes - Get a list of every route in the Metro system.&lt;br /&gt;getstops - Get the details for every stop a route travels through.&lt;br /&gt;getnearbystops - Get the details for all stops within a given distance of a latitude/longitude.&lt;br /&gt;getstoplocation - Get the location details for a stop given a sop ID.&lt;br /&gt;getvehicles (not implemented) - Get details for a particular vehicle on the road.&lt;br /&gt;getservicebulletins (not implemented) - Get a list of service bulletins in the Metro system.&lt;br/&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Why I Built It&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;As I noted, a big reason for building the API was simply to save the next person the trouble of building up a new set of screen scraping tricks to get the data. But I also knew that most people that have attempted this have stopped at the schedule data. I don't know anything that has gone the extra step of getting the route and stop location data as well.More importantly, I wanted to find a way to contribute to the larger mission of opening up a public dataset to make it more accessible. Open data systems are important for lots of reasons, but most importantly, it allows communities to operate more efficiently. And nowhere is that more evident than in transit. Every city, state, and national government in the world should be on a path towards open data right now.&lt;br /&gt;Unfortunately, Madison has been slow to find its course. My dream was that by creating the API and recruiting some more developers to use it, we'd have enough applications to take back to the city to say, "Look! If you open more data, developers will do great things!"&lt;br /&gt;I also did it for the intellectual challenging of build an API. I've been an API consumer for a long time, but had never constructed one myself. It's an exercise I encourage any API consumer to go through. You'll have a whole new perspective for what it takes to build, document and support an API.&lt;br /&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;Sample Applications&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;In theory, all of the &lt;a href="http://smsmybus.com/"&gt;original interfaces&lt;/a&gt; - SMS, google chat, email, and phone - could have been re-implemented using this API, but I didn't go back and do that. But lots of new apps have been built. For example, the bus kiosk displays hanging in a few local businesses use the API to visualize arrival estimates for nearby stops.&lt;br /&gt;&lt;a href="http://www.walkerenergysystems.com/"&gt;Larry Walker&lt;/a&gt; used the API to build a Chumby app and also used it to display arrival estimates on a small LED display on an Arduino. He also built a mobile browser app to more easily access arrival estimates. And I used the API to build a Google gadget so you can get scheduling data in the sidebar of gmail. The attached gallery shows off some of these examples.&lt;br /&gt;Go get started building your own Madison transit app! &lt;a href="http://www.smsmybus.com/api/"&gt;http://www.smsmybus.com/api/&lt;/a&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;a href="http://www.smsmybus.com/api/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://getfile7.posterous.com/getfile/files.posterous.com/temp-2011-09-02/DGgnHtiudqfpldthgifCerJhbFzutbxxiyAEpmtsjwtpbDjfjnnknxfemAkJ/Screen_Shot_2011-09-02_at_10.13.33_PM.png.scaled1000.png"&gt;&lt;img alt="Screen_shot_2011-09-02_at_10" height="317" src="http://getfile.posterous.com/getfile/files.posterous.com/temp-2011-09-02/DGgnHtiudqfpldthgifCerJhbFzutbxxiyAEpmtsjwtpbDjfjnnknxfemAkJ/Screen_Shot_2011-09-02_at_10.13.33_PM.png" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;div class="p_see_full_gallery"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/6113591347050414340/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/09/madison-transit-api-homebrew.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6113591347050414340" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/6113591347050414340" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/09/madison-transit-api-homebrew.html" title="Madison Transit API Homebrew" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-7332885548025648701</id><published>2011-08-08T02:05:00.000-05:00</published><updated>2013-04-27T09:27:05.196-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="twilio" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title type="text">Who needs a phone? The magic of the Twilio Client</title><content type="html">&lt;a href="http://twilio.com/"&gt;Twilio&lt;/a&gt; sucked me into one of their contests this weekend. The rules were simple - build an application that leveraged their new &lt;a href="http://www.twilio.com/api/client"&gt;Twilio Client&lt;/a&gt;, which enables anyone to build phone and SMS interfaces into the browser.&lt;br /&gt;&lt;br /&gt;It's a beautiful extension of their existing APIs and really does get you to ask the question, "Why &lt;strong&gt;do&lt;/strong&gt; I need a separate phone device to communicate with others?"&lt;br /&gt;&lt;br /&gt;I didn't have a killer idea or business idea to build on top of this so I decided to do something simple but make it available to anyone to use and extend. I built a browser-based phone that anyone can download and deploy to &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt; themselves. All you need is a Twilio account.&lt;br /&gt;&lt;br /&gt;The phone has four features. Once you've logged into the application, you can do the following...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Call anyone using a dial pad right in the browser&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Receive calls in the browser when people call your Twilio number&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Receive calls from friends that login to the app in their browsers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Record voicemail if you aren't logged in to answer (and send you an SMS to let you know)&lt;/li&gt;&lt;/ul&gt;Go give me a call - &lt;a href="http://phone.gregtracy.com/"&gt;http://phone.gregtracy.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was super fun to build and even more fun to use. If you'd like to get your own you can find the project on github - &lt;a href="http://github.com/gtracy/phonefree-twilio"&gt;http://github.com/gtracy/phonefree-twilio&lt;/a&gt;. It's intended to be a turn-key solution for App Engine. Just deploy and go.&lt;br /&gt;&lt;br /&gt;There are lots of opportunities to extend this if you're interested. I'd like to implement voicemail and SMS. I'd like to put a design on this so it looks nice. :) I'd also like to try implementing conferencing so you could have party lines right inside the browser. What else?&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://getfile.posterous.com/getfile/files.posterous.com/temp-2011-08-08/DkexmdqbviyjsslrsbGGGgdaBfHBlysiChgEcDnkoyIHlHrkkhmqBsnAEmqe/Screen_Shot_2011-08-08_at_2.11.06_AM.png"&gt;&lt;img alt="Screen_shot_2011-08-08_at_2" height="290" src="http://getfile.posterous.com/getfile/files.posterous.com/temp-2011-08-08/DkexmdqbviyjsslrsbGGGgdaBfHBlysiChgEcDnkoyIHlHrkkhmqBsnAEmqe/Screen_Shot_2011-08-08_at_2.11.06_AM.png" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="p_see_full_gallery"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/7332885548025648701/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/08/who-needs-phone-magic-of-twilio-client.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/7332885548025648701" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/7332885548025648701" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/08/who-needs-phone-magic-of-twilio-client.html" title="Who needs a phone? The magic of the Twilio Client" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-548859883819350499</id><published>2011-06-15T23:31:00.000-05:00</published><updated>2012-11-10T08:47:45.314-06:00</updated><title type="text">Conan's commencement speech is really for us old folks</title><content type="html">&lt;span style="font-family: inherit;"&gt;If you haven't seen it yet, find 25 minutes in your day and watch Conan O'Brien's Dartmouth Commencement speech from last week.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;It's as funny as you might expect. But it's also raw - you just need to stay with it until the end. Conan lays out his passion for comedy and how it took failure for him to reinvent himself. It's brilliant. And it's very likely advice that means nothing to these twenty two year-olds. It's a speech that is written for us 30/40 year-olds. The folks that have had enough jobs to know what we don't want, but may still be searching for our true passions and goals.&lt;/span&gt;&lt;br /&gt;&lt;iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="http://www.youtube.com/embed/ELC_e2QBQMk" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/548859883819350499/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/06/conan-commencement-speech-is-really-for.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/548859883819350499" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/548859883819350499" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/06/conan-commencement-speech-is-really-for.html" title="Conan&amp;#39;s commencement speech is really for us old folks" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/ELC_e2QBQMk/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-4590684904677591873</id><published>2011-05-04T16:06:00.000-05:00</published><updated>2013-04-27T09:34:11.703-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">My TEDx talk on Civic Entrepreneurship</title><content type="html">I spoke at &lt;a href="http://tedxmadison.com/" target="_blank"&gt;TEDxMadtown&lt;/a&gt;&amp;nbsp;in March, and it looks like they just posted the videos. In this talk, I reveal the great life lesson I learned in 2010 - giving back comes in all forms.&lt;br /&gt;&lt;br /&gt;I think the only thing more nerve racking than getting up on a &lt;a href="http://tedx.com/" target="_blank"&gt;TEDx&lt;/a&gt; stage is watching yourself on a TEDx stage. :)&lt;br /&gt;&lt;br /&gt;http://www.youtube.com/watch?v=gCfoqhPcMqg</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/4590684904677591873/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/05/my-tedx-talk-on-civic-entrepreneurship.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/4590684904677591873" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/4590684904677591873" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/05/my-tedx-talk-on-civic-entrepreneurship.html" title="My TEDx talk on Civic Entrepreneurship" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-1355548414016054453</id><published>2011-03-23T08:28:00.000-05:00</published><updated>2012-11-04T19:08:26.623-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jobs" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><title type="text">Do you pave roads or construct walls?</title><content type="html">&lt;p&gt;I had a discouraging conference call recently. The kind of call that makes you want to run for the hills, give up on your ideological dreams, and resign yourself to living within the system and never trying to make a difference.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The problem was that I ran into a wall builder. Not a single wall which could be scaled, but a system that was designed to continuously build walls meant to prevent progress.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Inevitably, people get tasked with "looking out for the best interest of the organization", but where these individuals fail is in the execution of that mission. They forget about the big picture. The best interest of any organization is not to protect themselves. The goal is to make progress. Build the best product, delight customers, advance research, or make new discoveries. The individuals need to be shepherds but too often act as gatekeepers locking everyone inside and refusing to stick their neck out.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;The very best shepherds are the ones that have the most creativity. They find solutions in the face of restrictions. In essence, they become adept at scaling walls and overcoming obstacles. They don't use words like "can't" and "won't". They articulate concerns and encourage solutions. And perhaps most importantly, when presented with a problem, the shepherds understand it is more important to listen then to talk.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Locking the gate and throwing the key away is the easy way out. When you block progress or maintain the status quo, you fail. And you piss a bunch of people off along the way.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Do you pave the way for others? Offer help and advice? Or do you just build barriers?&lt;/p&gt;&lt;br/&gt;&lt;p /&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/1355548414016054453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/03/do-you-pave-roads-or-construct-walls.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1355548414016054453" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1355548414016054453" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/03/do-you-pave-roads-or-construct-walls.html" title="Do you pave roads or construct walls?" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-455505753455923914</id><published>2011-02-19T11:00:00.000-06:00</published><updated>2013-04-27T09:35:59.585-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="twilio" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">SMSMyBus by the numbers - a recap of the first year</title><content type="html">It was about this time a year ago that I built the Madison transit app that delivers real-time arrivals estimates for &lt;a href="http://mymetrobus.com/" target="_blank"&gt;Metro&lt;/a&gt; buses via text messages.&amp;nbsp;Little did I realize that it would turn into such a fun adventure.&lt;br /&gt;&lt;br /&gt;I took a look at the logs for the past 52 weeks. Here's SMSMyBus by the numbers...&lt;br /&gt;&lt;br /&gt;Total number of users : 138&lt;br /&gt;Total number of requests : 2900&lt;br /&gt;Number of unique stops requested : 318&lt;br /&gt;Most popular stop requested : 1878, Jenifer &amp;amp; Ingersoll&lt;br /&gt;&lt;br /&gt;Below is a histogram of the requests each week, and the shape is curious. I've never marketed the service so it's only traveled by word of mouth. The cold weather likely led to the recent jump but I can't explain the general lumpiness throughout.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UsZnkFJbATk/UXvcCqDBETI/AAAAAAAAEGM/XUgZIsoky-U/s1600/smsmybus-histogram.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="428" src="http://2.bp.blogspot.com/-UsZnkFJbATk/UXvcCqDBETI/AAAAAAAAEGM/XUgZIsoky-U/s640/smsmybus-histogram.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I also plotted all of the requests on a map using size to indicate the number of requests for each stop. If you're interested, you can explore the map more at&amp;nbsp;&lt;a href="http://smsmybus.com/labs/map" target="_blank"&gt;http://smsmybus.com/labs/map&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p_embed p_image_embed"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DA3PdgdFeEI/UXvcGsH-lvI/AAAAAAAAEGw/aeHBdbFRp48/s1600/smsmybus-map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="408" src="http://1.bp.blogspot.com/-DA3PdgdFeEI/UXvcGsH-lvI/AAAAAAAAEGw/aeHBdbFRp48/s640/smsmybus-map.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Total cost to me? It was a little more than $75 - all of it going towards costs associated with the SMS messaging (&lt;a href="http://twilio.com/" target="_blank"&gt;Twilio&lt;/a&gt;). With the rising popularity, I'd &lt;a href="http://www.smsmybus.com/" target="_blank"&gt;love your donations&lt;/a&gt;. Just press the 'donate' button on &lt;a href="http://www.smsmybus.com/"&gt;the site&lt;/a&gt;. :)&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/455505753455923914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/02/smsmybus-by-numbers-recap-of-first-year.html#comment-form" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/455505753455923914" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/455505753455923914" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/02/smsmybus-by-numbers-recap-of-first-year.html" title="SMSMyBus by the numbers - a recap of the first year" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-UsZnkFJbATk/UXvcCqDBETI/AAAAAAAAEGM/XUgZIsoky-U/s72-c/smsmybus-histogram.png" height="72" width="72" /><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-7639538938752403857</id><published>2011-02-15T09:44:00.000-06:00</published><updated>2012-11-04T19:08:25.930-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><title type="text">Imagine a world where social media was used to find solutions. Ahhh.</title><content type="html">&lt;p&gt;If you're in Madison and listening to the social webisphere today, you can't help but notice the massive organization going on for a rally at the Capital later today to protest Gov. Walker's proposal&amp;nbsp;&lt;span style="font-family:Arial, Verdana, Helvetica, sans-serif;font-size:12px;line-height:18px;"&gt;to end collective bargaining rights for the majority of public employees in the state of Wisconsin.&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;I wonder what would happen if the governor - or any public official for that matter - stopped and tried to solve their hardest problems with the help of these same social media tools. Could the same level of organization seen with the protestors be achieved if the tools were used to organize a solution rather than a protest?&lt;/p&gt;&lt;br/&gt;&lt;p&gt;There are so many examples of Facebook, Twitter and other tools being used to raise awareness (see Egypt). But how about if everyone stopped picking sides and used the same mediums to propose solutions?&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/7639538938752403857/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/02/imagine-world-where-social-media-was.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/7639538938752403857" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/7639538938752403857" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/02/imagine-world-where-social-media-was.html" title="Imagine a world where social media was used to find solutions. Ahhh." /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-4648845352381876674</id><published>2011-02-07T23:00:00.000-06:00</published><updated>2013-04-27T09:37:28.948-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="opengov" /><title type="text">Civic Entrepreneurship, the Pecha Kucha talk caught on video</title><content type="html">youtube http://www.youtube.com/watch?v=3P2cJOum7KI&lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/4648845352381876674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/02/civic-entrepreneurship-pecha-kucha-talk.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/4648845352381876674" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/4648845352381876674" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/02/civic-entrepreneurship-pecha-kucha-talk.html" title="Civic Entrepreneurship, the Pecha Kucha talk caught on video" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-2541639350718517982</id><published>2011-02-06T09:00:00.000-06:00</published><updated>2012-11-04T19:08:25.945-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><category scheme="http://www.blogger.com/atom/ns#" term="posterous" /><title type="text">This is how you don't give someone feedback</title><content type="html">&lt;p&gt;I build stuff all the time. Sometimes it's just for me but most of the time, if I think the work I've done would be useful to others I open it up and share with others. For free. And a few of these projects have been very &lt;a href="http://apodemail.appspot.com" target="_blank"&gt;well&lt;/a&gt; &lt;a href="http://www.smsmybus.com" target="_blank"&gt;received&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;One such project I've shared is &lt;a href="http://www.ringerous.com" target="_blank"&gt;Ringerous&lt;/a&gt;. A simple tool that lets you blog to your &lt;a href="http://posterous.com" target="_blank"&gt;Posterous&lt;/a&gt; site via a telephone call. It was the very first &lt;a href="http://www.twilio.com" target="_blank"&gt;Twilio&lt;/a&gt; app I ever did after I discovered that &lt;a href="http://twilio.com/api" target="_blank"&gt;lovely API&lt;/a&gt;. I use Ringerous on my own site and my family uses it on a private site. Very few people - 26 to be exact - have signed up to use it. It was never a company or marketed and it has its own share of flaws. Most &lt;a href="http://www.gregtracy.com/posterous-api-a-wish-list" target="_blank"&gt;notably&lt;/a&gt; those related to authentication in the Posterous API.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;But it's there for others to enjoy. Like all the other projects I've shared, I try really hard to support it when I get questions. I've even added some features for a couple of users. The support part is really the most fun because I usually learn a lot from those interactions. Who doesn't want to make a product that delights people?&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Then I got a trifecta of emails from a disgruntled person last week. I'm doing the only thing I know how to do. I'm sharing them. Because as much as people get pissed about poor customer service from AT&amp;amp;T, the TSA or the local cable company, there is such a thing as a poor customer. I won't say the world doesn't need them, but I will say that I don't need them.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Next time you want to "provide feedback", here's a playbook for doing it badly...&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Email #1 at 4:53pm : User is clearly running into a sub-optimal implementation (on my part) for discovering the posterous site, but also fails to read the instructions on the site)...&lt;/p&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="border-collapse:collapse;font-family:arial, sans-serif;"&gt;Ringerous is SHIT.&lt;br /&gt;&amp;nbsp; I've tried *every way I know* to get it to work with my posterous, and it fails EVERY TIME.&lt;p /&gt;&amp;nbsp; &amp;nbsp;"Oops..configuration problems" can basically suck it.&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-family:arial, sans-serif;"&gt;&lt;span style="border-collapse:collapse;"&gt;Email #2 at 5:02pm : User must have a bad monitor or a funky browser theme because I can't figure out how "background-color: white;" turns into pink. I want to know. Sort of. But I can't get over "is SHIT" and "suck it" in the first email to want to dig in.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="border-collapse:collapse;font-family:arial, sans-serif;"&gt;1. change the colors. &amp;nbsp;tiny grey writing on that godawful pink(????) background is *impossible* to read under even the best of circumstances, so putting your "helpful" examples of what to enter into the fields in a way that people can't actually read is.....sub-optimal, at best.&lt;p /&gt;&amp;nbsp; 2. "oops...configuration problems" has *got* to be the shittiest, *least* informative error-message I've ever seen in my life. &amp;nbsp;How about maybe having the error message list what was *wrong* with what I entered, instead of making me end up with a photosensitive MIGRAINE from straining to read the bloodydamn, invisible grey-on-pink print, hmmmm?&lt;p /&gt;&amp;nbsp; 3. Better yet, how about making whatever setup you have over on *your* side be able to deal with the posterous host-name OR your posterous site-address? &amp;nbsp;That would even eliminate the need for the godawful tiny, unreadable GREY PRINT that I mentioned earlier.&lt;p /&gt;&amp;nbsp; &amp;nbsp;Three words: BAD INTERFACE DESIGN.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-family:arial, sans-serif;"&gt;&lt;span style="border-collapse:collapse;"&gt;Email #3 at 5:16pm : &amp;nbsp;Apparently not content with the first two assaults, he came back with more... Snarky? I think he rounded that corner in line one of the first email. I'm mildly amused that I might have caused a migraine given the flogging I've taken at this point, but know deep down that migraines are likely a part of his daily life independent of Ringerous.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="border-collapse:collapse;font-family:arial, sans-serif;"&gt;Not to sound snarky here, but:&lt;p /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1. Ringerous (or something like it) *could* very very useful for the blind or visually-impaired in particular. &amp;nbsp;Unfortunately, because you decided to use really tiny fonts, and a REALLY bad color-choice (gray on pink? &amp;nbsp;Seriously????) &amp;nbsp;I now have a photosensitive migraine from straining to look at your godawful mess.&lt;p /&gt;&amp;nbsp; &amp;nbsp; Please study up on how to make this *more* readable for the folks who would actually benefit most from it, okay? &amp;nbsp; Between that, and the *totally cryptically unusable* error-messages, I wouldn't be surprised if a proportion of your potential users just wander away in disgust after trying -- vainly -- to get somewhere with the thing.&lt;p /&gt;&amp;nbsp; &amp;nbsp;Seriously: change the pallete and add some actual helpfulness to the error-messages, or at least make the "example" lettering bigger, and NOT grey on pink.) :(&lt;p /&gt;&amp;nbsp; &amp;nbsp; Haven't actually tried to phone in yet, but given your web-based signup interface, I have my doubts. &amp;nbsp;(Plus, I'm waiting for the damn migraine to go away, thanks to you!!!!) :(&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="font-family:arial, sans-serif;"&gt;&lt;span style="border-collapse:collapse;"&gt;To kill the suspense... yes, he did phone in and successfully posted to his blog. Unfortunetly, there were no fireworks in that post. That makes sense, it was his blog after all. He's saves his best stuff for his service providers. That gave me an idea. I should really setup a Ringerous account for Ringerous. That way people could provide feedback directly over the phone. Ahhh... a project for another time.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;My response was short and simple.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="border-collapse:collapse;font-family:arial, sans-serif;"&gt;I have very little motivation to help you. Your tone is laughable. There are a few nuggets in there that I can take away from this, but I'd actually prefer that you didn't u&lt;span style="color:#000000;"&gt;se the service.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&lt;span style="border-collapse:collapse;font-family:arial, sans-serif;color:#000000;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;div class="im" style="color:#500050;"&gt;&lt;br/&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;It's worth pointing out that there is no pink on that page. So you might need to check your monitor.&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;p /&gt;&lt;br/&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;Your loyal free service provider&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/2541639350718517982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/02/this-is-how-you-don-give-someone.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2541639350718517982" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2541639350718517982" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/02/this-is-how-you-don-give-someone.html" title="This is how you don&amp;#39;t give someone feedback" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-8932600125165257921</id><published>2011-01-18T09:34:00.000-06:00</published><updated>2012-11-04T19:08:25.958-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="creative" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="startups" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title type="text">Launched, 2010</title><content type="html">&lt;p&gt;I launched an application at &lt;a href="http://asthmapolis.com" target="_blank"&gt;Asthmapolis&lt;/a&gt; last week. It's not complete and it probably took longer than it should have. But it's launched - a simple feat worth celebrating.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;I was reminded of this when I ran across Seth Godin's recent &lt;a href="http://sethgodin.typepad.com/seths_blog/2010/12/yearinreview.html" target="_blank"&gt;"#YearInReview What did you ship in 2010?" post&lt;/a&gt;. It was a great reminder of one of the best lessons I've learned being a part of some young companies over the last few years - don't settle for ideas or talk of doing things. Instead, go out and experiment, build and put your ideas to work.&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p&gt;In that spirit, I'm going to start celebrating every launch this year. And to match Seth's list, the following is my 2010 launch list. Some worked. Most failed. Some were good ideas with bad execution. Some were terrible ideas but it wasn't clear until after it was tried.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Here's to celebrating doing...&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;Launch of &lt;a href="http://www.smsmybus.com"&gt;SMSMyBus&lt;/a&gt;, a mobile transit notification app for Madison&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched &lt;a href="http://www.frinook.com" target="_blank"&gt;Frinook&lt;/a&gt; with my daughter so she and her friends could swap books more efficiently&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched a web service so my neighbors could swap ice skates&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched the &lt;a href="http://www.asthmapolis.com" target="_blank"&gt;Asthmapolis&lt;/a&gt; mobile application&amp;nbsp;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Built &lt;a href="http://spellitfor.us" target="_blank"&gt;spellitfor.us&lt;/a&gt;, a tool to help my kids practice their spelling&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Helped to re-launch &lt;a href="http://www.barcampmadison.org/" target="_blank"&gt;Barcamp Madison&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;I &lt;a href="http://www.gregtracy.com/marathon-training-started-this-week" target="_blank"&gt;trained&lt;/a&gt; for a marathon and &lt;a href="http://www.gregtracy.com/marathon-training-checkin-july-2010" target="_blank"&gt;failed&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;I did an open water swim around the &lt;a href="http://www.gregtracy.com/rounding-the-hog-island-lighthouse-in-a-speed" target="_blank"&gt;Hog Island lighthouse&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched the &lt;a href="http://blog.twilio.com/2010/10/asthmapolis-wins-twilio-union-square-ventures-contest.html" target="_blank"&gt;award winning&lt;/a&gt; SMS app for Asthmapolis&lt;/li&gt;&lt;br/&gt;&lt;li&gt;I launched a notification system for Shorewood swim parents to keep tabs on their kids' swimming results&lt;/li&gt;&lt;br/&gt;&lt;li&gt;I gave a &lt;a href="http://www.gregtracy.com/civic-entrepreneurship-a-pecha-kucha-talk" target="_blank"&gt;PechaKucha talk&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched the Madison Twilio &lt;a href="http://www.meetup.com/Twilio/32393/" target="_blank"&gt;meetup&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Launched a neighborhood block party&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;"To live a creative life, we must lose our fear of being wrong." -- Joseph Chilton Pearce&lt;/p&gt;&lt;br/&gt;&lt;p /&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/8932600125165257921/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2011/01/launched-2010.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8932600125165257921" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/8932600125165257921" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2011/01/launched-2010.html" title="Launched, 2010" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-1570784700870867009</id><published>2010-12-31T11:39:00.000-06:00</published><updated>2012-11-17T17:39:16.240-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="quantified-self" /><category scheme="http://www.blogger.com/atom/ns#" term="exercise" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><title type="text">Quantifying myself - a 2010 recap</title><content type="html">&lt;br /&gt;Back in March when I got started on &lt;a href="http://www.gregtracy.com/marathon-training-started-this-week" target="_blank"&gt;my marathon training&lt;/a&gt;, I signed up for a service called &lt;a href="http://dailymile.com/" target="_blank"&gt;dailymile&lt;/a&gt; to track all of my workouts. Even if my marathon aspirations &lt;a href="http://www.gregtracy.com/marathon-training-checkin-july-2010" target="_blank"&gt;failed&lt;/a&gt;, dailymile proved to be a fantastic tool and started a larger trend for me this year. Since starting with dailymile, I've begun quantifying all sorts of useful things in a quest to understand myself better. Partly because my memory is so bad and partly because I just like data. In some cases, I don't yet know when or where the usefulness will come, but in a world of infinite storage it's easy to store all kinds of information. &lt;br /&gt;Here's a summary of what I've been collecting... &lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: large;"&gt;Exercise&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;The year started with &lt;a href="http://dailymile.com/" target="_blank"&gt;dailymile&lt;/a&gt;, which I used to track my running, swimming, cycling and bike commutes to work. Dead simple data entry with a social/community element. I will say that I'd trade in the social aspect for a mobile app. :) &lt;a href="http://mytracks.appspot.com/" target="_blank"&gt;MyTracks&lt;/a&gt; proved to be a great app on Android even though it didn't integrate with dailymile. &lt;br /&gt;When the snow came, my outdoor activity essentially ended and so did my visits to dailymile. But in November, I joined some friends for the 100 Day Challenge. A friendly competition to see who could amass more points (via exercise activities). The idea is simple, you receive points for a variety of exercises - pushups, situps, walking, running, etc. The points are maintained on a Google spreadsheet so everyone knows where the others stand. There's even a little &lt;a href="http://twilio.com/" target="_blank"&gt;Twilio&lt;/a&gt; app that sends out a text message in the morning with the daily standings. I'm not even sure there is a prize at the end, but I can say that the simple fact that my numbers are viewed by others is an incredible motivator for me. &lt;br /&gt;Most recently, I've started carrying around a &lt;a href="http://fitbit.com/" target="_blank"&gt;FitBit&lt;/a&gt; to track my general activity level throughout the day. I'm doing this primarily as a research mission for &lt;a href="http://asthmapolis.com/" target="_blank"&gt;Asthmapolis&lt;/a&gt;, but I've enjoyed seeing the statistics each day. And the entire process is passive. I litterally don't do anything other than snap the device onto my pants pocket in the morning. &lt;br /&gt;&lt;strong&gt;&lt;span style="font-size: large;"&gt;Task Management&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;I've been using &lt;a href="http://rememberthemilk.com/" target="_blank"&gt;Remember The Milk&lt;/a&gt; for a couple of years to track To-dos - mostly macro-level items like "fix kitchen window" or "make yard signs for &lt;a href="http://melsgreengarden.com/"&gt;melsgreengarden&lt;/a&gt;". But for most of this year, I've started using it as my idea board. I've been recording every idea I've had regardless of whether or not it will actually turn into a To-do. Things like "build a Twitter app that let's one query baseball statistics". Likely never to be built by me... but I have an impressive list of good, bad and ugly ideas. Now I just need to find a better place to store them. &lt;br /&gt;At the end of the year, I started tracking my project time with far more granularity. I've often wanted to know how long it would take me to build something like &lt;a href="http://www.frinook.com/" target="_blank"&gt;Frinook&lt;/a&gt; with my kids, or a more accurate number for the number of hours I'm spending on Asthmapolis related projects. I'm now on a path to figure some of that out. I'm using a service called &lt;a href="http://toggl.com/" target="_blank"&gt;Toggl&lt;/a&gt; which makes this process very very easy and painless. &lt;br /&gt;Given the patchiness of this new habit, I don't have results for an entire year, but here is a sample of the raw numbers for what I've tracked...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ran, biked, and swam 486 total miles&lt;/li&gt;&lt;li&gt;106 total (dailymile) workouts (1 every 3.5 days isn't bad!)&lt;/li&gt;&lt;li&gt;135 donuts burned&lt;/li&gt;&lt;li&gt;7 pounds burned&lt;/li&gt;&lt;li&gt;2,870 pushups&lt;/li&gt;&lt;li&gt;3,105 situps&lt;/li&gt;&lt;li&gt;Walked 424 flights of stairs&lt;/li&gt;&lt;li&gt;262 tasks completed on Remember The Milk&lt;/li&gt;&lt;/ul&gt;In addition to logging more things in 2011, I'd like to figure out a new way to aggregate all of it so it isn't spread across so many services. I'm envisioning a system like &lt;a href="http://www.nimbits.com/" target="_blank"&gt;Nimbits&lt;/a&gt; and perhaps implementing a number of APIs to import the data. But I'm pretty sure I don't have the time to implement that so I'm still searching... &lt;br /&gt;The pace of innovation in web design and the proliferation of native mobile applications is making data collection easier and more fun. The tracking tools have become so easy and ubiquitous, you shouldn't stop and ask yourself, "What will I do with this data?". You should be saying to yourself, "I can't wait until I figure out how to use all of this great data!" &lt;br /&gt;What else should I be tracking in 2011? &lt;br /&gt;&lt;br /&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/1570784700870867009/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2010/12/quantifying-myself-2010-recap.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1570784700870867009" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/1570784700870867009" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2010/12/quantifying-myself-2010-recap.html" title="Quantifying myself - a 2010 recap" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-2862413314670876578</id><published>2010-12-02T10:45:00.000-06:00</published><updated>2012-11-04T19:08:25.995-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="startups" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><title type="text">Boing Boing's startup advice</title><content type="html">&lt;p&gt;I was reading the recent Fast Company&amp;nbsp;&lt;a href="http://www.fastcompany.com/magazine/151/boing-boing.html"&gt;article on Boing Boing&lt;/a&gt;&amp;nbsp;when I ran into this gem of a qoute from founder&amp;nbsp;&lt;a href="http://pesco.net/"&gt;David Pescovitz&lt;/a&gt;...&lt;/p&gt;&lt;br/&gt;&lt;blockquote class="posterous_short_quote"&gt;&lt;br/&gt;&lt;p&gt;Anything that we do, first and foremost, is to please ourselves.&lt;/p&gt;&lt;br/&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p&gt;The message of the article pins their success on this core belief. And while circumstances may change with customers and investors over time, David's quote should be the mantra of every startup while they get going and look for direction. Smart people do good things not because they conform, but because they have the vision of something different.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;Trying to figure out if you're right is hard enough when you're doing something new. There is no sense in clouding the picture by basing your decisions on perception.&amp;nbsp;It's far easier - and more fun! - to stick with what you believe when navigating the backwoods of innovation.&lt;/p&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/2862413314670876578/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2010/12/boing-boing-startup-advice.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2862413314670876578" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/2862413314670876578" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2010/12/boing-boing-startup-advice.html" title="Boing Boing&amp;#39;s startup advice" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5954182327773213751.post-3011536714648102008</id><published>2010-11-19T08:41:00.000-06:00</published><updated>2012-11-04T19:08:26.000-06:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="gov20" /><category scheme="http://www.blogger.com/atom/ns#" term="madison" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="opengov" /><title type="text">Civic Entrepreneurship - a PechaKucha talk</title><content type="html">&lt;div class="posterous_bookmarklet_entry"&gt;This was the talk I gave at last night's PechaKucha in Madison prior to&amp;nbsp;&lt;a href="http://www.hthh.org"&gt;HTHH&lt;/a&gt;. It's the story of my epiphany relative to leverage my technical skills as a way to give back to my community.&lt;/div&gt;&lt;br/&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;br/&gt;&lt;br/&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a href="http://www.slideshare.net/gtracy/civic-entrepreneurship-a-pechakucha"&gt;slideshare.net&lt;/a&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.gregtracy.com/feeds/3011536714648102008/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.gregtracy.com/2010/11/civic-entrepreneurship-pechakucha-talk.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3011536714648102008" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5954182327773213751/posts/default/3011536714648102008" /><link rel="alternate" type="text/html" href="http://blog.gregtracy.com/2010/11/civic-entrepreneurship-pechakucha-talk.html" title="Civic Entrepreneurship - a PechaKucha talk" /><author><name>Greg Tracy</name><uri>https://plus.google.com/104797338688276932412</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-hfhFgapVPtg/AAAAAAAAAAI/AAAAAAAABew/ro7EYBgtuMQ/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry></feed>
