<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Oliver Steele</title>
	
	<link>http://osteele.com</link>
	<description>Languages of the real and artificial.</description>
	<pubDate>Tue, 21 Oct 2008 16:39:14 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<geo:lat>42.377651</geo:lat><geo:long>-72.503237</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://osteele.com/feed/" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
		<title>Hexangular Gazebo</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/427599704/hexangular-gazebo</link>
		<comments>http://osteele.com/archives/2008/10/hexangular-gazebo#comments</comments>
		<pubDate>Tue, 21 Oct 2008 16:24:00 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Amusements]]></category>

		<category><![CDATA[Math Education]]></category>

		<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://osteele.com/?p=381</guid>
		<description>What is a "hexangle"?

&lt;img src="/images/2008/hexangle-3.jpg"/&gt;</description>
			<content:encoded><![CDATA[<p>Spotted in an L.A. Safeway: a &#8220;Hexangular Gazebo&#8221;.</p>

	<p><img src="/images/2008/hexangle-1.jpg" alt="" width="40%" /> <img src="/images/2008/hexangle-2.jpg" alt="" width="40%" /></p>

	<p>What is a &#8220;hexangle&#8221;?</p>

	<p><img src="/images/2008/hexangle-3.jpg" alt="" /></p>

	<p>It&#8217;s a six-sided polygon, of course.  Count them!</p>

	<p>(Yes, there&#8217;s a charitable interpretation.  But it&#8217;s no fun, so I&#8217;ll leave it mean.)</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=y9m4M"><img src="http://feeds.feedburner.com/~f/osteele?i=y9m4M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=pwJvM"><img src="http://feeds.feedburner.com/~f/osteele?i=pwJvM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=jttcm"><img src="http://feeds.feedburner.com/~f/osteele?i=jttcm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=D44qM"><img src="http://feeds.feedburner.com/~f/osteele?i=D44qM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=vxQkm"><img src="http://feeds.feedburner.com/~f/osteele?i=vxQkm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/427599704" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/10/hexangular-gazebo/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/10/hexangular-gazebo</feedburner:origLink></item>
		<item>
		<title>Bride of Palinstein</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/427584690/bride-of-palinstein</link>
		<comments>http://osteele.com/archives/2008/10/bride-of-palinstein#comments</comments>
		<pubDate>Tue, 21 Oct 2008 16:08:45 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Illustrations]]></category>

		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://osteele.com/?p=371</guid>
		<description>&lt;a href="http://www.zazzle.com/groom_of_palinstein_shirt-235705698498201767"&gt;&lt;img src="/images/2008/palinstein-thumb.jpg"/&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p>My friend Jeannine Mosely, <a href="http://j9.foldr.com/">mathematical origamist</a> and creator of the <a href="http://world.std.com/~j9/sponge/">Business Card Mengier Sponge</a>, designed <a href="http://www.zazzle.com/groom_of_palinstein_shirt-235705698498201767">this t-shirt</a>.  You can buy it, just in time for Halloween or the election, at <a href="http://www.zazzle.com/groom_of_palinstein_shirt-235705698498201767">Zazzle</a>.  Just remember not to wear it to the polls!</p>

	<p><a href="http://www.zazzle.com/groom_of_palinstein_shirt-235705698498201767"><img src="/images/2008/palinstein.jpg" alt="" /></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=ACsPM"><img src="http://feeds.feedburner.com/~f/osteele?i=ACsPM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=ka6HM"><img src="http://feeds.feedburner.com/~f/osteele?i=ka6HM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=JGApm"><img src="http://feeds.feedburner.com/~f/osteele?i=JGApm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=uIflM"><img src="http://feeds.feedburner.com/~f/osteele?i=uIflM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=ALOLm"><img src="http://feeds.feedburner.com/~f/osteele?i=ALOLm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/427584690" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/10/bride-of-palinstein/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/10/bride-of-palinstein</feedburner:origLink></item>
		<item>
		<title>Code Samples from Practical Functional JavaScript</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/409804345/code-samples-from-practical-functional-javascript</link>
		<comments>http://osteele.com/archives/2008/10/code-samples-from-practical-functional-javascript#comments</comments>
		<pubDate>Fri, 03 Oct 2008 01:52:47 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://osteele.com/?p=357</guid>
		<description>The code samples from my talk at the Ajax Experience conference are now available here. 

	Each example runs itself when you load its page, at least in Safari and Firefox.   This is something I first did for my talk at LL2.  It&amp;#8217;s the only way I&amp;#8217;ve ever been able to keep sample [...]</description>
			<content:encoded><![CDATA[<p>The code samples from my <a href="/archives/2008/09/practical-functional-javascript">talk at the Ajax Experience conference</a> are now available <a href="/talks/ajaxian-2008/samples">here</a>. </p>

	<p>Each example runs itself when you load its page, at least in Safari and Firefox.   This is something I first did for my talk at <a href="http://ll2.ai.mit.edu/"><span class="caps">LL2</span></a>.  It&#8217;s the only way I&#8217;ve ever been able to keep sample code actually working<sup id="fn-anchor1"><a href="#fn1">1</a></sup>.</p>

	<p>The full slide deck (including these code samples, but without the comments and the ability to run the code) is <a href="http://www.slideshare.net/osteele/oliver-steele-functional-javascript-presentation">here</a>.</p>

	<p>These are from the final draft of the talk, but they&#8217;re really the first draft of this material.  The audience was great, and I learned a lot about how to explain this from their questions during the presentation.  I&#8217;m planning to reorganize and expand this the next time I get a free weekend to work on it.</p>

	<p><hr/></p>

	<p id="fn1"><a href="#fn-anchor1"><sup>1</sup></a>  A funny story about that:  John Resig asked me after the talk whether I&#8217;d looked at <a href="http://ejohn.org/apps/learn/">Learn JavaScript</a>.  The truth is, I&#8217;d wanted to get by without any fancy slideware or sample scaffolding at all, but I needed a way to get formatted code into Keynote.  I started out using a technique that <a href="http://www.macvicar.net/blog/2008/06/source-code-hig.html">Scott MacVicar</a> came up with, and eventually added section breaks, and then &#8220;Previous&#8221; and &#8220;Next&#8221; buttons, until I&#8217;d eventually feature-creeped my way up to something pretty similar to John&#8217;s tool. Oh well.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=iMqiM"><img src="http://feeds.feedburner.com/~f/osteele?i=iMqiM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=Cg5ZM"><img src="http://feeds.feedburner.com/~f/osteele?i=Cg5ZM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=Ih4Zm"><img src="http://feeds.feedburner.com/~f/osteele?i=Ih4Zm" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=U8e4M"><img src="http://feeds.feedburner.com/~f/osteele?i=U8e4M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=uwNwm"><img src="http://feeds.feedburner.com/~f/osteele?i=uwNwm" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/409804345" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/10/code-samples-from-practical-functional-javascript/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/10/code-samples-from-practical-functional-javascript</feedburner:origLink></item>
		<item>
		<title>Practical Functional JavaScript</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/402049110/practical-functional-javascript</link>
		<comments>http://osteele.com/archives/2008/09/practical-functional-javascript#comments</comments>
		<pubDate>Wed, 24 Sep 2008 19:06:06 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://osteele.com/?p=344</guid>
		<description>I&amp;#8217;ll be giving a talk next Wednesday October 1 at The AJAX Experience, on &amp;#8220;Practical Functional JavaScript&amp;#8221;.  This could be subtitled &amp;#8220;distributing JavaScript across time and space&amp;#8221;, or maybe just &amp;#8220;how to do things with functions&amp;#8221;1.

	A couple of years ago I found that all the interesting AJAX programs that I wanted to write involved [...]</description>
			<content:encoded><![CDATA[<p>I&#8217;ll be giving a talk next Wednesday October 1 at <a href="http://ajaxexperience.techtarget.com/east/index.html">The <span class="caps">AJAX </span>Experience</a>, on &#8220;Practical Functional JavaScript&#8221;.  This could be subtitled &#8220;distributing JavaScript across time and space&#8221;, or maybe just &#8220;how to do things with functions&#8221;<sup id="fn-anchor1"><a href="#fn1">1</a></sup>.</p>

	<p>A couple of years ago I found that all the interesting <span class="caps">AJAX</span> programs that I wanted to write involved asynchronous communication with the server (or sometimes with a Flash plugin, or sometimes within the client but with a few seconds or minutes delay). Trying to think about and debug these programs made me feel like I was just learning how to program again (or hadn&#8217;t yet), and hurt my head.  But now I can emerge, sadder but wiser, head fully healed, and with this talk in hand.</p>

	<p>I&#8217;ll be covering:<ul><br />
<li>Talking <span class="caps">REST</span> asynchronously to your server  &#8211;  <b>without</b> dipping into bleeding-edge technologies such as <a href="http://en.wikipedia.org/wiki/Comet_(programming)"> Comet</a> and <a href="http://svn.xantus.org/shortbus/trunk/bayeux/bayeux.html">Bayeux</a>.[2]</li><br />
<li>Deferred execution and lightweight multithreading without <a href="http://code.google.com/apis/gears/api_workerpool.html">Google Gears</a>. [3]</li><br />
<li>Messaging between the Flash and the <span class="caps">HTML</span> within a page.  I&#8217;ll put this last so that if you aren&#8217;t interested in Flash you don&#8217;t have to worry about when to wake up.</li><br />
</ul></p>

	<p>This talk is really the flip side of <a href="http://osteele.com/sources/javascript/functional/">functional javascript</a> and <a href="http://osteele.com/sources/javascript/sequentially/">sequentially</a>. Those were <b>non-production</b> experiments to take functional javascript <em>to an extreme</em>.  &#8220;Practical&#8221;, on the other hand, will be about real-world techniques I&#8217;ve used to write web sites such as <a href="http://browsegoods.com">Browsegoods</a>, <a href="http://fansnap.com">FanSnap</a>, Style&amp;Share, and the <a href="http://www.gowebtop.com">goWebtop Calendar</a>, and that resulted in some of the JavaScript-related libraries <a href="http://github.com/osteele">here</a>.</p>

	<p>The <b>main</b> purpose of this talk is to be useful to practicing developers.  But it should also be fun.  <span class="caps">AJAX</span> lets you do a lot on the web that&#8217;s fun to look at and use.  It can be fun to program too, and I&#8217;d like to get some of that across.</p>

	<p>If you&#8217;re interested in the <b>type</b> of things I&#8217;ve posted <a href="http://osteele.com/archives/category/javascript">here</a>, but found that those zoomed through the material too quickly or that you wanted to see more of a connection to real-world production programming, then this is the talk for you.</p>

	<p>The bad news: <a href="http://ajaxexperience.techtarget.com/east/html/eventsataglance.html">It&#8217;s at 8am</a>.  I promise not to think badly of you if you take a nap, and to make loud noises when it&#8217;s time for you to go your next talk.</p>

	<p><ins>Update: A draft of the talk is <a href="/talks/Oliver_Steele_Functional_JavaScript_v2.pdf">here</a>.  It doesn&#8217;t include most of the code samples.</ins></p>

	<p><ins>Update 2: The final version with screenshots of all the code is <a href="http://www.slideshare.net/osteele/oliver-steele-functional-javascript-presentation">here</a>.  I&#8217;ll publish a runnable version of the examples soon.</ins></p>

	<p><ins>Update 3: The runnable examples are <a href="/archives/2008/10/code-samples-from-practical-functional-javascript">here</a>. </ins></p>

	<p><hr/></p>

	<p id="fn1"><a href="#fn-anchor1"><sup>1</sup></a> With a nod to <a href="http://en.wikipedia.org/wiki/J._L._Austin#How_to_Do_Things_With_Words">Austin</a>  &#8211;  but you don&#8217;t have to get that, if you aren&#8217;t a linguistics geek.</p>

	<p id="fn2"><a href="#fn-anchor2"><sup>2</sup></a> <span class="caps">COMET</span> and Bayeaux are cool, but the server-side support can be scary.</p>

	<p id="fn3"><a href="#fn-anchor3"><sup>3</sup></a> Another cool technology, but for the typical occasional-use consumer-facing site, you can&#8217;t count on it.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=jc37L"><img src="http://feeds.feedburner.com/~f/osteele?i=jc37L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=IGpsL"><img src="http://feeds.feedburner.com/~f/osteele?i=IGpsL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=bNgdl"><img src="http://feeds.feedburner.com/~f/osteele?i=bNgdl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=bpQFL"><img src="http://feeds.feedburner.com/~f/osteele?i=bpQFL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/402049110" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/09/practical-functional-javascript/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/09/practical-functional-javascript</feedburner:origLink></item>
		<item>
		<title>Latin Agreement and Case</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/297943520/latin-agreement-and-case</link>
		<comments>http://osteele.com/archives/2008/05/latin-agreement-and-case#comments</comments>
		<pubDate>Sun, 25 May 2008 17:45:05 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Illustrations]]></category>

		<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/25/latin-agreement-and-case</guid>
		<description>&lt;a href="/images/2008/latin%20agreement.png"&gt;&lt;img src="/images/2008/latin%20agreement.png" width="400px"/&gt;&lt;/a&gt;&lt;br/&gt;</description>
			<content:encoded><![CDATA[<p><a href="/images/2008/latin%20agreement.png"><img src="/images/2008/latin%20agreement.png" width="400px"/></a><br/></p>

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

	<p><a href="/images/2008/latin%20agreement.pdf"><span class="caps">PDF</span></a>, <a href="/images/2008/latin%20agreement.png"><span class="caps">PNG</span></a></p>

	<p>Here&#8217;s a chart from a couple of years ago when my son was studying Latin.  Like several things I&#8217;ve done, reaction seems to be split between &#8220;this makes it clearer&#8221; and &#8220;this makes it much more confusing&#8221;.  Thing of it as a variance magnifier <img src="/images/2008/bimodal.png" height="10ex"/><a href="#fn1"><sup>1</sup></a> <img src='http://osteele.com/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>

	<p><hr/></p>

	<p><sup>1</sup> The pseudo-<a href="http://en.wikipedia.org/wiki/Sparkline">sparkline</a> is either a bimodal distribution, or a <a href="http://en.wikipedia.org/wiki/The_Little_Prince">programming language mascot that has swallowed a fedora</a> .</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=ej3qyH"><img src="http://feeds.feedburner.com/~f/osteele?i=ej3qyH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=bJUWSH"><img src="http://feeds.feedburner.com/~f/osteele?i=bJUWSH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=9ncyXh"><img src="http://feeds.feedburner.com/~f/osteele?i=9ncyXh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=HdO0pH"><img src="http://feeds.feedburner.com/~f/osteele?i=HdO0pH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/297943520" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/latin-agreement-and-case/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/latin-agreement-and-case</feedburner:origLink></item>
		<item>
		<title>Smiley Socket</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/289147602/smiley-socket</link>
		<comments>http://osteele.com/archives/2008/05/smiley-socket#comments</comments>
		<pubDate>Tue, 13 May 2008 00:38:38 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Amusements]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/12/smiley-socket</guid>
		<description>See the face?!  Ooh, see the cute little baby face, and the other face on top of it?!

&lt;img src="/images/2008/smiley-socket-thumb.jpg"/&gt;

Why babies like electrical outlets.</description>
			<content:encoded><![CDATA[<p>See the face?!  Ooh, see the cute little baby face, and the other face on top of it?!</p>

	<p><img src="/images/2008/smiley-socket.jpg" /></p>

	<p>Why babies like electrical outlets.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=Z0lQLH"><img src="http://feeds.feedburner.com/~f/osteele?i=Z0lQLH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=R5UQJH"><img src="http://feeds.feedburner.com/~f/osteele?i=R5UQJH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=PG5D4h"><img src="http://feeds.feedburner.com/~f/osteele?i=PG5D4h" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=hEt3wH"><img src="http://feeds.feedburner.com/~f/osteele?i=hEt3wH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/289147602" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/smiley-socket/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/smiley-socket</feedburner:origLink></item>
		<item>
		<title>Commit Policies</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/287830270/commit-policies</link>
		<comments>http://osteele.com/archives/2008/05/commit-policies#comments</comments>
		<pubDate>Sat, 10 May 2008 23:51:30 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Illustrations]]></category>

		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/10/commit-policies</guid>
		<description>Git is a complicated beast.  The Git &lt;dfn&gt;index&lt;/dfn&gt;, if you're coming from other VCS's, is a new concept.  Yesterday "I described":/archives/2008/05/my-git-workflow how I use the Git index in my workflow:

&lt;a href="/archive/2008/05/my-git-workflow"&gt;
&lt;img src="/images/2008/git-transport.png" width="40%" align="top"/&gt;&lt;img src="/images/2008/git-workflow.png" width="40%" align="top"/&gt;
&lt;/a&gt;

These pictures illustrate the multiple locations, or "data stores", that host a copy of the source tree.  These stores are: the working directory, local and remote repositories, and the index.  In order to show more of the whole development process, the second picture also includes a "distribution directory", for code that is being distributed outside of Git.  (The distribution directory could be the deployment directory of a web site, or a compiled artifact, such as a binary, that is placed in firmware or on a DVD.)</description>
			<content:encoded><![CDATA[<p>Git is a complicated beast.  The Git <dfn>index</dfn>, if you&#8217;re coming from other <span class="caps">VCS</span>&#8217;s, is a new concept.  Yesterday <a href="/archives/2008/05/my-git-workflow">I described</a> how I use the Git index in my workflow:</p>

	<p><a href="/archive/2008/05/my-git-workflow"><br />
<img src="/images/2008/git-transport.png" width="40%" align="top"/><img src="/images/2008/git-workflow.png" width="40%" align="top"/><br />
</a></p>

	<p>These pictures illustrate the multiple locations, or &#8220;data stores&#8221;, that host a copy of the source tree.  These stores are: the working directory, local and remote repositories, and the index.  In order to show more of the whole development process, the second picture also includes a &#8220;distribution directory&#8221;, for code that is being distributed outside of Git.  (The distribution directory could be the deployment directory of a web site, or a compiled artifact, such as a binary, that is placed in firmware or on a <span class="caps">DVD</span>.)</p>

	<h3>Salmon Run Development</h3>

	<p>The <var>x</var> axis in these pictures is actually meaningful.  In fact, it has several meanings.  Towards the left is personal (only I can see my working directory); towards the right is public (the remote repository is visible to other developers; the distribution directory to users as well).  Towards the left is closer to closer to development, towards the right is closer to production.  Towards the left is easier to change; towards the right is more stable<sup id="fn-anchor1"><a href="#fn1">1</a></sup>.</p>

	<p><img src="/images/2008/datastore-spectrum.png" /></p>

	<p>Two of the most important properties of a project are its <dfn>design flexibility</dfn> (the ease with which developers can change it), and its <dfn>stability</dfn>.  Flexibility is necessary in order to maintain development velocity, to accommodate changing requirements, and to explore design spaces.  Stability is important in order to maintain quality (by allowing settling time for bugs, and by reducing their injection rate), and to synchronize with separately developed artifacts (test suites, test plans, and documentation, if they&#8217;re not in the repository; and books, forum and blog postings, and user knowledge).  Unfortunately, these properties conflict.</p>

	<p>Putting each of these constraints at the opposite end of the chain of data stores allows you to compromise each individual data store less.  You don&#8217;t need to maintain as stable a workspace, but the remote repository needn&#8217;t be yanked around as much.</p>

	<p><img src="/images/2008/flexible-stable.png" /></p>

	<p>I picture the process of moving edits from my working directory to a distribution as a multi-stage <a href="http://en.wikipedia.org/Transmission_%28mechanical%29">transmission</a>, where each step to the right steps down in speed (development velocity) but up in torque (quality).  Making the chain longer means there&#8217;s more of an impedance match between any two successive stores.  This is why <span class="caps">DVCS</span> is better than <span class="caps">VCS</span>; and it&#8217;s why I like to use the index as a staging area<sup id="fn-anchor2"><a href="#fn2">2</a></sup>.</p>

	<p>I also picture the process of moving edits to a distribution as a salmon run<sup id="fn-anchor3"><a href="#fn3">3</a></sup>.  To make it from the index up to a distribution, a change has to swim up a series of falls.  Each level of the stream is a data store; it has to leap the lowest fall to make it into the index, and another to make it into the local repository.  Only a few changes are strong enough to make it all the way.  [Although, unlike salmon, changes can team up to make a stronger fish.  Or maybe I&#8217;m not talking about salmon, but salmon <span class="caps">DNA</span>.  I&#8217;ll drop the metaphor in a moment :-)]</p>

	<p>What makes the falls steep  &#8211;  what makes it more difficult for a change to get further towards distribution  &#8211;  isn&#8217;t (in this age of fast networks, reliable <span class="caps">DVCS</span>, and automated deployment recipes) a technical limitation; it&#8217;s a matter of convention. In this case, it&#8217;s a matter of conventions that are constructed to maintain the quality of releases, by maintaining invariants on the data stores that feed into them.  These conventions are <dfn>commit policies</dfn>.</p>

	<h3>Commit Policies</h3>

	<p>The most helpful paper I&#8217;ve read on source control is <a href="http://www.perforce.com/perforce/bestpractices.html">&#8220;High-level Best Practices in Software Configuration Management&#8221;</a>, by Laura Wingerd and Christopher Seiwald of Perforce Software.  Its most helpful recommendation is &#8220;Give each codeline a policy&#8221;.  (The runners up are &#8220;branch on a policy change&#8221;, and &#8220;don&#8217;t branch unless necessary&#8221;.)</p>

	<p>Git&#8217;s data stores are in many ways like anonymous, built-in branches, with a built-in set of commands that operate on them<sup id="fn-anchor4"><a href="#fn4">4</a></sup>.  Like branches, I find it helpful to give each data store its own policy.  Each policy is more rigorous than the policy to its left.  These policies tell me how far upstream a change can swim.</p>

	<p>Here&#8217;s an example of the policies I use in my personal projects, or for the non-shared part (the workspace, index, and local repository) of a collaborative project.  &#8220;Revision Frequency&#8221; is how often I typically make changes to each data store, when I&#8217;m developing it full-time.</p>

	<p><img src="/images/2008/commit-policies.png" /></p>

	<p>Policies implement the intent of the salmon run.  By placing unrestrictive policies to the left, I can checkpoint my work frequently.  By placing restrictive policies on the right, I can maintain the stability of releases.  And by incrementing the restrictiveness of these policies in small steps, I reduce the backlog of code that is &#8220;trapped&#8221; towards the left.  Compare this to a centralized <span class="caps">VCS</span>, in which (since there&#8217;s no local repository), developers may keep changes out of <span class="caps">VCS</span> for hours or days (since the alternative is making a central branch, which is expensive to create and expensive to tear down).  Or compare to a <span class="caps">DVCS</span> system without an index, where the overhead of either making and tearing down branches, or of pruning temporary commits, can discourage a developer from making a checkpoint every minute or two.  (At least they discourage me, even though these operations are far less expensive than with centralized <span class="caps">VCS</span>.)</p>

	<p>And no, I&#8217;m not saying to do this <em>instead</em> of branching.  I find this system useful as an always-on, lightweight alternative to branching, and then add in branching when the lifting gets heaver.  This process, without branches, is as much mechanism as I usually want for small, personal projects such as <a href="http://github.com/osteele">these</a>.  For a collaborative project, I often synch to a feature branch of the main repository.  For an experiment that takes more than half a day, and that I therefore want to be able to set aside, I make a local branch.  And for a shared collaborative experiment, or a feature that calls on only part of the development team, I do both.</p>

	<p>More on branches tomorrow.</p>

	<p><hr/></p>

	<p id="fn1"><a href="#fn-anchor1"><sup>1</sup></a> The reasons for these differences are partly convention, but mostly technical.  I can easily make and revert changes in my workspace with my editor (or another tool).  Changes to the index and the local repository require some extra work with some command line intervention but can still be rolled back (via <code>get rebase -i</code> and <code>git reset</code>) without a trace.  Changes to the remote repository are carved in stone (I can only revert them with <code>git revert</code>, which reverses the reverted change but leaves both it and its reversion in the permanent record).  Changes to the distribution require a new version number, an announcement, and, depending on the circumstances, a recall notice and egg on my face.</p>

	<p id="fn2"><a href="#fn-anchor2"><sup>2</sup></a> But why not use branches?  Yeah, I&#8217;ll get to branches.  But the answer is mostly just personal preference.</p>

	<p id="fn3"><a href="#fn-anchor3"><sup>3</sup></a> Since you&#8217;re such a careful reader that you even bother to read footnotes, I&#8217;ll let you in on a secret.  I like to think about abstract stuff, but I&#8217;m not much good with abstractions.  Instead, I try to keep my concept library well-stocked with metaphors.  Then the hard parts become easy again.</p>

	<p id="fn4"><a href="#fn-anchor4"><sup>4</sup></a> For example, <code>git diff</code> tells me what&#8217;s different between my working directory and the index, without my having to build up, tear down, or remember any branch names.  The working directory and the index are self-cleaning (they don&#8217;t collect commits that I have to squash later); this has advantages and disadvantages, but it works for me and for the granularity with which I save to them.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=2OTrVH"><img src="http://feeds.feedburner.com/~f/osteele?i=2OTrVH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=NQp03H"><img src="http://feeds.feedburner.com/~f/osteele?i=NQp03H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=Zpdm1h"><img src="http://feeds.feedburner.com/~f/osteele?i=Zpdm1h" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=lQjzfH"><img src="http://feeds.feedburner.com/~f/osteele?i=lQjzfH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/287830270" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/commit-policies/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/commit-policies</feedburner:origLink></item>
		<item>
		<title>My Git Workflow</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/287199946/my-git-workflow</link>
		<comments>http://osteele.com/archives/2008/05/my-git-workflow#comments</comments>
		<pubDate>Fri, 09 May 2008 22:01:00 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Illustrations]]></category>

		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/09/my-git-workflow</guid>
		<description>&lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt;'s great!  But it's difficult to learn (it was for me, anyway) -- especially the index, which unlike the power-user features, comes up in day-to-day operation.

Here's my path to enlightment, and how I ended up using the index in my particular workflow.  There are other workflows, but this one is mine.

What this isn't: a Git tutorial.  It doesn't tell you how to set up git, or use it. I don't cover branches, or merging, or tags, or blobs.  There are dozens of really great articles about Git on the web; here are "some":http://del.icio.us/osteele/git.  What's here are just some pictures that _aren't_ about branches or blobs, that I wished I'd been able to look at six months ago when I was trying to figure this stuff out; I still haven't seen them elsewhere, so here they are now.</description>
			<content:encoded><![CDATA[<p><a href="http://git.or.cz/">Git</a>&#8217;s great!  But it&#8217;s difficult to learn (it was for me, anyway)  &#8211;  especially the index, which unlike the power-user features, comes up in day-to-day operation.</p>

	<p>Here&#8217;s my path to enlightment, and how I ended up using the index in my particular workflow.  There are other workflows, but this one is mine.</p>

	<p>What this isn&#8217;t: a Git tutorial.  It doesn&#8217;t tell you how to set up git, or use it. I don&#8217;t cover branches, or merging, or tags, or blobs.  There are dozens of really great articles about Git on the web; here are <a href="http://del.icio.us/osteele/git">some</a>.  What&#8217;s here are just some pictures that <em>aren&#8217;t</em> about branches or blobs, that I wished I&#8217;d been able to look at six months ago when I was trying to figure this stuff out; I still haven&#8217;t seen them elsewhere, so here they are now.</p>

	<h3>My brief history with Git</h3>

	<p>I started using Git about six months ago, in order to productively subcontract for a company that still uses Perforce.  Before that I had been a happy Mercurial user; before that, a Darcs devotee; before that, a mildly satisfied Subversion supplicant; and before that, a Perforce proponent.  (That last was before the other systems even <em>existed</em>.  I introduced Perforce into a couple of companies that had previously been using SourceSafe(!)  &#8211;  including the one I was now contracting for.)</p>

	<p>Each of these systems has flaws. Perforce and Subversion require an always-on connection and make branching (and merging) expensive, and Perforce uses pessimistic locking too (you have to check a file out before you can edit it).  I got hit by the exponential merge bug in Darcs (since fixed?); a deeper problem was that I found I wanted to be able to go back in time more often than I needed to commute patches, whereas Darcs makes the latter easy at the expense of the former  &#8211;  so Darcs&#8217; <a href="http://darcs.net/manual/node8.html#Patch">theory of patches</a>, although insightful and beautiful, just didn&#8217;t match my workflow.</p>

	<p>Git&#8217;s problem is its complexity.  Half of that is because it&#8217;s actually more powerful than the other systems: it&#8217;s got features that make it look scary but that you can ignore.  Another half is that Git uses nonstandard names for about half its most common operations.  (The rest of the <span class="caps">VCS</span> world has more or less settled on a basic command set, with names such as &#8220;checkout&#8221; and &#8220;revert&#8221;.  Not Git!)  And the third half is the index.  The index is a mechanism for preventing what you commit from matching what you tested in your working directory.  Huh?</p>

	<h3>Git without the index</h3>

	<p>I got through my first four months of Git by <a href="http://git.or.cz/course/svn.html">pretending it was Subversion</a>. (A faster implementation of Subversion, that works offline, with non-awful branches and merging, that can run as a client to Perforce  &#8211;  but still basically Subversion.)  The executive summary of this mode of operation is that if you use &#8220;<code>git commit -a</code>&#8221; instead of &#8220;<code>git commit</code>&#8221;, you can ignore the index altogether.  You can alias <code>ci</code> to &#8220;<code>commit -a</code>&#8221; (and train yourself not to use the longer <code>commit</code>, which I hadn&#8217;t been doing anyway), and then you don&#8217;t have to remember the command-line argument either:</p>

<pre>
$ cat ~/.gitconfig
[alias]
  ci = commit -a
  co = checkout
  st = status -a
$ git ci -m 'some changes'
</pre>

	<h3>Adding Back the Index</h3>

	<p>Git keeps copies of your source tree in the locations in this diagram<sup id="fn-anchor1"><a href="#fn1">1</a></sup>.  (I&#8217;ll call these locations &#8220;data stores&#8221;.)</p>

	<p><img src="/images/2008/git-transport.png" /></p>

	<p>The data store that&#8217;s new, relative to every other <span class="caps">DVCS</span> that I know about, is the &#8220;index&#8221;.  The one that&#8217;s new relative to centralized <span class="caps">VCS</span>&#8217;s such as Subversion and Perforce is the &#8220;local repository&#8221;.</p>

	<p>The illustration shows that &#8220;<code>git add</code>&#8221; is the only (everyday) operation that can cause the index to diverge from the local repository.  The only reason (in Subversion-emulation mode) to use &#8220;<code>git add</code>&#8221; is so that &#8220;<code>git commit</code>&#8221; will see your changes.  The <code>-a</code> option to &#8220;<code>git commit</code>&#8221; causes &#8220;<code>git commit</code>&#8221; to run &#8220;<code>git add -u</code>&#8221; first  &#8211;  in which case you never need to <code>run "git add -u</code>&#8221; explicitly  &#8211;  in which case the index stays in sync with the repository head.  This is how the trick in &#8220;git without the index&#8221; works: if you always use commit via &#8220;<code>git commit -a</code>&#8221;, you can ignore the index<sup id="fn-anchor2"><a href="#fn2">2</a></sup>.</p>

	<p>So what&#8217;s the point of the index?  Is it because Linus likes complicated things?  Is to one-up all the other repositories?  Is it to increase the complexity of system, so that you have a chance to shoot yourself in the foot if you&#8217;re not an alpha enough geek?</p>

	<p>Well, probably.  But it&#8217;s good for something else as well.  Several things, actually; I&#8217;ll show you one (that I use), and point you to another.</p>

	<p>But first, a piece of background that helps in understanding Git.  Git isn&#8217;t at its core a <span class="caps">VCS</span>.  It&#8217;s really a distributed versioning file system, down to its own <a href="http://www.kernel.org/pub/software/scm/git/docs/git-fsck.html">fsck</a> and <a href="http://www.kernel.org/pub/software/scm/git/docs/git-gc.html">gc</a>.  It was developed as the bottom layer of a <span class="caps">VCS</span>, but the <span class="caps">VCS </span> layer, which provides the conventional <span class="caps">VCS</span> commands (<code>commit</code>, <code>checkout</code>, <code>branch</code>), is more like an uneven veneer than like the &#8220;porcelain&#8221; it&#8217;s sometimes called: bits of file system (git core) internals poke through.</p>

	<p>The disadvantage of this (leaky) layering is that Git is complicated.  If you look up how to diff against yesterday&#8217;s 1pm sources in <a href="http://www.kernel.org/pub/software/scm/git/docs/git-diff.html">git diff</a>, it will send you to <a href="http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html">git rev-parse</a> from the core; if you look up <a href="http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html">git checkout</a>, you may end up at <a href="http://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html">git-check-ref-format</a>.  Most of this you can ignore, but it takes some reading to figure out which.</p>

	<p>The advantage of the layering is that you can use Git to build your own workflows.  Some of these workflows involve the index.  Like the other fancy Git features, bulding your own workflows is something that you can ignore initially, and add when you get to where you need it.  This is, historically, how I&#8217;ve used the index: I ignored it until I was comfortable with more of Git, and now I use it for a more productive workflow than I had with other <span class="caps">VCS</span>&#8217;s.  It&#8217;s not my main reason for using Git, but it&#8217;s turned to a strength from being a liability.</p>

	<h3>My Git Workflow</h3>

	<p><ins>Added: By way of illustration, here&#8217;s how I use Git.  I&#8217;m not recommending this particular workflow; instead, I&#8217;m hoping that it can further illustrate the relation between the workspace, the index, and the repository; and also the more general idea of using Git to build a workflow.</ins></p>

	<p>I use the index as a checkpoint.  When I&#8217;m about to make a change that might go awry  &#8211;  when I want to explore some direction that I&#8217;m not sure if I can follow through on or even whether it&#8217;s a good idea, such as a conceptually demanding refactoring or changing a representation type  &#8211;  I checkpoint my work into the index.  If this is the first change I&#8217;ve made since my last commit, then I can use the local repository as a checkpoint, but often I&#8217;ve got one conceptual change that I&#8217;m implementing as a set of little steps. I want to checkpoint after each step, but save the commit until I&#8217;ve gotten back to working, tested code.  (More on this tomorrow.)</p>

	<p><ins>Added: This way I can checkpoint every few minutes.  It&#8217;s a very cheap operation, and I don&#8217;t have to spend time cleaning up the checkpoints later.  &#8220;<code>git diff</code>&#8221; tells me what I&#8217;ve changed since the last checkpoint; &#8220;<code>git diff head</code>&#8221; shows what&#8217;s changed since the last commit.  &#8220;<code>git checkout .</code>&#8221; reverts to the last checkpoint; &#8220;<code>git checkout head .</code>&#8221; reverts to the last commit.  And &#8220;<code>git stash</code>&#8221; and &#8220;<code>git checkout -m -b</code>&#8221; operate on the changes since the last commit, which is what I want.</ins></p>

	<p>I&#8217;m most efficient when I can fearlessly try out risky changes.  Having a test suite is one way to be fearless: the fear of having to step through a set of manual steps to test each changed code path, or worse yet missing some, inhibits creativity.  Being able to roll back changes to the last checkpoint eliminates another source of fear.</p>

	<p>I used to make copies of files before I edited them; my directory would end up littered with files like <code>code.java.1</code> and <code>code.java.2</code>, which I would periodically sweep away.  Having Git handle the checkpoint and diff with them makes all this go faster.  (Having painless branches does the same for longer-running experiments, but I don&#8217;t want to create and then destroy a branch for every five-minute change.)</p>

	<p>Here&#8217;s another picture of the same Git commands, this time shown along a second axis, time, proceeding from top to bottom. [This is the behavior diagram to the last picture&#8217;s dataflow diagram.  Kind of.]  A number of local edits adds up to something I checkpoint to the index via &#8220;<code>git add -u</code>&#8221;; after a while I&#8217;ve collected something I&#8217;m ready to commit; and every so many commits I push everything so far to a remote repository, for backup (although I&#8217;ve got other backup systems), and for sharing.  </p>

	<p><img src="/images/2008/git-workflow.png" /></p>

	<p>I&#8217;ve even added another step, releasing a distribution, that goes outside of git.  This uses rsync (or scp, or some other build or deployment tool) to upload a tar file (or update a web site, or build a binary to place on a <span class="caps">DVD</span>).</p>

	<h3>Some Alternatives</h3>

	<p>Ryan Tomayko has written an <a href="http://tomayko.com/writings/the-thing-about-git">excellent essay</a> about a completely different way to use the repository.  I recommend it wholeheartedly.</p>

	<p>Ryan&#8217;s workflow is completely incompatible with mine.  Ryan uses the repository to tease apart the changes in his working directory into a sequence of separate commits.  I prefer to commit only code that I&#8217;ve tested in my directory, so Ryan&#8217;s method doesn&#8217;t work for me.  I set pending work aside via <code>git stash</code> or <code>git checkout -m -b</code> when I know I might need to interrupt it with another change; this sounds like it might not work for Ryan.  Neither one of these workflows is wrong (and I could easily use Ryan&#8217;s, I&#8217;m just slightly more efficient with mine); Git supports them both.</p>

	<p>There&#8217;s another way to do this particular task  &#8211;  of checkpointing after every few edits, but only persisting some of these checkpoints into the repository.  This is to commit each checkpoint to the repository (and go back to ignoring the index  &#8211;  at least for checkpointing  &#8211;  so this might work with Ryan&#8217;s), and <code>rebase</code> them later.  Git lets you squash a number of commits into a single commit before you push it to a public repository (and edit, reorder, and drop unpushed commits too)  &#8211;  that&#8217;s the <code>rebase -i</code> block in the previous illustration, and you can read about it <a href="http://blog.moertel.com/articles/2007/12/10/how-i-stopped-missing-darcs-and-started-loving-git">here</a>.  This is a perfectly legitimate mode of operation; it&#8217;s just one that I don&#8217;t use.</p>

	<p>Both of these alternatives harken back to Git as being a tool for designing <span class="caps">VCS</span> workflows, as much as being a <span class="caps">VCS</span> system itself.  The reasons I don&#8217;t use them myself bring us to Commit Policies, which I&#8217;ll write about <a href="/archives/2008/05/commit-policies">tomorrow</a>.</p>

	<p><hr/></p>

	<p id="fn1"><a href="#fn-anchor1"><sup>1</sup></a> This picture shows just those commands that copy data between the local repository, the remote repository, the index, and your workspace.  There&#8217;s lots more going on <em>inside</em> these repositories (branches, tags, and heads; or, blobs, trees, commits, and refs).  In fact, during a merge, there&#8217;s more going on inside the <em>index</em>, too (&#8220;mine&#8221;, &#8220;ours&#8221;, and &#8220;theirs&#8221;).  To a first approximation, all that&#8217;s orthogonal to how data gets <em>between</em> data stores; we&#8217;ll ignore it.</p>

	<p id="fn2"><a href="#fn-anchor2"><sup>2</sup></a> This isn&#8217;t quite true.  You still need to use &#8220;<code>git add</code>&#8221; a new file to tell git about it, and at that point it&#8217;s in your index but not in your repository.  You still don&#8217;t need to <em>think</em> about the repository in order to use it this way </p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=1eQzFH"><img src="http://feeds.feedburner.com/~f/osteele?i=1eQzFH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=W5aF6H"><img src="http://feeds.feedburner.com/~f/osteele?i=W5aF6H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=sHi0oh"><img src="http://feeds.feedburner.com/~f/osteele?i=sHi0oh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=uG7SKH"><img src="http://feeds.feedburner.com/~f/osteele?i=uG7SKH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/287199946" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/my-git-workflow/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/my-git-workflow</feedburner:origLink></item>
		<item>
		<title>Pneumococoa</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/286971820/pneumococoa</link>
		<comments>http://osteele.com/archives/2008/05/pneumococoa#comments</comments>
		<pubDate>Fri, 09 May 2008 14:19:03 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Amusements]]></category>

		<category><![CDATA[Words]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/09/pneumococoa</guid>
		<description>&lt;b&gt;pneu·mo·co·coa&lt;/b&gt; (&lt;b&gt;'&lt;/b&gt;nū.mə'koʊ.koʊ&lt;/span&gt;): A condition wherein the presence of the patient in a room vacuums all the chocolate out of it.</description>
			<content:encoded><![CDATA[<p><b>pneu&#183;mo&#183;co&#183;coa</b> (<b>&#8216;</b>nū.mə&#8217;koʊ.koʊ</span>): A condition wherein the presence of the patient in a room vacuums all the chocolate out of it.</p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=vxUmHH"><img src="http://feeds.feedburner.com/~f/osteele?i=vxUmHH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=dR1a3H"><img src="http://feeds.feedburner.com/~f/osteele?i=dR1a3H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=u3uB3h"><img src="http://feeds.feedburner.com/~f/osteele?i=u3uB3h" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=M0boRH"><img src="http://feeds.feedburner.com/~f/osteele?i=M0boRH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/286971820" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/pneumococoa/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/pneumococoa</feedburner:origLink></item>
		<item>
		<title>My No TV</title>
		<link>http://feeds.feedburner.com/~r/osteele/~3/286971821/my-no-tv</link>
		<comments>http://osteele.com/archives/2008/05/my-no-tv#comments</comments>
		<pubDate>Fri, 09 May 2008 14:18:39 +0000</pubDate>
		<dc:creator>Oliver</dc:creator>
		
		<category><![CDATA[Family]]></category>

		<guid isPermaLink="false">http://osteele.com/2008/05/09/my-no-tv</guid>
		<description>We have a No TV in our living room.

Sometimes I think it's our most valuable possession.

Our No TV gives the whole family somewhere between one and six extra hours every day.  It's hard to add hours to a day, but the No TV does it.

Miles uses the time for making stop-motion movies and Flash animations.  Charlotte uses it to read, and write, and compose pieces on the piano.  I use it for writing (code), and writing (English), and to teach myself algebra and geometry and management theory and finance.  Margaret uses it for her many projects too.  We wouldn't have time for any of this, if it weren't for our No TV.</description>
			<content:encoded><![CDATA[<p>We have a No TV in our living room.</p>

	<p>Sometimes I think it&#8217;s our most valuable possession.</p>

	<p>Our No TV gives the whole family somewhere between one and six extra hours every day.  It&#8217;s hard to add hours to a day, but the No TV does it.</p>

	<p>Miles uses the time for making stop-motion movies and Flash animations.  Charlotte uses it to read, and write, and compose pieces on the piano.  I use it for writing (code), and writing (English), and to teach myself algebra and geometry and management theory and finance.  Margaret uses it for her many projects too.  We wouldn&#8217;t have time for any of this, if it weren&#8217;t for our No TV.</p>

	<p>The No TV comes with other benefits as well.  It creates a few square feet of floor space.  And it pays out a few hundred dollars a year.</p>

	<p>In fact, we like our No TV so much, we&#8217;ve put one in each of the bedrooms too.</p>

	<p><b>Followups</b><br />
<ul><li><a href="http://pietersz.co.uk/2008/05/i-have-no-tv">I have a No TV too</a></li></ul></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/osteele?a=8wl7iH"><img src="http://feeds.feedburner.com/~f/osteele?i=8wl7iH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=NLye0H"><img src="http://feeds.feedburner.com/~f/osteele?i=NLye0H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=3jb1ph"><img src="http://feeds.feedburner.com/~f/osteele?i=3jb1ph" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/osteele?a=7wB0hH"><img src="http://feeds.feedburner.com/~f/osteele?i=7wB0hH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/osteele/~4/286971821" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://osteele.com/archives/2008/05/my-no-tv/feed</wfw:commentRss>
		<feedburner:origLink>http://osteele.com/archives/2008/05/my-no-tv</feedburner:origLink></item>
	</channel>
</rss>
