<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Micah Elliott</title>
	
	<link>http://micahelliott.com</link>
	<description>Stories from my Startup Journey</description>
	<lastBuildDate>Mon, 29 Nov 2010 07:46:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
<image>
  <link>http://micahelliott.com</link>
  <url>http://micahelliott.com/mde-gravatar7.png</url>
  <title>Micah Elliott</title>
</image>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.6.3" -->
	<copyright>Copyright &amp;#xA9; Micah Elliott 2010 </copyright>
	<managingEditor>mde@micahelliott.com (Micah Elliott)</managingEditor>
	<webMaster>mde@micahelliott.com (Micah Elliott)</webMaster>
	<category>posts</category>
	<image>
		<url>http://micahelliott.com/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Micah Elliott</title>
		<link>http://micahelliott.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle />
	<itunes:summary>Stories from my Startup Journey</itunes:summary>
	<itunes:keywords />
	<itunes:category text="Society &amp; Culture" />
	<itunes:author>Micah Elliott</itunes:author>
	<itunes:owner>
		<itunes:name>Micah Elliott</itunes:name>
		<itunes:email>mde@micahelliott.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://micahelliott.com/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MicahElliott" /><feedburner:info uri="micahelliott" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>MicahElliott</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Customizing the GNOME System Monitor</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/Q24tym4skHc/</link>
		<comments>http://micahelliott.com/2010/09/customizing-gnome-system-monitor/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 22:13:54 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=397</guid>
		<description><![CDATA[I probably glance down at my system&#8217;s status displays way too often; surely graphs are addicting. But it really is handy to know what&#8217;s going on all the time. If I&#8217;m ever on a machine without this info, I just feel lost. Oh, if only my Android had one! I&#8217;ve been able to make faster [...]]]></description>
			<content:encoded><![CDATA[<p>I probably glance down at my system&#8217;s status displays way too often; surely graphs are addicting. But it really is handy to know what&#8217;s going on all the time. If I&#8217;m ever on a machine without this info, I just feel lost. Oh, if only my Android had one! I&#8217;ve been able to make faster and more sense out of the <strong>System Monitor</strong> since tweaking the colors, so I&#8217;m writing this to encourage my Linux compatriots to do the same.<span id="more-397"></span></p>
<p>First off, if you haven&#8217;t yet enabled the System Monitor, just right-click on your Panel and you should see it on the list. (Othewise: <em>apt-get install gnome-system-monitor</em> first)</p>
<p><img class="alignleft size-full wp-image-400" title="GNOME System Monitory with pretty colors" src="http://micahelliott.com/wp-content/uploads/2010/09/monitor1.png" alt="GNOME System Monitory with pretty colors" width="282" height="133" />By default the colors are all pretty similar. The first important tweak is to <strong>differentiate the <em>Processor</em> colors</strong>. Use whatever you want, but make sure they have enough contrast. (Not shown: I just fixed my green <em>User</em> color to contrast a little better.) Watching the Processor usage can show you a bit about the sites you spend time on (among several other things). If you&#8217;ve got a constant green bar (hmm, that sounds backwards to TDDers; maybe I should stay away from green), you might want to hunt down the tab hosting the unruly flash widget. Ideally, your system at rest should most often show a beautiful black box.</p>
<p>The second tweak I just made recently &#8212; and it&#8217;s growing on me &#8212; is to <strong>make outgoing network traffic red</strong>, and incoming yellow. Now I can see my backups to S3 in full swing when they kick in. And I might notice if anything is unexpectedly drifting outbound.</p>
<p>I also recently added the fourth <em>Swap Space</em> indicator just in case it ever kicks in, at which point I&#8217;ll know something is really awry. This one is probably not too important to have showing if you&#8217;re shy on Panel space.</p>
<p>Great! Now I can watch Firefox and a Mongrel take off with all my memory and know when to kill them. The monitor is also handy to see when something you&#8217;ve been running is (too often unexpectedly) finished. (I like using <em>beep</em> at the end of a long command for this too.)</p>
<p>I do still use top on occasion for its light weight. But sometimes it&#8217;s a bit more convenient to have a one-click GUI view of your system. Please share if you&#8217;ve got a more effective color scheme or if you use another light-weight tool for continuous monitoring.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Q24tym4skHc:39dRcs4s0y4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Q24tym4skHc:39dRcs4s0y4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Q24tym4skHc:39dRcs4s0y4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Q24tym4skHc:39dRcs4s0y4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Q24tym4skHc:39dRcs4s0y4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Q24tym4skHc:39dRcs4s0y4:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/Q24tym4skHc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2010/09/customizing-gnome-system-monitor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2010/09/customizing-gnome-system-monitor/</feedburner:origLink></item>
		<item>
		<title>Twitter Desktop Client Geolocation</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/1GcBqzrW3DU/</link>
		<comments>http://micahelliott.com/2009/12/twitter-desktop-client-geolocation/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 08:23:24 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Mining]]></category>
		<category><![CDATA[Social]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=384</guid>
		<description><![CDATA[Twitter&#8217;s new geolocation facilities are all the rage.  Actually, most users don&#8217;t know about them yet, but they should soon. And by &#8220;facilities&#8221;, I mean just a couple fields in your XML/JSON that&#8217;s fed through the API to/from a few clients.  Most Twitter clients don&#8217;t yet support this new geolocation, but they may come around&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Twitter&#8217;s new geolocation facilities are all the rage.  Actually, most users don&#8217;t know about them yet, but they should soon. And by &#8220;facilities&#8221;, I mean just a couple fields in your XML/JSON that&#8217;s fed through the API to/from a few clients.  Most Twitter clients don&#8217;t yet support this new geolocation, but they may come around&#8230; if they figure out how to be accurate.<span id="more-384"></span></p>
<h2>Geo Services</h2>
<p>There&#8217;s no lack of geo-aware tools out there: fireeagle, brightkite, latitude, shizzow, foursquare, loopt, more I don&#8217;t remember trying and tossing, and I&#8217;m sure a bunch more I&#8217;ve never heard of. I tried most of them just this year, as most are pretty new.  But they generally lack users, at least compared to Twitter, who&#8217;s new to the geo game. Just try importing your friends from gmail, twitter, and facebook with some of these services, and you&#8217;ll see what I mean. Latitude will be interesting to watch &#8212; given android&#8217;s impending ubiquity &#8212; but Google&#8217;s may be too big to be the real innovator in this space (despite all their leverage).</p>
<h2>Mobility</h2>
<p>I wonder where we&#8217;re going with mobility.  I gather that the majority of Twits are still using non-browser-based Twitter Desktop Clients (TDCs).  Maybe the sea-change to smartphones is underway.  But I&#8217;m not sure. Granted, this luddite got a MyTouch a few months ago, and I&#8217;ve got latitude and foursquare (and other random android apps crashing my phone) constantly sending my location around (after giving up on brightkite and shizzow clients).  But I know a lot of (predominantly AIR?) desktop apps are still overwhelmingly popular; they&#8217;re just lacking something&#8230;</p>
<h2>The Problem With Desktop Geo-awareness</h2>
<p>Quick background. Smartphones now have GPS, and it tends to be readily available (and now easy enough to turn off to save batteries) and incredibly accurate, often pinning you to the residence/office/coffee shop/place you shouldn&#8217;t be, you&#8217;re actually in. That constant information stream can really open some doors to innovation (e.g., geo-time-plot-animating your week). It&#8217;s the impetus for all those geo-services. Also, browsers like Firefox 3.5 can <a href="http://www.mozilla.com/en-US/firefox/geolocation/">pinpoint you</a> with similar accuracy with a little magic that I haven&#8217;t completely figured out.  It seems to have to do with IP lookup combined with unique MAC address locations and a nice relationship with Google who&#8217;s probably got MACs/SSIDs for most routers in your neighborhood. Probably collected while taking pictures of your street. So at least one bleeding-edge browser has it. Some others will figure it out too over the coming years.</p>
<p><strong>But what about <a href="http://mashable.com/2009/06/27/twitter-desktop-apps/">all those  TDCs</a>? When will they really become geo-aware?</strong> I tried out <a href="http://mike.verdone.ca/twitter/">Python Twitter Tools</a> today and it actually supported the geo-tag features just introduced into the Twitter API. I&#8217;m expecting it&#8217;s one of the few language libs with support as of today.  It&#8217;s really simplistic and naturally adapts to API changes (for better or worse), unlike the de facto python-twitter whose recent patches we&#8217;re insufficient and thus far ignored (by all but me?). So pretending to be a TDC I wanted to figure out how to send accurate geo-info alongside a tweet.</p>
<p>The TDC scenario is that we have no GPS and we&#8217;re outside a browser. That leaves us with a local IP address, like 192.168.1.X, and some mapping APIs. You can determine your un-NAT-ed IP most easily with somthing like:</p>
<pre>curl <a rel="nofollow" href="http://www.whatismyip.com/automation/n09230945.asp" target="_blank">www.whatismyip.com/automation/n09230945.asp</a></pre>
<p>Then you can make use of GeoIP, which (along with <a href="http://www.maxmind.com/app/geoip_country">its database</a>) is installable via apt-get and some path-tweaking (or a bunch of other commercial offerings) to determine your <em>approximate</em> location, for widely varying degrees of approximate. I understand this approach can be way off outside the US, and my testing shows it&#8217;s not too great here either &#8212; something like &#8220;in the vicinity&#8221; 80% of the time.</p>
<p>For serious geo-tracking (illnesses, events, friends, advertising, etc) that&#8217;s usually not good enough. So I&#8217;m perplexed &#8212; what are all the TDCs going to do to make use of this compelling feature? Seriously, leave a comment if you&#8217;ve got some insights.</p>
<h2>Redundant and Confusing</h2>
<p>Since Day 1 Twitter has offered a &#8220;Location&#8221; field, to represent the city you live in (I guess). It&#8217;s been bastardized by various mobile clients to reflect a user&#8217;s current location.  Through the API a client can mess with a user&#8217;s profile to be constantly updating the Location field when she tweets. It apparently wasn&#8217;t designed to be used this way (or else why are they rolling out this shiny coord-only geo stuff?), but it has worked. In fact it works just about as well as the new-geo-facilities. But now we have two ways to do it.</p>
<p>The difference is that the new formal mechanism seems to enforce (or just encourage?) GeoRSS/GeoJSON (which have their own odd inconsistencies, like disagreeing on lat/lon and lon/lat). And it&#8217;s on a tweet-by-tweet basis, so the location is associated with the tweet itself; not the user (picture the schema). That&#8217;s really cool to be able to see where a user has been as he sends each tweet. But it would be a lot better IMHO if Twitter enabled geo updating without the tweets themselves (no, @devnull is not available for constant dumping of DMs with geo-coords). Then it might supplant any of the other new geo-services. I find it a little annoying to see floods of &#8220;I&#8217;m here!&#8221; tweets from the geo-aware-ati(?) I follow. So new-geo is for tweets, and I guess old-geo (Location field) is for users, and should be kept pretty static, maybe conventionally indicating where the user lives permanently.</p>
<p>I wish the intended uses of the fields had been made more clear. For now, I&#8217;m just hoping that the TDCs figure out how to get accurate geo-info, and start making use of new-geo. I&#8217;ll try to be tweeting from a mobile client like Twidroid that supports new-geo. And I&#8217;ll continue to let Latitude and FourSquare track me automatically, in hopes that their gathered data becomes useful. Eventually I hope to see a massive adoption of geo-aware clients so we can start to do real things with all that data (assuming we can continue to mine it en masse). I expect that Facebook will again be playing fast-follower once this really catches on.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=1GcBqzrW3DU:UcUSBa_az6k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=1GcBqzrW3DU:UcUSBa_az6k:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=1GcBqzrW3DU:UcUSBa_az6k:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=1GcBqzrW3DU:UcUSBa_az6k:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=1GcBqzrW3DU:UcUSBa_az6k:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=1GcBqzrW3DU:UcUSBa_az6k:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/1GcBqzrW3DU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/12/twitter-desktop-client-geolocation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/12/twitter-desktop-client-geolocation/</feedburner:origLink></item>
		<item>
		<title>Make a PC Keyboard UNIX-Friendly</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/fninTlDPmj4/</link>
		<comments>http://micahelliott.com/2009/04/make-a-pc-keyboard-unix-friendly/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 18:47:43 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Living]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[health]]></category>
		<category><![CDATA[keyboard]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=362</guid>
		<description><![CDATA[How many years have you been making the tedious stretch for Ctrl and Esc keys?  Maybe you&#8217;ve gone so far as choosing workflows that don&#8217;t require them much, maybe without even realizing it.  That would be sad.  You just can&#8217;t use vim or emacs (or even web browsers) without them.*  I stopped the stretching a [...]]]></description>
			<content:encoded><![CDATA[<p>How many years have you been making the tedious stretch for <code>Ctrl</code> and <code>Esc</code> keys?  Maybe you&#8217;ve gone so far as choosing workflows that don&#8217;t require them much, maybe without even realizing it.  That would be sad.  You just can&#8217;t use vim or emacs (or even web browsers) without them.*  I stopped the stretching a long time ago.  If you haven&#8217;t fixed this yet, you&#8217;re either crippling yourself, or being sub-optimally productive.  There are various ways to this and eliminate the stretching &#8212; I&#8217;ll touch on a couple so you can relieve your aching left wrist.<span id="more-362"></span></p>
<h2>Easiest way</h2>
<p><a href="http://us.st12.yimg.com/us.st.yimg.com/I/pfuca-store_2030_8561"><img class="alignleft" title="Happy Hacking Keyboard Lite 2" src="http://us.st12.yimg.com/us.st.yimg.com/I/pfuca-store_2030_8561" alt="" width="180" height="104" /></a>Almost a decade ago the <a href="http://pfuca-store.stores.yahoo.net/haphackeylit1.html">Happy Hacking keyboard</a> came out.  This was a brilliant product that I can&#8217;t believe hasn&#8217;t altogether replaced the PC layout and monster keyboard footprint.  I&#8217;ve had a few through the years, and I highly recommend them.  They have been at the $70 mark all along though, so I&#8217;ve decided to stop buying them, when commodity keyboards are a dime a dozen, even the small footprinted ones.  I&#8217;ve also had the legendary OMNIKEY (and maintain it as a keepsake), which is hands down the best keyboard ever made (clickety-click-clack).  But they&#8217;re even pre-PS/2, so probably impossible to get working with USB (let me know if you&#8217;ve done it!).  So that&#8217;s the first and <strong>simplest solution if you&#8217;ve got the budget: spend the money to get a great UNIX keyboard.</strong></p>
<p><strong><img class="aligncenter" title="OmniKey Ultra" src="http://www.amiga-hardware.com/download_photos/omnikeyultra_big.jpg" alt="" width="780" height="289" /><br />
</strong></p>
<h2>Harder, cheaper way (still easy enough)</h2>
<p>But you probably work at various machines, and everyone has a budget.  And sometimes we have to use that silly laptop keyboard.  So now you&#8217;re looking at <strong>a keyboard reconfig</strong>.  If you just want to make <code>CapsLock</code> go away (not a bad idea) and put <code>Ctrl</code> where it&#8217;s supposed to be (left of &#8216;<code>A</code>&#8216;), you can use GNOME to swap them.  Something like: <em>System -&gt; Preferences -&gt; Keyboard -&gt; Layouts -&gt; Other Options -&gt; Ctrl Key Position -&gt; Make CapsLock an additional Ctrl</em>.  There&#8217;s also some swapping options, but overall the options there are pretty rigid and don&#8217;t get you all the way there.  So don&#8217;t bother with this approach, unless you only want to fix the <code>Ctrl</code> key.</p>
<p>What you really need is <strong>xkeycaps</strong>.  You can install it in a Debian-based system with <code>apt-get install xkeycaps</code>.  Other distros should also make it easy.  It&#8217;s not the most intuitive tool to use if you haven&#8217;t played with it before (that&#8217;s why I&#8217;m writing this), so I&#8217;ll walk you through what I did with it.  BTW, it&#8217;s an ancient tool, from the legendary hacker <a href="http://www.jwz.org/">Jamie Zawinski</a>.</p>
<p>Some keyboard layouts vary slightly from <a href="http://en.wikipedia.org/wiki/IBM_PC_keyboard">the 104-key standard</a>, but I believe you can get any cheapo or absurd laptop layout to do the right thing with a little experimentation.  We&#8217;re going to be reassigning some keys.  It&#8217;s crucial that <code>Esc</code> is in a friendly spot &#8212; that probably means just left of your 1 key.  Even on a small keyboard with an <code>Esc</code> just one close row up, it&#8217;s still too far; you&#8217;ve gotta try putting it in the optimal spot.  But then you&#8217;ll be losing <code>`~</code> (or something)!  What a dilemma!  You can&#8217;t code without those.  Some will disagree with me here, but I have found the <code>RightAlt</code> key to be a great, easily right-thumb-accessible, unused key, so that&#8217;s what I now use for <code>`~</code>.  <code>RightAlt</code> is a sad loss if you&#8217;ve got a crappy mouse (since <code>RightAlt-LeftArrow</code> have been the canonical browser back-button), but that may be the subject of another article.  Just get a 5-button or tilt-wheel mouse; recent Ubuntus do the right thing with the extra buttons, in my experience.  So we&#8217;ll proceed here to use <code>RightAlt</code> as the <code>`~</code> replacement.  And we&#8217;ll be throwing away the original inaccessible <code>Esc</code>.  That top Function key row is off limits for touch-typists.</p>
<p>You can scramble a bunch of keys around as your see fit for your MO.  Here&#8217;s the process I used (as close as I can recall) for the <code>Ctrl</code>, <code>Esc</code>, <code>`~</code> reassignments I&#8217;ve been describing:</p>
<ul>
<li>Fire it up from a terminal: <code>xkeycaps</code></li>
<li>Just say &#8216;ok&#8217; on the first screen which should default to the right &#8216;PC&#8217; layout.</li>
<li>Hover over the <code>Esc</code> key and notice the <em>KeySym</em> at the top, indicating you&#8217;ve looking at <code>Esc</code>.  If you screw anything up, this is the place to see it.</li>
<li>Move away and physically press <code>Esc</code> and watch it light up on the screen.  Now you can verify any key&#8217;s position, which you want to do for any changing keys.</li>
<li>Make sure all the keys we care about are mapping to the right location.  I found that <code>RightAlt</code> on my wacky keyboard was actually mapping to my number pad&#8217;s <code>Enter</code>.  So figure out what your <code>RightAlt</code> is by pressing it.  That&#8217;s what we&#8217;ll reassign.</li>
<li>Make the first reassignment.  Right-click-hold on <code>`~</code> and select <em>Duplicate key</em>.  Then click on <code>RightAlt</code> (or its equivalent).  Now you&#8217;ve got another <code>`~</code> key! (and you can probably figure out the rest).</li>
<li>Now we can reassign the original <code>`~</code> to be an <code>Esc</code>.</li>
<li>Do the same <em>Duplicate key</em> trick to make the original <code>Esc</code> duplicated over <code>`~</code>.</li>
<li>Finally, do that process one more time assigning the original <code>Ctrl</code> (crazy bottom-left postion) over the top of <code>CapsLock</code>.  Added bonus: no more <code>CapsLock</code> key (remedy that if you want).</li>
<li>Write out the new layout with the <em>Write Output</em> button (just the <em>Changed Keys</em> is enough).</li>
<li>Now you&#8217;ve got a new <code>~/.xmodmap-<em>machinename</em></code> file.  I believe it&#8217;s already been activated at this point, or at least <code>xkeycaps</code> has done some magic.</li>
<li>You&#8217;re done.  You might find that some things are not working at this point.  You can always restart <code>xkeycaps</code> and restore to defaults.  But you&#8217;ve likely got things right, and just need to log out of X and log back in.  My arrow keys broke when I did this before restarting X.</li>
<li>Every time you start up X you&#8217;ll need to run <code>xmodmap ~/.xmodmap-<em>machinename</em></code>.  But Ubuntu (or something) actually automatically detected my new <code>.xmodmap</code> and prompted me to ask if I wanted to use it.  That was friendly!</li>
<li>Use some white-out or tape to relabel your new keys. (optional)</li>
</ul>
<p>Whew!  That was quite a few steps.  Fortunately, it&#8217;s just a one time setup, and subsequent uses of <code>xmodmap</code> at login are trivial (put it  in your <code>.bash_profile</code> or equivalent if not prompted; use <code>$(uname -n)</code> to make it flexible for a shared profile).  I hope you&#8217;ve got it working now.  You can leave a comment if you&#8217;re having any trouble with the steps and maybe I (or someone) will be able to figure it out.  Breathe a sigh of relief as you re-train your fingers to stop stretching.</p>
<p>I can no longer type without the hack described here.  You can probably alter it for any machine you&#8217;re on and any of your own different preferences.  I&#8217;m also considering making <code>Ctrl-J</code> a permanent duplicate for <code>Enter</code>.</p>
<p>I should also add a rant for why this article and tools need to exist: Shame on IBM and Microsoft and all the others involved for being such layout idiots and costing the world so much in ongoing <a href="http://en.wikipedia.org/wiki/Carpal_tunnel_syndrome">CTS</a> healthcare costs.  Especially when the optimal layout was already well-known and widely used.  Remind you of anything (backslash path separator, another ergonomic impropriety; plus countless others)?  It&#8217;s really interesting to just stare down at the PC location of Ctrl and Esc, two essential keys probably both in the top 5.  They couldn&#8217;t possible have been put in less convenient places.  Well, maybe they were just taking the QWERTY model of slowing down typists to the next level.  I&#8217;m surprised they didn&#8217;t think to move <code>Shift</code> up to <code>F5</code> and <code>Enter</code> over to <code>ScrollLock</code>.</p>
<p>Be sure to thank Jamie for saving your wrist and adding years of screen time to your life.</p>
<p><em><span style="color: #999999;">* Furthermore, I make the typical assumption you&#8217;re using some *NIX variant.  Why else would you be here?  But if you&#8217;re using Windows or a Mac there are some other tools floating around that will help you customize your keyboard layout; I&#8217;m sure they&#8217;ll be different from xkeycaps.  Whether hacker or not, anyone can benefit by making these changes.</span></em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=fninTlDPmj4:KH3-tWyR1Q0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=fninTlDPmj4:KH3-tWyR1Q0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=fninTlDPmj4:KH3-tWyR1Q0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=fninTlDPmj4:KH3-tWyR1Q0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=fninTlDPmj4:KH3-tWyR1Q0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=fninTlDPmj4:KH3-tWyR1Q0:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/fninTlDPmj4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/04/make-a-pc-keyboard-unix-friendly/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/04/make-a-pc-keyboard-unix-friendly/</feedburner:origLink></item>
		<item>
		<title>How to Choose and Learn a New Programming Language</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/EoKNjmMdtds/</link>
		<comments>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 03:00:37 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[qop]]></category>

		<guid isPermaLink="false">http://blog.micahelliott.com/?p=46</guid>
		<description><![CDATA[They say you should learn a new programming language every year.  I don&#8217;t necessarily agree, but it&#8217;s happening this year for me with R.  Here are the steps I have found over the years to make it go smoothly. If you&#8217;re a perl, C++, or Java zealot, it&#8217;s been nice knowing you&#8230; Why Learn a [...]]]></description>
			<content:encoded><![CDATA[<p>They say you should <a href="http://www.google.com/search?q=learn+new+language+every+year">learn a new programming language every year</a>.   I don&#8217;t necessarily agree, but it&#8217;s happening this year for me <a href="http://micahelliott.com/2009/03/considering-r-as-python-supplement/">with R</a>.   Here are the steps I have found over the years to make it go smoothly. If you&#8217;re a perl, C++, or Java zealot, it&#8217;s been nice knowing you&#8230;<span id="more-46"></span></p>
<h2>Why Learn a New Language?</h2>
<p>You may disagree or have your own unrelated reasons, but addressing the <em>why</em> seems a necessary start for such a <em>how</em> post.  Here are the reasons I could think of:</p>
<ol>
<li><strong>You want to impress someone.</strong> Your present/future boss?  Peers?   Just padding your resume?   This is not a very good reason.  Maybe just stick with perl/C++/Java.</li>
<li><strong>Pursue a new domain.</strong> E.g., I&#8217;m heading into R because it&#8217;s touted as the best for visualization and statistics, and even has some epidemiologic facilities I hope to make use of.</li>
<li><strong>You want to expand your mind.</strong> Given your new learnings, you&#8217;ll be able to achieve better/faster results with your present favorite language.  E.g., <a href="http://micahelliott.com/2008/06/a-single-command-to-get-started-on-functional-programming/">learning FP</a> is sure to help you with many other languages.</li>
<li><strong>You&#8217;re actually going to need to use the new language for real work.</strong> You need to work on some app written in it, or you think it will be the best tool for your next challenge.</li>
<li><strong>Get connected to a new community.</strong> Maybe those relationships will lead to finding startup founders.</li>
<li><strong>Have something new to write about.</strong> Not a great reason, but I suppose I&#8217;m guilty.</li>
<li><strong>Feed the hype machine.</strong> Maybe you&#8217;ve just heard too much buzz about a language and have to know what everyone&#8217;s talking about.  This was why I explored Ruby!</li>
</ol>
<p>There&#8217;s got to be more reasons.  <em>What have been yours?</em></p>
<h2>How Long Should it Take?</h2>
<p>Depending on your background and the new language you&#8217;re targeting, you should plan to dedicate  some significant time to learning it.  This is <a href="http://www.linuxjournal.com/article/3882">ESR on his first run-in with Python</a>:</p>
<blockquote><p><em>Not that it took me very long to learn the feature set. I wrote a working, usable fetchmailconf, with GUI, in six working days, of which perhaps the equivalent of two days were spent learning Python itself.</em></p></blockquote>
<p>Or you could side with <a href="http://norvig.com/21-days.html">Peter Norvig</a> and devote 10 years to it:</p>
<blockquote><p><em>&#8230;it takes about ten years to develop expertise in [a programming language].</em></p></blockquote>
<p>Maybe Peter only knows perl*, in which case I&#8217;d heartily agree, and <a href="http://steve.yegge.googlepages.com/ancient-languages-perl">so would others</a>.  Personally, <strong>I think a typical competent programmer can pick up a well-designed language in a couple solid months of hands-on study</strong>, though this estimate may be off by a couple years.</p>
<h2>How To Actually Learn It</h2>
<p>We all have to learn a bunch of languages throughout our hacking careers.  How do you go about picking up a new one?  Get a book?  Start hacking?  Stare at some existing code?  Those are all useful things to do, but I want to streamline the process and get to the best practices.  Here&#8217;s the checklist I&#8217;ve come up with for effectively and efficiently learning a new programming language:</p>
<ul>
<li><strong>Click around on the home site.</strong> Discover the documentation pages, FAQs, wiki, community, etc.  You&#8217;ll be back here a lot.</li>
<li><strong>See what Wikipedia has to say about it.</strong> You should see some interesting history and learn about why it behaves and looks the way it does.  Maybe you&#8217;ll even find something to add.</li>
<li><strong>Print out the Tutorial and work through it.</strong> Mark it up with colors.  Type the snippets into your REPL. Change them.</li>
<li><strong>Read the FAQ.</strong> At least browse it so you know something about the common pitfalls.<strong><br />
</strong></li>
<li><strong>Read the style guide.</strong> If it doesn&#8217;t have one, figure out why.  Hopefully you can find editor settings that will enforce it.</li>
<li><strong>Get a book.</strong> Sometimes it takes a couple.  With Perl you&#8217;ll need eight tomes, all of which will be witty, yet combinedly inconsistent.  With Python you&#8217;ll need <a href="http://www.amazon.com/Python-Nutshell-Second-OReilly/dp/0596100469/">one</a>. (some will argue which one that is, many are great).</li>
<li><strong>Avoid certain languages.</strong> If you can&#8217;t find a book that dedicates fewer than 100 pages to wholly describing the language core, then something is wrong with the language.  C++ and perl are violators of this, and prime examples of languages to avoid in all capacities, at all costs.  You will waste all your energy on learning and remembering their <strong>quirks</strong>, instead of focusing on problems to solve.   I can&#8217;t believe some institutions (my undergrad!) have used these to teach OOP.  I would go so far as to call their paradigm <em>QOP</em>, or &#8220;quirks-oriented programming&#8221;.  (<em>WOP</em> &#8212; &#8220;warts-oriented programming&#8221; &#8212; isn&#8217;t undeservedly harsh, but maybe not PC.).  They will damage your thinking process, waste years of your programming career, or destroy it altogether, and you will actually become <em>less</em> competent for having ingrained their quirks into your cognition.*</li>
<li><strong>Work through the examples in the book.</strong> Highlight and scribble all over it.  If the book is more than 600 pages, then either the language is crufty or the book is poorly organized, and you might not want either.</li>
<li><strong>Start collecting miscellaneous pages from around the web and bookmark and tag them appropriately.</strong> Look for <a href="http://delicious.com/ianb">language luminaries</a> that have created nice bookmark collections.</li>
<li><strong>Hang out on the IRC channel.</strong> That will be <a href="http://freenode.net/">irc.freenode.net</a>.  The traffic on some of these is overwhelming, but you can quickly get a feel for what are the tricky corners of the language.</li>
<li><strong>Find a local user group to meet people and get connected.</strong> You can even get a feel for the language by surveying the attendees. Watch for excessive drool! If a SIG doesn&#8217;t exist yet, then start one. If no one is interested in joining, move to a bigger town or find a new language, or try to associate with one online.</li>
<li><strong>Join the users (and announcements) mailing list.</strong> You&#8217;ll get to see lots of code written by others and see solutions to common problems.</li>
<li><strong>Watch some videos (Google tech talks) and slideshows.</strong></li>
<li><strong>Play in the REPL.</strong> Get a better REPL if available (ipython).  What, no REPL?  Beanshell doesn&#8217;t count.  Bye-bye, Java!</li>
<li><strong>Try the debugger.</strong> See if there are better ones.  Can you dive right into it from crashing code?</li>
<li><strong>Get the tool suite.</strong> Get familiar with the tools and understand why they&#8217;re necessary.</li>
<li><strong>Explore the vaults.</strong> Examples are Python&#8217;s PyPI (Cheeseshop), R&#8217;s CRAN, perl&#8217;s CPAN (though CPAN has similar issues to its books).  Having extensive add-ons is a good language health indicator.  Also note how difficult their packages are to install.</li>
<li><strong>Write a simple tool.</strong> That will season you in making use of important facilities.  A good example is grep, which will exercise regexes, getopt (Erlang&#8217;s was hard to find), command line, strings, files, etc.</li>
<li><strong>Blog about your experience.</strong> Trying to describe your learnings to others will ensure that you understand what you&#8217;re talking about.  Do I? <img src='http://micahelliott.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />   <em>Learn by teaching</em> can be even more effective than <em>learn by doing</em>.</li>
<li><strong>Find the right interpreter/compiler.</strong> Some languages (Lisp) provide many.</li>
<li><strong>Install it, and its documentation</strong>.  <code>apt-get install ...</code> Not available in apt?  Then it&#8217;s too new, or you&#8217;re seriously bleeding edge, or it&#8217;s not viable.</li>
<li><strong>Figure out how to use the documentation systems.</strong> Manpages, info, &#8211;help, REPL-tab-completion, special tool (pydoc, Edoc, perldoc))</li>
<li><strong>Make sure your editor is equipped.</strong> What? it prescribes an IDE for you?  Later, Smalltalk (Squeak)!  Mess with your editor until it&#8217;s working as intended.  Syntax highlighting, auto-completion, auto-indent, macros, etc.</li>
<li><strong>Learn a bit about its history.</strong> Why was the language created.  For what niche?  Are its strengths and weaknesses reflected in that history?</li>
<li><strong>Make sure it&#8217;s open.</strong> I shouldn&#8221;t go into this again, and I realize it&#8217;s a loaded statement, but I say avoid anything that doesn&#8217;t have an excessively open community and standards body around it.  I&#8217;m still teetering on the Flex (Adobe) fence, but anything that Microsoft has had its hands in developing is simply poisonous.</li>
<li>Compare to a language you know.  What&#8217;s it most similar to?</li>
<li><strong>Take a class.</strong> This is often not necessary, but if you&#8217;ve got some college nearby they may offer something helpful.</li>
<li><strong>Get certified.</strong> Some languages have (silly) certifications.  The main benefit of them is that there is training material built around them that help you focus on what someone thinks are the important pieces of the language.  Doing this with Java helped my focus quite a bit (though I&#8217;ve since left the language behind).</li>
<li><strong>Watch/shadow a pro.</strong> This can be the absolute fastest way to see what to do, or what not to do.  Careful that you choose the right pro.</li>
<li><strong>Study the idioms and quirks.</strong> All languages have some quirks, <a href="http://wiki.python.org/moin/PythonWarts">even Python</a>.  It&#8217;s best to know about them early.</li>
<li><strong>Find and explore a project source base that is known to be well-written.</strong> Dive into the code.  Try making some changes.</li>
</ul>
<p>I&#8217;m not suggesting you need to do all these things for every language you explore.  This list could even serve as an evaluation for a new language you&#8217;re just considering.</p>
<h2>Bonus: Go Deep</h2>
<p>If you&#8217;d like to move on to the next prescribed level, here are some bonus activities:</p>
<ul>
<li>Find a bug in a library, and submit it to the <a href="http://en.wikipedia.org/wiki/Bug_tracking_system">BTS</a>.</li>
<li>Fix a bug and submit a patch.</li>
<li>Understand how to mark up your code for document auto-generation.  Write a manpage/vignette.</li>
<li>Check out the source using the VCS and build the compiler/interpreter yourself. If this is hard, you might consider if your apps to-be-written in this language can ever be deployed.  (Huge language bonus if they&#8217;ve got it together enough to be <a href="http://www.python.org/dev/peps/pep-0374/">using a DVCS</a>.)</li>
<li>Try your app on multiple OSs.  If you can get it to work on Linux, Mac, and Windows (at least Cygwin), you&#8217;re probably safe.  Even a web app should have some portability since you never know what future co-developers might think they need to do.</li>
<li>Start or join a real project.</li>
<li>Make use of shared memory or message passing or whatever concurrency facilities are provided.  Measure the quality of the language by how long it takes to figure out how to do robust parallel programming.  Erlang takes a week.  If it&#8217;s years, like most, you may want to move on, or read the next item.</li>
<li>Integrate with another language, particularly C.  If this is impossible, it&#8217;s probably a showstopper.  Compare to Python and R as benchmark examples.</li>
</ul>
<p>If you can&#8217;t accomplish all these things with the new language you&#8217;re considering, just move on to the next.  There are <a href="http://en.wikipedia.org/wiki/Alphabetical_list_of_programming_languages">plenty</a> to try!</p>
<p>Note that these are all great things to do when getting started with a new language.  However, you probably don&#8217;t want to be hanging out on IRC or mailing lists forever, or writing excessive posts about your fascinating new learnings, or reading too many books.  I&#8217;ve fallen into all those traps.  The best advice I can give you (and myself) is to get those hands dirty!</p>
<p><em>What other things do you do to get comfortable with a new language?</em></p>
<p><span style="color: #808080;"><em>* Notes: [1] Peter is actually pretty bright, and I was joking about perl.  I sat on the floor right next to him last year at <a href="http://micahelliott.com/2008/04/startup-school-impressions-should-you-attend/">Startup School</a>, without realizing who he was until he excused himself to give the next talk.  [2] Wow, Stevey; that second glass certainly does get the juices flowing!</em></span></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=EoKNjmMdtds:XFS2LWgljhs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=EoKNjmMdtds:XFS2LWgljhs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=EoKNjmMdtds:XFS2LWgljhs:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=EoKNjmMdtds:XFS2LWgljhs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=EoKNjmMdtds:XFS2LWgljhs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=EoKNjmMdtds:XFS2LWgljhs:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/EoKNjmMdtds" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/03/how-to-choose-and-learn-a-new-programming-language/</feedburner:origLink></item>
		<item>
		<title>Focus on Why, not What</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/c74JofDC600/</link>
		<comments>http://micahelliott.com/2009/03/focus-on-why-not-what/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 17:50:16 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[Startup]]></category>
		<category><![CDATA[customers]]></category>
		<category><![CDATA[elevator pitch]]></category>
		<category><![CDATA[entrepreneurship]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=329</guid>
		<description><![CDATA[I just started in on the Kauffman Foundation&#8217;s TechVenture program, being facilitated by Steve Morris at OTBC to about 10 of us entrepreneurs.  This was the first session, with a really useful focus: why, not what &#8212; at least that&#8217;s how I digested it.  I&#8217;ll try to record my learnings here from the class over [...]]]></description>
			<content:encoded><![CDATA[<p>I just started in on the <a href="http://www.fasttrac.org/techventure.cfm">Kauffman Foundation&#8217;s TechVenture</a> program, being facilitated by Steve Morris at <a href="http://otbc.org">OTBC</a> to about 10 of us entrepreneurs.  This was the first session, with a really useful focus: <strong>why, not what</strong> &#8212; at least that&#8217;s how I digested it.  I&#8217;ll try to record my learnings here from the class over the next few months.  There was a nice lecture from a source I&#8217;ll keep anonymous; details are irrelevant for this.  It was the long personal story of a 12-year business experience, summed up into a single lesson: we shouldn&#8217;t be focusing on <em>what we build</em>, but rather on <em>why it benefits customers</em>.<span id="more-329"></span></p>
<p>More concretely, it&#8217;s really easy for entrepreneurs &#8212; particularly developers &#8212; to fall into the trap of focusing on <em>what</em> their product does.  This gets reflected in presentations and messages, and ultimately in the shape of the product.  For example, in my case I could be saying that uGraph is a technology stack that does round-the-clock data mining, processing, and analytics to produce novel, real-time visualizations about health.  But that tells nothing about <em>why the product is compelling to customers</em>.  I&#8217;ve made that mistake, almost so blatantly.  The <em>why</em> message should be more like: Our product enables medical detectives to understand sickness so that they can detect and avoid it.  (That&#8217;s a bit simplistic, but at least the right emphasis.)  Focusing on the <em>why</em> seems pretty obvious now, right?  Wonder why nearly all of the recent 30 elevator pitches I&#8217;ve heard have been <em>what</em>-focused.  Maybe it&#8217;s not so obvious.</p>
<p>That brings up the next point: <em>who</em>.  As we started working through <a href="http://oregonstartups.com/blog/2009/02/15/how-to-create-an-elevator-pitch/">elevator pitches</a>, we had some confusion about who our customers are.  For many at this stage it&#8217;s hard to exclude any potential markets.  But there needs to be a focus on a near-single customer; not the world at large.  Of course our technologies can be tailored or generalized for various markets.  It&#8217;s hard to throw out so many opportunities, but the bottom line is that we need to narrow in on a specific customer, or at least differentiate for disparate groups.  We still have a few potential markets since we&#8217;re still testing the waters, but now I&#8217;m simply lumping them all into a &#8220;medical detective&#8221; class, which I now define as Epidemiologists.  It turns out that a lot of types of end-users (news companies and sickos) would like to wear Amateur Epidemiologist hats, and we&#8217;ll target them too (though most may not even know what epidemiology is).  We are now building <em>Epidemiological visualizations</em> &#8212; that&#8217;s pretty specific.  This narrowing really helps to simplify my elevator pitch (which we&#8217;ll work more on next week), and really the grand vision (which may be different next week <img src='http://micahelliott.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>With that in mind, I&#8217;ll expand our <em>who</em> and <strong>why</strong> to: We provide tools the <em>CDC</em> uses to <strong>immediately see an </strong><span id="split_3451405"><strong>illness spread and take necessary action</strong>, or what the <em>news companies</em> use to <strong>captivate their audience so they stick around through the next commercial</strong>, or what <em>end-users</em> use to <strong>avoid getting sick and understand why they&#8217;ve been sick</strong>.  The <em>why</em> is now addressing the real needs/pain points of our actual </span><span id="split_3451405"><em>who</em>: </span><span id="split_3451405">customers.</span></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=c74JofDC600:_i2LA71XkI0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=c74JofDC600:_i2LA71XkI0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=c74JofDC600:_i2LA71XkI0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=c74JofDC600:_i2LA71XkI0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=c74JofDC600:_i2LA71XkI0:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=c74JofDC600:_i2LA71XkI0:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/c74JofDC600" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/focus-on-why-not-what/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/03/focus-on-why-not-what/</feedburner:origLink></item>
		<item>
		<title>Considering R as a Python Supplement</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/Wn6wTEp7OPg/</link>
		<comments>http://micahelliott.com/2009/03/considering-r-as-python-supplement/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:00:12 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[r]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=311</guid>
		<description><![CDATA[It&#8217;s quite an investment to pick up a new programming language (syntax, semantics, types), along with all its periphery: tools, libraries, interfaces, environment, documentation, culture, user groups, history, idioms, and quirks.  I&#8217;m not trying to force myself to learn a new language every year, though looking back it&#8217;s pretty much turned out that way.  I [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s quite an investment to pick up a new programming language (syntax, semantics, types), along with all its periphery: tools, libraries, interfaces, environment, documentation, culture, user groups, history, idioms, and quirks.  I&#8217;m not trying to force myself to <a href="http://www.perlmonks.org/?node_id=397542">learn a new language every year</a>, though looking back it&#8217;s pretty much turned out that way.  I actually think there&#8217;s a skill-diluting effect in going shallow and trying to memorize syntax for a breadth of languages without knowing much about those other necessary peripheral pieces.  You really need a native language as a foundation by which you judge the others.  That may consist of a few, but I think there must be a small core.  Over the years my primary foundation has become Python.  I actually tend to steer away from the majority of new languages (especially since I rarely get into a situation where Python won&#8217;t handle the job), though the temptation of the new is sometimes great.  This year I&#8217;m having an especially hard time holding back the urge for the new.  It&#8217;s <a href="http://www.r-project.org/"><strong>R</strong></a>.  I&#8217;ve spent the last month telling myself I can&#8217;t make the commitment now given <a href="http://micahelliott.com/2009/01/reasons-for-creating-a-business/">how critical my development momentum is</a> to survival.  Well, R keeps taunting me, showing up <a href="http://en.wikipedia.org/wiki/23_Enigma">everywhere I look</a>.  I&#8217;ve got to figure out why it won&#8217;t leave me alone.  So here are the compelling pieces I&#8217;ve discovered thus far about R, that have me tinkering in its <a href="http://en.wikipedia.org/wiki/REPL">REPL</a>, wanting to buy <a href="http://www.amazon.com/Interactive-Dynamic-Graphics-Data-Analysis/dp/0387717617/">book</a> after <a href="http://www.amazon.com/Handbook-Statistical-Analyses-Using-R/dp/1584885394">book</a>, and even <a href="http://www.ggobi.org/demos/tour.html">having some strange dreams</a>.  I&#8217;m trying to compare to Python to evaluate the investment in learning another new language.<span id="more-311"></span></p>
<p>Here are some great things I&#8217;ve discovered about R:</p>
<ul>
<li><strong>Functional.</strong> Although <a href="http://micahelliott.com/2008/06/a-single-command-to-get-started-on-functional-programming/">I&#8217;ve dabbled in Erlang, Haskell, and ML</a>, and grown towards using Python in various functional ways (<a href="http://www.ibm.com/developerworks/library/l-prog.html">Mertz</a>, <a href="http://www.amk.ca/python/writing/functional">AMK</a>), I can&#8217;t say I&#8217;m <em>fluent</em> in any sanctioned <a href="http://en.wikipedia.org/wiki/Category:Functional_languages">functional language</a> (okay, I just added R to that list, but <a href="http://www.ibm.com/developerworks/linux/library/l-r2/">it should have been there</a>: &#8220;R&#8217;s functional parts come from Scheme.&#8221;)  I want to continue &#8220;breaking my brain in useful and creative ways&#8221;, and R fits the bill for completing this repertory need (I&#8217;ll probably head back to Haskell if/when a strong need for concurrency arises).</li>
<li><strong>Statistics and data analysis.</strong> <a href="http://www.amazon.com/Numerati-Stephen-Baker/dp/0618784608">The Numerati</a> and <a href="http://www.mckinseyquarterly.com/Hal_Varian_on_how_the_Web_challenges_managers_2286">other sources</a> say statisticians rule the world.  My eyes have been opened and I believe they&#8217;re right, so I&#8217;m working back my math chops.  It would appear that R&#8217;s statistics packages are more expansive than Python&#8217;s, and more is built into the language itself.</li>
<li><strong>Mathematical learning tool.</strong> It&#8217;s been a decade since I finished that math degree, but now the investment is finally paying off&#8230; I, uh, hypothesize.  I&#8217;ll blame the hiatus on not having found very interesting work to do until now &#8212; another reason to be self-employed, and why I&#8217;m loving life this year.  Anyway, I&#8217;m already getting re-versed in stats just by starting to use the language.  It&#8217;s looking like playing with R is a much better way to learn statistics than muddling through textbooks and paper-based homework.</li>
<li><strong>Graphical.</strong> Don&#8217;t know where to start.  There are <a href="http://en.wikipedia.org/wiki/R_(programming_language)#Graphical_user_interfaces">so many graphical tools</a> for R it is mind-numbing.  I&#8217;m starting to look at <a href="http://www.ggobi.org/rggobi/">RGgobi</a>, but there are lots of others to get acquainted with, including what&#8217;s built in.  I&#8217;ve worked through a couple graphical tutorials, and they seem to just magically pop up amazing graphs without having installed anything.  Try: <code>&gt; demo('graphics')</code> Notice how few lines of code are doing all that. Wow!</li>
<li><strong>Geospatial.</strong> I&#8217;ve got a need to be plotting data on maps in a variety of formats.  I&#8217;ve <a href="http://delicious.com/mdelliot/visual">found a lot of ways to do this</a>, but R seems to be the lightest, and <a href="http://grass.itc.it/">very capable</a>.</li>
<li><strong>High-level. </strong> Everything is a data structure.  Operations applied to variables are done across the whole set with no loops or treatment of individual items.  The syntax appears to be a bit richer (higher level, more sugar) than found in Python.</li>
<li><strong>I/O.</strong> R seamlessly slurps table-oriented text files for processing.  Output is also automatically formatted in nice text tables.  A mini-book (<a href="http://cran.r-project.org/doc/manuals/R-data.pdf">PDF</a>) describes this and much more.  My next learning task is to start <a href="http://rpgsql.sourceforge.net/">interfacing with PostgreSQL</a>.</li>
<li><strong>Kind of Python-like.</strong> I&#8217;ve started outlining another article that I hope to actually write someday called &#8220;R For Python Programmers&#8221; (since I can&#8217;t find such a guide).  Isn&#8217;t Python the gold standard to which <a href="http://www.amazon.com/Real-World-Haskell-Bryan-OSullivan/dp/0596514980/">great books</a> make comparisons these days?  I won&#8217;t duplicate that here, but simply say that I can&#8217;t believe how comfortable the syntax feels coming from Python nativity.  And R appears to <a href="http://rpy.sourceforge.net/">integrate very well with Python</a> (this probably being the more important point).</li>
<li><strong>Best REPL evar!</strong> I start evaluating any language simply by firing up its REPL and comparing its facilities to those of <a href="http://ipython.scipy.org">IPython</a>.  R&#8217;s REPL is on par with it (readline editing with vim-mode support, tab completion for everything, extensive help), and even has some extra niceties; e.g., function parameter tab-completion.  While getting started, note that the help system uses <code>?</code> and <code>??</code> <em>prefixes</em> instead of IPython&#8217;s suffix notation.  IOW, use <code>?topic</code> instead of <code>topic?</code> I&#8217;m getting the impression that a common workflow is spending lots of time in the REPL working with files and graphics.  This is probably the killer feature that enables me to quickly get up to speed.</li>
<li><strong>Documentation.</strong> The pages aren&#8217;t pretty, but there is a mass of info on the R site.  And AFAICT R is the foremost language used in recent Statistics textbooks.  There&#8217;s also a free 100-page (a good length, compare to Python Tutorial) <a href="http://cran.r-project.org/doc/manuals/R-intro.html">intro book</a>.  It&#8217;s horrible for non-programmers, and less than perfect for non-statisticians, but will get you familiar with some language features.  Appendix A offers a nice REPL walk-thru of language features.  I can&#8217;t find any Python books with much treatment of numerics, except for <a href="http://www.amazon.com/Python-Scripting-Computational-Science-Engineering/dp/3540739157">this one</a> which seems to touch on some but shares space with language basics.</li>
<li><strong>CRAN.</strong> Incredibly diverse libraries (<a href="http://cran.r-project.org/web/packages/">list of packages</a>) for statistics, graphics, and even <a href="http://www.medepi.net/epir/">Epidemiology</a> (probably overkill for my present needs).</li>
<li><strong>Mature and well-designed.</strong> R has been growing as the de facto FOSS statistical/graphical language <a href="http://cran.r-project.org/doc/html/interface98-paper/paper.html">for over a decade</a> (inception in 1993, in <a href="http://micahelliott.com/2008/06/1983-96-the-golden-age-of-programming-languages/">the golden age</a>).  It has grown up from the learnings of its ancestor <a href="http://en.wikipedia.org/wiki/S_(programming_language)">S</a> (shouldn&#8217;t R then be T??; I guess similar to C-&gt;B-&gt;A progression), which came onto the scene circa 1976 (a good year <img src='http://micahelliott.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</li>
<li><strong>Widely used.</strong> A survey of university statistics courses and Public Health curricula show R as a prevalent tool; e.g., UC Berkeley and Iowa State.</li>
<li><strong>UNIX-friendly.</strong> I was humored to see that R is more apt to borrow names from UNIX commands than from other languages.  The commands for managing a namespace are <code>rm</code> and <code>ls</code> &#8212; easy for me to remember. <img src='http://micahelliott.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />   And I&#8217;m glad to see it has good roots.</li>
<li><strong>Trivial Ubuntu installation.</strong> Try this: <code>apt-get install r-recommended r-cran-&lt;tab&gt;&lt;tab&gt;</code></li>
<li><strong>Script-friendly.</strong> Rscript enables R to act as a scripting language.</li>
<li><strong>PDX-visualization group.</strong> This month we&#8217;re starting up <a href="http://micahelliott.com/2009/03/getting-started-with-graphviz/">a group to discuss visualization technology/advances</a>, and R will be the primary language under discussion.  My statistician friend, <a href="http://twitter.com/znmeb">Ed</a>, won&#8217;t stop talking about R, and he&#8217;s someone I&#8217;ve come to listen intently to.</li>
</ul>
<p>It&#8217;s a bit early to be writing an article on a language I haven&#8217;t done much with yet.  But I had to explore what&#8217;s pushing me towards R.  Looks pretty compelling now, so I&#8217;m very close to diving in (actually using it in a project).  I&#8217;ve sprinkled a number of resources throughout this post which I hope will be helpful for newcomers to R (including myself).  I should also mention that the best articles I&#8217;ve seen on introducing R are by David Mertz (a very capable Pythonista): Statistical Programming with R, <a href="http://www.ibm.com/developerworks/linux/library/l-r1/">Part I</a> and <a href="http://www.ibm.com/developerworks/linux/library/l-r2/">Part II</a>.</p>
<p>I can&#8217;t ignore what&#8217;s been growing out of  <a href="http://www.scipy.org">Scipy</a>, especially the <a href="http://www.scipy.org/Cookbook/Matplotlib/Maps">maps</a>.  And <a href="http://matplotlib.sourceforge.net/gallery.html">matplotlib&#8217;s gallery</a> is incredible (and I have some of them working).  The above items are all great features of R, but if I can accomplish them nearly as well in Python I probably shouldn&#8217;t invest too much into R.  At this point it does appear that R offers some facilities beyond Python.  <em>Have you worked with both Python and R and found compelling reasons to prefer R?  For which types of tasks?</em></p>
<p>My pain points with Python today are in analyzing query data (ad hoc in loops and heuristics), and creating a bunch of different formats to send to various third-party visualizations.  My analysis is going to need to get more sophisticated, and I&#8217;d like to be able to look at data visually quickly with less overhead.</p>
<p>I&#8217;m probably overstating the investment required in getting up and running with R; it&#8217;s <a href="http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html">supposed to be easy to pick up</a>.  I&#8217;d really like to get to being comfortable with applying <a href="http://en.wikipedia.org/wiki/Statistics">non-trivial statistics</a>, which means working through some R books.  I&#8217;ve made it this far (and now so have you), so I&#8217;m going for it, hoping it will be a pretty quick learn.  <em>Please feel free to share your experiences with learning and using R!</em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Wn6wTEp7OPg:g4qiodTjeFg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Wn6wTEp7OPg:g4qiodTjeFg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Wn6wTEp7OPg:g4qiodTjeFg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Wn6wTEp7OPg:g4qiodTjeFg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Wn6wTEp7OPg:g4qiodTjeFg:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Wn6wTEp7OPg:g4qiodTjeFg:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/Wn6wTEp7OPg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/considering-r-as-python-supplement/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/03/considering-r-as-python-supplement/</feedburner:origLink></item>
		<item>
		<title>Getting Started with Graphviz</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/S43cvePPvNk/</link>
		<comments>http://micahelliott.com/2009/03/getting-started-with-graphviz/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 19:44:22 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[graphviz]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[visualization]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=304</guid>
		<description><![CDATA[I&#8217;m getting pretty excited for the first meeting of the PDX-visualization group (which I convinced Ed to expand his R Language Study group into).  One of the topics we&#8217;ll be going over is Graphviz.  It&#8217;s old as dirt (ChangeLog goes back to 2000 at v1.7, but I&#8217;m guessing it&#8217;s at least a decade older) and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m getting pretty excited for the <a href="http://groups.google.com/group/pdx-visualization/browse_thread/thread/592f4563abbd2e95">first meeting</a> of the <a href="http://groups.google.com/group/pdx-visualization/">PDX-visualization</a> group (which I convinced Ed to expand his R Language Study group into).  One of the topics we&#8217;ll be going over is <a href="http://www.graphviz.org/">Graphviz</a>.  It&#8217;s old as dirt (ChangeLog goes back to 2000 at v1.7, but I&#8217;m guessing it&#8217;s at least a decade older) and has long been the de facto UNIX tool chain for creating graphics with code; i.e., without needing a graphics editor.  I believe it has only recently adopted a true FOSS <a href="http://www.graphviz.org/License.php">license</a>, which may really help its cause.  Graphviz use is pervasive in journals and books, and even shows up in wikis (<a href="http://c2.com/cgi/wiki?GraphViz">c2</a>, <a href="http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial">Mercurial</a>).  It&#8217;s such a simple graphics package to make use of, but a couple early steps might not be obvious to first-timers.  I&#8217;ve done a bit of exploring to get off the ground &#8212; here are some good resources I&#8217;ve found.<span id="more-304"></span></p>
<ul>
<li><code>$ apt-get install graphviz python-pydot python-pygraphviz  # Python/Ubuntu friendly</code></li>
<li><code>$ man graphviz</code> (will lead to many other pages)</li>
<li><a href="http://www.linuxdevcenter.com/pub/a/linux/2004/05/06/graphviz_dot.html">O&#8217;Reilly tutorial</a> by Michele Simionato (some other tutorials are not great)</li>
<li>Some flickr <a href="http://www.flickr.com/photos/kentbye/sets/72157601523153827/">example images</a>, some with sample code included<a href="http://cli.gs/4g8bPt" target="_blank"></a></li>
<li>Simplest first use: <code>$ dot hello.dot -Tpng -o hello.png &amp;&amp; firefox hello.png</code></li>
<li><a href="http://code.google.com/p/pydot/">Use from Python</a></li>
<li><a href="http://moinmo.in/GraphVizForMoin">Plug Graphvis into your wiki</a> (MoinMoin)</li>
</ul>
<p>I (with Tim) am also planning to show some of our progress on visualizations for uGraph, so be sure to <a href="http://calagator.org/events/1250456781">show up for the meeting</a>.  And what a fantastic group of folks: many entrepreneurs and data miners.  Should be a great after-party!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=S43cvePPvNk:BJ9khAaq5HQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=S43cvePPvNk:BJ9khAaq5HQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=S43cvePPvNk:BJ9khAaq5HQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=S43cvePPvNk:BJ9khAaq5HQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=S43cvePPvNk:BJ9khAaq5HQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=S43cvePPvNk:BJ9khAaq5HQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/S43cvePPvNk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/03/getting-started-with-graphviz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/03/getting-started-with-graphviz/</feedburner:origLink></item>
		<item>
		<title>Home Media Center Wall-Wart</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/Oc7LAWki_Wc/</link>
		<comments>http://micahelliott.com/2009/02/home-media-center-wall-wart/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 01:37:17 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Living]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[multi-media]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=297</guid>
		<description><![CDATA[Apparently, we&#8217;re very close to having a low-power, affordable Linux media (er, audio) center, driven by a tiny wall-wart.  It should only need to support networking, USB, ssh, external storage, and audio output.  The candidate is called the Marvell ShivaPlug, and it features some of those, and maybe the rest can be satisfied. The NIC [...]]]></description>
			<content:encoded><![CDATA[<p>Apparently, we&#8217;re very close to having a low-power, affordable Linux media (er, audio) center, driven by a tiny wall-wart.  It should only need to support <strong>networking</strong>, <strong>USB</strong>, <strong>ssh</strong>, <strong>external storage</strong>, and <strong>audio output</strong>.  The candidate is called the <a href="http://www.slashgear.com/marvell-sheevaplug-99-linux-pc-hidden-in-a-wall-wart-2435556/">Marvell ShivaPlug</a>, and it features some of those, and maybe the rest can be satisfied.<span id="more-297"></span></p>
<p>The NIC and USB are obviously present.  ssh is highly expected (how else would you get in?), as is the ability to install anything that will fit in the 512 MiB of flash.  The audio output is missing, but if it supports any USB hub, you could connect an external USB drive and a USB amp like <a href="http://www.pcstats.com/articleview.cfm?articleID=1401">this one</a>, and feed into your sound system.  Wonder what distro it&#8217;s using?</p>
<p>I&#8217;ve been using an old laptop to drive the audio for my whole house for several years.  This is not a great solution since it&#8217;s comparatively power hungry, loud, takes up space, and is dying.  With the wall-wart, that old system can disappear, and the wart can probably put out a lot better sound (with the USB amp).  I&#8217;ve considered replacing the laptop with an iTouch or some device, but I really like using the machine as a server for other purposes that a <a href="http://en.wikipedia.org/wiki/Handheld_computer">handheld</a> would not support.</p>
<p>So far this system is just theoretical.  But I hope to get my hands on one of these and try it out.  Hmm, there are even <a href="http://www.xbitlabs.com/articles/monitors/display/samsung-sm940ux.html">USB monitors</a> now; that could be interesting!</p>
<p>It would also make for a nice little backup server, hosting a drive for automated rsync.  There&#8217;s also the need for USB-powered <a href="http://www.developertesting.com/archives/month200404/20040401-eXtremeFeedbackForSoftwareDevelopment.html">eXtreme Feedback Devices</a> (XFDs).  The ShivaPlug could handle some of that with a USB light or lava lamp.  Any other possibilities?  Let me know your experiences if you&#8217;re playing with one.</p>
<p><span style="color: #808080;"><em>Thanks Jon for the link!</em></span></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Oc7LAWki_Wc:CDJ3ZxnUVB4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Oc7LAWki_Wc:CDJ3ZxnUVB4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Oc7LAWki_Wc:CDJ3ZxnUVB4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Oc7LAWki_Wc:CDJ3ZxnUVB4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Oc7LAWki_Wc:CDJ3ZxnUVB4:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Oc7LAWki_Wc:CDJ3ZxnUVB4:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/Oc7LAWki_Wc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/02/home-media-center-wall-wart/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/02/home-media-center-wall-wart/</feedburner:origLink></item>
		<item>
		<title>Send Email from a Webhost Script</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/Je0o4QX3LAM/</link>
		<comments>http://micahelliott.com/2009/02/send-email-from-a-webhost-script/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 08:35:53 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=276</guid>
		<description><![CDATA[Some webhosts make it a bit tedious to send email from your shell, and even harder inside your scripts or web apps.  But setting up Django properly enables this to become a one-liner whenever you need it. After some hunting around I found a help article at Webfaction describing the process of sending mail from [...]]]></description>
			<content:encoded><![CDATA[<p>Some webhosts make it a bit tedious to send email from your shell, and even harder inside your scripts or web apps.  But setting up Django properly enables this to become a one-liner whenever you need it.<span id="more-276"></span></p>
<p>After some hunting around I found <a href="https://help.webfaction.com/index.php?_m=knowledgebase&amp;_a=viewarticle&amp;kbarticleid=49">a help article at Webfaction</a> describing the process of sending mail from a script (with Python, nice! give it a thumbs up; those guys are great).  I could easily enough put some code like that into a function in a utility module to be called from various places, but it&#8217;s kind of ugly and repeats some data multiple times and requires a couple more imports.  On a development box I got Django&#8217;s handy <a href="http://docs.djangoproject.com/en/dev/topics/email/#topics-email">send_mail</a> function to work, but even with the described <em>smtplib</em> setup work on the webhost, the Django convenience was not going to fly.  But shortly into that Django article you see some setting parameters that are not part of the default django-admin-generated skeleton.  I tried setting these like so:</p>
<pre name="code" class="python">if platform.uname()[1].lower() == 'myserver.webfaction.com':
    EMAIL_HOST = 'smtp.webfaction.com'
    EMAIL_HOST_USER = 'my_user_name'
    EMAIL_HOST_PASSWORD = get_my_password()</pre>
<p>And now I can simply send myself emails by making calls to <em>send_mail</em>, like this:</p>
<pre name="code" class="python">from django.core.mail import send_mail
...
send_mail("New beta user signed up!",
    "%s\n%s" % (email, text),
    "beta@mycompany.com", [ADMIN])</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Je0o4QX3LAM:0rWLhtC_myM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Je0o4QX3LAM:0rWLhtC_myM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Je0o4QX3LAM:0rWLhtC_myM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Je0o4QX3LAM:0rWLhtC_myM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=Je0o4QX3LAM:0rWLhtC_myM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=Je0o4QX3LAM:0rWLhtC_myM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/Je0o4QX3LAM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/02/send-email-from-a-webhost-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/02/send-email-from-a-webhost-script/</feedburner:origLink></item>
		<item>
		<title>Reasons for Creating a Business</title>
		<link>http://feedproxy.google.com/~r/MicahElliott/~3/tB9nSjw-Fwo/</link>
		<comments>http://micahelliott.com/2009/01/reasons-for-creating-a-business/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 18:27:50 +0000</pubDate>
		<dc:creator>Micah</dc:creator>
				<category><![CDATA[Startup]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[goals]]></category>

		<guid isPermaLink="false">http://micahelliott.com/?p=262</guid>
		<description><![CDATA[We&#8217;re getting ready to incorporate our business.  Part of the expectations-setting process on my team was fleshing out the personal reasons for wanting to commit to building a new business.  Here are my reasons. Build something that I would really like to have/use (satisfy a personal need; understanding/tracking health, in my case) Benefit large group [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re getting ready to <a href="http://www.stoel.com/webfiles/TVGFee.aspx">incorporate</a> our business.  Part of the expectations-setting process on my team was fleshing out the personal reasons for wanting to commit to building a new business.  Here are my reasons.</p>
<p><span id="more-262"></span></p>
<ul>
<li>Build something that I would really like to have/use (satisfy a personal need; understanding/tracking health, in my case)</li>
<li>Benefit large group of people (make a difference in the world)</li>
<li>Feel in control of life (bypass corporate agendas)</li>
<li>Pursue own creative ideas</li>
<li>Make own decisions (or at least have a major say)</li>
<li>Have fun, be passionate (thus be able/motivated to really be devoted to making it successful)</li>
<li>Make enough money to pay mortgage and support family (but maintain frugality/minimalism perspective with children), and give back</li>
<li>Contribute to <a href="http://en.wikipedia.org/wiki/FOSS">FOSS</a> (many projects require new tooling/libraries, some of which can be used by others)</li>
<li>Work with excellent people: friends, role models, apprentices, visionaries of my choosing</li>
<li>Create jobs for capable people, for my (evolving) definition of capable</li>
<li>Learn new technologies, follow cutting edge developments (data mining/visualization, programming language/tools progression, web frameworks)</li>
<li>Better understand users/crowds (and how to make sense of the huge data sets they generate)</li>
<li>Have something interesting to write about</li>
<li>Take a rollercoaster ride; experience the extreme/rush/thrill</li>
<li>Make contacts/friends/future partners around new technologies</li>
<li>Justify getting ridiculously connected on social networks</li>
<li>Get further experience in all aspects of running a business</li>
<li>Gain the wisdom (business savvy, engineering, writing, presentation, art) to pass on to my children and anyone else who will listen</li>
<li>Build reputation and equity to enable pursuit of larger future projects</li>
<li>Optimize the business creation process (be able to start up many more quickly with discretional insights)</li>
</ul>
<p>Some books that I have found to be influential in getting started: <a href="http://www.amazon.com/review/R20C4ZNK25DK4S/">Tribes</a>, <a href="http://www.amazon.com/Career-Renegade-Great-Living-Doing/dp/0767927419/">Career Renegade</a>, <a href="http://www.amazon.com/review/RL9P0E6EP7YF8">The Big Moo</a>, <a href="http://www.amazon.com/Founders-Work-Stories-Startups-Problem-Solution/dp/1430210788">Founders At Work</a>.  And blogs: <a href="http://www.paulgraham.com/notnot.html">Paul Graham</a>, <a href="http://sethgodin.typepad.com/seths_blog">Seth Godin</a>.</p>
<p>Are you thinking about taking the plunge?  Done it already?  <em><strong>What are your reasons?</strong></em></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/MicahElliott?a=tB9nSjw-Fwo:544aF0k0ut8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=tB9nSjw-Fwo:544aF0k0ut8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=tB9nSjw-Fwo:544aF0k0ut8:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=tB9nSjw-Fwo:544aF0k0ut8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/MicahElliott?i=tB9nSjw-Fwo:544aF0k0ut8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/MicahElliott?a=tB9nSjw-Fwo:544aF0k0ut8:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/MicahElliott?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/MicahElliott/~4/tB9nSjw-Fwo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://micahelliott.com/2009/01/reasons-for-creating-a-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://micahelliott.com/2009/01/reasons-for-creating-a-business/</feedburner:origLink></item>
	</channel>
</rss>

