<?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>A Beta-ful Life</title>
	<atom:link href="http://www.betaful.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.betaful.com</link>
	<description>Personal blog of Tim Su. I blog about startups, coding, and life.</description>
	<lastBuildDate>Tue, 23 Apr 2013 20:49:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Astrid word clouds</title>
		<link>http://www.betaful.com/2013/04/astrid-word-clouds/</link>
		<comments>http://www.betaful.com/2013/04/astrid-word-clouds/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 20:49:02 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[astrid]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[visualization]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=826</guid>
		<description><![CDATA[When our team makes changes to Astrid, we have to supply a &#8220;commit message&#8221; &#8211; a short description of what we&#8217;ve done. As I was looking through our old messages today, I noticed that a lot of these messages were along the lines of &#8220;Fix some unit tests&#8221;, &#8220;Typo!&#8221;, or &#8220;More polish&#8221; &#8211; which makes [...]]]></description>
				<content:encoded><![CDATA[<p>When our team makes changes to Astrid, we have to supply a &#8220;commit message&#8221; &#8211; a short description of what we&#8217;ve done. As I was looking through our old messages today, I noticed that a lot of these messages were along the lines of &#8220;Fix some unit tests&#8221;, &#8220;Typo!&#8221;, or &#8220;More polish&#8221; &#8211; which makes sense, as many of these changes are only a line or two.</p>
<p>Large walls of text such as these are just dying to be visualized, so I threw our commit messages into an online tag cloud generator. It&#8217;s funny that all three of us use different words &#8211; &#8220;fix&#8221;, &#8220;fixed&#8221;, and &#8220;fixing&#8221;, though note that similar words are grouped into the most common word.</p>
<h3>Astrid.com server:</h3>
<p><!--<br />
begin tag cloud : generated by TagCrowd.com<br />
Feel free to modify as long as you keep this notice.</p>
<p>EMBEDDING INSTRUCTIONS:<br />
1. Customize your cloud's style by editing the CSS where it says CUSTOMIZE below.<br />
2. Insert this code in its entirety into your webpage or blog post.</p>
<p>This code and its rendered image are released under the Creative Commons Attribution-Noncommercial 3.0 Unported License. (http://creativecommons.org/licenses/by-nc/3.0/)</p>
<p>For COMMERCIAL USE LICENSING, visit http://tagcrowd.com/licensing.html<br />
--></p>
<style type="text/css"><!-- #htmltagcloud{</p>
<p>/******************************************
 * CUSTOMIZE CLOUD CSS BELOW (optional)
 */
	font-size: 100%;
	width: auto;		/* auto or fixed width, e.g. 500px   */
	font-family:'lucida grande','trebuchet ms',arial,helvetica,sans-serif;
	background-color:#fff;
	margin:1em 1em 0 1em;
	border:2px dotted #ddd;
	padding:2em; 
/******************************************
 * END CUSTOMIZE
 */</p>
<p>}#htmltagcloud{line-height:2.4em;word-spacing:normal;letter-spacing:normal;text-transform:none;text-align:justify;text-indent:0}#htmltagcloud a:link{text-decoration:none}#htmltagcloud a:visited{text-decoration:none}#htmltagcloud a:hover{color:white;background-color:#05f}#htmltagcloud a:active{color:white;background-color:#03d}.wrd{padding:0;position:relative}.wrd a{text-decoration:none}.tagcloud0{font-size:1.0em;color:#ACC1F3;z-index:10}.tagcloud0 a{color:#ACC1F3}.tagcloud1{font-size:1.4em;color:#ACC1F3;z-index:9}.tagcloud1 a{color:#ACC1F3}.tagcloud2{font-size:1.8em;color:#86A0DC;z-index:8}.tagcloud2 a{color:#86A0DC}.tagcloud3{font-size:2.2em;color:#86A0DC;z-index:7}.tagcloud3 a{color:#86A0DC}.tagcloud4{font-size:2.6em;color:#607EC5;z-index:6}.tagcloud4 a{color:#607EC5}.tagcloud5{font-size:3.0em;color:#607EC5;z-index:5}.tagcloud5 a{color:#607EC5}.tagcloud6{font-size:3.3em;color:#4C6DB9;z-index:4}.tagcloud6 a{color:#4C6DB9}.tagcloud7{font-size:3.6em;color:#395CAE;z-index:3}.tagcloud7 a{color:#395CAE}.tagcloud8{font-size:3.9em;color:#264CA2;z-index:2}.tagcloud8 a{color:#264CA2}.tagcloud9{font-size:4.2em;color:#133B97;z-index:1}.tagcloud9 a{color:#133B97}.tagcloud10{font-size:4.5em;color:#002A8B;z-index:0}.tagcloud10 a{color:#002A8B}.freq{font-size:10pt !important;color:#bbb}#credit{text-align:center;color:#333;margin-bottom:0.6em;font:0.7em 'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif}#credit a:link{color:#777;text-decoration:none}#credit a:visited{color:#777;text-decoration:none}#credit a:hover{color:white;background-color:#05f}#credit a:active{text-decoration:underline}// -->
</style>
<div id="htmltagcloud"> <span id="0" class="wrd tagcloud0"><a href="#tagcloud">achievement</a></span> <span id="1" class="wrd tagcloud3"><a href="#tagcloud">activity</a></span> <span id="2" class="wrd tagcloud6"><a href="#tagcloud">added</a></span> <span id="3" class="wrd tagcloud4"><a href="#tagcloud">api</a></span> <span id="4" class="wrd tagcloud0"><a href="#tagcloud">astrid</a></span> <span id="5" class="wrd tagcloud2"><a href="#tagcloud">better</a></span> <span id="6" class="wrd tagcloud4"><a href="#tagcloud">branch</a></span> <span id="7" class="wrd tagcloud1"><a href="#tagcloud">bug</a></span> <span id="8" class="wrd tagcloud1"><a href="#tagcloud">button</a></span> <span id="9" class="wrd tagcloud2"><a href="#tagcloud">cache</a></span> <span id="10" class="wrd tagcloud3"><a href="#tagcloud">change</a></span> <span id="11" class="wrd tagcloud0"><a href="#tagcloud">cleaned</a></span> <span id="12" class="wrd tagcloud0"><a href="#tagcloud">cleanup</a></span> <span id="13" class="wrd tagcloud2"><a href="#tagcloud">code</a></span> <span id="14" class="wrd tagcloud2"><a href="#tagcloud">comment</a></span> <span id="15" class="wrd tagcloud2"><a href="#tagcloud">completed</a></span> <span id="16" class="wrd tagcloud1"><a href="#tagcloud">controller</a></span> <span id="17" class="wrd tagcloud3"><a href="#tagcloud">create</a></span> <span id="18" class="wrd tagcloud1"><a href="#tagcloud">date</a></span> <span id="19" class="wrd tagcloud0"><a href="#tagcloud">default</a></span> <span id="20" class="wrd tagcloud2"><a href="#tagcloud">deleted</a></span> <span id="21" class="wrd tagcloud0"><a href="#tagcloud">due</a></span> <span id="22" class="wrd tagcloud1"><a href="#tagcloud">edit</a></span> <span id="23" class="wrd tagcloud4"><a href="#tagcloud">email</a></span> <span id="24" class="wrd tagcloud1"><a href="#tagcloud">error</a></span> <span id="25" class="wrd tagcloud1"><a href="#tagcloud">filter</a></span> <span id="26" class="wrd tagcloud10"><a href="#tagcloud">fix</a></span> <span id="27" class="wrd tagcloud0"><a href="#tagcloud">gem</a></span> <span id="28" class="wrd tagcloud0"><a href="#tagcloud">goal</a></span> <span id="29" class="wrd tagcloud0"><a href="#tagcloud">handle</a></span> <span id="30" class="wrd tagcloud0"><a href="#tagcloud">history</a></span> <span id="31" class="wrd tagcloud0"><a href="#tagcloud">home</a></span> <span id="32" class="wrd tagcloud1"><a href="#tagcloud">id</a></span> <span id="33" class="wrd tagcloud0"><a href="#tagcloud">images</a></span> <span id="34" class="wrd tagcloud3"><a href="#tagcloud">issues</a></span> <span id="35" class="wrd tagcloud0"><a href="#tagcloud">js</a></span> <span id="36" class="wrd tagcloud1"><a href="#tagcloud">landing</a></span> <span id="37" class="wrd tagcloud0"><a href="#tagcloud">layout</a></span> <span id="38" class="wrd tagcloud3"><a href="#tagcloud">link</a></span> <span id="39" class="wrd tagcloud5"><a href="#tagcloud">list</a></span> <span id="40" class="wrd tagcloud1"><a href="#tagcloud">logic</a></span> <span id="41" class="wrd tagcloud6"><a href="#tagcloud">merge</a></span> <span id="42" class="wrd tagcloud0"><a href="#tagcloud">method</a></span> <span id="43" class="wrd tagcloud3"><a href="#tagcloud">minor</a></span> <span id="44" class="wrd tagcloud1"><a href="#tagcloud">model</a></span> <span id="45" class="wrd tagcloud1"><a href="#tagcloud">name</a></span> <span id="46" class="wrd tagcloud0"><a href="#tagcloud">nil</a></span> <span id="47" class="wrd tagcloud4"><a href="#tagcloud">page</a></span> <span id="48" class="wrd tagcloud0"><a href="#tagcloud">people</a></span> <span id="49" class="wrd tagcloud2"><a href="#tagcloud">picture</a></span> <span id="50" class="wrd tagcloud1"><a href="#tagcloud">premium</a></span> <span id="51" class="wrd tagcloud3"><a href="#tagcloud">pull</a></span> <span id="52" class="wrd tagcloud2"><a href="#tagcloud">remote-tracking</a></span> <span id="53" class="wrd tagcloud4"><a href="#tagcloud">removed</a></span> <span id="54" class="wrd tagcloud1"><a href="#tagcloud">repeat</a></span> <span id="55" class="wrd tagcloud3"><a href="#tagcloud">request</a></span> <span id="56" class="wrd tagcloud1"><a href="#tagcloud">save</a></span> <span id="57" class="wrd tagcloud2"><a href="#tagcloud">send</a></span> <span id="58" class="wrd tagcloud0"><a href="#tagcloud">share</a></span> <span id="59" class="wrd tagcloud2"><a href="#tagcloud">stuff</a></span> <span id="60" class="wrd tagcloud2"><a href="#tagcloud">style</a></span> <span id="61" class="wrd tagcloud5"><a href="#tagcloud">tag</a></span> <span id="62" class="wrd tagcloud8"><a href="#tagcloud">task</a></span> <span id="63" class="wrd tagcloud6"><a href="#tagcloud">test</a></span> <span id="64" class="wrd tagcloud0"><a href="#tagcloud">text</a></span> <span id="65" class="wrd tagcloud0"><a href="#tagcloud">tweaks</a></span> <span id="66" class="wrd tagcloud0"><a href="#tagcloud">typo</a></span> <span id="67" class="wrd tagcloud0"><a href="#tagcloud">ui</a></span> <span id="68" class="wrd tagcloud3"><a href="#tagcloud">unit</a></span> <span id="69" class="wrd tagcloud3"><a href="#tagcloud">update</a></span> <span id="70" class="wrd tagcloud1"><a href="#tagcloud">url</a></span> <span id="71" class="wrd tagcloud6"><a href="#tagcloud">user</a></span> <span id="72" class="wrd tagcloud0"><a href="#tagcloud">view</a></span> <span id="73" class="wrd tagcloud0"><a href="#tagcloud">welcome</a></span> <span id="74" class="wrd tagcloud4"><a href="#tagcloud">work</a></span> </div>
<div id="credit">created at <a href="http://tagcrowd.com">TagCrowd.com</a></div>
<p><!-- end tag cloud : generated by TagCrowd.com : please keep this notice --></p>
<h3>Astrid.com for Android:</h3>
<p><!--<br />
begin tag cloud : generated by TagCrowd.com<br />
Feel free to modify as long as you keep this notice.</p>
<p>EMBEDDING INSTRUCTIONS:<br />
1. Customize your cloud's style by editing the CSS where it says CUSTOMIZE below.<br />
2. Insert this code in its entirety into your webpage or blog post.</p>
<p>This code and its rendered image are released under the Creative Commons Attribution-Noncommercial 3.0 Unported License. (http://creativecommons.org/licenses/by-nc/3.0/)</p>
<p>For COMMERCIAL USE LICENSING, visit http://tagcrowd.com/licensing.html<br />
--></p>
<style type="text/css"><!-- #htmltagcloud{</p>
<p>/******************************************
 * CUSTOMIZE CLOUD CSS BELOW (optional)
 */
	font-size: 100%;
	width: auto;		/* auto or fixed width, e.g. 500px   */
	font-family:'lucida grande','trebuchet ms',arial,helvetica,sans-serif;
	background-color:#fff;
	margin:1em 1em 0 1em;
	border:2px dotted #ddd;
	padding:2em; 
/******************************************
 * END CUSTOMIZE
 */</p>
<p>}#htmltagcloud{line-height:2.4em;word-spacing:normal;letter-spacing:normal;text-transform:none;text-align:justify;text-indent:0}#htmltagcloud a:link{text-decoration:none}#htmltagcloud a:visited{text-decoration:none}#htmltagcloud a:hover{color:white;background-color:#05f}#htmltagcloud a:active{color:white;background-color:#03d}.wrd{padding:0;position:relative}.wrd a{text-decoration:none}.tagcloud0{font-size:1.0em;color:#ACC1F3;z-index:10}.tagcloud0 a{color:#ACC1F3}.tagcloud1{font-size:1.4em;color:#ACC1F3;z-index:9}.tagcloud1 a{color:#ACC1F3}.tagcloud2{font-size:1.8em;color:#86A0DC;z-index:8}.tagcloud2 a{color:#86A0DC}.tagcloud3{font-size:2.2em;color:#86A0DC;z-index:7}.tagcloud3 a{color:#86A0DC}.tagcloud4{font-size:2.6em;color:#607EC5;z-index:6}.tagcloud4 a{color:#607EC5}.tagcloud5{font-size:3.0em;color:#607EC5;z-index:5}.tagcloud5 a{color:#607EC5}.tagcloud6{font-size:3.3em;color:#4C6DB9;z-index:4}.tagcloud6 a{color:#4C6DB9}.tagcloud7{font-size:3.6em;color:#395CAE;z-index:3}.tagcloud7 a{color:#395CAE}.tagcloud8{font-size:3.9em;color:#264CA2;z-index:2}.tagcloud8 a{color:#264CA2}.tagcloud9{font-size:4.2em;color:#133B97;z-index:1}.tagcloud9 a{color:#133B97}.tagcloud10{font-size:4.5em;color:#002A8B;z-index:0}.tagcloud10 a{color:#002A8B}.freq{font-size:10pt !important;color:#bbb}#credit{text-align:center;color:#333;margin-bottom:0.6em;font:0.7em 'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif}#credit a:link{color:#777;text-decoration:none}#credit a:visited{color:#777;text-decoration:none}#credit a:hover{color:white;background-color:#05f}#credit a:active{text-decoration:underline}// -->
</style>
<div id="htmltagcloud"> <span id="0" class="wrd tagcloud3"><a href="#tagcloud">activity</a></span> <span id="1" class="wrd tagcloud6"><a href="#tagcloud">added</a></span> <span id="2" class="wrd tagcloud0"><a href="#tagcloud">android</a></span> <span id="3" class="wrd tagcloud0"><a href="#tagcloud">api</a></span> <span id="4" class="wrd tagcloud3"><a href="#tagcloud">astrid</a></span> <span id="5" class="wrd tagcloud0"><a href="#tagcloud">better</a></span> <span id="6" class="wrd tagcloud3"><a href="#tagcloud">branch</a></span> <span id="7" class="wrd tagcloud5"><a href="#tagcloud">bug</a></span> <span id="8" class="wrd tagcloud0"><a href="#tagcloud">build</a></span> <span id="9" class="wrd tagcloud2"><a href="#tagcloud">bump</a></span> <span id="10" class="wrd tagcloud1"><a href="#tagcloud">button</a></span> <span id="11" class="wrd tagcloud1"><a href="#tagcloud">changes</a></span> <span id="12" class="wrd tagcloud2"><a href="#tagcloud">code</a></span> <span id="13" class="wrd tagcloud0"><a href="#tagcloud">comments</a></span> <span id="14" class="wrd tagcloud2"><a href="#tagcloud">crash</a></span> <span id="15" class="wrd tagcloud1"><a href="#tagcloud">created</a></span> <span id="16" class="wrd tagcloud2"><a href="#tagcloud">date</a></span> <span id="17" class="wrd tagcloud0"><a href="#tagcloud">default</a></span> <span id="18" class="wrd tagcloud1"><a href="#tagcloud">deleted</a></span> <span id="19" class="wrd tagcloud1"><a href="#tagcloud">dialog</a></span> <span id="20" class="wrd tagcloud0"><a href="#tagcloud">display</a></span> <span id="21" class="wrd tagcloud0"><a href="#tagcloud">due</a></span> <span id="22" class="wrd tagcloud3"><a href="#tagcloud">edit</a></span> <span id="23" class="wrd tagcloud0"><a href="#tagcloud">error</a></span> <span id="24" class="wrd tagcloud3"><a href="#tagcloud">files</a></span> <span id="25" class="wrd tagcloud3"><a href="#tagcloud">filter</a></span> <span id="26" class="wrd tagcloud10"><a href="#tagcloud">fixed</a></span> <span id="27" class="wrd tagcloud0"><a href="#tagcloud">google</a></span> <span id="28" class="wrd tagcloud2"><a href="#tagcloud">gtasks</a></span> <span id="29" class="wrd tagcloud0"><a href="#tagcloud">handle</a></span> <span id="30" class="wrd tagcloud0"><a href="#tagcloud">images</a></span> <span id="31" class="wrd tagcloud0"><a href="#tagcloud">improvements</a></span> <span id="32" class="wrd tagcloud2"><a href="#tagcloud">issues</a></span> <span id="33" class="wrd tagcloud0"><a href="#tagcloud">layout</a></span> <span id="34" class="wrd tagcloud6"><a href="#tagcloud">list</a></span> <span id="35" class="wrd tagcloud0"><a href="#tagcloud">logging</a></span> <span id="36" class="wrd tagcloud0"><a href="#tagcloud">logic</a></span> <span id="37" class="wrd tagcloud0"><a href="#tagcloud">login</a></span> <span id="38" class="wrd tagcloud0"><a href="#tagcloud">menu</a></span> <span id="39" class="wrd tagcloud5"><a href="#tagcloud">merge</a></span> <span id="40" class="wrd tagcloud2"><a href="#tagcloud">message</a></span> <span id="41" class="wrd tagcloud0"><a href="#tagcloud">migration</a></span> <span id="42" class="wrd tagcloud2"><a href="#tagcloud">minor</a></span> <span id="43" class="wrd tagcloud0"><a href="#tagcloud">name</a></span> <span id="44" class="wrd tagcloud0"><a href="#tagcloud">notification</a></span> <span id="45" class="wrd tagcloud0"><a href="#tagcloud">null</a></span> <span id="46" class="wrd tagcloud0"><a href="#tagcloud">page</a></span> <span id="47" class="wrd tagcloud0"><a href="#tagcloud">polish</a></span> <span id="48" class="wrd tagcloud1"><a href="#tagcloud">preference</a></span> <span id="49" class="wrd tagcloud0"><a href="#tagcloud">pull</a></span> <span id="50" class="wrd tagcloud0"><a href="#tagcloud">refactored</a></span> <span id="51" class="wrd tagcloud0"><a href="#tagcloud">remote-tracking</a></span> <span id="52" class="wrd tagcloud4"><a href="#tagcloud">removed</a></span> <span id="53" class="wrd tagcloud0"><a href="#tagcloud">repeat</a></span> <span id="54" class="wrd tagcloud0"><a href="#tagcloud">request</a></span> <span id="55" class="wrd tagcloud0"><a href="#tagcloud">sb</a></span> <span id="56" class="wrd tagcloud0"><a href="#tagcloud">service</a></span> <span id="57" class="wrd tagcloud0"><a href="#tagcloud">settings</a></span> <span id="58" class="wrd tagcloud0"><a href="#tagcloud">started</a></span> <span id="59" class="wrd tagcloud1"><a href="#tagcloud">strings</a></span> <span id="60" class="wrd tagcloud0"><a href="#tagcloud">subtasks</a></span> <span id="61" class="wrd tagcloud5"><a href="#tagcloud">sync</a></span> <span id="62" class="wrd tagcloud3"><a href="#tagcloud">tag</a></span> <span id="63" class="wrd tagcloud7"><a href="#tagcloud">task</a></span> <span id="64" class="wrd tagcloud4"><a href="#tagcloud">test</a></span> <span id="65" class="wrd tagcloud0"><a href="#tagcloud">text</a></span> <span id="66" class="wrd tagcloud1"><a href="#tagcloud">unit</a></span> <span id="67" class="wrd tagcloud5"><a href="#tagcloud">updated</a></span> <span id="68" class="wrd tagcloud2"><a href="#tagcloud">upgrade</a></span> <span id="69" class="wrd tagcloud1"><a href="#tagcloud">user</a></span> <span id="70" class="wrd tagcloud3"><a href="#tagcloud">version</a></span> <span id="71" class="wrd tagcloud1"><a href="#tagcloud">view</a></span> <span id="72" class="wrd tagcloud0"><a href="#tagcloud">widget</a></span> <span id="73" class="wrd tagcloud3"><a href="#tagcloud">work</a></span> <span id="74" class="wrd tagcloud0"><a href="#tagcloud">xml</a></span> </div>
<div id="credit">created at <a href="http://tagcrowd.com">TagCrowd.com</a></div>
<p><!-- end tag cloud : generated by TagCrowd.com : please keep this notice --></p>
<h3>Astrid.com for iPhone:</h3>
<p><!--<br />
begin tag cloud : generated by TagCrowd.com<br />
Feel free to modify as long as you keep this notice.</p>
<p>EMBEDDING INSTRUCTIONS:<br />
1. Customize your cloud's style by editing the CSS where it says CUSTOMIZE below.<br />
2. Insert this code in its entirety into your webpage or blog post.</p>
<p>This code and its rendered image are released under the Creative Commons Attribution-Noncommercial 3.0 Unported License. (http://creativecommons.org/licenses/by-nc/3.0/)</p>
<p>For COMMERCIAL USE LICENSING, visit http://tagcrowd.com/licensing.html<br />
--></p>
<style type="text/css"><!-- #htmltagcloud{</p>
<p>/******************************************
 * CUSTOMIZE CLOUD CSS BELOW (optional)
 */
	font-size: 100%;
	width: auto;		/* auto or fixed width, e.g. 500px   */
	font-family:'lucida grande','trebuchet ms',arial,helvetica,sans-serif;
	background-color:#fff;
	margin:1em 1em 0 1em;
	border:2px dotted #ddd;
	padding:2em; 
/******************************************
 * END CUSTOMIZE
 */</p>
<p>}#htmltagcloud{line-height:2.4em;word-spacing:normal;letter-spacing:normal;text-transform:none;text-align:justify;text-indent:0}#htmltagcloud a:link{text-decoration:none}#htmltagcloud a:visited{text-decoration:none}#htmltagcloud a:hover{color:white;background-color:#05f}#htmltagcloud a:active{color:white;background-color:#03d}.wrd{padding:0;position:relative}.wrd a{text-decoration:none}.tagcloud0{font-size:1.0em;color:#ACC1F3;z-index:10}.tagcloud0 a{color:#ACC1F3}.tagcloud1{font-size:1.4em;color:#ACC1F3;z-index:9}.tagcloud1 a{color:#ACC1F3}.tagcloud2{font-size:1.8em;color:#86A0DC;z-index:8}.tagcloud2 a{color:#86A0DC}.tagcloud3{font-size:2.2em;color:#86A0DC;z-index:7}.tagcloud3 a{color:#86A0DC}.tagcloud4{font-size:2.6em;color:#607EC5;z-index:6}.tagcloud4 a{color:#607EC5}.tagcloud5{font-size:3.0em;color:#607EC5;z-index:5}.tagcloud5 a{color:#607EC5}.tagcloud6{font-size:3.3em;color:#4C6DB9;z-index:4}.tagcloud6 a{color:#4C6DB9}.tagcloud7{font-size:3.6em;color:#395CAE;z-index:3}.tagcloud7 a{color:#395CAE}.tagcloud8{font-size:3.9em;color:#264CA2;z-index:2}.tagcloud8 a{color:#264CA2}.tagcloud9{font-size:4.2em;color:#133B97;z-index:1}.tagcloud9 a{color:#133B97}.tagcloud10{font-size:4.5em;color:#002A8B;z-index:0}.tagcloud10 a{color:#002A8B}.freq{font-size:10pt !important;color:#bbb}#credit{text-align:center;color:#333;margin-bottom:0.6em;font:0.7em 'lucida grande',trebuchet,'trebuchet ms',verdana,arial,helvetica,sans-serif}#credit a:link{color:#777;text-decoration:none}#credit a:visited{color:#777;text-decoration:none}#credit a:hover{color:white;background-color:#05f}#credit a:active{text-decoration:underline}// -->
</style>
<div id="htmltagcloud"> <span id="1" class="wrd tagcloud0"><a href="#tagcloud">achievement</a></span> <span id="2" class="wrd tagcloud6"><a href="#tagcloud">activity</a></span> <span id="3" class="wrd tagcloud9"><a href="#tagcloud">added</a></span> <span id="4" class="wrd tagcloud1"><a href="#tagcloud">app</a></span> <span id="5" class="wrd tagcloud1"><a href="#tagcloud">attachments</a></span> <span id="6" class="wrd tagcloud0"><a href="#tagcloud">background</a></span> <span id="7" class="wrd tagcloud0"><a href="#tagcloud">better</a></span> <span id="8" class="wrd tagcloud4"><a href="#tagcloud">branch</a></span> <span id="9" class="wrd tagcloud3"><a href="#tagcloud">bug</a></span> <span id="10" class="wrd tagcloud0"><a href="#tagcloud">build</a></span> <span id="11" class="wrd tagcloud2"><a href="#tagcloud">button</a></span> <span id="12" class="wrd tagcloud6"><a href="#tagcloud">cell</a></span> <span id="13" class="wrd tagcloud5"><a href="#tagcloud">changed</a></span> <span id="14" class="wrd tagcloud1"><a href="#tagcloud">code</a></span> <span id="15" class="wrd tagcloud0"><a href="#tagcloud">color</a></span> <span id="16" class="wrd tagcloud4"><a href="#tagcloud">comments</a></span> <span id="17" class="wrd tagcloud0"><a href="#tagcloud">completed</a></span> <span id="18" class="wrd tagcloud0"><a href="#tagcloud">conflicts</a></span> <span id="19" class="wrd tagcloud2"><a href="#tagcloud">controller</a></span> <span id="20" class="wrd tagcloud2"><a href="#tagcloud">crash</a></span> <span id="21" class="wrd tagcloud1"><a href="#tagcloud">data</a></span> <span id="22" class="wrd tagcloud2"><a href="#tagcloud">date</a></span> <span id="23" class="wrd tagcloud0"><a href="#tagcloud">default</a></span> <span id="24" class="wrd tagcloud5"><a href="#tagcloud">deleting</a></span> <span id="25" class="wrd tagcloud5"><a href="#tagcloud">edit</a></span> <span id="26" class="wrd tagcloud1"><a href="#tagcloud">error</a></span> <span id="27" class="wrd tagcloud0"><a href="#tagcloud">featured</a></span> <span id="28" class="wrd tagcloud2"><a href="#tagcloud">files</a></span> <span id="29" class="wrd tagcloud9"><a href="#tagcloud">fixing</a></span> <span id="30" class="wrd tagcloud2"><a href="#tagcloud">header</a></span> <span id="31" class="wrd tagcloud4"><a href="#tagcloud">images</a></span> <span id="32" class="wrd tagcloud1"><a href="#tagcloud">ipad</a></span> <span id="33" class="wrd tagcloud0"><a href="#tagcloud">issues</a></span> <span id="34" class="wrd tagcloud0"><a href="#tagcloud">leaks</a></span> <span id="35" class="wrd tagcloud8"><a href="#tagcloud">list</a></span> <span id="36" class="wrd tagcloud1"><a href="#tagcloud">loading</a></span> <span id="37" class="wrd tagcloud1"><a href="#tagcloud">longer</a></span> <span id="38" class="wrd tagcloud2"><a href="#tagcloud">memory</a></span> <span id="39" class="wrd tagcloud6"><a href="#tagcloud">merge</a></span> <span id="40" class="wrd tagcloud0"><a href="#tagcloud">model</a></span> <span id="41" class="wrd tagcloud0"><a href="#tagcloud">name</a></span> <span id="42" class="wrd tagcloud3"><a href="#tagcloud">notifications</a></span> <span id="43" class="wrd tagcloud2"><a href="#tagcloud">people</a></span> <span id="44" class="wrd tagcloud2"><a href="#tagcloud">picker</a></span> <span id="45" class="wrd tagcloud0"><a href="#tagcloud">polish</a></span> <span id="46" class="wrd tagcloud1"><a href="#tagcloud">popover</a></span> <span id="47" class="wrd tagcloud0"><a href="#tagcloud">profile</a></span> <span id="48" class="wrd tagcloud1"><a href="#tagcloud">quick</a></span> <span id="49" class="wrd tagcloud1"><a href="#tagcloud">refactored</a></span> <span id="50" class="wrd tagcloud2"><a href="#tagcloud">reminders</a></span> <span id="51" class="wrd tagcloud1"><a href="#tagcloud">remote</a></span> <span id="52" class="wrd tagcloud5"><a href="#tagcloud">removing</a></span> <span id="53" class="wrd tagcloud0"><a href="#tagcloud">resizing</a></span> <span id="54" class="wrd tagcloud0"><a href="#tagcloud">reusable</a></span> <span id="55" class="wrd tagcloud1"><a href="#tagcloud">screen</a></span> <span id="56" class="wrd tagcloud0"><a href="#tagcloud">scroll</a></span> <span id="57" class="wrd tagcloud0"><a href="#tagcloud">search</a></span> <span id="58" class="wrd tagcloud0"><a href="#tagcloud">server</a></span> <span id="59" class="wrd tagcloud0"><a href="#tagcloud">service</a></span> <span id="60" class="wrd tagcloud3"><a href="#tagcloud">settings</a></span> <span id="61" class="wrd tagcloud1"><a href="#tagcloud">share</a></span> <span id="62" class="wrd tagcloud1"><a href="#tagcloud">showing</a></span> <span id="63" class="wrd tagcloud3"><a href="#tagcloud">sync</a></span> <span id="64" class="wrd tagcloud4"><a href="#tagcloud">table</a></span> <span id="65" class="wrd tagcloud7"><a href="#tagcloud">tag</a></span> <span id="66" class="wrd tagcloud10"><a href="#tagcloud">task</a></span> <span id="67" class="wrd tagcloud0"><a href="#tagcloud">text</a></span> <span id="68" class="wrd tagcloud1"><a href="#tagcloud">title</a></span> <span id="69" class="wrd tagcloud4"><a href="#tagcloud">ui</a></span> <span id="70" class="wrd tagcloud6"><a href="#tagcloud">updated</a></span> <span id="71" class="wrd tagcloud5"><a href="#tagcloud">user</a></span> <span id="72" class="wrd tagcloud9"><a href="#tagcloud">view</a></span> <span id="73" class="wrd tagcloud0"><a href="#tagcloud">warnings</a></span> <span id="74" class="wrd tagcloud2"><a href="#tagcloud">work</a></span> </div>
<div id="credit">created at <a href="http://tagcrowd.com">TagCrowd.com</a></div>
<p><!-- end tag cloud : generated by TagCrowd.com : please keep this notice --></p>
<p>It&#8217;s easy to generate one yourself! If you use git, you can output a file with only commit messages:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">git log</span> <span style="color: #660033;">--pretty</span>=format:<span style="color: #000000; font-weight: bold;">%</span>s <span style="color: #000000; font-weight: bold;">&gt;</span> messages.txt</pre></td></tr></table></div>

<p>You can then send that file to a service like <a href="http://tagcrowd.com/" target="_blank">tagcrowd.com</a></p>
<p>Finally, some of our notable commit messages:</p>
<ul>
<li>MIGRATION FINALLY WORKS</li>
<li>dsjkfhdsfhdjakgfdk;lafj da;f jdslkfjdsa l;fdsa</li>
<li>russian is really long</li>
<li>deuling windows</li>
<li>over 9000</li>
<li>well that was a mess</li>
<li>cat of the day</li>
<li>Add some rescuage if some is needed</li>
<li>You&#8217;re no child of mine! You&#8217;re deleted!</li>
</ul>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/04/astrid-word-clouds/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/04/astrid-word-clouds/" data-text="Astrid word clouds"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/04/astrid-word-clouds/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F04%2Fastrid-word-clouds%2F&amp;title=Astrid%20word%20clouds" id="wpa2a_2">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/04/astrid-word-clouds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transitions</title>
		<link>http://www.betaful.com/2013/04/transitions/</link>
		<comments>http://www.betaful.com/2013/04/transitions/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 10:13:13 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[postmortem]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[transition]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=823</guid>
		<description><![CDATA[The Bridges Transition Model I&#8217;ve been reading a fantastic book called Transitions, by William Bridges. As I&#8217;ve been going, I made a list of all of the transitions in my life in the past year: Became a vegetarian Ended a relationship Moved twice Gained and lost three roommates Entered my &#8220;late twenties&#8221; Changed from renting [...]]]></description>
				<content:encoded><![CDATA[<div class="alignright" style="text-align: center; padding-left: 10px"><img src="http://www.betaful.com/wp-content/uploads/2013/04/Managing-Transitions-William-Bridges.gif" alt="Managing-Transitions-William-Bridges" width="438" height="256" class="size-full wp-image-824" /></p>
<p>The Bridges Transition Model</p></div>
<p>I&#8217;ve been reading a fantastic book called <a href="http://www.amazon.com/Transitions-Making-Changes-Revised-Anniversary/dp/073820904X" target="_blank"><i>Transitions</i></a>, by William Bridges. As I&#8217;ve been going, I made a list of all of the transitions in my life in the past year:</p>
<ul>
<li>Became a vegetarian</li>
<li>Ended a relationship</li>
<li>Moved twice</li>
<li>Gained and lost three roommates</li>
<li>Entered my &#8220;late twenties&#8221;</li>
<li>Changed from renting to being a landlord at work</li>
<li>Went to seven different churches</li>
<li>Passed through mild depression</li>
<li>Lived at home for the first time in ten years</li>
<li>Became more proactive with my family</li>
<li>Started thinking about the next five years</li>
<li>Acquired <a href="http://www.betaful.com/2013/04/gandalf-the-gray/" target="_blank">a pet</a></li>
</ul>
<p>Looking over that list, I&#8217;m starting to realize just how turbulent things have been recently. <i>Transitions</i> suggests that while there isn&#8217;t a universal life development schedule, people tend to go through a shift around age 30 as what they were doing before seems &#8220;not quite right&#8221;. That sounds pretty accurate, given what I know about myself and my peers.</p>
<p>Each transition begins with an ending (see the diagram). Endings are often sad, even when transitions are good, like getting married or moving into a new home. Endings can also trigger emotions felt during previous (possibly unresolved) endings, which can make them seem even scarier than they ought to be. The book, however, stresses that endings should be processed before new beginnings, which I guess makes sense.</p>
<p>From there, the neutral zone, which sounds bad, is actually awesome. Once you break from your old ways and worldview, there is an opportunity to re-see the world and life from a different perspective. Things you used to do automatically can be re-imagined because you&#8217;ve branched away from the familiar path. When I moved this past year, I realized that I didn&#8217;t want to own furniture anymore &#8211; even things I&#8217;d gotten attached to over the years. The move, painful as it was, gave me an opportunity to imagine a life without a lot of furniture, which is somehow really appealing to me.</p>
<p>I&#8217;m still working through the book (and my transitions), but without it, I don&#8217;t think I would have sat down and thought about the things that have happened and what they mean for my life. If you feel like everything is crazy, it just might be because there&#8217;s a lot that&#8217;s changing in your life. If that&#8217;s the case, I&#8217;d highly recommend picking up <i>Transitions</i> and giving it a read.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/04/transitions/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/04/transitions/" data-text="Transitions"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/04/transitions/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F04%2Ftransitions%2F&amp;title=Transitions" id="wpa2a_4">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/04/transitions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gandalf the Gray</title>
		<link>http://www.betaful.com/2013/04/gandalf-the-gray/</link>
		<comments>http://www.betaful.com/2013/04/gandalf-the-gray/#comments</comments>
		<pubDate>Thu, 11 Apr 2013 22:45:49 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[cats]]></category>
		<category><![CDATA[gandalf]]></category>
		<category><![CDATA[pictures]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=797</guid>
		<description><![CDATA[You might know this blog as a blog about startups, or engineering, or productivity. All of this is true (and hopefully more of those blog posts coming soon) &#8211; but this blog is also part of the &#8220;Internet&#8221;, which as you may know, exists to deliver pictures of cats. Allow me to introduce my furry [...]]]></description>
				<content:encoded><![CDATA[<p>You might know this blog as a blog about startups, or engineering, or productivity. All of this is true (and hopefully more of those blog posts coming soon) &#8211; but this blog is also part of the &#8220;Internet&#8221;, which as you may know, exists to deliver pictures of cats. Allow me to introduce my furry sidekick, <b>Gandalf</b> (the Gray).</p>
<p>Gandalf is a handsome critter, posing for the camera when he feels like it.</p>
<p><center><br />
<img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Aug-12-13-35-22.jpg" class="wp-image-799" /></p>
<p>You&#8217;re cooking? Don&#8217;t forget me!</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Sep-06-11-47-24.jpg" class="wp-image-801" /></p>
<p>You don&#8217;t mind if I use this as a couch&#8230;</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Dec-28-0-57-03.jpg" class="wp-image-803" /></p>
<p>Brr&#8230; it&#8217;s cold tonight</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Jul-21-22-30-36.jpg" class="wp-image-819" /></p>
<p>The most interesting cat in the world<br />
</center></p>
<p>He also likes to play &#8211; with toys, yarn, and people.</p>
<p><center><br />
<img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Aug-21-23-45-16.jpg" class="wp-image-804" /></p>
<p>Home-made cat toy, courtesy of Ellen</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Mar-21-12-08-14.jpg" class="wp-image-808" /></p>
<p>Furry mice also work</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Dec-21-11-42-32.jpg" class="wp-image-806" /><br />
Ellen &#038; a ball of yarn</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Jul-27-22-03-35.jpg" class="wp-image-820" /><br />
My favorite toy&#8230; is DA BIRD<br />
</center></p>
<p><span id="more-797"></span></p>
<p>He also loves the outdoors &#8211; and in SF, it&#8217;s beautiful almost every day!</p>
<p><center><br />
<img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Mar-10-14-34-25.jpg" class="aligncenter  wp-image-810" /></p>
<p>Staring at birds</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Mar-24-15-01-57.jpg" class="aligncenter  wp-image-812" /></p>
<p>Looking for birds</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Mar-11-13-05-39.jpg" class="aligncenter  wp-image-814" /></p>
<p>Wishing I was outside with the birds<br />
</center></p>
<p>Like all kitties, he gets tired and needs to rest sometimes.</p>
<p><center><br />
<img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Feb-04-10-54-24.jpg" class="aligncenter  wp-image-815" /></p>
<p>Scratching and napping</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Feb-21-10-09-47.jpg" class="aligncenter  wp-image-816" /></p>
<p>Sharing a bed with cat-dad</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Oct-15-9-38-48.jpg" class="aligncenter  wp-image-818" /></p>
<p>Found a nice place to sleep!</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Aug-27-0-37-15.jpg" class="wp-image-821" /></p>
<p>Sometimes, my bed is a little too small<br />
</center></p>
<p>And finally, my favorite picture (just to prove that he is a wizard, after all):</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2013/04/Photo-Nov-20-1-04-08.jpg" alt="Photo Nov 20, 1 04 08" width="306" height="408" class="aligncenter size-full wp-image-822" /></p>
<p>Hope you enjoyed this peek into the life of Mr. Gandalf &#8211; which one was your favorite? Also, <b>share/like</b> to support my obsessive cat-picture-taking habit and unlock Gandalf&#8217;s secret powers.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/04/gandalf-the-gray/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/04/gandalf-the-gray/" data-text="Gandalf the Gray"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/04/gandalf-the-gray/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F04%2Fgandalf-the-gray%2F&amp;title=Gandalf%20the%20Gray" id="wpa2a_6">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/04/gandalf-the-gray/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Architecture Decisions &amp; Information Overload</title>
		<link>http://www.betaful.com/2013/02/architecture-decisions-information-overload/</link>
		<comments>http://www.betaful.com/2013/02/architecture-decisions-information-overload/#comments</comments>
		<pubDate>Sun, 10 Feb 2013 09:50:27 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[decision making]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[psychology]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=791</guid>
		<description><![CDATA[Ah, the rarified air of the software architect. There is no source control up here, no text editors, or servers, or pagers, or unit tests. Mostly what&#8217;s up here is blocks &#8211; lots and lots of blocks, with lines running to and fro. What architects do with blocks is move them around furiously &#8211; a [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.betaful.com/wp-content/uploads/2013/02/SysCallIISsmall-300x210.jpg" alt="SysCallIISsmall" width="300" height="210" class="alignright size-medium wp-image-792" />Ah, the rarified air of the software architect. There is no source control up here, no text editors, or servers, or pagers, or unit tests. Mostly what&#8217;s up here is blocks &#8211; lots and lots of blocks, with lines running to and fro.</p>
<p>What architects do with blocks is move them around furiously &#8211; a process that others might call &#8220;making decisions&#8221;. For example, how does this block talk to this other block? How can I organize my blocks? Should I make new blocks, or try to increase the abilities of my existing blocks?</p>
<p>Central to all of this is the ability to quickly and accurately visualize the consequences of decisions &#8211; which is why the primary enemy of architectural decision-making seems to be <b>overload</b>. When there are too many parts, when changing something has too many implications, or when there are difficult tradeoffs to be managed, it&#8217;s possible to lose the ability to make architectural decisions with confidence.</p>
<p>In particular, when systems are poorly abstracted, we tend to pay attention to the details (because we have to), leading to increased cognitive complexity. This manifests itself in slower and more difficult decisions, as things just don&#8217;t &#8220;feel right&#8221; with the system.</p>
<p>Here&#8217;s this crazy thing &#8211; the way you simplify an architecture is to add <b>more</b> things&#8230; but better things. Add layers with well-defined interfaces. Make rules. Group small things into bigger things. When at the point of overwhelm, instead of trying to solve the problem at hand, it may be worthwhile to step back and work on your mental model.</p>
<p>While sometimes you can get rid of things, in my experience, a lot of project requirements are handed down from &#8220;on high&#8221;. At best, you can try to make a case for getting rid of old, crufty things &#8211; which is why I&#8217;m always asking my cofounder if we can kill this feature or that. (I&#8217;m sorry, Astrid users, it&#8217;s true)</p>
<p>At the end of the day, as an architect, your job is to make decisions and produce blueprints that others (or yourself) can work with. Make better decisions by creating better abstractions &#8211; zoom in when you need to, but always keep the big picture in mind.</p>
<p>Need a hand? Some patterns that help simplify things include <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank">MVC</a>, <a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank">dependency injection</a> or <a href="http://en.wikipedia.org/wiki/Service_locator_pattern" target="_blank">service locator pattern</a>, and <a href="http://en.wikipedia.org/wiki/Facade_pattern" target="_blank">facade pattern</a>. Design patterns, good times.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/02/architecture-decisions-information-overload/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/02/architecture-decisions-information-overload/" data-text="Architecture Decisions &#038; Information Overload"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/02/architecture-decisions-information-overload/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F02%2Farchitecture-decisions-information-overload%2F&amp;title=Architecture%20Decisions%20%26%20Information%20Overload" id="wpa2a_8">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/02/architecture-decisions-information-overload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Analog Sunday, and other themed days</title>
		<link>http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/</link>
		<comments>http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/#comments</comments>
		<pubDate>Sun, 27 Jan 2013 02:49:23 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[entrepreneurship]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[life hack]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[pete carroll]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=784</guid>
		<description><![CDATA[For the past several weeks, I&#8217;ve been experimenting with theming days. I first learned about the practice while following the Seattle Seahawks and hearing about days like &#8220;Competition Wednesday&#8221;, &#8220;Review Saturday&#8221;, and &#8220;No Repeat Friday&#8221; (where players strive to make sure they don&#8217;t have to practice anything twice &#8211; read more about the practices). Longtime [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.betaful.com/wp-content/uploads/2013/01/Analog-2012-224x300.png" alt="Analog" width="224" height="300" class="alignright size-medium wp-image-787" />For the past several weeks, I&#8217;ve been experimenting with theming days. I first learned about the practice while following the Seattle Seahawks and hearing about days like &#8220;Competition Wednesday&#8221;, &#8220;Review Saturday&#8221;, and &#8220;No Repeat Friday&#8221; (where players strive to make sure they don&#8217;t have to practice anything twice &#8211; <a href="http://blog.winforever.com/pete-carroll-is-a-man-with-a-plan/" target="_blank">read more about the practices</a>). Longtime readers know that I&#8217;ve been a <a href="http://www.betaful.com/2012/02/pete-carroll-on-coaching-and-motivation/" target="_blank">Pete Carroll fan</a> for a while, and this has been one of the most practical things I&#8217;ve learned from Coach Pete.</p>
<p>As I&#8217;ve brought the idea of themed days into my life, I can name several reasons why I&#8217;ve come to love them:</p>
<ul>
<li><b>Focus</b>: let&#8217;s face it &#8211; there&#8217;s more than one thing that&#8217;s important in life. Whether it&#8217;s family, work, chores, hobbies, or learning, most everyone has a few things going on simultaneously. Having themed days makes sure that you spend at least 14% of your time focused on the areas that you want to get better in.</li>
<li><b>Defining Success</b>: what makes a day successful? For me, it&#8217;s when I get a lot done. Having themed days, though, lets me derive joy from improving on the other aspects of my life, including writing, relationships, and managing my team.</li>
<li><b>Easy to Remember</b>: everyone knows that they&#8217;re supposed to balance work, life, fitness, spirituality, and all of that good stuff, but it&#8217;s hard to follow through. In contrast, it&#8217;s so easy to remember to make themed days happen. If habits need regularity to be formed, and they probably do, themed days provide a weekly rhythm that allows change to occur.</li>
</ul>
<p>Not convinced yet? Let me share about each of the days that I&#8217;ve instituted, and why I appreciate each of them.<br />
<span id="more-784"></span></p>
<hr />
<h3>Analog Sunday</h3>
<p>I&#8217;ll start with my favorite. Analog Sunday has the following guidelines:</p>
<ul>
<li>No Internet</li>
<li>No email or SMS (phone calls are ok)</li>
<li>Spend some time journalling</li>
</ul>
<p>The goal of this day, as you can probably guess, is to clear my head of distractions, rest, and take stock of how things are going. I don&#8217;t know about you guys, but if I don&#8217;t force myself to journal, I pretty much never do. Plus, <a target="_blank" href="http://www.cnn.com/2013/01/11/health/sleeth-take-day-off/index.html">CNN seems to think it&#8217;s pretty helpful</a> to have a &#8220;stop day&#8221; to stay sane.</p>
<h3>Meetings Monday</h3>
<p>As someone who manages a team, and is responsible for their success, I&#8217;ve learned that meetings are important. As someone who still has a lot of coding responsibilities, and has been a software engineer all of my professional life, I still dislike meetings and think they&#8217;re the devil. (If this resonates with you, Paul Graham has a <a href="http://www.paulgraham.com/makersschedule.html" target="_blank">great essay on this dichotomy</a>). My solution is to try to pile all meetings onto a single day &#8211; Monday. It saves the rest of my week to be productive, while on Mondays, I define success by the number and quality of my meetings. It&#8217;s been really helpful.</p>
<h3>Fun Friday</h3>
<p>I&#8217;m still experimenting with this, but the idea behind this day is to work on projects that you find personally fun, nurture the joy of the creative process, and try some things that may not always be at the top of the queue. For you programmers, that means try to fix your high priority bugs Tuesday through Thursday <img src='http://www.betaful.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<h3>Social Saturday</h3>
<p>Yes, I need some structure to make sure that I don&#8217;t stay in a cave all week. I blame the startup life.</p>
<p>So far (three weeks), it&#8217;s been a lot of fun to engage in these days, and I hope they become a long-term part of my life. What do you think? What are some themed days that would be helpful for you?</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/" data-text="Analog Sunday, and other themed days"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F01%2Fanalog-sunday-and-other-themed-days%2F&amp;title=Analog%20Sunday%2C%20and%20other%20themed%20days" id="wpa2a_10">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/01/analog-sunday-and-other-themed-days/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Single Table Inheritance</title>
		<link>http://www.betaful.com/2013/01/single-table-inheritance/</link>
		<comments>http://www.betaful.com/2013/01/single-table-inheritance/#comments</comments>
		<pubDate>Sun, 06 Jan 2013 10:00:18 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=781</guid>
		<description><![CDATA[Rails Single Table Inheritance is a powerful concept where a single database table can contain various subclasses of a parent class, distinguished by a type column. For example, you can have a Cat and Dog model descend from Animal, each having their own methods or inheriting from the parent. In the database, the type field [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.betaful.com/wp-content/uploads/2013/01/nesting-tables-1-300x265.png" alt="nesting-tables" width="300" height="265" class="alignright size-medium wp-image-782" />Rails Single Table Inheritance is a powerful concept where a single database table can contain various subclasses of a parent class, distinguished by a type column. For example, you can have a Cat and Dog model descend from Animal, each having their own methods or inheriting from the parent. In the database, the type field will be either &#8220;Cat&#8221; or &#8220;Dog&#8221;, and when you use query methods such as Animal#where, the models that are returned will be instances of the appropriate subclass.</p>
<p>STI allows your code to be much cleaner, removes those nasty case statements (see below), and gives you logical groupings for related functionality. As our code base has grown, and functionality is repurposed or expanded, I have since found myself refactoring classes to split them into subclasses as appropriate.</p>
<p>For example, Astrid used to only support premium accounts via Recurly. When we added the ability to perform in-app purchasing through various app stores, we ended up adding methods like &#8220;verify_android_token&#8221; and &#8220;verify_apple_token&#8221; to the PremiumAccount class. Even worse, when we had to write common functionality like a cancel method, it would look something like this:<br />
<span id="more-781"></span></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> cancel!
  <span style="color:#9966CC; font-weight:bold;">if</span> type == <span style="color:#ff3333; font-weight:bold;">:recurly</span>
    <span style="color:#008000; font-style:italic;"># do stuff</span>
  <span style="color:#9966CC; font-weight:bold;">elsif</span> type == <span style="color:#ff3333; font-weight:bold;">:android</span>
    <span style="color:#008000; font-style:italic;"># do stuff</span>
  <span style="color:#9966CC; font-weight:bold;">elsif</span> type == <span style="color:#ff3333; font-weight:bold;">:apple</span>
    <span style="color:#008000; font-style:italic;"># do stuff</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>After refactoring, each subclass of PremiumAccount has its own cancel implementation, and thanks to the magic of Single Table Inheritance, we always get the right type of class when we need to perform these operations. Unfortunately, like many things Rails, STI is not that well documented and isn&#8217;t exactly discoverable. Lucky for you, other people have done the hard work of <a href="http://therailworld.com/posts/18-Single-Table-Inheritance-with-Rails"> figuring things out</a>.</p>
<p>My mantra when it comes to code quality is to have smaller, conceptually grouped units &#8211; fewer files in each folder, fewer methods in a class, and shorter methods. STI lets you group related classes into a subfolder, separates out related functionality, and eliminates proliferation of if statements such as the one above. Tools like these are powerful weapons in the war we fight against code attrition. </p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2013/01/single-table-inheritance/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2013/01/single-table-inheritance/" data-text="Single Table Inheritance"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2013/01/single-table-inheritance/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2013%2F01%2Fsingle-table-inheritance%2F&amp;title=Single%20Table%20Inheritance" id="wpa2a_12">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2013/01/single-table-inheritance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Delayed::Job to Resque</title>
		<link>http://www.betaful.com/2012/11/delayedjob-to-resque/</link>
		<comments>http://www.betaful.com/2012/11/delayedjob-to-resque/#comments</comments>
		<pubDate>Sun, 25 Nov 2012 08:42:22 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=772</guid>
		<description><![CDATA[In general, the idea of queuing long-running jobs is a great one. At Astrid, we lean heavily on queueing for anything that requires talking to external services &#8211; including emailing, push notifications, and indexing. However, when your queueing infrastructure starts hurting, that is a Very Bad Problem&#8482;. We used to use delayed_job, but for us, [...]]]></description>
				<content:encoded><![CDATA[<p>In general, the idea of queuing long-running jobs is a great one. At Astrid, we lean heavily on queueing for anything that requires talking to <b>external services</b> &#8211; including emailing, push notifications, and indexing. However, when your queueing infrastructure starts hurting, that is a Very Bad Problem&trade;. </p>
<p>We used to use <a href="https://github.com/collectiveidea/delayed_job">delayed_job</a>, but for us, processing jobs became <b>really slow</b>. First, each worker has to try to lock a job. Then, it has to check if it obtained the job lock, and then it has to do the work, and then it has to delete the row. Last week, we reached a point where more jobs were getting added to the queue than finishing &#8211; which means that even if we had cleared our queue of old jobs, our jobs table would still have continued to grow unbounded. </p>
<p>Time for some intervention in the form of Resque, the hot redis-based queuing system from Github.</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2012/11/resque-logo.png" alt="how come resque doesn't have a real logo?" title="resque-logo" width="299" height="139" class="aligncenter size-full wp-image-774" /></p>
<p>We&#8217;re obviously not using our old infrastructure anymore, but I would estimate that our job throughput increased at least 5x after the switch. We also get much better transparency into our jobs via <a href="https://a248.e.akamai.net/camo.github.com/eb900b9ccefc0119e9328ea064688a73ed8becc5/68747470733a2f2f696d672e736b697463682e636f6d2f32303131303532382d7063363761387173666170676a786635676167786439326663752e706e67" target="_blank">sexy UI</a>. What&#8217;s not to like?</p>
<h3>Step 1: install resque</h3>
<p>(We are using Rails 3.2 on Ruby 1.9)</p>
<p>We added <code>resque</code>, <code>resque_mailer</code>, and <code>resque_unit</code> (in the test group) to our Gemfile. If you don&#8217;t have redis installed, you&#8217;ll need to do that in your development and production environments as well. On Mac or Linux, homebrew / apt / yum should do the trick.</p>
<p>While you&#8217;re here, you should check out the Github pages for <a href="https://github.com/defunkt/resque">resque</a>, <a href="https://github.com/zapnap/resque_mailer">resque_mailer</a>, and <a href="https://github.com/justinweiss/resque_unit">resque_unit</a>.<br />
<span id="more-772"></span></p>
<h3>Step 2: migrate your jobs to resque</h3>
<p>For the most part, this is straight forward &#8211; convert the perform method to a class method, and convert the invocation (e.g. <code>Delayed::Job.enqueue C2DMJob.new(notifications)</code> becomes <code>Resque.enqueue C2DMJob, notifications</code>).</p>
<p><font style="color: red; font-weight: bold">SUPER IMPORTANT!</font></p>
<p>Resque serializes your parameters to JSON, not YAML. For us, this had two major implications:</p>
<ul>
<li>You can&#8217;t pass ActiveRecord models directly &#8211; you need to change your jobs to take ids as parameters instead of models</li>
<li>Symbol keys will become strings (e.g. <code>{ :cat => "Mittens" }</code> becomes <code>{ "cat" => "Mittens" }</code>). If you check for hash[:cat], this will break.</li>
</ul>
<p>As an added bonus, you should add a named queue to each of your jobs. We (and Github) use a named-priority queue system (critical, high, medium, low), and specify to our resque workers to work them in that order.</p>
<h3>Step 3: convert your ActionMailers</h3>
<p>Add &#8220;<code>include Resque::Mailer</code>&#8221; at the top of your mailers. Find all of your old references to the Delayed::Job mailer invocation (<code>Notifications::delay.signup_email</code>) and change them to Resque::Mailer style of invocation. We did this with regular expressions and sed. You may also want to change your non-delayed mail invocations to use the <code>deliver!</code> method. Then, change all of your ActionMailer methods to use ids instead of models (see above).</p>
<h3>Step 4: convert your unit tests</h3>
<p>Of course, this depends on how you wrote your tests, but we had to change from:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">assert_difference <span style="color:#996600;">&quot;Delayed::Job.count&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#008000; font-style:italic;"># do some stuff</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Delayed::Worker</span>.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">work_off</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>to</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">Resque.<span style="color:#9900CC;">reset</span>!
&nbsp;
<span style="color:#008000; font-style:italic;"># do some stuff</span>
assert_queued MyAwesomeJob
&nbsp;
Resque.<span style="color:#9900CC;">run</span>!</pre></td></tr></table></div>

<p>We also had to add the following line to an initializer to have Resque::Mailer not suppress emails in the test environment (since the resque_unit gem handles the mocking of redis):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">Resque::Mailer</span>.<span style="color:#9900CC;">excluded_environments</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<h3>Step 5: misc stuff</h3>
<p>There were a few loose ends for us to tie up. We had to create a simple resque.rake file that loaded the Rails environment. There were a few <code>delay</code> calls that weren&#8217;t emails and weren&#8217;t using background jobs that we had to convert to Resque-style jobs. Finally, we installed the resque web interface, which is awesome. </p>
<p>That&#8217;s it, other than the actual deployment of resque workers to your production environment. I trust that if you&#8217;ve come this far, that should not be too much of a chore.</p>
<p></p>
<h3>The bottom line</h3>
<p>Are you still using Delayed::Job in a large production environment? You shouldn&#8217;t be. Go replace it <img src='http://www.betaful.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p><img src="http://www.betaful.com/wp-content/uploads/2012/11/132869163_3a547ea876-300x237.jpg" alt="" title="132869163_3a547ea876" width="300" height="237" class="aligncenter size-medium wp-image-773" /><br />
<center><i>Don&#8217;t be like these dudes who wait so long for a job that they turn to stone.</i></center></p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2012/11/delayedjob-to-resque/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2012/11/delayedjob-to-resque/" data-text="Delayed::Job to Resque"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2012/11/delayedjob-to-resque/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2012%2F11%2Fdelayedjob-to-resque%2F&amp;title=Delayed%3A%3AJob%20to%20Resque" id="wpa2a_14">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2012/11/delayedjob-to-resque/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autobiography in 5 Short Chapters</title>
		<link>http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/</link>
		<comments>http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/#comments</comments>
		<pubDate>Mon, 12 Nov 2012 21:22:27 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=770</guid>
		<description><![CDATA[A little poetry for your startup and your life. Autobiography in 5 Short Chapters by Portia Nelson: I I walk down the street. There is a deep hole in the sidewalk. I fall in. I am lost. I am helpless. It isn’t my fault. It takes me forever to find a way out. II I [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://slapphappe.wordpress.com/2010/05/31/unbelievable-sink-hole-in-guatemala/" target="_blank"><img src="http://slapphappe.files.wordpress.com/2010/05/sink-hole.jpg?w=400" style="float:right" /></a>A little poetry for your startup and your life.</p>
<p><i>Autobiography in 5 Short Chapters</i> by Portia Nelson:</p>
<p><strong>I</strong></p>
<p>I walk down the street.<br />
There is a deep hole in the sidewalk.<br />
I fall in.<br />
I am lost. I am helpless.<br />
It isn’t my fault.<br />
It takes me forever to find a way out.</p>
<p><strong>II</strong></p>
<p>I walk down the same street.<br />
There is a deep hole in the sidewalk.<br />
I pretend I don’t see it.<br />
I fall in again.<br />
I can’t believe I am in the same place.<br />
But it isn’t my fault.<br />
It still takes a long time to get out.</p>
<p><strong>III</strong></p>
<p>I walk down the same street.<br />
There is a deep hole in the sidewalk.<br />
I see it is there.<br />
I still fall in; it’s a habit.<br />
My eyes are open.<br />
I know where I am.<br />
It is my fault.<br />
I get out immediately.</p>
<p><strong>IV</strong></p>
<p>I walk down the same street.<br />
There is a deep hole in the sidewalk.<br />
I walk around it. </p>
<p><strong>V</strong></p>
<p>I walk down another street.</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/" data-text="Autobiography in 5 Short Chapters"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2012%2F11%2Fautobiography-in-5-short-chapters%2F&amp;title=Autobiography%20in%205%20Short%20Chapters" id="wpa2a_16">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2012/11/autobiography-in-5-short-chapters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cluster SSH</title>
		<link>http://www.betaful.com/2012/10/cluster-ssh/</link>
		<comments>http://www.betaful.com/2012/10/cluster-ssh/#comments</comments>
		<pubDate>Wed, 31 Oct 2012 07:58:55 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[engineering]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[utility]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=766</guid>
		<description><![CDATA[Have a lot of servers to manage? I recently discovered *nix / OSX utility called Cluster SSH. It lets you spawn a whole slew of SSH terminals, issue commands to all of them individually and collectively, and even lets you define groups of servers to log in to together. I know, who wants to be [...]]]></description>
				<content:encoded><![CDATA[<p>Have a lot of servers to manage? I recently discovered *nix / OSX utility called <b>Cluster SSH</b>. It lets you spawn a whole slew of SSH terminals, issue commands to all of them individually and collectively, and even lets you define groups of servers to log in to together.</p>
<p><a href="http://www.betaful.com/wp-content/uploads/2012/10/12_cssh_jobs.png" target="_blank"><img src="http://www.betaful.com/wp-content/uploads/2012/10/12_cssh_jobs-1024x402.png" alt="" title="12_cssh_jobs" width="575" height="225" class="aligncenter size-large wp-image-768" /></a></p>
<p>I know, who wants to be SSH-ing into multiple servers, but there are times when it&#8217;s necessary, and often you aren&#8217;t going to be able to run the same exact shell script on each server.</p>
<p>Real world examples:<br />
<span id="more-766"></span></p>
<h3>You want to check for stale server processes</h3>
<p>You can use cssh to log into all of your app servers. Then, use <code>ps aux | grep "PROCESSNAME"</code> to find all of the running instances of PROCESSNAME. Instead of killing them all, you can visually look across all of your terminals for processes that have been around for too long and are clearly frozen, and then kill them manually.</p>
<h3>You want to change your server hostname scheme</h3>
<p>Each server&#8217;s hostname has to be different, so what better way to pull this off than to have every server open in a different window for you to visually make sure you didn&#8217;t make a mistake.</p>
<h3>You want to find out which servers aren&#8217;t configured properly</h3>
<p>Similar to the case above, you can print out / grep configuration files to find which servers aren&#8217;t configured correctly. Then, you can close the windows for the properly configured servers and mass-configure your broken servers all together at once.</p>
<h3>You want to make a configuration change</h3>
<p>What did you used to do? Make changes to a configuration file, and then copy it across to each server? Sometimes the files have to be owned by root, and I hope you can&#8217;t SSH into your boxes as the root user. Make a script? Then you have to be careful not to mess up. Instead, use cssh to edit the same file on all of the machines&#8230; at the same time.</p>
<hr />
<p>Check it out now! Use the &#8220;Install ClusterSSH&#8221; below for more info on how to install (and get reminded about it later!).</p>
<p>Also, if you have further tips for system administration or another awesome use for Cluster SSH, hit up the comments!</p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2012/10/cluster-ssh/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2012/10/cluster-ssh/" data-text="Cluster SSH"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2012/10/cluster-ssh/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2012%2F10%2Fcluster-ssh%2F&amp;title=Cluster%20SSH" id="wpa2a_18">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2012/10/cluster-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How I became a morning person</title>
		<link>http://www.betaful.com/2012/10/how-i-became-a-morning-person/</link>
		<comments>http://www.betaful.com/2012/10/how-i-became-a-morning-person/#comments</comments>
		<pubDate>Wed, 10 Oct 2012 07:23:19 +0000</pubDate>
		<dc:creator>tim</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[cat]]></category>
		<category><![CDATA[life hack]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[sleep]]></category>

		<guid isPermaLink="false">http://www.betaful.com/?p=760</guid>
		<description><![CDATA[For the past two years, I&#8217;ve been keeping an entrepreneur&#8217;s schedule that includes going to bed around 3:30 AM and waking up some time between 11 AM and 1 PM. I was convinced that this made me the most productive &#8211; no new emails or news articles to check, very few people in the office, [...]]]></description>
				<content:encoded><![CDATA[<p><img src="http://molempire.com/wp-content/uploads/2010/10/garfield_smile1.jpg" class="alignright size-full" width="300" /> For the past two years, I&#8217;ve been keeping an entrepreneur&#8217;s schedule that includes going to bed around 3:30 AM and waking up some time between 11 AM and 1 PM. I was convinced that this made me the most productive &#8211; no new emails or news articles to check, very few people in the office, and energy levels that would peak around 8 PM. Even before then, I worked at a larger startup, where my waking hours were from 10 AM to 2 AM.</p>
<p>Suffice to say, I haven&#8217;t been a morning person since high school, and that was not really by choice. I&#8217;ve tried several times to change my body&#8217;s schedule, unsuccessfully. Lately, however, I have been going to bed around 11 PM and waking up before 9 AM. Yes, I now sleep 5 hours before my previous bedtime. How did I do it?</p>
<p><span id="more-760"></span></p>
<p><b>Motivation</b></p>
<p>Why did I want to go to bed earlier? For a long time, it was because I &#8220;should&#8221;. Over the past three months, however, I had been sleeping 8 hours and just not feel rested the next day. I found that the few days I woke up earlier, I felt much better. (My theory is that since the sun rises here around 6:30 AM, sleeping late was causing most of my sleep to occur while the sun was up). Knowing I would have a lot more energy helped me gain resolve for sleeping earlier.</p>
<p>In addition, I realized that by staying up and sleeping later, I was making poor choices. I noticed I would consistently watch TV in the evenings, invariably watch &#8220;just one more episode,&#8221; and push my bedtime even further. With an earlier schedule, I head home from work with my coworkers around 11 PM and then head almost straight to bed.</p>
<p><b>Trigger</b></p>
<p>With all of that motivation, I still needed a trigger to get started with the plan. For me, it happened a day after I had only gotten 5 hours of sleep the previous night (went to bed at 6 AM, woke up around 11 AM). I was so exhausted that I ended up going to sleep at 8 PM&#8230; and waking up at 6:30 AM. From then on, I started going to bed much earlier than I used to.</p>
<p><b>Technology</b></p>
<p>Getting out of bed early in the morning isn&#8217;t easy. I&#8217;ve found that chewing some <a href="http://www.amazon.com/STAY-ALERT-Military-Caffeine-Energy/dp/B0017O19Q2" target="_blank">caffeine gum</a> as I wake up helps me get out of bed in around 5 minutes instead of the 30 that it took without it. Once I get to the office, I&#8217;ll often consume my second dose of caffeine in the form of coffee or red bull. By front-loading my energy via caffeine, I have energy to start the day, and I&#8217;ll start to run out of steam in the evening, which then helps me go to bed earlier.</p>
<p><b>Secret Weapon</b></p>
<p>But it&#8217;s easy to get back into a bad habit, right? Sleep later and later, until you&#8217;re back where you started. That&#8217;s where my secret weapon comes in. I used to sleep with my cat outside of the bedroom, because he would often keep me from falling asleep, but I decided to keep my door open. I find that my cat (Gandalf) will often wake me up around 6 AM and again at 8 if I&#8217;m still in bed. It&#8217;s annoying, but it prevents me from getting too far off track with my sleep. I don&#8217;t know if he wants to be fed, played with, or genuinely thinks that my feet are a threat to society, but it definitely wakes me up in the morning.</p>
<p>It&#8217;s probably some combination of these that&#8217;s helped &#8212; all I know is that I sleep a lot earlier than I used to, feel better, and have more scratches on my feet. That works for me.</p>
<p>Anything you do to keep yourself on track in the mornings? Do share!</p>
<p><img src="http://www.betaful.com/wp-content/uploads/2012/10/Photo-Sep-07-11-29-01.jpg" alt="" title="Gandalf" width="500" height="542" class="aligncenter size-full wp-image-762" /></p>
<p><center>Get your ass outta bed</center></p>
<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://www.betaful.com/2012/10/how-i-became-a-morning-person/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="none" data-url="http://www.betaful.com/2012/10/how-i-became-a-morning-person/" data-text="How I became a morning person"></a><a class="a2a_button_google_plusone addtoany_special_service" data-annotation="none" data-href="http://www.betaful.com/2012/10/how-i-became-a-morning-person/"></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.betaful.com%2F2012%2F10%2Fhow-i-became-a-morning-person%2F&amp;title=How%20I%20became%20a%20morning%20person" id="wpa2a_20">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.betaful.com/2012/10/how-i-became-a-morning-person/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
