<?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>Mike&#039;s Blabberings</title>
	<atom:link href="http://www.mike-griffith.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mike-griffith.com/blog</link>
	<description>on software, testing, and the web.</description>
	<lastBuildDate>Mon, 14 Feb 2011 10:51:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Make It A Great Day</title>
		<link>http://www.mike-griffith.com/blog/2011/02/make-it-a-great-day/</link>
		<comments>http://www.mike-griffith.com/blog/2011/02/make-it-a-great-day/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 10:51:40 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[off topic]]></category>
		<category><![CDATA[karma]]></category>
		<category><![CDATA[lifehack]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=569</guid>
		<description><![CDATA[Here I stand in the wee hours of the morning, having worked far too many hours without sleep (14.5 in the last day and another few to go if you&#8217;re counting), and beginning to feel sorry for myself.
I just recalled the end of a conversation I had with a fellow at a the Oakwood bar [...]]]></description>
			<content:encoded><![CDATA[<p>Here I stand in the wee hours of the morning, having worked far too many hours without sleep (14.5 in the last day and another few to go if you&#8217;re counting), and beginning to feel sorry for myself.</p>
<p>I just recalled the end of a conversation I had with a fellow at a the Oakwood bar a few weeks ago.  We chatted briefly, and upon parting ways he left me with:</p>
<blockquote><p>Make it a great day.</p></blockquote>
<p>Normally I would have thrown out my usual &#8220;later, hope you have a good one,&#8221; but his command was echoing through my ears like the roar of an animal I had never seen before.  So I stood bewildered, pondering those words, as he walked away.  He probably thought I was a jerk for not responding, but I honestly got stuck in a moment.</p>
<p>That closing instruction, &#8220;make it a great day,&#8221; leaves someone with a task.  It reminds you that <strong>life isn&#8217;t up for grabs, you control your own destiny</strong>.</p>
<p>No matter what kind of day you&#8217;re having, you can always turn it around.</p>
<p>Here are 5 things you can do to change the direction of even your worst day.</p>
<ul>
<li><strong>Exercise.</strong>  Whether that&#8217;s taking a break from work to crawl on the floor and do 10 pushups and 20 situps every hour for a day, having vigorous sex with your partner, or taking a lunch trip to the gym, you can always find a way to get your heart pumping.</li>
<li><strong>Eat Healthy:</strong>  It&#8217;s so damn easy and cheap to go to McDonald&#8217;s and grab a value meal.  But what does that say about the value of your insides?  That grade-E beef covers your arteries with more cholesterol than you could imagine and makes you pay for every bite.  Instead, take a bag of oranges and a apples to work, munch on some carrots, eat a few hard-boiled eggwhites, and drink 10 glasses of water.  You&#8217;ll walk away with your head held high and without suffering horrible heartburn and instant regret.</li>
<li><strong>Clean your Desk.</strong>  Get rid of the clutter and spray something that smells pretty in the area.  Get rid of visual distractions so you can focus on the task at hand.</li>
<li><strong>Learn a New Word.</strong>  There are <a href="http://www.merriam-webster.com/word-of-the-day/">plenty</a> of <a href="http://dictionary.reference.com/wordoftheday/">sites</a> that will give you a new word every day.  Find one you like and set it as your homepage.  Or visit a <a href="http://en.wikipedia.org/wiki/Special:Random">random wikipedia article</a> to get even more in depth.</li>
<li><strong>Hug Somebody.</strong>  And hug them right.  Squeeze them tight and take a deep breath to get the scent of their hair.  If you don&#8217;t have someone that will let you do that without calling HR, I suggest you go to a bar, strike up a conversation, buy the person a drink, and 9 times out of 10 you can sneak in a good hug when leaving (and bonus points if you leave them with the message to Make It A Great Day)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2011/02/make-it-a-great-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go fast!</title>
		<link>http://www.mike-griffith.com/blog/2010/08/go-fast/</link>
		<comments>http://www.mike-griffith.com/blog/2010/08/go-fast/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 21:22:49 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[quotes]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=552</guid>
		<description><![CDATA[ 

I was reading Kill Zone by Gunnery Sgt. Jack Coughlin, and was struck by the personal mantra of one of the Marine snipers:
Slow is smooth, smooth is fast.
Even though lives are not usually on the line, it&#8217;s important in the software industry to understand that sometimes we shouldn&#8217;t rush around like chickens with our [...]]]></description>
			<content:encoded><![CDATA[<div style="float:right; margin: 5px;"><a title="&quot;Going nowhere fast&quot;, or my $800 picture by NathanFromDeVryEET, on Flickr" target="_blank" href="http://www.flickr.com/photos/thatguyfromcchs08/2300190277/" title="&quot;Going nowhere fast&quot;, or my $800 picture by NathanFromDeVryEET, on Flickr"><img src="http://farm3.static.flickr.com/2036/2300190277_360853ae0d.jpg" alt="&quot;Going nowhere fast&quot;, or my $800 picture" width="250" height="184" /> </a>
</div>
<p>I was reading <em><a href="http://www.amazon.com/Kill-Zone-Sgt-Jack-Coughlin/dp/0312360185" target="_blank">Kill Zone</a></em> by Gunnery Sgt. Jack Coughlin, and was struck by the personal mantra of one of the Marine snipers:</p>
<blockquote><p>Slow is smooth, smooth is fast.</p></blockquote>
<p>Even though lives are not usually on the line, it&#8217;s important in the software industry to understand that sometimes we shouldn&#8217;t rush around like chickens with our heads cut off.  During your project&#8217;s crunch time, this is most important.</p>
<p>Slow down, take a breather, and think before you slam in a bunch of crap code.  All the technical debt you create has to be accounted for by someone.  Be the rabbit, not the hare.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/08/go-fast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Culinary Analogy</title>
		<link>http://www.mike-griffith.com/blog/2010/06/a-culinary-analogy/</link>
		<comments>http://www.mike-griffith.com/blog/2010/06/a-culinary-analogy/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 13:17:44 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=541</guid>
		<description><![CDATA[
We used to build software like a crappy banana split stand.  Grab the banana off the shelf (which probably is about to expire), throw on ice cream, cover it in chocolate, add some cherries, whip cream, nuts, stir it up, put a spoon in it, hand it to the customer, take their money, and [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/06/bananasplit-242x300.jpg" alt="" title="bananasplit" width="242" height="300" class="aligncenter size-medium wp-image-543" /></p>
<p>We used to build software like a crappy banana split stand.  Grab the banana off the shelf (which probably is about to expire), throw on ice cream, cover it in chocolate, add some cherries, whip cream, nuts, stir it up, put a spoon in it, hand it to the customer, take their money, and let them walk away.</p>
<p>STOP THAT RIGHT NOW!</p>
<p>Stop the gargantuan effort up front, stop compromising the quality of pieces that don&#8217;t get seen, stop making your customer wait til the end of the project.</p>
<p>Find a beautiful banana and show it to your customer.  Let them take a bite.  That might be all they need.  Or they might want to take a small piece of it and try it in banana bread.  They might not like that.  But that&#8217;s OK, because we have lots of time and lots of banana left.  Take the next piece and make a banana smoothie for them.  Maybe add a strawberry for the next sip.</p>
<p><a href="http://twitter.com/aaron_oliver" target="_blank">Aaron Oliver</a> might suggest that a good time to have these tastings is <a href="http://www.codesoftly.com/2010/06/dont-forget-the-meeting-after-the-standup-meeting.html" target="_blank">right after your daily stand-up</a>.</p>
<p>Let your customer be involved at each step.  Let them help you make the right changes early and often.  Be agile.  Don&#8217;t be the hobo behind the bad banana split counter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/06/a-culinary-analogy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python decorators, SRP, and testability</title>
		<link>http://www.mike-griffith.com/blog/2010/06/python-decorators-srp-and-testability/</link>
		<comments>http://www.mike-griffith.com/blog/2010/06/python-decorators-srp-and-testability/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 06:30:02 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=504</guid>
		<description><![CDATA[On the SRP:
For those unfamiliar with the Single Responsibility Principle (SRP), it states that there should never be more than one reason for a class to change.
That is to say: do one thing, do it well.
Decorators (not to be confused with the decorator pattern) can add behaviors or side-effects to a method, and this can [...]]]></description>
			<content:encoded><![CDATA[<p><strong>On the SRP:</strong><br />
For those unfamiliar with the <a href="http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank">Single Responsibility Principle</a> (SRP), it states that <em>there should never be more than one reason for a class to change</em>.</p>
<p>That is to say: do one thing, do it well.</p>
<p><a href="http://www.python.org/dev/peps/pep-0318/" target="_blank">Decorators</a> (not to be confused with the <a href="http://en.wikipedia.org/wiki/Decorator_pattern" target="_blank">decorator pattern</a>) can add behaviors or side-effects to a method, and this can be dangerous.  It seems harmless, because by adding a decorator, you&#8217;re likely taking boilerplate code and shuffling it elsewhere.  However, they often encourage badness because of how easy it is to add these behaviors.</p>
<p><strong>On testing decorated methods:</strong></p>
<p>Adding an @decorator to a python object unarguably makes the undecorated code difficult to test in isolation.  Decorators are applied at compile-time, and cannot be mocked or made to not-execute without some pain.</p>
<p>There are certainly a few common tricks that can help test a decorated method with minimal side-effects, but they require changes to the decorator itself.  There&#8217;s just plain and simple no way to un-decorate a method for isolated testing.</p>
<p><strong>Let&#8217;s look at a few common examples:</strong></p>
<p><strong><em>@expose</em></strong>: register a URL for a view function in a web framework</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> BlogPostController<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    @expose<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/blog/{post_id}&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, post_id=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot; show a blog post &quot;&quot;&quot;</span>
        post = adapter.<span style="color: black;">get_post</span><span style="color: black;">&#40;</span>post_id<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> render<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;show_entry.html&quot;</span>, <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>post=post<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Without the `@expose`, your `show_entry` knows how to get a given post and render it in the proper template.  With the decorator, it also now knows which URL corresponds to that.  You now have multiple reasons for this block of code to change, including pointing to a different URL or using a different template.  It&#8217;s preferred to have a separate module for managing which urls point to which views.</p>
<p>Harm factor: low.  Ick factor: medium &#8211; high.</p>
<p><strong><em>@cache</em></strong>: try to get the result from memcache, otherwise, execute the function and stick it in cache for next time</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> PostAdapter<span style="color: black;">&#40;</span>DataAdapter<span style="color: black;">&#41;</span>:
    @cache
    <span style="color: #ff7700;font-weight:bold;">def</span> get_post<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, post_id<span style="color: black;">&#41;</span>
        <span style="color: #483d8b;">&quot;&quot;&quot; grab a blog post from the database &quot;&quot;&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">query</span><span style="color: black;">&#40;</span>Post<span style="color: black;">&#41;</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=post_id<span style="color: black;">&#41;</span>.<span style="color: black;">one</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># SQLAlchemy folks need to talk to Mr Demeter...</span></pre></div></div>

<p>OK this seems cool right?  You only hit the database when you have to, otherwise we get it even quicker by looking it up in the cache.</p>
<p>What happens if you want to disable caching?  A separate cache abstraction layer would reduce volatility in your data adapter.</p>
<p>And what does the unit test look like?</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> TestGettingAPost<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> setup<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">query</span> = Mock<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#don't hit the production database!</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">post_adapter</span> = PostAdapter<span style="color: black;">&#40;</span>query=<span style="color: #008000;">self</span>.<span style="color: black;">query</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> test_getting_a_post<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">assert</span> <span style="color: #008000;">self</span>.<span style="color: black;">post_adapter</span>.<span style="color: black;">get_post</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">123</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Damn, there&#8217;s no way to mock out the @cache decorator so it doesn&#8217;t run.  Try to, I dare you.  You&#8217;re likely going to actually get post 123 from your production memcache.  Crappy.  The only thing you can do is make the @cache grab the cache implementation from the PostAdapter instance (and mock that out in you test), or find some other sneaky way of disabling caching for test runs.  But the @cache decorator isn&#8217;t all self-contained and fun anymore.</p>
<p>Harm factor: medium &#8211; high.</p>
<p><strong><em>@validate</em></strong>: Make sure the request matches the specified schema, otherwise hand-off to error handler</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> EditPostController<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> _save_error<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, errors<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot; @validate decorator kicked flow here, redisplay edit page with errors &quot;&quot;&quot;</span>
        ...
    @validate<span style="color: black;">&#40;</span>schema, error_handler=_save_error<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> save<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request<span style="color: black;">&#41;</span>
        post = <span style="color: #008000;">self</span>.<span style="color: black;">schema</span>.<span style="color: black;">to_python</span><span style="color: black;">&#40;</span>request.<span style="color: black;">params</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">post_adapter</span>.<span style="color: black;">save_post</span><span style="color: black;">&#40;</span>post<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> redirect<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/blog/{0}&quot;</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>post_id<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Without this @validate, there would be a lot of boilerplate code inside the `save` method.  With it, any unit test for the save method will be likely linked to your schema.  You&#8217;d have to make an actual valid request in order to test this method.  That&#8217;s outside of any tests for your schema directly. That means double-coverage but 2 tests to update when requirements shift.</p>
<p>Harm factor: low-medium</p>
<p><strong>Conclusions (or tl;dr):</strong></p>
<p>As easy as it is to become infatuated with Python decorators, they definitely encourage you to violate the SRP.  This can create a myriad of problems:</p>
<ul>
<li>Difficultly in isolating system under test</li>
<li>Added complexity to enable testing</li>
<li>Redundant redundant unit tests</li>
<li>Making a code module more volatile than it ought to</li>
</ul>
<p>They still have some valid use cases and can lead to cleaner code, however,  as Master Yoda once said, &#8220;when you look at the dark side, careful you must be&#8230;&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/06/python-decorators-srp-and-testability/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Rally pairing</title>
		<link>http://www.mike-griffith.com/blog/2010/05/rally-pairing/</link>
		<comments>http://www.mike-griffith.com/blog/2010/05/rally-pairing/#comments</comments>
		<pubDate>Mon, 10 May 2010 19:50:00 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=485</guid>
		<description><![CDATA[Iwein Fuld posted a great article about different styles of pair programming.  It&#8217;s a great post, and I encourage you to read it if you&#8217;ve tried pairing but haven&#8217;t bought in yet. His rally car analogy is spot-on.
My favorite driver is an outspoken dutch guy. He&#8217;s quick on the wheel and if he doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Iwein Fuld posted a great article about different <a href="http://blog.xebia.com/2010/05/09/practical-styles-of-pair-programming/" target="_blank">styles of pair programming</a>.  It&#8217;s a great post, and I encourage you to read it if you&#8217;ve tried pairing but haven&#8217;t bought in yet. His rally car analogy is spot-on.</p>
<blockquote><p>My favorite driver is an outspoken dutch guy. He&#8217;s quick on the wheel and if he doesn&#8217;t get the idea I&#8217;m trying to convey to him he&#8217;ll just type something to try if that works. When he does get what I&#8217;m mumbling it&#8217;s on the screen faster than when I would have typed it myself, so it doesn&#8217;t give me time to get frustrated over things not being like the would be when I had the keyboard. And that gives me time to look for exits and pittfalls.
</p></blockquote>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/05/rally-300x187.jpg" alt="" title="rally" width="300" height="187" class="aligncenter size-medium wp-image-487" /></p>
<p>He also dismisses anyone that tries to say pairing isn&#8217;t as effective as coding solo.</p>
<blockquote><p>No you&#8217;re not faster on your own, you&#8217;re just creating more crap for your colleagues to puzzle over and eventually delete. The code you write alone sucks. That guy that is getting on your nerves is trying to tell you (clumsily) that your code sucks, try to listen to him and you&#8217;ll turn into a better programmer. Or maybe you can teach him something and he&#8217;ll stop getting on your nerves. &#8230; If you&#8217;re slowing the other guy down, that&#8217;s a good thing. That will prevent him from writing code that you cannot maintain. If you don&#8217;t feel worthy of your colleagues code, get over it, or get off the team.</p></blockquote>
<p>My biggest stumbling block to date has been the ratio of time driving to navigating when you&#8217;re pairing a senior and junior dev.  Trying to balance productivity and mentoring isn&#8217;t always easy.  I find allowing the Sr. dev to drive 2/3 of the time and Jr. dev to drive 1/3 strikes close to the optimal balance.  Any more driving for the Sr and you&#8217;ll lose the Jr entirely as he rides along for the tour.  Any less and you lose valuable time in guiding-by-doing.</p>
<p>Whether you&#8217;re the driver or navigator, take your role seriously.  Share in the responsibility and help foster a mutual respect for the other.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/05/rally-pairing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installing Aventail VPN (and Sun Java6) on Ubuntu 10.04</title>
		<link>http://www.mike-griffith.com/blog/2010/05/installing-aventail-vpn-and-sun-java6-on-ubuntu-10-04/</link>
		<comments>http://www.mike-griffith.com/blog/2010/05/installing-aventail-vpn-and-sun-java6-on-ubuntu-10-04/#comments</comments>
		<pubDate>Sat, 01 May 2010 19:08:14 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[off topic]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=479</guid>
		<description><![CDATA[The Aventail VPN client requires Sun Java to correctly function on Ubuntu.  For whatever reason, the OpenJDK is not sufficient, and the client exhibits numerous bugs.  Unfortunately, for Ubuntu 10.04 LTS, Canonical decided to move Sun Java to the partner repository.  It&#8217;s no-longer apt-get-able by default.
No worries, we can easily add the [...]]]></description>
			<content:encoded><![CDATA[<p>The Aventail VPN client requires Sun Java to correctly function on Ubuntu.  For whatever reason, the OpenJDK is not sufficient, and the client exhibits numerous bugs.  Unfortunately, for Ubuntu 10.04 LTS, Canonical <a href="http://www.ubuntu.com/getubuntu/releasenotes/1004#Sun%20Java%20moved%20to%20the%20Partner%20repository">decided to move Sun Java</a> to the partner repository.  It&#8217;s no-longer <code>apt-get</code>-able by default.</p>
<p>No worries, we can easily add the parter repository, then install Sun Java.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> add-apt-repository <span style="color: #ff0000;">&quot;deb http://archive.canonical.com/ lucid partner&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> update
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> sun-java6-jre</pre></div></div>

<p>Once completed, the Aventail VPN installation can proceed.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> xf AventailConnect-Linux.tar
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>install.sh</pre></div></div>

<p>If you did attempt to install Aventail using the OpenJDK, you&#8217;ll need to uninstall it and re-install after installing Sun Java.  See <code>/usr/local/Aventail/uninstall.sh</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/05/installing-aventail-vpn-and-sun-java6-on-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agile Auto Restoration?</title>
		<link>http://www.mike-griffith.com/blog/2010/05/agile-auto-restoration/</link>
		<comments>http://www.mike-griffith.com/blog/2010/05/agile-auto-restoration/#comments</comments>
		<pubDate>Sat, 01 May 2010 05:59:12 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=430</guid>
		<description><![CDATA[I was over at my buddy Chad&#8217;s garage again tonight tinkering with his 1958 Chevy pickup.  Chad bought the truck when he turned 16 and planned to restore it and drive it all through college.  Ten years later, the truck still doesn&#8217;t run. To an untrained eye, there&#8217;s little different from when he [...]]]></description>
			<content:encoded><![CDATA[<p>I was over at my buddy Chad&#8217;s garage again tonight tinkering with his 1958 Chevy pickup.  Chad bought the truck when he turned 16 and planned to restore it and drive it all through college.  <strong>Ten years later, the truck still doesn&#8217;t run.</strong> To an untrained eye, there&#8217;s little different from when he bought it.  What&#8217;s wrong with this picture?</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/05/pickup-300x224.jpg" alt="as it stands today" title="as it stands today" width="300" height="224" class="alignright size-medium wp-image-444" /></p>
<p>Chad had high hopes early.  He bought the truck on a whim and, without too much inspection, figured it&#8217;d be a few month job to get it on the road again.  Needless to say, months passed, and it was still in his dad&#8217;s garage.  Life (and college) got in the way, and the truck sat abandoned for several years, with only an occasional wrench gracing it&#8217;s steel.</p>
<p>He&#8217;d buy new parts from time to time, and store them away to be put on at a later date.  He&#8217;d spend the occasional weekend tearing something off, grinding on it, patching, and welding.  Tearing off one part would show deeper damage.  This was Chad&#8217;s baby, and he couldn&#8217;t simply mask that damage, so he&#8217;d plan to fix the next issue before continuing, or order another new body panel.  Little visible progress was made, but lots of hours and dollars were invested.</p>
<p>Finally, 3 weeks ago, after lots of pressure from his friends and family over the last few years, Chad took the truck out of storage at his parents 2 hours away and brought it to his own garage.  He&#8217;s got a reinvigorated passion to get this thing running, and I&#8217;m excited to help him.</p>
<p><strong>Some of these challenges sound familiar to software veterans, but are any analogies actually relevant?</strong></p>
<p>Consider for a moment that you&#8217;re assigned to a project that requires you to migrate an existing web application from Java+Oracle to PHP+MySQL.  Doing rewrites of applications can often be driven by a desire to consolidate platforms and reduce costs, and there is often a fixed timeline.  The project is locked and loaded, and you haven&#8217;t had time to do technical due diligence.</p>
<p>You dive right in without much planning, and before you know it, you&#8217;ve passed your deadline.  You got hung up digging into the guts of the old software.  What little new code you were able to write relies on features that your new database doesn&#8217;t have, but you didn&#8217;t realize because you were testing against the old one.</p>
<p><strong>What has agile software development taught us that can right this project-gone-bad?</strong></p>
<p>It would be a stretch to suggest the core tenets of <a href="http://agilemanifesto.org/" target="_blank">the agile manifesto</a> are entirely applicable.  There really aren&#8217;t any processes/tools getting in the way, he&#8217;s not held up by a desire to document everything about the truck, contract negotiation doesn&#8217;t matter, and he really doesn&#8217;t have much of a plan that would inhibit responding to change.</p>
<p>However, the <a href="http://www.agilemanifesto.org/principles.html" target="_blank">principles behind an agile team</a> can be very useful to this situation.</p>
<ul>
<li>Rapid, continuous delivery of a useful <del>software</del> <strong>truck</strong>.  Don&#8217;t worry if, for example, the interior dome lights aren&#8217;t working right away.  But let&#8217;s get it running, and make sure it&#8217;s poised to keep getting better.</li>
<li>A working <del>software</del> <strong>truck</strong> is the principal measure of progress.  Not how many new body parts got ordered off ebay, or how cool the sketch of flames on the doors might look.</li>
<li>The <del>project</del> <strong>truck</strong> is built by motivated individuals, who should be trusted.  The friends that help need to be committed to the goal.</li>
<li>Continuous attention to technical excellence and good design.  Don&#8217;t rush it.  And avoid duct tape.</li>
<li>Simplicity.  One of the beautiful things about old cars is how few moving parts there really are under the hood.  Don&#8217;t ruin it by adding flamethrowers to the exhaust or an automatic transmission.</li>
<li>Regular adaptation to changing circumstances.  Expect that we&#8217;ll uncover a few unanticipated problems, but be ready to figure them out and keep charging forward.</li>
</ul>
<p>Chad is a perfectionist, and he&#8217;s not in a rush to get this thing done.   However, we have made some progress already in the last few weeks.  Here&#8217;s where we are now:  most barriers to working on the truck have been removed, we&#8217;ve started a &#8220;spike&#8221; of work to get the motor close to starting, I&#8217;m going to help put together a prioritized list of features (similar to user stories), and we&#8217;ll identify incremental milestones along the path to winning car shows.</p>
<p>With any luck, we&#8217;ll get the motor fired up after our first sprint.  And maybe, just maybe, I&#8217;ll learn something along the way that can help us develop better software!</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/05/1958_chevy_pickup-300x199.jpg" alt="" title="will it every look this sexy?" width="300" height="199" class="alignnone size-medium wp-image-440" /></p>
<p><em>Photo courtesy of <a href="http://www.flickr.com/photos/chicanerii/195977388/">chicanerii on flickr</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/05/agile-auto-restoration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Animal pictures for baby room</title>
		<link>http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/</link>
		<comments>http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 01:42:18 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[off topic]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=388</guid>
		<description><![CDATA[The wife and I are trying to pick out some pictures for the baby&#8217;s room.  We can&#8217;t decide whether to go realistic or whimsical.
What works best in a nursery?
]]></description>
			<content:encoded><![CDATA[<p>The wife and I are trying to pick out some pictures for the baby&#8217;s room.  We can&#8217;t decide whether to go realistic or whimsical.</p>

<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/elephant/' title='elephant'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/elephant-150x150.jpg" class="attachment-thumbnail" alt="" title="elephant" /></a>
<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/turtle/' title='turtle'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/turtle-150x150.jpg" class="attachment-thumbnail" alt="" title="turtle" /></a>
<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/flamingo/' title='flamingo'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/flamingo-150x150.jpg" class="attachment-thumbnail" alt="" title="flamingo" /></a>
<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/tiger/' title='tiger'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/tiger-150x150.jpg" class="attachment-thumbnail" alt="" title="tiger" /></a>
<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/dolphin/' title='dolphin'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/dolphin-150x150.jpg" class="attachment-thumbnail" alt="" title="dolphin" /></a>
<a href='http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/puppy/' title='puppy'><img width="150" height="150" src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/04/puppy-150x150.jpg" class="attachment-thumbnail" alt="" title="puppy" /></a>

<p>What works best in a nursery?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/04/animal-pictures-for-baby-room/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Show me the $80 million dollar Blue (#0044cc)</title>
		<link>http://www.mike-griffith.com/blog/2010/03/show-me-the-80-million-dollar-blue-0044cc/</link>
		<comments>http://www.mike-griffith.com/blog/2010/03/show-me-the-80-million-dollar-blue-0044cc/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 17:01:40 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[software development]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[design]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=371</guid>
		<description><![CDATA[So what&#8217;s this fancy shade of blue that made Bing so much money look like?

&#160;

Eh.  Doesn&#8217;t really do it for me as a blob of color.
How about on a link?  Well, that is actually quite pleasant against a white background.
Regardless, the takeaway from the whole story isn&#8217;t that you should switch all your [...]]]></description>
			<content:encoded><![CDATA[<p>So what&#8217;s this <a href="http://www.lukew.com/ff/entry.asp?1025" target="_blank">fancy shade of blue that made Bing so much money</a> look like?</p>
<div style="border: 1px solid #888888;background-color: #0044cc;width: 150px;height: 50px;">
&nbsp;
</div>
<p>Eh.  Doesn&#8217;t really do it for me as a blob of color.</p>
<p>How about <a style="color: #0044cc;" href="javascript:void(0);">on a link</a>?  Well, that is actually quite pleasant against a white background.</p>
<p>Regardless, the takeaway from the whole story isn&#8217;t that you should switch all your colors to #0044cc, but rather that you need to rigorously test your audience and be able to make changes based on the observed behavior.  Having the discipline to carefully react to the measurements can and will drive success.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/03/show-me-the-80-million-dollar-blue-0044cc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Baby boy gear round-up</title>
		<link>http://www.mike-griffith.com/blog/2010/01/baby-boy-gear-round-up/</link>
		<comments>http://www.mike-griffith.com/blog/2010/01/baby-boy-gear-round-up/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 22:36:58 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[off topic]]></category>

		<guid isPermaLink="false">http://www.mike-griffith.com/blog/?p=352</guid>
		<description><![CDATA[With a baby boy on the way (due in early June 2010), I decided to start looking for fun stuff for my lil dude.  I thought that maybe I&#8217;d have to wait a few years to unleash him on the world, but lo and behold there&#8217;s some seriously badass gear for infants and toddlers! [...]]]></description>
			<content:encoded><![CDATA[<p>With a baby boy on the way (due in early June 2010), I decided to start looking for fun stuff for my lil dude.  I thought that maybe I&#8217;d have to wait a few years to unleash him on the world, but lo and behold there&#8217;s some seriously badass gear for infants and toddlers!  If I wasn&#8217;t excited enough already, now I&#8217;m entirely stoked to take on parenting and turn this guy into the coolest kid on the block!</p>
<p>I&#8217;m still looking for lots more goodies.  I have yet to find the perfect off-road running stroller, and I&#8217;m a bit disappointed by the selection of baby snowboards, but I&#8217;ve got a few more months to sort it all out.</p>
<p>Here&#8217;s some of the clothes and gear I&#8217;ve found so far&#8230;</p>
<p><strong>Nerdy T-shirts:</strong></p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/exothermic.gif" alt="" title="exothermic" width="275" height="227" /><br />
Exothermic reaction t-shirt &#8211; clevercuties.com
</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/BIBONACCI-186x300.jpg" alt="" title="BIBONACCI" width="186" height="300" /><br />
Bibonacci t-shirt &#8211; clevercuties.com.  The nerd in me cannot resist something this awesome.
</p>
<p><strong>Big boys clothes in little man sizes:</strong></p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/adidastracksuit-195x300.jpg" alt="" title="adidastracksuit" width="195" height="300" /><br />
Baby track suit &#8211; Nordstrom&#8217;s.  Oh heck yes, he gonna be a soccer playa!
</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/chucks.jpg" alt="" title="chucks" width="240" height="240" /><br />
Baby Chuck&#8217;s &#8211; zappos.com
</p>
<p><strong>Outdoor gear:</strong></p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/helmet.jpg" alt="" title="helmet" width="220" height="220" /><br />
Full-face helmet &#8211; nybikergear.com.  This is a prerequisite for the snowboard, dirt bike, skateboard, and baby sky-diving outfit that he&#8217;ll be donning after a few months.</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/childcarrier1-300x300.jpg" alt="" title="childcarrier" width="300" height="300" /><br />
Kid in a bag &#8211; rei.com.  Before he&#8217;s able to walk, he&#8217;ll be able to tag along on hikes.  Throw him in a bag on my back and off we go.  They even sell sun visors and other accessories.</p>
<p><img src="http://www.mike-griffith.com/blog/wp-content/uploads/2010/01/snowsuit-300x300.jpg" alt="" title="snowsuit" width="300" height="300"  /><br />
Snowsuit &#8211; backcountry.com.  He&#8217;s gonna be the hippest kid on the slopes for sure.  Gotta look good, especially considering he&#8217;ll almost certainly be the youngest person to ever bust a double cork.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mike-griffith.com/blog/2010/01/baby-boy-gear-round-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

