<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>stevengharms.com &#187; Technology and Computers</title>
	<atom:link href="http://stevengharms.com/category/technology-and-computers/feed" rel="self" type="application/rss+xml" />
	<link>http://stevengharms.com</link>
	<description>My Blog</description>
	<lastBuildDate>Thu, 24 Nov 2011 06:01:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Practical Metaprogramming Video Now Available</title>
		<link>http://stevengharms.com/practical-metaprogramming-video-now-available</link>
		<comments>http://stevengharms.com/practical-metaprogramming-video-now-available#comments</comments>
		<pubDate>Thu, 03 Nov 2011 16:27:09 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2374</guid>
		<description><![CDATA[As mentioned previously, I gave a talk at Rubyconf XI in New Orleans a few months back. The video is now available. If you want to see me talking about some of the finer details of the Ruby programming language while wearing a shirt from Saturday Morning Breakfast Cereal, here&#8217;s your chance. &#8220;Practical Metaprogramming&#8221; hosted [...]]]></description>
			<content:encoded><![CDATA[<p>As <a href="http://stevengharms.com/practical-metaprogramming-presentation-from-rubyconf-xi">mentioned previously</a>, I gave a talk at Rubyconf XI in New Orleans a few months back.  The video is now available.  If you want to see me talking about some of the finer details of the Ruby programming language while wearing a shirt from <a href="http://smbc-comics.com">Saturday Morning Breakfast Cereal</a>, here&#8217;s your chance.</p>

<p><a href="http://confreaks.net/videos/687-rubyconf2011-practical-metaprogramming-modeling-thought-or-lessons-learned-while-using-ruby-s-mp-system-to-model-a-2-500-year-old-dead-language">&#8220;Practical Metaprogramming&#8221; hosted by Confreaks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/practical-metaprogramming-video-now-available/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My  First Week of Development at Carbon Five: By the Numbers</title>
		<link>http://stevengharms.com/my-first-week-of-development-at-carbon-five-by-the-numbers</link>
		<comments>http://stevengharms.com/my-first-week-of-development-at-carbon-five-by-the-numbers#comments</comments>
		<pubDate>Wed, 02 Nov 2011 19:24:00 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[carbonfive]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2358</guid>
		<description><![CDATA[It may be a bit of a &#8220;no duh&#8221; observation to point out that joining a consulting firm has a very different work flow versus working in corporate. A few numbers: Number of days when pairing occurred: 5 Number of hours spent pairing: ~37 Number of stand-ups: 5 Time spent in stand ups (week): ~ [...]]]></description>
			<content:encoded><![CDATA[<p>It may be a bit of a &#8220;no duh&#8221; observation to point out that joining a consulting firm has a very different work flow versus working in corporate.  A few numbers:</p>

<ul>
<li>Number of days when pairing occurred:  5</li>
<li>Number of hours spent pairing:  ~37</li>
<li>Number of stand-ups:  5</li>
<li>Time spent in stand ups (week):  ~ 50 minutes</li>
<li>Brown Bag Lunch:  90 minutes</li>
<li>Emails received within project team:  3</li>
<li>Emails received from client:  1</li>
<li>Skills Worked On:  HTML5, CSS3, Rails, Backbone.JS</li>
<li>Times astounded by <a href="http://mikeperham.com">my pair</a>&#8217;s refactoring skills:  2</li>
<li>Times astounded by my peer teams&#8217; approaches to managing complexity elegantly:  2</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/my-first-week-of-development-at-carbon-five-by-the-numbers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hipchat!</title>
		<link>http://stevengharms.com/hipchat</link>
		<comments>http://stevengharms.com/hipchat#comments</comments>
		<pubDate>Tue, 25 Oct 2011 00:36:27 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2359</guid>
		<description><![CDATA[Earlier this year when driving back to the City from San Jose, I saw this billboard featuring &#8220;Y U NO Guy&#8221; advertising a service called Hipchat. Today on my first day at Carbon Five, I got registered for my accounts: email, tracker, etc. And of course: I USE HIPCHAT, Y U NO GUY. Hipchat&#8217;s founder, [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this year when driving back to the City from San Jose, I saw this billboard featuring &#8220;<a href="http://knowyourmeme.com/memes/y-u-no-guy#.TqYD3JypoX4">Y U NO Guy</a>&#8221; advertising a service called <a href="http://hipchat.com">Hipchat</a>.</p>

<a href="http://stevengharms.com/wp-content/uploads/2011/10/hip.jpg"><img src="http://stevengharms.com/wp-content/uploads/2011/10/hip-300x201.jpg" alt="" title="Hipchat Billboard" width="300" height="201" class="size-medium wp-image-2360" /></a>

<p>Today on my first day at <a href="http://carbonfive.com">Carbon Five</a>, I got registered for my accounts: email, tracker, etc. And of course:</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/10/Screen-shot-2011-10-24-at-10.33.19-AM.png"><img src="http://stevengharms.com/wp-content/uploads/2011/10/Screen-shot-2011-10-24-at-10.33.19-AM.png" alt="" title="Screen shot 2011-10-24 at 10.33.19 AM" width="285" height="65" class="aligncenter size-full wp-image-2361" /></a></p>

<p>I USE HIPCHAT, Y U NO GUY.</p>

<p>Hipchat&#8217;s founder, Pete, tells the story of Hipchat aweseomeness <a href="http://blog.hipchat.com/2011/06/23/a-tale-of-a-ridiculous-billboard/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/hipchat/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Season of New Beginnings:  Joining Carbon Five</title>
		<link>http://stevengharms.com/a-season-of-new-beginnings-joining-carbon-five</link>
		<comments>http://stevengharms.com/a-season-of-new-beginnings-joining-carbon-five#comments</comments>
		<pubDate>Wed, 12 Oct 2011 17:39:01 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruminations]]></category>
		<category><![CDATA[San Francisco]]></category>
		<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2342</guid>
		<description><![CDATA[Probably the most significant constant in the entire history of this blog has been where I have spent several hours of my day each work-day. For a great many years, I have been an employee of Cisco Inc. As of the 19th of this month, that will end. I will commence employment at Carbon Five, [...]]]></description>
			<content:encoded><![CDATA[<p>Probably the most significant constant in the entire history of this blog has
been where I have spent several hours of my day each work-day.  For a great
many years, I have been an employee of <a href="http://cisco.com">Cisco Inc</a>.  As of
the 19<sup>th</sup> of this month, that will end.</p>

<div style="background-color:black; margin: 0px 20px; padding 5px 10px">
<div style="text-align:center">
<a href="http://stevengharms.com/wp-content/uploads/2011/10/carbonfive.png"><img src="http://stevengharms.com/wp-content/uploads/2011/10/carbonfive.png" alt="" title="Carbon Five Logo" width="237" height="110" class="aligncenter size-full wp-image-2344" /></a>
</div>
</div>

<p><br/></p>

<p>I will commence employment at <a href="http://carbonfive.com">Carbon Five</a>, a
consulting and application development firm in San Francisco, on the 24th of
this month.  I am elated about joining Carbon Five&#8217;s team of energetic and
innnovative developers.  I will be doing Ruby and Rails development and I hope
to learn more about mobile development, async server technologies, and sexy
Javascript front-ends.</p>

<p>Since last Winter Carbon Five has hosted a fortnightly &#8220;hack night.&#8221;  Through
the winter and spring they saw me struggle and batter my way through the
rewrite of my LatinVerb library and my metaprogramming presentation.
Ultimately this co-working session facilitated a relationship which is about
to turn into a working relationship.  Here are the things I like about them:</p>

<ol>
<li>Team

<ol>
<li>Management:  Friendly but clearly with a sense of standards and high
expectations but with great trust in the developers to do what&#8217;s right,
well</li>
<li>Staff:  Excited, energetic, motivated, funny on Twitter</li>
<li>Size:  Forty-ish or souls with whom I can have actual relationships</li>
</ol></li>
<li>Culture

<ol>
<li>Standardized hours (exceptions allowed)</li>
<li>Fancy coffee machine that scares me</li>
<li>Developer-sensitive culture:  don&#8217;t burn out, do good work on good
equipment in a nice place</li>
</ol></li>
<li>Agile Methodologies:  Paired programming (flexibly), User Stories</li>
<li>Client Engatement:  I&#8217;ve never worked whith a money-paying customer, I
think that&#8217;s an experience to have!</li>
<li>Technology:  The team there is trying out new ideas and tools all the
time. </li>
<li>Proximity:  They&#8217;re a 3 block walk from my home.  Granted, two of those
are SoMa wide north-east/south-west blocks, but it beats the heck out of
driving or taking the train anywhere.  They&#8217;re also surrounded by several gyms so I can get some fitness work in.</li>
<li>Type of Work

<ol>
<li>Application development (including &#8220;heavy lifting&#8221; of the back end)</li>
<li>Startup / Idea bootstrapping</li>
<li>Design</li>
</ol></li>
</ol>

<p>When the door opened, I felt that the time was right for me to make a change.</p>

<p>I will miss my friends and contacts from Cisco terribly.  The people at Cisco
and my experiences there defined many of my friends and many years of great
memories.  Nevertheless I am so excited about my future with Carbon Five.  I
find so much peace in Ovid these days that I&#8217;ll repeat the quote I gave in my
&#8220;sign off&#8221; email:</p>

<blockquote>
  <p>&#8220;As pliable wax, stamped with new designs, it is no longer what it was; does
  not keep the same form; but is still one and the same;&#8221;</p>
</blockquote>

<p><em>Quoque mutabo</em></p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/a-season-of-new-beginnings-joining-carbon-five/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Practical Metaprogramming&#8221; presentation from RubyConf XI</title>
		<link>http://stevengharms.com/practical-metaprogramming-presentation-from-rubyconf-xi</link>
		<comments>http://stevengharms.com/practical-metaprogramming-presentation-from-rubyconf-xi#comments</comments>
		<pubDate>Sat, 01 Oct 2011 17:19:14 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2335</guid>
		<description><![CDATA[On the 30th of September I presented at Rubyconf XI in New Orleans, LA. My topic was &#8220;Practical Metaprogramming.&#8221; This presentation was very special for me. Having spent some of my childhood in New Orleans, speaking there was very special. Further, one year ago, inspried by Chad Fowler&#8217;s book The Passionate Programmer, I resolved that [...]]]></description>
			<content:encoded><![CDATA[<p>On the 30<sup>th</sup> of September I presented at Rubyconf XI in New Orleans, LA.  My topic was &#8220;Practical Metaprogramming.&#8221;</p>

<p>This presentation was very special for me.  Having spent some of my childhood in New Orleans, speaking there was very special.  Further, one year ago, inspried by Chad Fowler&#8217;s book <em>The Passionate Programmer</em>, I resolved that &#8220;One year from now, I <em>will</em> speak at Rubyconf.&#8221;  I am filled with joy to say that I attained my dream.</p>

<p>I spoke on one of the more complicated aspects of the Ruby programming language:  Metaprogramming.  Ruby&#8217;s constructs allow you to fundamentally and flexibly re-direct calls at runtime and change the object model.  While it is generally believed that this is complicated or a weird bolt-on to Ruby, I contend that <em>all</em> programming in Ruby is metaprogramming &mdash; from the get-go!  I also present a path for learners so that they can level-up.  Lastly I show some examples of heavily, and justifiably heavily used, metaprogramming code courtesy of my library <strong>LatinVerb</strong>.</p>

<p>Here are resources for those in attendance or for those who could not make it.</p>

<ul>
<li><a href="http://stevengharms.com/MP_talk.pdf">The slides to my presentation</a></li>
<li><a href="http://spkr8.com/t/8534">My SpeakerRate.com page</a></li>
<li><a href="http://pragprog.com/book/cfcar2/the-passionate-programmer">The Passionate Programmer</a></li>
<li><a href="https://github.com/sgharms/LatinVerb">LatinVerb GitHub Home</a></li>
</ul>

<p>Or, here are the slides in-line:</p>

<p>Please, if you were inspired by this talk, please leave a comment. If you would like to provide criticism of the talk, please visit the speaker8 page.</p>

<script src="http://speakerdeck.com/embed/4e8766b26ea0ae00530077e0.js?size=preview"></script>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/practical-metaprogramming-presentation-from-rubyconf-xi/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I Won the Podio API Release Hackathon Competition</title>
		<link>http://stevengharms.com/i-won-the-podio-api-release-competition</link>
		<comments>http://stevengharms.com/i-won-the-podio-api-release-competition#comments</comments>
		<pubDate>Sun, 22 May 2011 18:51:24 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[San Francisco]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2248</guid>
		<description><![CDATA[Introduction On May 14th, I competed at a Hackfest hosted by Podio. Podio is a customizable social networking application delivered as a service (aaS). After 8 hours of coding, I placed first in the competition and won a beautiful Apple Cinema Display. In this post I will cover my hack, how it was done, and [...]]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>

<p>On May 14<sup>th</sup>, I competed at a Hackfest hosted by <a href="http://podio.com">Podio</a>.
Podio is a customizable social networking application delivered as a service
(aaS).  After 8 hours of coding, I placed first in the competition and won a
beautiful Apple Cinema Display.  In this post I will cover my hack, how it was
done, and lessons learned.</p>

<p><a href="http://www.flickr.com/photos/podio/5724215201/" title="Steven G.
Harms with his first prize by Team Podio, on Flickr"><img
class="aligncenter size-full"
src="http://farm4.static.flickr.com/3124/5724215201_34a6023095.jpg"
width="500" height="333" alt="Steven G. Harms with his first prize"></a></p>

<p><em>Victori pretium it</em></p>

<p><em><a href="http://blog.podio.com/2011/05/25/interview-with-steven-g-harms-winner-of-the-podio-api-release-hackathon/">Or, you can watch my video interview</a></em></p>

<p><span id="more-2248"></span></p>

<h2>Background</h2>

<p>Let me first introduce the various companies involved and technologies
provided or implemented in the solution.  I think of these as the ingredients
in the recipe that allowed me to code my offering.</p>

<h3>Podio</h3>

<p>In case you haven&#8217;t noticed, people are spending phenomenally large amounts of
time on social networks.  These applications have their own vocabulary of
interactions and provide certain defined workflows that, thanks to their
popularity, are teaching the population certain workflows for successful
collaboration.  As younger employees enter the workforce, their models of
collaboration will be informed by these social networks whose existence and
interaction vocabulary are presumed to be ubiquitous.  Accordingly, it would
be wise for businesses to adjust <em>their</em> workflows to look something like
these social sites.</p>

<p>The traditional solution to this has been to acquire servers, place them in a
data center, and build your own social networking clone which, invariably,
would be perceived as a dismal dog in comparison to the glittery product like
Facebook, Linked In, et al. distilled in the market crucible.  In short,
building a social platform is probably not your core competency.</p>

<p>Enter Podio who offers a software solution that behaves &#8220;like Facebook&#8221; and
which can be used <em>as a service</em>.</p>

<p>Traditionally, when using  an aaS solution, one loses the ability to create
highly specfic applications (&#8220;Podio&#8217;s not going to build an app to show what&#8217;s
in our cafeteria today&#8221;).  Or one might expect that to get a specific app one
would have to pay Podio a handsome consulting engagement fee.  Podio has seen
a way around these drawbacks of using an aaS service by providing an
<strong>in-application, friendly, web-based, drag-and-drop application builder</strong>.
This is the first key element in my solution.</p>

<p>While a well-conceived application builder is great, certain behaviors are
unique to certain businesses (e.g. &#8220;SMS the sales manager if no one takes
ownership of the customer complaint within 24 hours.&#8221;) and don&#8217;t have an
obvious integration point in a web interface.  To remedy this concern, Podio
provides <strong>a rich API (Application Program Interface) that&#8217;s a pleasure to
use</strong>.  It allows 3<sup>rd</sup> parties to extend and share functionality
between the Podio core and their own custom applications.  It was the public
release of this API on Saturday that occasioned the Hackfest.  It was also
the second key element in my solution.</p>

<p>On the topic of the API, let me add that
many technical entities develop an API as an afterthought and the reliability
and consideration (or lack thereof) shows.  Podio bravely (!) decided to
re-implement their web interface as a client of their own API.  This is a
brave move, but by testing whether they themselves could work with the API
they were providing, they wound up creating a better, more-intuitive app.</p>

<p><a href="http://www.flickr.com/photos/podio/5553727063/" title="Work 2.0
Hackday at The Podio Store by Team Podio, on Flickr"><img
src="http://farm6.static.flickr.com/5225/5553727063_3ea610da89.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Work 2.0 Hackday at The Podio Store"></a></p>

<p>Incidentally Podio is not purely a virtual experience, they have the Podio
Store in San Francisco&#8217;s SoMa districit where you can go and talk to their
staff about what you could do with Podio.  They&#8217;ve made the &#8220;app store&#8221;
software conceit physical.  It&#8217;s revolutionarily transgressive in a good way <img src='http://stevengharms.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3>Twilio</h3>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/twilio-logo.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/twilio-logo-300x100.png" alt="" title="twilio-logo" width="300" height="100" class="aligncenter size-medium wp-image-2255" /></a></p>

<p><a href="http://www.twilio.com/">Twilio</a> is a service vendor who provides an
exceedingly simple-to-use API for interacting with phones:  setting up
phone menus (&#8220;Press 1 for &#8230;, Press 2 for&#8230;&#8221;), making phone
calls, bridging calls, setting up conference calls, setting up answer
menus, etc. is a breeze.  If you need to do something that touches a phone,
Twilio&#8217;s rich, well-documented API will make it easy.</p>

<p>I had gotten a Twilio developer key and $30.00 of free minutes that I hadn&#8217;t
touched since it was given to me at the Social Apps workshop held at Heroku in
January 2010 (<em>ulp</em>).  <strong>Twilio&#8217;s API was the third component</strong> in my solution.</p>

<h3>Heroku</h3>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/heroku-logo-light-300x100.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/heroku-logo-light-300x100.png" alt="" title="heroku-logo-light-300x100" width="300" height="100" class="aligncenter size-full wp-image-2251" /></a></p>

<p><a href="http://heroku.com">Heroku</a> makes it incredibly easy to stand up and host web
applications.  I have only ever used it to deploy Rails and Sinatra
applications.  Heroku makes a very complex process managable, but it is not
without some complexity.  <strong>Heroku&#8217;s service was the fourth and final vended
technology involved in my solution</strong>.</p>

<h3>Previous Experience</h3>

<p>It is fair to say that I probably spent the most of my time on the
hack day trying to figure out the right way to develop with Heroku.  However,
if you read through this post and reference the <a href="http://devcenter.heroku.com/articles/quickstart">implementation process</a>, while not
completely <em>effortless</em>, you will capture the value proposition posed by
Heroku&#8217;s use.</p>

<p>Previously I had used Heroku to host my <a href="http://verbalatina.heroku.com">Verba Latina in Viis Ferrorum (Latin
on Rails)</a> application that I used in a failed
bid to get into grad school (<em>Cue violins and tears</em>).  As such I was familiar
with their streamlined, <a href="http://git-scm.com/">git</a>-based deployment design as
well as with the concept that you must configure your app to have a
configuration manifest so that Heroku builds the application the right way.</p>

<p>Last January <a href="http://blog.heroku.com/archives/2010/8/20/social_app_workshop_videos/">Heroku and Twilio hosted an
introduction</a>
to using Twilio and Heroku to create social, phone-based applications.  Here a
pattern emerged whose introduction was very important to my Podio solution:</p>

<ol>
<li>Acquire a Heroku instance</li>
<li>Run a web framework (the lighter the better, for debugging purposes)</li>
<li>Use your instance to bridge communications between API&#8217;s</li>
<li>Violà, mashup</li>
</ol>

<p>However at the Social Apps workshop, I didn&#8217;t really do this, instead I
learned about some other Ruby tools described below.  While the pattern would
have been good to have had some experience with, the following tools were
also essential to my success at Podio, so it was good that I spent time
learning a bit about them.</p>

<h3>Ruby Tooling</h3>

<h4>Sinatra</h4>

<p>Sinatra is a very light language for describing a web server.  You say:  hey,
when someone points to you with <code>/</code> at the end, send back some text generated
by executing some code.  It&#8217;s incredibly simple, incredibly clear and I had
done a &#8220;hello Heroku&#8221; on it as part of the Social Apps get-together.</p>

<h4>Ruby</h4>

<p>Sinatra is written in Ruby, so, I&#8217;m glad I know Ruby.</p>

<h4>RVM</h4>

<p><a href="http://rvm.beginrescueend.com/">RVM</a> is a way to have multiple Ruby
interpreters installed on a machine at the same time such that their various
libraries and dependencies don&#8217;t interfere with one another.  It also has a
wonderful tool called &#8220;gemsets&#8221; which allow you to store all your Ruby gems
(libraries for specific tasks) in a single sandbox so that you know what you
have when it comes time to deploy.</p>

<h4>git</h4>

<p><a href="http://git-scm.org">Git</a> is for revision control.  More than once I screwed
up a file and needed to get back to a working state quickly, specifically
because the competition was timed.  The ability to not have to do dozens of
&#8216;undo&#8217; operations was critical.</p>

<h4>vim</h4>

<p>A fast editor for editing text.  &#8216;Nuff said.</p>

<h2>Ingredient List</h2>

<p>Having shown the background above, I had the following ingredients when I
showed up:</p>

<ol>
<li>Podio:

<ol>
<li>In-application, web-based, drag-and-drop application builder</li>
<li>API</li>
</ol></li>
<li>Twilio

<ol>
<li>API</li>
<li>Free developer minutes from Social Apps workshop</li>
</ol></li>
<li>Heroku</li>
<li>Sinatra</li>
<li>Other development tools</li>
</ol>

<p>As of Saturday morning, I would rate my proficiency with Podio, Twilio, and
Heroku, and Sinatra as being very low.  It is a tribute to the designers of
these systems that I was able to stitch them all together in just a few hours.</p>

<h2>The Hack</h2>

<h3>Kick-Off</h3>

<p>First things first I arrived at Podio&#8217;s <a href="https://store.podio.com/">beautiful
storefront</a> on 6<sup>th</sup> street, SoMa, SF, CA,
but 2 blocks from my house, at 8am and was treated to some great brain-food
for breakfast.  The interior is beautuful with Scandinavian sensibility and
with several ukelele&#8217;s decorating the wall.  The loft-style space is modern
and tasteful and a great place to visit.</p>

<p><a href="http://www.flickr.com/photos/podio/5553731133/" title="IMG_5782 by
Team Podio, on Flickr"><img
src="http://farm6.static.flickr.com/5141/5553731133_32029ddb43.jpg"
class="aligncenter size-full"
width="500" height="333" alt="IMG_5782"></a></p>

<p><em>The ukelele wall</em></p>

<p>The morning started off with <a href="http://blog.podio.com/author/phil/">Phil
Chambers</a> (CTO,
<a href="http://twitter.com/#!/filchambers">@filchambers</a>) and
Christian Holm (Developer, <a href="http://twitter.com/#!/hlmrn">@hlmrn</a>) showing off
what the Podio drag and drop tool and API is capable of.</p>

<p><a href="http://www.flickr.com/photos/podio/5724806926/" title="Christian Holm
by Team Podio, on Flickr"><img
src="http://farm6.static.flickr.com/5268/5724806926_8cb74ce8b8.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Christian Holm"></a></p>

<p><em>Christian demonstrates</em></p>

<p>Now here&#8217;s a bit of a sheepish confession I have to make:  <em>I hadn&#8217;t really
even considered there was a competition</em>.  I thought it was going to be a meet
and greet, code some, and get some tasty food and / or beverages&#8230;but then
Phil mentioned that there were prizes for the best use of the API!  To sweeten
the deal with the spectre of avarice, Podio had brought in some great prizes:
Dr.  Dre headphones, an iPad2, and a beautiful Apple Cinema Display.  I
figured going home with headphones wouldn&#8217;t be bad for a day&#8217;s work.  I
half-flirted with maybe even getting the iPad but didn&#8217;t put much store by it.
Besides, I had work to do.</p>

<h3>Ideation</h3>

<p>After the &#8220;Go!&#8221; bell was rung, I thought about something that had been on my
mind.  They day before I&#8217;d had a frustrating visit with my HOA.  I found
myself wishing that there were some way for us to keep better track of our
&#8220;shared&#8221; maintenance tickets (handled via email).  The first thing I did was use
Podio&#8217;s drag-and-drop application builder to build a basic ticket tracker.
While most tickets are private and bonded to a single resident, there should
be &#8220;shared / public&#8221; tickets for shared issues:  water stains in a hallway,
Insanity Wolf in the garage, etc.</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/insanity_wolf.jpg"><img src="http://stevengharms.com/wp-content/uploads/2011/05/insanity_wolf-300x300.jpg" alt="" title="insanity_wolf" width="300" height="300" class="aligncenter size-medium wp-image-2254" /></a></p>

<p><em>A fearsome menace!  Insanity wolf does not read your Tumblr blog</em></p>

<p>I called this app &#8220;Is It Done Yet?&#8221; &mdash; a common-enough thought among most
urban flat-dwellers when considering the state of their work orders with their
property management companies.</p>

<p>By using the Podio app builder &#8230;</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/app_builder.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/app_builder-300x262.png" alt="" title="app_builder" width="300" height="262" class="aligncenter size-medium wp-image-2250" /></a></p>

<p><em>Click for larger view</em></p>

<p>I was able to create &#8220;IIDY?&#8221; tickets&#8230;</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/IIDY_ticket.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/IIDY_ticket-271x300.png" alt="" title="IIDY_ticket" width="271" height="300" class="aligncenter size-medium wp-image-2253" /></a></p>

<p><em>Click for larger view</em></p>

<p>This took me all of about 15 minutes to put together.  It was about this time
that Jon Froda, one of the founders, came by to talk to me about how things
were going.  I explained the work-order tracking idea and he suggested that
maybe I could add an alerting system for &#8220;Emergency&#8221; requests and that I could
have that page out.  Having been a sysadmin, I knew about pager notifications
and while I thought it might be a bit too simple to be a real competitor, I
knew that it was implementable in a few hours&#8230;provided I use Heroku and
Twilio.  I was a bit daunted since I was not too familiar with these peer
components and I certainly had no experience in tying them to the Podio API.</p>

<p><em>&#8230;But</em> Jon&#8217;s idea seemed audacious to win a prize but was slim enough to do
in a few hours.  I went with it.</p>

<p>I thought the idea over and sketched up a basic schematic for the design with
the help of Christian.  I worked from right to left.</p>

<pre>
Podio                    Heroku-hosted Custom App               Twilio
 Web Hook On Create -->    Receives event                  |-->API sends SMS
                           Evaluates emergency Status      |
                           If emergency, paged via Twilio -|
</pre>

<h3>Set Up the Development Space</h3>

<pre><code>$ mkdir podio
$ cd podio
$ git init
$ echo '\*.sw\*' &gt;&gt; .gitignore
$ touch Gemfile Gemfile.lock
$ echo 'rvm use ruby-1.9.2-p180@podio' &gt;&gt; .rvmrc
$ cd ~
$ rvm use ruby-1.9.2-p180
$ rvm gemset create podio
$ cd - 

info: Using ruby 1.9.2 p180 with gemset podio
$
</code></pre>

<p>As I mentioned earlier, knowing some core Ruby / Unix tools made getting
started and working efficiently an edge for a team of one.  These command set
creates a directory, a primitive git ignore file, and creates a Gemfile that
will be used for defining the apps&#8217; gem dependenices via
<a href="http://gembundler.com/v1.0/index.html">bundler</a> as required by Heroku.  It
also specifies an RVM gemset which will sandbox all the dependencies.</p>

<h3>Send an SMS via Twilio from the CLI</h3>

<p>Twilio provides an Ruby wrapper for dealing with their API. The first thing I
did was get the <code>twiliolib</code> gem.  I then found the <a href="http://www.twilio.com/docs/howto/sms-notifications-and-alerts">Twilio SMS
example</a> that,
although written in PHP, was sufficient to give me a place to start.</p>

<p>I implemented this code like so:</p>

<pre><code>#!/usr/bin/env ruby

require 'twiliolib' 
require 'pp'

# Twilio REST API version 
API_VERSION = '2010-04-01'

# Twilio AccountSid and AuthToken 
ACCOUNT_SID = 'MY-SID' 
ACCOUNT_TOKEN = 'MY-AUTH-TOKEN'

# Outgoing Caller ID previously validated with Twilio 
CALLER_ID = 'MY-VALIDATED CALLER ID';

# Create a Twilio REST account object using your Twilio account ID and token
account = Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN)

d = { 'From' =&gt; CALLER_ID, 'To' =&gt; 'MY-CELL-PHONE', 'Body' =&gt; ARGV.empty? ?
'An EMERGENCY severity task has been opened!  Please check PODIO task list.'
: ARGV[0] }

resp =
account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/SMS/Messages",
'POST', d) resp.error! unless resp.kind\_of? Net::HTTPSuccess

puts "code: %s\nbody: %s" % [resp.code, resp.body]
</code></pre>

<p>What could be easier!?  Well, I got killed by a bug here that took a lot of
debugging.  I had put in the wrong <code>CALLER_ID</code> value.  Make sure you <strong>cut and
paste</strong> the validated phone number value into your code.  You can find the
number on your <a href="https://www.twilio.com/user/account/phone-numbers">Twilio user
page</a>.</p>

<p><em>Tip:</em>  In the last puts of the code, there is a call to <code>resp.code</code> and
<code>resp.body</code>.  Twilio provides another value <code>resp.moreinfo</code>.  This additional
property of the response object is described in the <a href="http://www.twilio.com/docs/api/rest/response">response
API</a>.  It will give your a more
verbose explanation of why a REST request failed.  I wound up finding out that
my approved number was incorrect from this property (see previous paragraph) by
tracing through the stack using <code>rdebug</code>.  Again, familiarity with the
lanaguge&#8217;s facets and debugging tools will make your race much easier.
Unfamiliarity with <code>moreinfo</code> cost me time and thus functionality :-/.</p>

<p><a href="http://www.flickr.com/photos/podio/5724247967/" title="Alan Davis by
Team Podio, on Flickr"><img
src="http://farm4.static.flickr.com/3457/5724247967_879907f893.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Alan Davis"></a></p>

<p><em>Alan Davis, when not being harrassed on GChat by yours truly</em></p>

<p>As I was debugging that issue I had help from Alan Davis and Andrew Benton on
the Twilio team via GChat.  With a simple Twilio paging app completed, I was
ready for a midday snack.  After that I needed to put the logic of my
stand-alone app into a web framework: both on my local MacBook Pro as well as
a remote system reachable by Podio as well as Twilio, i.e. on Heroku.</p>

<h3>Building the Middleware: Heroku and Sinatra</h3>

<p>I started off small in Sinatra, basically cloning the Sinatra tutorial by
<a href="http://titusd.co.uk/2010/04/07/a-beginners-sinatra-tutorial">Joe Yates</a> with
additional support from <a href="http://sinatra-book.gittr.com/">The Sinatra Book</a>.
This set me up with a small web service on my local machine as a proving
ground for what I would deploy onto the <em>real</em> Internet on a Heroku node.</p>

<p>In about a half hour I had a Sinatra app running on my localhost that blended
in the Twilio logic from the previous step.  This file is <code>podio.rb</code>.</p>

<pre><code>require 'sinatra'
require 'twiliolib'


# Twilio REST API version
API_VERSION = '2010-04-01'

# Twilio AccountSid and AuthToken
ACCOUNT_SID = 'XXXXXXX'
ACCOUNT_TOKEN = 'XXXXXXX'

# Outgoing Caller ID previously validated with Twilio
CALLER_ID = 'XXXXXXX';


before do
  # Great debugging!
  pp params
end

helpers do
  def send_a_page(rest,num)
      account = Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN)

      d = {
          'From' =&gt; CALLER_ID,
          'To' =&gt; rest[0].nil? ? 'XXX-XXX-XXXX' : rest[0],
          'Body' =&gt; "Emergency page"
      }

     resp = 
     account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/SMS/Messages",
                               'POST', d)
     puts "#### code: %s\nbody: %s" % [resp.code, resp.body]
   end


  end
end

get '/' do
  'Minimal Sinatra Hello World!'
end


get '/razzle' do
  'You have been razzled!'
end

get '/simplenotify/' do
 'Paging out simple'
 send_a_page [ nil, 'simple notify', nil, nil ] 
end
</code></pre>

<p>As you can see, given my inexperience with Sinatra I kept things simple.  The
first routes I added were &#8216;<code>/</code>&#8217; and &#8216;<code>/razzle</code>&#8217; (Old joke from the Perl camel
book&#8230;).  Having tested those locally, I was sure I had the right approach.  I
then wrote <code>/simplenotify</code> to see if I could page myself.  This basically
harvested the previous CLI implementation and had me underway.  I next needed
to get this code up into Heroku.</p>

<h3>Heroku</h3>

<p>As I said before, Heroku is not difficult.  But Heroku is not easy either.
Heroku deployments have a number of dependencies on constituent technologies
that are not easily understood unless you are already familiar with the
requisite, supporting technologies preferably in a realm where you have used
each of them independently where their dependencies don&#8217;t cloud the issue.
Regrettably, it doesn&#8217;t seem like there is much documentation that helps take a
developer through that process (although this post might fill that void).</p>

<p>That said, deploying to Heroku once you know these pieces is a snap, but before
then it is daunting, and especially so under time pressure!  For first timers,
your time will principally be spent here (<em>yes, I did just split that
infinitive</em>).</p>

<p>Let me try to simplify things as much as possible:</p>

<ol>
<li>Follow the <a href="http://devcenter.heroku.com/articles/quickstart">quickstart</a>, steps 1-3:</li>
<li>Get Heroku on Ruby 1.9: <code>heroku stack:migrate bamboo-mri-1.9.2</code> in your
working directory</li>
<li>Edit code in podio.rb that worked on localhost, commit it to the local git
repository</li>
<li>Execute step 4 and push to heroku; your code is now on Heroku!</li>
<li>Fail</li>
</ol>

<p>When I started I didn&#8217;t understand two critical constituent technologies that
are needed to make Heroku work.  Here they are.</p>

<h4>Bundler and Gemfile</h4>

<p>Bundler allows you to specify gems your app needs (on local development) in a
Gemfile.  Heroku respects this definition set when it gets your application
pushed to it.  Therefore <strong>any gem you need should be specified in the
Gemfile</strong>.  Thus my Gemfile looks like:</p>

<pre><code>source "http://rubygems.org"

gem "nokogiri"
gem "rack"
gem "sinatra", "1.2.6"
gem "twiliolib"
gem "podio"
</code></pre>

<p>What does this mean?  It means that I want you, Heroku, to install nokogiri,
rack, sinatra, twiliolib, podio into this instance&#8217;s (be it local or Heroku)
gemset repository.  On the local system, thanks to my <code>.rvmrc</code> this will ALSO
be in the <code>podio</code> gemset I specified when I set up the workspace.  Thus I can
issue <code>bundler install</code> and the gems will be downloaded and, thanks to RVM,
be stored in the <code>podio</code> gemset.  This is very cool.  When this directive goes to
Heroku the <em>same thing</em> will happen.  Heroku will grab all the gems specified
in the Gemfile and store it in your app&#8217;s gem repository.  If you want to
<code>require</code> it, make sure its gem is loaded in the <code>Gemfile</code>.  Speaking of
<code>require</code>&#8230;</p>

<h4>Rack and config.ru</h4>

<p>Sinatra uses &#8216;rack&#8217; as middleware.  To configure how a Rack instance is to be
launched, you specify the criteria in <code>config.ru</code>.  Here&#8217;s mine:</p>

<pre><code>require 'sinatra'
require 'twiliolib'
require 'pp'
require './podio.rb'

run Sinatra::Application
</code></pre>

<p>It is the logical complement to the Gemfile.  It says, given those gems that
are now available (thanks to bundler and <code>Gemfile</code>), I want to require these
libraries into the namespace:</p>

<ul>
<li><code>sinatra</code>:  (obviously!)</li>
<li><code>twiliolib</code>:  For use in Twilio operations</li>
<li><code>pp</code>:  pretty-print debugging</li>
<li><code>./podio.rb</code>:  My code!</li>
</ul>

<p>The last step is a command to run a <code>Sinatra::Application</code>.</p>

<p>With these two files in place and in the git repository, we&#8217;re good to run a
Heroku-based simple-page out.  With a simple <code>git push heroku master</code> I was
able to get my code up on Heroku.  The <code>heroku logs (-n lineCount)</code> command
was a good friend during this process.  Pointing a browser at
<code>http://my-heroku-instance.heroku.com/simplenotify</code> sent my phone a page.  Next
was to tie the other half in:  link into Podio.</p>

<p><a href="http://www.flickr.com/photos/podio/5724245617/" title="Neil Mansilla
and Andreas Haugstrup by Team Podio, on Flickr"><img
src="http://farm4.static.flickr.com/3624/5724245617_5101f91113.jpg"
class="aligncenter size-full"
width="407" height="500" alt="Neil Mansilla and Andreas Haugstrup"></a></p>

<p><em>Neil uses Skype to contact Podio home-base in Copenhagen for Andreas&#8217; help
and Journey playlist</em></p>

<h3>Podio API</h3>

<p>First, I went back to my app editor and added a field called &#8220;Emergency&#8221; with
values of &#8220;Yes&#8221; and &#8220;No.&#8221;  Then I saved the app.  This would be my signal of
whether to page out.</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/webhook.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/webhook-300x145.png" alt="" title="webhook" width="300" height="145" class="aligncenter size-medium wp-image-2256" /></a></p>

<p>Next I clicked the &#8220;Settings &gt; WebHooks&#8221; menu.  I added a new hook and
specified that <code>item.create</code> tasks should trigger the URL to my Heroku
instance called <code>/verify</code>.  This name is a bad name, but I was in too much of
a hurry to change it.  I should have called it something else.  I specified,
thus, a URL of the form <code>http://my-heroku-instance/verify</code>.</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/05/hookspecify.png"><img src="http://stevengharms.com/wp-content/uploads/2011/05/hookspecify-288x300.png" alt="" title="hookspecify" width="288" height="300" class="aligncenter size-medium wp-image-2252" /></a></p>

<p>The next step is to verify your URL.  To accomplish this Podio will send a
form-encoded data blob (POST) to your URL.  You must catch this and send back
the <a href="https://developers.podio.com/doc/hooks/validate-hook-verificated-215241">validation information specified per the
spec</a>.</p>

<p>At this time I was encouraged by Christian to make use of the 
<a href="https://developers.podio.com/clients/ruby">Ruby client API</a> to handle the
validation.  Ergo I added <code>podio</code> to my Gemfile and required <code>podio</code> in my
<code>config.ru</code>.  I then ran <code>bundler install</code> and viola, I had the gem I needed.
I then did another <code>git push heroku master</code> and Heroku built in the new
dependency.  I was now able to get validation working via API.</p>

<p>Getting validation set up took me a while, but it basically boils down to
this.</p>

<p>In my <code>podio.rb</code>, in the listener for the route I specified in the WebHook
configuration to use I added the following logic:</p>

<p>require &#8216;sinatra&#8217;
  require &#8216;twiliolib&#8217;</p>

<p>post &#8216;/verify&#8217; do
    if params[&#8220;type&#8221;] == &#8220;hook.verify&#8221;
      Podio.setup( :api_key => &#8216;MY API KEY&#8217;, :api_secret => &#8216;SECRET_STUFF&#8217;)<br />
      Podio.client.authenticate_with_credentials(&#8216;MY_PODIO_EMAIL_LOGIN&#8217;, &#8216;PW&#8217;)
      Podio::Hook.validate params[&#8220;hook_id&#8221;],  params[&#8220;code&#8221;]
    end
  end</p>

<p>Then you hit the &#8220;Verify&#8221; button in Podio.  If you watch your Heroku logs,
you&#8217;ll see the request come through and the validation trigger occur.
<strong>NOTE:</strong>  I lost a lot of time because I had &#8216;get&#8217; as the first word for
/verify.  Verification happends as a <strong>POST</strong> operation.  It was getting late
at that point and I was completely blind to that error.</p>

<p><a href="http://www.flickr.com/photos/podio/5724781980/" title="Podio
Hackathon by Team Podio, on Flickr"><img
src="http://farm3.static.flickr.com/2791/5724781980_11d41ea4c8.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Podio Hackathon"></a></p>

<p><em>Probably about this point I got stuck on this stupid bug&#8230;</em></p>

<p>Now that the hook was validated, all I needed was a means to catch
<code>item.create</code> operations.  So I added:</p>

<pre><code>if params["type"] == "item.create"
 send_a_page [ nil, 'simple notify', nil, nil ], params["item_id"]
end
</code></pre>

<p>This would pass the configuration message as well as the critical item_id
for the newly-created item to a helper method which would implement the
Twilio bridge to place a page.</p>

<p>Here&#8217;s that method, it should look familiar based on the content presented
thus far.</p>

<pre><code>helpers do
  def send_a_page(rest,num)

   Podio.setup( :api_key =&gt; 'XXXXXX', :api_secret =&gt; 'XXXXXX')   
   Podio.client.authenticate_with_credentials('XXXXXX', 'XXXXX')

   # The ID passed in from /verify
   anItem=Podio::Item.find(num)

   # Very ugly JSON hash dereferencing
   theField=
     anItem["fields"].detect{|x| x["external_id"] == "is-this-an-emergency" }
   theRes=anItem["tasks"].first["created_by"]["name"]

   # If the emergency value field is set to use
   if  theField["values"].first["value"] =~ /yes/i 
     # Cheap Heroku logging <img src='http://stevengharms.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> 
     puts "YES!  It is an emergency" 

      account = Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN)

      d = {
          'From' =&gt; CALLER_ID,
          'To' =&gt; rest[0].nil? ? 'XXX-XXX-XXXX' : rest[0],
          'Body' =&gt; "Emergency page: Task: #{params["item_id"]}" +
                          " from resident "+ 
                           "#{theRes} has been reported in Podio!"
      }

     resp = 
     account.request("/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/SMS/Messages", 
                               'POST', d)
     puts "#### code: %s\nbody: %s" % [resp.code, resp.body]
   else
     puts "NO"
   end
  end
end
</code></pre>

<p><a href="http://www.flickr.com/photos/podio/5724240261/" title="The demo that
never was.  by Team Podio, on Flickr"><img
src="http://farm3.static.flickr.com/2673/5724240261_e6fdbd2397.jpg"
class="aligncenter size-full"
width="500" height="333" alt="The demo that never was. "></a></p>

<p><em>Caleb invited me to show up via the SF Ruby group</em></p>

<h2>Finish Line</h2>

<p>At this point all the pieces were in place and I created a test item, set to
emergency, and had it page my cell phone.  It worked!  I finished about 10
minutes ahead of time and did something revolutionary.</p>

<p><strong>I STOPPED WORKING</strong></p>

<p>A failing app is a non-competitor, so I decided to quit with a small bit
of functionality in place.  I had planned for more, but learning Heroku,
Sinatra, Twilio, and Podio had taken more time than I had expected.  I credit
knowing when to stop to be the result of 10 years hard experience in coding
before deadlines or change request endings.</p>

<h2>Comments</h2>

<p>The story I tell here is pretty straight-forward and linear, but in reality
(and I have the git commit logs to prove it!) it was much messier.  I hope
anyone interested can follow this post for didactic purposes not narratorial
veracity.</p>

<h2>Demo</h2>

<p>I grabbed a beer and started talking with some of the guests who had come for
the demos.  The beer was necessary because my furious coding had left my
nerves shot and my hands shaking.  We sat down and were called upon to
demonstrate in order.  When my turn came I explained about the need for case
tracking and alert systems.  I created a new &#8220;Is It Done Yet&#8221; item, set the
flag to emergency, and submitted the item.  And as I talked I felt a buzz and
ring from my chest pocket:  I pulled out my phone and showed that the alert
had worked!</p>

<p><a href="http://www.flickr.com/photos/podio/5724795210/" title="Winner Steven
G. Harms by Team Podio, on Flickr"><img
src="http://farm4.static.flickr.com/3100/5724795210_34b7d5772d.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Winner Steven G. Harms"></a></p>

<p><em>I demonstrate&#8230;</em></p>

<p>It was a good feeling to get down from the presentation with a working app.
The other entrants were all great.  Alas, several good ideas were also presented
where the developers couldn&#8217;t <em>quite</em> get all the pieces working in the time
allotted.</p>

<p><a href="http://www.flickr.com/photos/podio/5724793064/" title="Ching Mey and
John Fan by Team Podio, on Flickr"><img
src="http://farm6.static.flickr.com/5087/5724793064_4d3a7f3a85.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Ching Mey and John Fan"></a></p>

<p><em>Cardinal Blue did a great job</em></p>

<h2>The Winner, Me?</h2>

<p>When the judges&#8217; delibrations had finished they returned and announced that
3rd prize was going to Nick who had worked with us remotely from Copenhagen
(home of Podio).  He won the sweet headphones as his application was designed
to catalog entrants in the Eurovision contest.</p>

<p><a href="http://www.flickr.com/photos/podio/5724209323/" title="Andreas
Haugstrup and Nick Barnwell  by Team Podio, on Flickr"><img
src="http://farm3.static.flickr.com/2363/5724209323_db0771a8ee.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Andreas Haugstrup and Nick Barnwell "></a></p>

<p>Coming up next, for the iPad 2, was the team from Cardinal Blue.  I thought their conference call bridging app (also using Twilio!) between Podio contacts was really great.</p>

<p><a href="http://www.flickr.com/photos/podio/5724214565/" title="Ching Mey and
John Fa by Team Podio, on Flickr"><img
src="http://farm6.static.flickr.com/5265/5724214565_58d4f21337.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Ching Mey and John Fa"></a></p>

<p>But I was very surprised when Phil Chambers announced that the
winner was &#8220;Team Solo&#8221; that is, me.  I was awarded the beautiful cinema
display on which, even now, I type this document.</p>

<p><a href="http://www.flickr.com/photos/podio/5724220057/" title="Winner Steven
G. Harms by Team Podio, on Flickr"><img
src="http://farm4.static.flickr.com/3481/5724220057_a58c974d62.jpg"
class="aligncenter size-full"
width="500" height="333" alt="Winner Steven G. Harms"></a></p>

<p><em>Checking my iPhone for an update as triggered from Podio for the camera</em></p>

<p>I gave a little speech, thanking the Twilio guys and the Podio guys who helped
me.  I was thankful to all of them for creating systems that had openness and
hybridization at their heart.  With such a good design principle at their
core, all apps can be integrated for great and surprising effect.</p>

<p>After that it was time for more beer and a great lasagne dinner.  Podio is
first-class all the way through.</p>

<p>I had a great night talking with contacts who urged me to take the idea
further and I hope to talk with all of them again soon.</p>

<h2>Thanks</h2>

<p>I am so thankful to everyone who helped me on the way and am thankful to Podio
for their generosity and initiative in setting this up.  I urge all of you to
try to make a hack fest.  It really gels your skills and, who knows, you
might win!</p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/i-won-the-podio-api-release-competition/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>I, too, am glad I did not come of age in the age of the internets</title>
		<link>http://stevengharms.com/i-too-am-glad-i-did-not-come-of-age-in-the-age-of-the-internets</link>
		<comments>http://stevengharms.com/i-too-am-glad-i-did-not-come-of-age-in-the-age-of-the-internets#comments</comments>
		<pubDate>Fri, 22 Apr 2011 16:59:38 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Critique]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Life And Death]]></category>
		<category><![CDATA[Modern Times]]></category>
		<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2233</guid>
		<description><![CDATA[I think Ryan and I must be on a similar wavelength lately as I too was thinking the exact same thing as him: I am thankful to not have come of age in an era where the internet&#8217;s depthless hard drives could store my equally depthless teenage narcissism or youthful folly for-ever. You can read [...]]]></description>
			<content:encoded><![CDATA[<p>I think Ryan and I must be on a similar wavelength lately as I <em>too</em> was thinking the exact same thing as him: I am thankful to not have come of age in an era where the internet&#8217;s depthless hard drives could store my equally depthless teenage narcissism or youthful folly <em>for-ever</em>.  You can read <a href="http://signalwatchlinks.blogspot.com/2011/04/i-am-always-glad-i-did-not-come-of-age.html">Ryan&#8217;s</a> take here.</p>

<p>As an early (may I say that?) adopter in the general populace (1994, dial up Unix shell on a SCO-V UNIX) of the Internet, I didn&#8217;t get off scot-free.  Thanks to <a href="http://en.wikipedia.org/wiki/Bulletin_board_system">BBS&#8217;</a> and <a href="http://en.wikipedia.org/wiki/Usenet">Usenet</a>, I managed to write some pretty inane things (e.g. &#8220;Are you excited about <a href="">Mike Modano</a> and the Dallas Stars?&#8221;) and various comments of the form &#8220;<a href="http://stevengharms.com/ditmsghod-90s-edition-strikes-back">Gillian Anderson is the most beautiful woman in the world!</a>&#8221;).  Thankfully these comments were widely spread, private (in the case of BBS&#8217;), and untraceable (in the case of Usenet).</p>

<p>Unlike what faces modern youth, my revelations of crushes, breakups, or photographs of humiliating pass-outs are not recorded, displayed, and / or, as in the case of particularly recirculation-worthy errors, spread globally with witty, degrading commentary added in sans-serif fonts.  It seems that the internet has forgotten the essential truth of being young:  as youths we fuck up.  For a taste (possibly not-safe for work), consider <a href="http://www.latenightmistakes.com/">Late Night Mistakes</a>.</p>

<p>To say &#8220;fuck up&#8221; may seem a discordant note in an otherwise slightly-more-highly-minded essay, but I think &#8220;fucking up&#8221; is exactly what youths do.  It&#8217;s not that the young &#8220;err,&#8221; implying a sense of understanding cause and the full length of effect and they do the wrong thing.  No, rather they fuck up.  They leave mowers in the rain, crash cars, text and drive<sup>1</sup>, and run out of gas.</p>

<p>When you ask them why they did (or did not do) what ought have been done, they often have no answer because, research shows, their brain is not fully wired up yet; in case you missed that, they literally <em>do not know</em>.  It&#8217;s all the free will of an adult without the experience to see final consequences <em>all while being divorced from the motivation</em>.  It&#8217;s asking for chess, a game of evaluating predicted long-term outcomes, from a Candy Land player (&#8220;I go to the green square now!&#8221;).<sup>2</sup>  This implies to me not that they chose to do the wrong thing, but that they simply fucked up.  Incidentally, to me this seems the game of parenting:  molding kids by providing rote maxims while hoping your kids don&#8217;t fuck up unto death before they can start making sense of the world as an adult.</p>

<p>When young the brain is not fully developed, the risk-evaluation cortices are immature and fucking-up occurs.  Surely at the age of 25 everyone wishes the option to have a wipe-out, a quashing on mention of the fuck-ups in the previous 25 years.  To remember the moments of burning humiliation, despair, isolation, and cruelty are the moments that forge our characters, but it&#8217;s nice to know they live <em>back there</em> away from quotidian existence.  To feel that bitter flush in our temples and ears when the memories come back too clearly is our <em>private</em> boon, a spur to the right, or a sword-wielding, flaming angel warning off from the wrong path.  Is it fair that <em>my</em> private character-forming experiences may be commandeered for sport, or that <em>my</em> lessons sans context are found later?  In my generation that was not possible, for today&#8217;s it may be impossible to avoid.  You know your errors will be documented by a dozen cell-phones, be spread like spilled quicksilver, and will live forever.</p>

<p>For me there is another concern.  Not only does the burn of shame endure from moment of fuck-up unto the end of the electronic society, but knowing of the deathlessness of modern error, there will be a chilling effect on  the <em>healthy</em> experimentation befitting to this time of life.  To be clear, there are fuck-ups, but there are also experiments.  Admittedly, sometimes that line <em>is</em> fuzzy, I grant.  But if one is afraid to attempt an experiment for fear of it it being wrong and then having it recorded and disseminated as a fuck-up, then some wonderful people will not realize their full, true identity.  It&#8217;s a pre-emptive shove to keep your exploration about your identity in the closet against the master paradigm.   And note, I&#8217;m not strictly talking sexual identity, I&#8217;m talking about loving cello, being devout Muslim, being an atheist, struggling to be a poet.  There&#8217;s a chilling effect as we see how deathless media can haunt you forever.</p>

<p>Imagine:</p>

<p>&#8230;High on hormones and ill-gained vodka, in a music-thrumming bedroom where the room spins red  as her lips careen into her best friend&#8217;s&#8230; hours later her friend crushes her heart and her weeks of angst by publicly blabbing about the &#8220;lez shit&#8221; that her friend pulled&#8230;.<sup>3</sup><br />
&#8230;The humiliating break-up from something you might work&#8230;hours later you have to endure a grilling via dozens of text messages&#8230;<br />
&#8230;That Goth phase&#8230;.</p>

<p>To remember and laugh, to move on, to accept is a blessing of aging, but to have it indelibly etched in so many 1&#8217;s and 0&#8217;s for eternal sport <em>and to know that this is the case</em> could make anyone run from seeing something as a folly of youth or an experiment and turn it into something, quite possibly, not worth living through and past.</p>

<p>The time is, sadly, inevitably coming (has already come?) where the Internet&#8217;s perfect, inhuman, and inhumane memory will drive a beautiful life to end itself.  Perhaps I can take a page from <a href="http://www.itgetsbetter.org/">Dan Savage</a> in preëmption:  &#8220;For those who have embarrassed themselves on the Internet, it gets better.  No matter how bad it gets, we&#8217;re born naked, we die with little control over our bodies, you will do well sometimes and poorly others, you will rue and relish alike, and everyone is a fool in love.  Try to be honest, nice, and respectful to others, especially those you share your secrets and bodies with.  And lastly cut yourself and everyone else a little slack.  Be that voice of conscience that doesn&#8217;t relish the safe, mean blanket of <em>schadenfreude</em> over the beautiful quilt of friendship.&#8221;</p>

<p>Whatever evidence is left, you are more than the sum of your experiences and their record.</p>

<p>Notes:</p>

<ol>
<li>I&#8217;d almost rather give a teen a beer than a phone before putting him/her on the road</li>
<li>Obviously this varies by individual, so yes, there will be some teens who know more about electrical engineering by 16 than I ever will.  </li>
<li>Times being what they are, this situation may now be a bragging point.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/i-too-am-glad-i-did-not-come-of-age-in-the-age-of-the-internets/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tmux:  A Screen Multiplexer</title>
		<link>http://stevengharms.com/tmux-a-screen-multiplexer</link>
		<comments>http://stevengharms.com/tmux-a-screen-multiplexer#comments</comments>
		<pubDate>Fri, 25 Mar 2011 21:34:05 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2216</guid>
		<description><![CDATA[I&#8217;ve used GNU screen since 1994 to keep multiple terminals open and active on remote servers. Whew. That&#8217;s a lot of my life to be mucking about terminal windows. The longevity of that run should say good things about the people behind screen. But about 6 months ago at RubyConf i was convinced to try [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve used GNU screen since 1994 to keep multiple terminals open and active on remote servers.</p>

<p>Whew.  That&#8217;s a lot of my life to be mucking about terminal windows.  The longevity of that run should say good things about the people behind <code>screen</code>.</p>

<a href="http://stevengharms.com/wp-content/uploads/2011/03/tmux_screen.png"><img src="http://stevengharms.com/wp-content/uploads/2011/03/tmux_screen-300x187.png" alt="Screenshot of a tmux session" title="tmux_screen" width="300" height="187" class="size-medium wp-image-2218" /></a>

<p>But about 6 months ago at RubyConf i was convinced to try out <code>tmux</code> (<strong>t</strong>erminal <strong>mu</strong>ltiple<strong>x</strong>er).  It&#8217;s a more flexible, more scriptable cousin of <code>screen</code>.  You have the ability to divide space into multiple tiled panes so that you can have a code and result window on the same screen, you can attach multiple clients without the fragility <code>screen</code> has in this area, etc.  I recommend you check it out.</p>

<p>I&#8217;m also going to add some of the tips I rediscover on this post below.</p>


<hr />


<h3>Tips</h3>

<ol>
<li>If you have multiple terminals attached to the same session, the smaller sized client can &#8220;lock&#8221; the dimensions of the session.  You need to detach those other terminal.  Use prefix+D to get a menu of the attached terminals and hit enter to disconnect them.  When only the current terminal is left, the size will adjust to fill your space.  The area that&#8217;s available in the larger, but unavailable in the smaller is marked as a pane full of &#8216;&#8230;&#8230;..&#8217; characters.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/tmux-a-screen-multiplexer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Bag</title>
		<link>http://stevengharms.com/new-bag</link>
		<comments>http://stevengharms.com/new-bag#comments</comments>
		<pubDate>Mon, 21 Mar 2011 21:01:10 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2207</guid>
		<description><![CDATA[I have decided to move away from a stylish Timbuk 2 computer bag. Fully encumbered and with my walk from the train station / around town it seems to be contributing to weakness and irritation in my right outer oblique muscles. Therefore I have moved back to a backpack. If it&#8217;s good enough for Dora [...]]]></description>
			<content:encoded><![CDATA[<p>I have decided to move away from a stylish <a href="">Timbuk 2 computer bag</a>.</p>

<p><a href="http://www.flickr.com/photos/sgharms/19046365/" title="Steven's Pic for &quot;Whatsinyourbag&quot; by sgharms, on Flickr"><img src="http://farm1.static.flickr.com/12/19046365_934505c5af.jpg" width="500" height="375" alt="Steven's Pic for &quot;Whatsinyourbag&quot;" /></a></p>

<p>Fully
encumbered and with my walk from the train station / around town it seems to
be contributing to weakness and irritation in my right outer oblique muscles.
Therefore I have moved back to a backpack.  If it&#8217;s good enough for Dora
n&eacute;e Explorer, it should be good enough for me.</p>

<p>Looking at the choices I was struck by how unbelievably <strong>dorky</strong> they all
looked.  I tried to buy the most stylish of the available choices and wound up
with the Brenthaven Slimline.</p>

<p>Judge for yourself:</p>

<p><a href="http://stevengharms.com/wp-content/uploads/2011/03/photo-1.jpg"><img src="http://stevengharms.com/wp-content/uploads/2011/03/photo-1.jpg" alt="" title="Brenthaven Slimline Bag" width="2048" height="436" class="aligncenter size-full wp-image-2208" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/new-bag/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changing the rhetoric:  post-PC Era</title>
		<link>http://stevengharms.com/changing-the-rhetoric-post-pc-era</link>
		<comments>http://stevengharms.com/changing-the-rhetoric-post-pc-era#comments</comments>
		<pubDate>Mon, 21 Mar 2011 20:47:43 +0000</pubDate>
		<dc:creator>steven</dc:creator>
				<category><![CDATA[Technology and Computers]]></category>

		<guid isPermaLink="false">http://stevengharms.com/?p=2204</guid>
		<description><![CDATA[Two weeks ago I noted that at the Apple Keynote Jobs had put forth an interesting display of rhetorical jiujitsu: repeatedly referring to now, i.e. the current moment for a sale, as &#8220;the post-PC era.&#8221; Thus far I hadn&#8217;t seen a lot of commentary about the injection of this meme, but I see it now [...]]]></description>
			<content:encoded><![CDATA[<p>Two weeks ago I noted that at the Apple Keynote Jobs had put forth an interesting
display of rhetorical jiujitsu:  repeatedly referring to now, i.e. the current
moment for a sale, as &#8220;the post-PC era.&#8221;  Thus far I hadn&#8217;t seen a lot of
commentary about the injection of this meme, but I see it now in the incipient
stages of taking hold.</p>

<p><em>Time</em> magazine&#8217;s <a href="http://www.time.com/time/business/article/0,8599,2058101,00.html">Harry McCracken&#8217;s article of</a> March 10<sup>th</sup>
bears the titile:  <strong>The Post-PC Era Is Already Here</strong>.
McCracken&#8217;s article is more a &#8220;mention&#8221; than a &#8220;use&#8221; insofar as refers
repreatedly to the introduction of this term by Jobs, but I believe Time&#8217;s
editorial board is positioning and helping introduce this meme into a wider
circle.</p>

<p>I&#8217;m not particularly sure that the term needed to be introduced outside of
the marketing and messaging departments of Apple, but as the Caltrain rolls
out of San Francisco this morning, I count ~70 individuals doing
email, web browsing, and word processing &mdash; the classic low bar
activities of computing demand &mdash; on iPads or iPhones.</p>

<p>Verily, a paradigm has changed.  It is <em>not</em> in the
90&#8217;s paradigm of machine at desk, machine at home, and / or machine in laptop
bag that these efforts of my neighbors occur, but much like &#8220;cloud&#8221; the fact
that some other locus for effort is underway is notable.</p>
]]></content:encoded>
			<wfw:commentRss>http://stevengharms.com/changing-the-rhetoric-post-pc-era/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

