<?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>Autoficiency</title>
	<atom:link href="http://blog.quarternotecoda.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.quarternotecoda.com</link>
	<description>Adventures in Automation</description>
	<lastBuildDate>Thu, 26 Jan 2012 12:55:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>My Ideal GTD App</title>
		<link>http://blog.quarternotecoda.com/2012/01/my-ideal-gtd-app/</link>
		<comments>http://blog.quarternotecoda.com/2012/01/my-ideal-gtd-app/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 12:55:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=128</guid>
		<description><![CDATA[I have been a long time user of Things by Cultured Code, but they have been very slow implementing a couple of features that would really enhance the way I use GTD, namely time based reminders, location based reminders, and cloud-based syncing. So I went out looking. Producteev looked pretty good, but it is woefully [...]]]></description>
			<content:encoded><![CDATA[<p>I have been a long time user of <a title="Things - GTD Task Management" href="http://culturedcode.com/things">Things</a> by <a title="Cultured Code" href="http://culturedcode.com" target="_blank">Cultured Code</a>, but they have been very slow implementing a couple of features that would really enhance the way I use GTD, namely time based reminders, location based reminders, and cloud-based syncing.</p>
<p>So I went out looking. <a href="http://producteev.com">Producteev</a> looked pretty good, but it is woefully underpolished. <a href="http://firetask.com">Firetask</a> also looked promising, as did <a href="http://wunderlist.com/">Wunderlist</a>, but both left something to be desired. Toodledo had nearly everything except a native app.  Omnifocus looks like it has all the features, but is so complicated and ugly that I don&#8217;t like it.</p>
<p>So I&#8217;ve come up with my list of needs, wants, and wishes for a GTD app. I don&#8217;t think it&#8217;s comprehensive, but it doesn&#8217;t seem like too much to ask&#8211;and yet there is nothing in a reasonable price range to do what I want.</p>
<p>So here&#8217;s my list. Take it for what it is. And if you know of something that implements all the musts, most of the wants and some of the needs&#8230; let me know.</p>
<p><strong>Needs</strong></p>
<ul>
<li>Native Mac App (as a first class part of the solution)</li>
<li>iPhone App with Sync</li>
<li>Global Hotkey for capture that goes by default to the &#8220;Inbox&#8221;</li>
<li>Recurring Tasks</li>
<li>Easy Deferring of Tasks</li>
<li>A good &#8220;Focus&#8221;/&#8221;Today&#8221;/&#8221;Now&#8221; view that makes solid sense</li>
</ul>
<p><strong>Wants</strong></p>
<ul>
<li>Solid Cloud Sync</li>
<li>Easy Delegation of Tasks (drag, e-mail/web app notification)</li>
<li>Contexts / Workspaces</li>
<li>Projects / tags</li>
<li>Basic integration / support for Pomodoros</li>
<li>Full screen mode in Lion that takes advantage of the screen real estate to show task details, sub tasks, etc for the *current* task.</li>
<li>Push notifications / App badges for tasks remaining</li>
</ul>
<p><strong>Wishes</strong></p>
<ul>
<li>Defer to Location (best &#8211; switch contexts based on location automatically, some tasks context free)</li>
<li>Defer to Time: maybe not as important if location based worked, but being able to defer something until 9:00 pm gets it off my focus list until after my kids are in bed.</li>
<li>Defer until Focus section is &#8216;empty&#8217;: Implemented as &#8220;dependent&#8221; tasks or &#8220;next&#8221; tasks or &#8220;next tasks&#8221; for within a project.  Hard to get this right.</li>
<li>Full on support for Pomodoro</li>
<ul>
<li>Start a pomodoro for a given task, tag, or context</li>
<li>If started for a task, automatically mark the # of pomodoros taken</li>
<li>If started for a tag or context, still record the pomo and the tasks checked off during it</li>
<li>If the &#8220;interrupt&#8221; key is pressed, prompt for recording a new task in the inbox</li>
<li>If not resumed, mark the pomo as failed</li>
</ul>
<li>Review Support</li>
<ul>
<li>Reports of Pomodoros for the day/week/month</li>
<li>Reports of tasks completed for the day/week/context</li>
<li>Graph of &#8220;productivity&#8221; based on pomos completed per day</li>
</ul>
<li>Calendar View, integrated with iCal calendars</li>
</ul>
<p>Now, I know my list looks long to those in the GTD world, but if you look at the features, they seem simple to implement.  Very simple.  Omnifocus is the closest to this, but has no Pomodoro support and bad &#8220;Today&#8221; support.  Producteev is actually really close, but lacks enough polish.  Things is still the best task manager I&#8217;ve found for managing tasks AND getting out of the way.  Has someone made this task manager I seek?  If not, I assume I&#8217;m naive for thinking it is simple to do.  I&#8217;m considering whipping together a webapp prototype that does what I want.</p>
<p>What&#8217;s your ideal GTD app?  What features would you say are imperative?</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2012/01/my-ideal-gtd-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don&#8217;t Use DateTime in Rails 3</title>
		<link>http://blog.quarternotecoda.com/2011/11/dont-use-datetime-in-rails-3/</link>
		<comments>http://blog.quarternotecoda.com/2011/11/dont-use-datetime-in-rails-3/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 17:44:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=118</guid>
		<description><![CDATA[Rails 3 has good TimeZone support built in, but you have to use the right Date and Time classes to get full support. If you have this set in your application.rb 1config.active_record.default_timezone = :local , then you really need to use Time so that it properly identifies itself as being in the local timezone and [...]]]></description>
			<content:encoded><![CDATA[<p>Rails 3 has good TimeZone support built in, but you have to use the right Date and Time classes to get full support.</p>
<p>If you have this set in your application.rb</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config.<span style="color:#9900CC;">active_record</span>.<span style="color:#9900CC;">default_timezone</span> = <span style="color:#ff3333; font-weight:bold;">:local</span></div></td></tr></tbody></table></div>
<p>, then you really need to use Time so that it properly identifies itself as being in the local timezone and not in UTC when passing to the database insert.</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ree<span style="color:#006600; font-weight:bold;">-</span>1.8.7<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2011.03</span> :001 <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#CC00FF; font-weight:bold;">DateTime</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'2011-11-27 12:00:00 +0000'</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">=&gt;</span> Sun, <span style="color:#006666;">27</span> Nov <span style="color:#006666;">2011</span> <span style="color:#006666;">12</span>:00:00 <span style="color:#006600; font-weight:bold;">+</span>0000<br />
ree<span style="color:#006600; font-weight:bold;">-</span>1.8.7<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2011.03</span> :002 <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#CC00FF; font-weight:bold;">DateTime</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'2011-11-27 12:00:00'</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">=&gt;</span> Sun, <span style="color:#006666;">27</span> Nov <span style="color:#006666;">2011</span> <span style="color:#006666;">12</span>:00:00 <span style="color:#006600; font-weight:bold;">+</span>0000<br />
ree<span style="color:#006600; font-weight:bold;">-</span>1.8.7<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2011.03</span> :003 <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'2011-11-27 12:00:00 +0000'</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">=&gt;</span> Sun Nov <span style="color:#006666;">27</span> 06:00:00 <span style="color:#006600; font-weight:bold;">-</span>0600 <span style="color:#006666;">2011</span><br />
ree<span style="color:#006600; font-weight:bold;">-</span>1.8.7<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2011.03</span> :004 <span style="color:#006600; font-weight:bold;">&gt;</span> <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'2011-11-27 12:00:00'</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#006600; font-weight:bold;">=&gt;</span> Sun Nov <span style="color:#006666;">27</span> <span style="color:#006666;">12</span>:00:00 <span style="color:#006600; font-weight:bold;">-</span>0600 <span style="color:#006666;">2011</span></div></td></tr></tbody></table></div>
<p>So basically, Time.parse always returns the value in the local timezone, DateTime.parse always returns the value in UTC.  To get complete compatibility, always use Time.parse.  Trust me, I learned the hard way :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/11/dont-use-datetime-in-rails-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Kata #1 &#8211; Supermarket Pricing</title>
		<link>http://blog.quarternotecoda.com/2011/10/code-kata-1-supermarket-pricing/</link>
		<comments>http://blog.quarternotecoda.com/2011/10/code-kata-1-supermarket-pricing/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 20:39:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=117</guid>
		<description><![CDATA[Taken from Code Kata&#8217;s by Dave Thomas The basic premise of this Kata is asking how you would model super market pricing.  What is the price of an item?  What is the cost?  How do you handle price-per-pound?  Buy 2 get one free?  What&#8217;s the value of stock? It&#8217;s interesting, and I thought I&#8217;d take [...]]]></description>
			<content:encoded><![CDATA[<p>Taken from <a href="http://codekata.pragprog.com/2007/01/code_kata_one_s.html">Code Kata&#8217;s by Dave Thomas</a></p>
<p>The basic premise of this Kata is asking how you would model super market pricing.  What is the price of an item?  What is the cost?  How do you handle price-per-pound?  Buy 2 get one free?  What&#8217;s the value of stock? It&#8217;s interesting, and I thought I&#8217;d take the time to blog through my thought process.</p>
<p>I&#8217;d like to iterate over the design and see where it takes me.  First task is to represent a product.</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">class</span> Product<br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:name</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:price</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:quantity</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>name, quantity, price<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@name</span> = name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@quantity</span> = quantity<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@price</span> = price<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>Basic enough&#8230; But the :price element can&#8217;t simply be a float&#8230; no it&#8217;s it&#8217;s own object&#8230; let&#8217;s look at that closer</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">class</span> Price<br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:amount</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:unit</span> <span style="color:#008000; font-style:italic;"># nil, :pound, :oz, :box, etc</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:multiple</span> <span style="color:#008000; font-style:italic;"># defaults to 1, enables '3 {units} per {amount}'</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:num_free</span> <span style="color:#008000; font-style:italic;"># defaults to 0, enables 'buy {special} get 10 free!'</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:special</span> <span style="color:#008000; font-style:italic;"># defaults to nil, enables 'buy 3 get {num_free}'</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>params=<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">p</span>,v<span style="color:#006600; font-weight:bold;">|</span> send<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{p}=&quot;</span>, v<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>At first, this looks overly complicated, but it allows us to store the exact input and calculate off of that.  We never want to store $0.3333333 / orange when the user enters 3 for $1&#8211;that would make our rounding happens at the EARLIEST possible moment, rather than the latest.  We also want to enable flexible definitions of what costs the amount specified, thus you could say 0.99/pound, etc.  There should be some units that are known, and others that are simply treated the same a nil (or /each).  I&#8217;m not thrilled with the num_free or special yet&#8230; maybe those will factor themselves differently as we go forward.</p>
<p>So what can we represent here&#8230; let&#8217;s set up some examples:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; apple = Product.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;apples&quot;</span>, <span style="color:#006666;">200</span>, Price.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.99</span>, <span style="color:#ff3333; font-weight:bold;">:unit</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:pound</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; soup &nbsp;= Product.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;soup&quot;</span>, <span style="color:#006666;">100</span>, Price.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.00</span>, <span style="color:#ff3333; font-weight:bold;">:multiple</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; oreos = Product.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;oreos&quot;</span>, <span style="color:#006666;">50</span>, Price.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:special</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">4</span>, <span style="color:#ff3333; font-weight:bold;">:num_free</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span>, <span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">2.98</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; bread = Product.<span style="color:#9900CC;">new</span> <span style="color:#996600;">&quot;bread&quot;</span>, <span style="color:#006666;">25</span>, Price.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:amount</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.69</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></td></tr></tbody></table></div>
<p>There&#8217;s a couple things about these that I want to refactor as I&#8217;m going&#8230; I want the price to be a bit more readable&#8230; like:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; apple = Product.<span style="color:#9900CC;">new</span> <span style="color:#006666;">200</span>, <span style="color:#996600;">&quot;apple&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.99</span>, <span style="color:#ff3333; font-weight:bold;">:per</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:pound</span><br />
&nbsp; &nbsp; soup &nbsp;= Product.<span style="color:#9900CC;">new</span> <span style="color:#006666;">100</span>, <span style="color:#996600;">&quot;chicken noodle soup&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.00</span>, :<span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">3</span><br />
&nbsp; &nbsp; oreos = Product.<span style="color:#9900CC;">new</span> <span style="color:#006666;">50</span>, &nbsp;<span style="color:#996600;">&quot;oreos&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">2.98</span>, <span style="color:#ff3333; font-weight:bold;">:buy</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">4</span>, <span style="color:#ff3333; font-weight:bold;">:get</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span><br />
&nbsp; &nbsp; bread = Product.<span style="color:#9900CC;">new</span> <span style="color:#006666;">25</span>, &nbsp;<span style="color:#996600;">&quot;bread&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:at</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1.69</span>, <span style="color:#ff3333; font-weight:bold;">:per</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:loaf</span></div></td></tr></tbody></table></div>
<p>That&#8217;s what I&#8217;d like.  It reads straight across.  You can represent most things here&#8230; so we&#8217;ll refactor &#8220;Price&#8221; and &#8220;Product&#8221; to look like that:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">class</span> Product<br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:name</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:price</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:quantity</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>quantity, name, price<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@name</span> = name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@quantity</span> = quantity<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@price</span> = price.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Hash</span><span style="color:#006600; font-weight:bold;">&#41;</span> ? Price.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>price<span style="color:#006600; font-weight:bold;">&#41;</span> : price<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">class</span> Price<br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:at</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:per</span> <span style="color:#008000; font-style:italic;"># nil, :pound, :oz, :box, etc</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor :<span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#008000; font-style:italic;"># defaults to 1, enables '{for} {per} per {at}'</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:get</span> <span style="color:#008000; font-style:italic;"># defaults to 0, enables 'buy {buy} get {get} free!'</span><br />
&nbsp; &nbsp; &nbsp; attr_accessor <span style="color:#ff3333; font-weight:bold;">:buy</span> <span style="color:#008000; font-style:italic;"># defaults to nil, enables 'buy {buy} get {get}'</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>params=<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; params.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">p</span>,v<span style="color:#006600; font-weight:bold;">|</span> send<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{p}=&quot;</span>, v<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>There!  Much better!  Now how about being able to call &#8220;cost&#8221; for a specific quantity of something. Should it be on the &#8220;product&#8221; or the &#8220;price&#8221;?  They are closely related, but the product is what needs the call, most likely delegating some of the calculation to the price.  Let&#8217;s set up &#8220;Price.of(n)&#8221; and &#8220;Product.buy!(n)&#8221;  Product.buy!(n) will actually decrease the quantity we have in stock.</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> Price<br />
&nbsp; <span style="color:#008000; font-style:italic;"># ...</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> of<span style="color:#006600; font-weight:bold;">&#40;</span>quantity, unit=:each<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; quantity = convert<span style="color:#006600; font-weight:bold;">&#40;</span>quantity, unit<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span>quantity <span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">for</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">*</span> <span style="color:#0066ff; font-weight:bold;">@at</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">class</span> Product<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> buy!<span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; <span style="color:#0066ff; font-weight:bold;">@quantity</span> <span style="color:#006600; font-weight:bold;">-</span>= n<br />
&nbsp; &nbsp; price.<span style="color:#9900CC;">of</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></td></tr></tbody></table></div>
<p>This continues to be tougher and tougher, but I&#8217;m getting the idea.  This would be great for a TDD driven exercise.  I&#8217;d like to do the timed Kata like Corey Heines does &#8212; to music even :)  </p>
<p>Enough for this Kata.  Time to move on to Kata #2.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/10/code-kata-1-supermarket-pricing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scary Complicated or Richly Awesome?</title>
		<link>http://blog.quarternotecoda.com/2011/09/scary-complicated-or-richly-awesome/</link>
		<comments>http://blog.quarternotecoda.com/2011/09/scary-complicated-or-richly-awesome/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 14:44:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=89</guid>
		<description><![CDATA[When you look at a new piece of data, most of our initial reaction is in relation to the complexity of that data. Usually this scares me, but after you get to know the data, the more the merrier! What was scary becomes rich and awesome. How do we move from scary complicated to richly [...]]]></description>
			<content:encoded><![CDATA[<p>When you look at a new piece of data, most of our initial reaction is in relation to the complexity of that data. Usually this scares me, but after you get to know the data, the more the merrier! What was scary becomes rich and awesome.</p>
<p>How do we move from scary complicated to richly awesome? Comprehension, comprehension, comprehension. And what is the best way to grok something like that? Dive deep into the guts of the code or the task and find out why the data is there and what it does. Why was it modeled that way? In what way could it have been modeled different? Do I have the power to change it? Is it a good thing to change it? Do I understand the system fully enough to see the richness of the data and of the model itself?</p>
<p>In the spirit of &#8220;Practice, Practice, Practice&#8221; &#8212; pick an open source project, look at the model, figure out what all of it does and how you would do it differently, more simply, more robustly, with better error handling, with fewer models.  Grok and regrok.  Get used to the FEELING of comprehension.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/09/scary-complicated-or-richly-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feedback Loops and Estimation -or- What Rubik&#8217;s Cubes Taught Me About Making Software</title>
		<link>http://blog.quarternotecoda.com/2011/04/feedback-loops-and-estimation-or-what-rubiks-cubes-taught-me-about-making-software/</link>
		<comments>http://blog.quarternotecoda.com/2011/04/feedback-loops-and-estimation-or-what-rubiks-cubes-taught-me-about-making-software/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 17:35:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=108</guid>
		<description><![CDATA[Estimation is hard. It may not be listed as one of the top two problems in computer science, but it&#8217;s at least a close third. Over the years I&#8217;ve gotten to try all sorts of methodologies for estimating. Waterfall, Agile, Points, Stories, Requirements, Features, Epics, Pomodoros, Billable hours&#8230; you can go on forever with the [...]]]></description>
			<content:encoded><![CDATA[<p>Estimation is hard.  It may not be listed as one of the top <a href="http://laughingmeme.org/2005/12/23/there-are-only-two-hard-things-in-computer-science-cache-invalidation-and-naming-things/">two problems in computer science</a>, but it&#8217;s at least a close third. Over the years I&#8217;ve gotten to try all sorts of methodologies for estimating.  Waterfall, Agile, Points, Stories, Requirements, Features, Epics, Pomodoros, Billable hours&#8230; you can go on forever with the Jargon of Management, trying to get information from a developer about how much longer The Client has to wait until The Feature is finished.</p>
<h2>Rubik&#8217;s Cubes</h2>
<p>About 4 years ago I started a job where a coworker was an avid Rubik&#8217;s cube solver.  I learned the steps and began competing with him to see who could solve a cube the fastest.  Eventually, my top time ended up around a minute and thirty seconds.  There are guys who can <a href="http://www.youtube.com/watch?v=zLQJ93B5Nl0">do</a> <a href="http://www.youtube.com/watch?v=bm6ohS55Tu0">it</a> <a href="http://www.youtube.com/watch?v=uBqaOs6omrI">much faster</a>&#8211;but I&#8217;m interested in consistency and improved speed.  Sometimes I can solve very quickly because some steps can be skipped (i.e. they are done for you) or because I&#8217;m using a very good cube, but in general, I can solve a cube in 1:30 &#8211; 3:00.</p>
<p>But I don&#8217;t <a href="http://www.youtube.com/watch?v=JCkI2qh1SF4">do it blindfolded</a>.</p>
<h2>Blindfolded</h2>
<p>The world record for the fastest solve is just under 10 seconds, but the world record for the fastest blindfold solve (i.e. from the time you pick it up, look it over, and then blindfold yourself to begin solving) is over a minute and a half&#8211;10 times as long.  The reason is simple&#8211;<strong>feedback</strong>.  Immediate and quick feedback allow you to take shortcuts and spend less time worrying about the next 200 moves and just worry about the next step or two.</p>
<p>So why do we still tend toward &#8220;blindfolded&#8221; approaches in software?</p>
<h2>Waterfall vs. a Feedback loop</h2>
<p>Call it Agile, call it scrum, call it feedback&#8211;it doesn&#8217;t matter.  What makes a team think they&#8217;re going to deliver better because they took the time to figure out all the steps, when you don&#8217;t know exactly how one step will affect the next?  It&#8217;s foolish when you consider it, but still, so many teams do it.  Even the supposed &#8220;agile&#8221; teams end up blindfolding releases and then trying to &#8216;feedback&#8217; the sprints.  That&#8217;s not to say there should be no planning, but getting customer and developer feedback is crucial to accurate and fast solutions to problems.</p>
<p>What should we be doing instead?  In Rubik&#8217;s Cube solutions, you typically identify the next &#8216;step&#8217; and iterate over it, examining the result and deciding the following step at that point.  You might be able to &#8216;blindfold&#8217; for each step, but you&#8217;d still need to look at the end to figure out where to go next.  I think a similar paradigm works in software building.  Identify the key feature, and let the developer work on it, deploy it, and get feedback.  Iterate on it again if it&#8217;s not quite right.  If it is, then move along to the next step or feature.</p>
<h2>Analogy Breakdown</h2>
<p>Where does this analogy break down?  Architectural changes.  You can&#8217;t make sweeping changes underneath the system without a good deal of planning and &#8220;blindfolding&#8221; where you step through, unsure of the effect on the system because you can&#8217;t actually evaluate it. There are times this must occur&#8211;but as developers, we probably tend toward a desire to rearchitect more often than we should.  Always consider what the right solution is and evaluate the cost of technical debt vs. the <strong>potential cost</strong> of an underlying change that could have pervasive and unknown effects.  Sometimes it is necessary, but generally it&#8217;s not.  <a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CCIQFjAA&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FYou_ain't_gonna_need_it&amp;ei=0ACaTeScFc3Htwe0mJnuCw&amp;usg=AFQjCNHaDCOVQWLpBfX1NqScK8nJ-kZ8FQ">YAGNI</a> is your friend.</p>
<h2>Takeaway</h2>
<p>The tighter the feedback loop, the more accurate and more quickly you&#8217;re able to deliver a solution, whether in Rubik&#8217;s world or in the Software space.  Focus on tight loops with customer feedback <em>and</em> developer feedback and watch your estimation troubles diminish.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/04/feedback-loops-and-estimation-or-what-rubiks-cubes-taught-me-about-making-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating Serialized Columns in Rails</title>
		<link>http://blog.quarternotecoda.com/2011/03/migrating-serialized-columns-in-rails/</link>
		<comments>http://blog.quarternotecoda.com/2011/03/migrating-serialized-columns-in-rails/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 21:09:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=101</guid>
		<description><![CDATA[I recently switched a serialized column in Rails from one type (Hash) to another (OpenStruct) and ran into a little problem when I tried to migrate, namely, that loading the model threw a SerializationTypeMismatch error. Hmm&#8230; how am I going to get at the base YAML and translate all of these without being brittle? The [...]]]></description>
			<content:encoded><![CDATA[<p>I recently switched a serialized column in Rails from one type (Hash) to another (OpenStruct) and ran into a little problem when I tried to migrate, namely, that loading the model threw a SerializationTypeMismatch error.  Hmm&#8230; how am I going to get at the base YAML and translate all of these without being brittle?</p>
<p>The answer is to copy the column, nullify it, and the load the raw YAML manually:</p>
<div class="codecolorer-container ruby twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; add_column <span style="color:#ff3333; font-weight:bold;">:my_table</span>, <span style="color:#ff3333; font-weight:bold;">:serialized_column_raw</span>, <span style="color:#ff3333; font-weight:bold;">:text</span><br />
&nbsp; &nbsp; MyTable.<span style="color:#9900CC;">update_all</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;serialized_column_raw = serialized_column&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; MyTable.<span style="color:#9900CC;">update_all</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;serialized_column = NULL&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; MyTable.<span style="color:#9900CC;">all</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>mt<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; &nbsp; mt.<span style="color:#9900CC;">serialized_column</span> = OpenStruct.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">YAML</span>::<span style="color:#CC0066; font-weight:bold;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span>mt<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:serialized_column_raw</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; mt.<span style="color:#9900CC;">save</span>!<br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; &nbsp; remove_column <span style="color:#ff3333; font-weight:bold;">:my_table</span>, <span style="color:#ff3333; font-weight:bold;">:serialized_column_raw</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/03/migrating-serialized-columns-in-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Stay At Inbox Zero</title>
		<link>http://blog.quarternotecoda.com/2011/01/how-to-stay-at-inbox-zero/</link>
		<comments>http://blog.quarternotecoda.com/2011/01/how-to-stay-at-inbox-zero/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 21:57:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=95</guid>
		<description><![CDATA[I saw a link recently on how to get to the ever elusive &#8220;Inbox Zero&#8221; and it seemed kinda lame&#8211;label everything &#8220;oldinbox&#8221; and archive everything in Gmail. Maybe that&#8217;s the only way to do it when you have 10K+ e-mails in your inbox, but it seems like the best way is to never get there [...]]]></description>
			<content:encoded><![CDATA[<p>I saw a link recently on how to get to the ever elusive &#8220;Inbox Zero&#8221; and it seemed kinda lame&#8211;label everything &#8220;oldinbox&#8221; and archive everything in Gmail.  Maybe that&#8217;s the only way to do it when you have 10K+ e-mails in your inbox, but it seems like the best way is to never get there to begin with.</p>
<p>Personally, I haven&#8217;t had more than 50 e-mail in my inbox at any given time in over 2 years.  I ruthlessly archive and delete items and as soon as I&#8217;ve processed something into an action for &#8220;Things&#8221; I get it out of my inbox.  For e-mails I just need to look at, reference or respond to, I use the stars feature, but I have only 8 starred items right now.  I think at some point I had nearly 20&#8230; that&#8217;s about the max.</p>
<p>There are 3 very simple things you can do to <em>stay</em> at Inbox Zero:</p>
<ol>
<li><b>Use &#8220;Multiple Inboxes&#8221;</b> &#8211; to keep things in front of you, use multiple inboxes (it&#8217;s a Gmail Labs feature) and make your own version of the priority inbox.<a href="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.50.12-PM.png"><img src="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.50.12-PM.png" alt="" title="Multiple Inboxes Setup" width="715" height="419" class="alignnone size-full wp-image-97" /></a></li>
<li><b>Use a catch-all and your own domain</b> &#8211; I have a catch-all address getting checked by Gmail.  I give out e-mail addresses to businesses like &#8220;amazon@my.domain.com&#8221; that way and have all of the mail that comes in on that domain marked with the label &#8220;bulk&#8221; &#8212; and I have a &#8220;bulk&#8221; inbox using &#8220;Multiple Inboxes&#8221;<a href="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.42.09-PM.png"><img src="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.42.09-PM.png" alt="" title="Multiple Inboxes" width="645" height="696" class="alignnone size-full wp-image-96" /></a></li>
<li><b>Add &#8220;Send and Archive&#8221; in labs</b> &#8211; Now, everytime you respond to somebody, send and archive, don&#8217;t just send.  You&#8217;re done.  Never worry about it again.<a href="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.51.09-PM.png"><img src="http://blog.quarternotecoda.com/wp-content/uploads/2011/01/Screen-shot-2011-01-04-at-3.51.09-PM.png" alt="" title="Send and Archive" width="706" height="223" class="alignnone size-full wp-image-98" /></a></li>
</ol>
<p>Okay, now you know how to keep a simple and clean inbox.  Go forth and do likewise.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2011/01/how-to-stay-at-inbox-zero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Importance Of Speed in Automation</title>
		<link>http://blog.quarternotecoda.com/2010/12/the-importance-of-speed-in-automation/</link>
		<comments>http://blog.quarternotecoda.com/2010/12/the-importance-of-speed-in-automation/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 15:35:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=85</guid>
		<description><![CDATA[We are impatient people. This is something that we must work to fix in order to grow as individuals, but it is something that serves the automator well&#8211;or can be our downfall. Joel Splosky wrote on the &#8220;Joel Test&#8221; that having anything less than the best tools money can buy is rediculous for a development [...]]]></description>
			<content:encoded><![CDATA[<p>We are impatient people.  This is something that we must work to fix in order to grow as individuals, but it is something that serves the automator well&#8211;or can be our downfall.</p>
<p>Joel Splosky wrote on the &#8220;<a href="http://www.joelonsoftware.com/articles/fog0000000043.html">Joel Test</a>&#8221; that having anything less than the best tools money can buy is rediculous for a development team.  The reasoning is this:  If you&#8217;re paying developers what they are worth, then they are expensive, and wasting their time while they&#8217;re reading the Onion waiting for a build will kill your productivity&#8211;and your bottom line.</p>
<p>The same goes now for Test Driven Development.  Having a great test suite is nearly essential, and anything more than a trivial application will have difficult and long running tests, but these tests must be managed well and there must be a way for a developer to quickly run through a cross section of the test suite as a sanity check before checking in.  If your tests take 1 minute to run, then the developer is 6 times less likely to run them than if they take 10 seconds to run.  If your tests take 30 minutes to run, then the developer is 60 times less likely to run them than if they take 30 seconds.  Every additional test is great for coverage, but if it adds time, there is a point of diminishing returns.</p>
<p>Tagged tests are a must, and a solid set of fast tests that touch much of the code base is essential.  It must also be easy to run individual tests&#8211;anything that hampers this reduces the liklihood of continued test driven development.  Testing becomes a chore again and running the tests becomes an <a href="http://xkcd.com/303/">excuse for swordfighting</a> in the hall.</p>
<p>So take the time to improve the speed of anything you wait on as developers&#8211;and reap the benefits tenfold. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2010/12/the-importance-of-speed-in-automation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stop Googling // RailsTips by John Nunemaker</title>
		<link>http://blog.quarternotecoda.com/2010/10/stop-googling-railstips-by-john-nunemaker/</link>
		<comments>http://blog.quarternotecoda.com/2010/10/stop-googling-railstips-by-john-nunemaker/#comments</comments>
		<pubDate>Thu, 14 Oct 2010 15:33:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[general computing]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=86</guid>
		<description><![CDATA[Yesterday, one of my inter-web buddies IM’d me and asked if I had used Typhoeus before. I said yes, so he asked me if it was possible to follow redirects using it. He said he google’d it and nothing turned up. I sharply responded, “LOOK AT THE CODE!”. We had some banter back and forth [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, one of my inter-web buddies IM’d me and asked if I had used Typhoeus before. I said yes, so he asked me if it was possible to follow redirects using it. He said he google’d it and nothing turned up.</p>
<p>I sharply responded, “LOOK AT THE CODE!”. We had some banter back and forth and a few minutes later he was automatically following redirects. It seems these days that developers often think if something does not turn up in a google search, it does not exist.</p>
<p>via <a href="http://railstips.org/blog/archives/2010/10/14/stop-googling/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+railstips+%28Rails+Tips%29">Stop Googling // RailsTips by John Nunemaker</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2010/10/stop-googling-railstips-by-john-nunemaker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things and Pomodoro</title>
		<link>http://blog.quarternotecoda.com/2010/08/things-and-pomodoro/</link>
		<comments>http://blog.quarternotecoda.com/2010/08/things-and-pomodoro/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 14:11:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.quarternotecoda.com/?p=82</guid>
		<description><![CDATA[For the last two years, I&#8217;ve been a loose GTD-er, using Cultured Code&#8217;s &#8220;Things&#8221; to dump my brain and keep track of tasks to do. I never got into the &#8220;project&#8221; side of GTD&#8211;planning out every project and asking why&#8230; I&#8217;m sure it has value, but that was never the problem I was trying to [...]]]></description>
			<content:encoded><![CDATA[<p>For the last two years, I&#8217;ve been a loose GTD-er, using <a href="http://culturedcode.com">Cultured Code&#8217;s</a> &#8220;<a href="http://culturedcode.com/things">Things</a>&#8221; to dump my brain and keep track of tasks to do.  I never got into the &#8220;project&#8221; side of GTD&#8211;planning out every project and asking why&#8230;  I&#8217;m sure it has value, but that was never the problem I was trying to solve with GTD.</p>
<p>I just wanted to keep up with all the stuff everyone wanted me to do and I was tired of having things so easily slip through the cracks.</p>
<p>Well, 2+ years later and I&#8217;ve gotten very used to capturing, scheduling, prioritizing and crossing off items from my master list that isn&#8217;t in my brain.  Things has been great for this, if only for the &#8220;Today&#8221; feature.  For those of you looking for a great GTD app, I&#8217;d still recommend <a href="http://culturedcode.com/things">Things</a> even though it doesn&#8217;t have OTA sync yet and there are many performance issues.  It&#8217;s a simple app that does a simple thing.</p>
<p>Now, though, I&#8217;ve discovered that I have a problem getting motivated to do items on my list.  Motivation is always difficult, but I tend to be paralyzed when I&#8217;m not sure how I will complete something.  It makes me fail to even get started.  Enter the <a href="http://www.pomodorotechnique.com/">Pomodoro Technique</a>.  I read this over the weekend and it made a huge difference on the first day.  If you struggle with motivation and procrastination, this is the technique for you.</p>
<p>I&#8217;ve got 2 years worth of data in &#8220;Things&#8221; and my Pomodoro Technique is pretty new, so my first big question was how to use them TOGETHER.  While this is neither pure GTD nor pure Pomodoro, I think I already have a great way to use Things better than I ever have and to stay motivated.  If you&#8217;d like to try it, read on.</p>
<p><span id="more-82"></span></p>
<p>If you haven&#8217;t already, go get familiar with GTD and Pomodoro.  You can read the full <a href="http://www.pomodorotechnique.com/resources.html">PDF about Pomodoro for free</a>.</p>
<p>Once you&#8217;re familiar, go download <a href="http://www.focusboosterapp.com/">Focus Booster</a> (or one of many other pomodoro timer apps out there).  Then fire up &#8220;Things&#8221; and set up the following tags:</p>
<p><a href="http://blog.quarternotecoda.com/wp-content/uploads/2010/08/Screen-shot-2010-08-31-at-9.05.43-AM.png"><img src="http://blog.quarternotecoda.com/wp-content/uploads/2010/08/Screen-shot-2010-08-31-at-9.05.43-AM.png" alt="" title="Pomodoro Tags" width="377" height="396" class="alignnone size-full wp-image-83" /></a></p>
<p>Now, set up a recurring task daily to &#8220;Prep for day&#8221; with a &#8220;1p&#8221; tag &#8211; 1 pomodoro.  You can use this first pomodoro to parse through everything in your inboxes and Today list in Things.  Estimate using the number keys&#8230; and if you end up estimating 8 or more, break it up.  Use the c or &#8216;combine&#8217; tag for tasks that are smaller than one pomodoro and could be combined together.</p>
<p>Now, prioritize the tasks in order, and start working on your first pomodoro by winding up Focus Booster and plowing through.  When you&#8217;re done with the pomodoro, put an X in the notes section of the task you worked on.  Check it off if you&#8217;ve finished it. </p>
<p>At the end of the day, go review your tasks in the log book and ask how you can do better.  </p>
<p>100% software Pomodoro + GTD &#8212; I guarantee you can get lots done!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.quarternotecoda.com/2010/08/things-and-pomodoro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

