<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/3.3.3" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Ryan's Inter-Online Web Blog</title>
		<link>http://blog.hoopycat.com/</link>
		<atom:link rel="self" type="application/rss+xml" href="http://blog.hoopycat.com/?tempskin=_rss2" />
		<description></description>
		<language>en-US</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=3.3.3"/>
		<ttl>60</ttl>
				<item>
			<title>Review: Sharpie Liquid Pencil</title>
			<link>http://blog.hoopycat.com/2010/08/review-sharpie-liquid-pencil</link>
			<pubDate>Sat, 28 Aug 2010 18:20:45 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">Useless Blatherings</category>
<category domain="main">Geekery</category>
<category domain="alt">Photographs</category>			<guid isPermaLink="false">319@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;Since man&amp;#8217;s first forays into the written word, his dreams and aspirations have centered around improving the weakest link in the compositional process: the interface between nebulous mind and printed matter.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342878081.jpg.html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://photo.hoopycat.com/d/17111-2/28342878081.jpg&quot; alt=&quot;Sharpie Liquid Pencil&quot; width=&quot;80%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Certainly, the advent of the printing press and the widespread acceptance of the word processor revolutionized writing as we know it, but the actual implements of drafting have changed comparatively little. We still scribble with pens and pencils and type on keyboards that would be familiar to &lt;a href=&quot;http://www.straightdope.com/columns/read/221/was-the-qwerty-keyboard-purposely-designed-to-slow-typists&quot;&gt;many typists alive during the civil war&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Perhaps this is because great writers, like great carpenters or engineers, never blame their tools for their own inadequacies. Investing in &lt;a href=&quot;http://www.imdb.com/title/tt0098382/quotes?qt0395324&quot;&gt;the right tool for the right job&lt;/a&gt; is one of the most important investments you can make, but is a mechanical pencil the best we can do?&lt;/p&gt;
&lt;p&gt;Most of my &lt;a href=&quot;http://whatpulse.org/stats/users/286092/&quot;&gt;writing output is digital&lt;/a&gt; nowadays, so my &amp;#8220;analog&amp;#8221; writing needs center around tactical writing situations. I still prefer a mechanical pencil and paper for mathematics work, note-taking, and jotting down reminders. Even though I carry a netbook most days, pencil and paper affords me maximum freedom to arrange and annotate notes just so, with drawings and diagrams requiring no additional effort.&lt;/p&gt;
&lt;p&gt;This works out pretty well, but I have a few issues with mechanical pencils: broken leads, incessant clicking to dispense more lead, and a tendency to make noise due to the leads rolling around inside the chamber. Also, my favorite mechanical pencil, a &lt;a href=&quot;http://www.staples.com/Pentel-Quicker-Clicker-Automatic-Pencils-.5mm-Smoke-Barrel/product-nr_499731&quot;&gt;Pentel 0.5 mm&lt;/a&gt;, has a relatively slender profile and causes a little more fatigue than I&amp;#8217;d like, especially compared to the &lt;a href=&quot;http://www.staples.com/Pilot-G-2-Retractable-Gel-Ink-Pens-Fine-Point-Black-Dozen/product_429174&quot;&gt;Pilot G-2 fine point&lt;/a&gt; I enjoy. Even though I have no reason to ditch my beloved Pentels, I owe it to myself to see what&amp;#8217;s out there.&lt;/p&gt;
&lt;p&gt;Enter the &lt;a href=&quot;http://blog.sharpie.com/2010/08/introducing-the-new-sharpie-liquid-pencil/&quot;&gt;Sharpie Liquid Pencil&lt;/a&gt;. This curious device writes like a pen, but its output is equivalent to #2 pencil lead and is erasable as such. While &lt;a href=&quot;http://www.amazon.com/Liquaphite-Unleaded-Patented-Technology-Refills/dp/B002S5KRPS/&quot;&gt;Pentech&amp;#8217;s Liquaphite&lt;/a&gt; has been on the market for some time now, the Sharpie&amp;#8217;s major advantage is price: about $2 each, versus about $50 each for the Pentech.&lt;/p&gt;
&lt;h3&gt;The Physics&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342943233.jpg.html&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;float: right;&quot; src=&quot;http://photo.hoopycat.com/d/17102-4/28342943233.jpg&quot; alt=&quot;Liquid pencils in their natural habitat&quot; width=&quot;40%&quot; /&gt;&lt;/a&gt;I ordered a two-pack of Sharpie Liquid Pencils from Amazon.com, for about $6 with tax. After a brief backorder, the devices arrived. The two-pack comes with a set of six bonus erasers, which are &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342900993.jpg.html&quot; target=&quot;_blank&quot;&gt;loosely floating around inside the blister pack&lt;/a&gt; (I had to do a brief search and rescue operation after opening the package).&lt;/p&gt;
&lt;p&gt;It is a bog-standard retail package of the sort you&amp;#8217;ve all seen before, so I immediately popped it open and weighed it using the hoopycat.com scales of science. The liquid pencil &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342862721.jpg.html&quot; target=&quot;_blank&quot;&gt;weighed in at 12 grams&lt;/a&gt;, compared to &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342838145.jpg.html&quot; target=&quot;_blank&quot;&gt;11 grams for my recently-reloaded Pentel&lt;/a&gt; and &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342810113.jpg.html&quot; target=&quot;_blank&quot;&gt;10 grams for my Pilot G-2&lt;/a&gt;. I would consider this reasonable, within the expected error range of the scale.&lt;/p&gt;
&lt;p&gt;As far as handfeel and geometry go, the Sharpie is almost indistinguishable from the Pilot G-2. It feels solid, has good balance, and has the padded grip right where I like it. The grip lacks the texture of the Pilot, but this is not a dealbreaker for me.&lt;/p&gt;
&lt;p&gt;Curiously, the Sharpie rattles when shaken. This is due to the clicker retraction mechanism, which involves the entire top quarter of the barrel. Unfortunately, there&amp;#8217;s too much mass there and too many places for plastic-on-plastic contact, so its operation is not completely silent. A smaller &amp;#8220;button,&amp;#8221; such as on the G-2, would have likely improved the situation.&lt;/p&gt;
&lt;h3&gt;The Output&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342613121.jpg.html&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;float: right;&quot; src=&quot;http://photo.hoopycat.com/d/17147-2/28342613121.jpg&quot; alt=&quot;Comparison writing test&quot; width=&quot;50%&quot; /&gt;&lt;/a&gt;Alas, my tests revealed that the Sharpie Liquid Pencil&amp;#8217;s writing quality is more like that of a cheap ballpoint pen than a quality mechanical pencil. I tested on a variety of surfaces, including a &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342788993.jpg.html&quot; target=&quot;_blank&quot;&gt;sticky note&lt;/a&gt;, some &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342725889.jpg.html&quot; target=&quot;_blank&quot;&gt;copy paper&lt;/a&gt;, the backs of the &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342702081.jpg.html&quot; target=&quot;_blank&quot;&gt;packing slip&lt;/a&gt; and &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342685313.jpg.html&quot; target=&quot;_blank&quot;&gt;shipping envelope&lt;/a&gt;, a sheet of &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342663553.jpg.html&quot; target=&quot;_blank&quot;&gt;newsprint&lt;/a&gt;, and the &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342637441.jpg.html&quot; target=&quot;_blank&quot;&gt;writing pads I use for note-taking&lt;/a&gt;. Overall, I found the marks to be spotty and irregular, as if the flow rate through the ball were inconsistent depending on angle and velocity.&lt;/p&gt;
&lt;p&gt;This is a curse that befalls a number of pens, but is certainly an unwelcome introduction to the pencil. I think this, above all, will be the dealbreaker for notes and homework. While the liquid pencil&amp;#8217;s &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342590209.jpg.html&quot; target=&quot;_blank&quot;&gt;quality improved with greater downforce and velocity&lt;/a&gt;, this is not acceptable for lectures due to the resulting fatigue.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/writing-example.png.html&quot; target=&quot;_blank&quot;&gt;high-resolution scan of the writing pad test&lt;/a&gt; is available in the &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/&quot; target=&quot;_blank&quot;&gt;photo gallery&lt;/a&gt;, along with a number of other images.&lt;/p&gt;
&lt;h3&gt;Hiding the Evidence&lt;/h3&gt;
&lt;p&gt;&lt;a title=&quot;Third row: erased with Mars eraser; fourth row: erased with built-in eraser&quot; href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342747137.jpg.html&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;float: right;&quot; src=&quot;http://photo.hoopycat.com/d/17129-2/28342747137.jpg&quot; alt=&quot;Erasing test&quot; width=&quot;50%&quot; /&gt;&lt;/a&gt;The ability to erase is one of the key features of a pencil, and in this category, the Sharpie is no slouch. The built-in eraser erased the text from a post-it note perfectly, but my standard &lt;a href=&quot;http://www.amazon.com/Mars-White-Pencil-Eraser-Four/dp/B00006IFAN/&quot; target=&quot;_blank&quot;&gt;Staedtler Mars&lt;/a&gt; plastic eraser left a little bit behind. In the image on the right, the third row was erased with the Staedtler, and the fourth was with the built-in eraser.&lt;/p&gt;
&lt;p&gt;One downside to the built-in eraser: it goes fast. I had a noticeable bevel on it from just erasing two words, and I&amp;#8217;m not entirely sure it would survive my typical sentence.&lt;/p&gt;
&lt;p&gt;After 24 hours at room temperature, marks were essentially un-erasable by either eraser. They just get a bit lighter without fully disappearing.&lt;/p&gt;
&lt;h3&gt;Unsuccessful Smear Campaign&lt;/h3&gt;
&lt;p&gt;My more sinister colleagues often worry about their clumsy left hands smearing ink from particularly juicy specimens. While it is harder than you&amp;#8217;d think to write left-handed (I hear only 10% of people can do it), I did try writing backwards to no avail. I eventually gave up, wrote a chunk of text, and then dragged the edge of my hand across it.&lt;/p&gt;
&lt;p style=&quot;text-align: center; &quot;&gt;&lt;a title=&quot;Well that's a drag.&quot; href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342569089.jpg.html&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;vertical-align: middle;&quot; src=&quot;http://photo.hoopycat.com/d/17153-2/28342569089.jpg&quot; alt=&quot;Skin-on-paper drag test&quot; width=&quot;80%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left; &quot;&gt;I sure wasn&amp;#8217;t expecting that to happen.&lt;/p&gt;
&lt;p style=&quot;text-align: left; &quot;&gt;Rather than smearing, the writing disappeared with about as much effectiveness as my Mars eraser! It appeared as a &lt;a href=&quot;http://photo.hoopycat.com/v/SharpieLiquidPencil/28342552705.jpg.html&quot; target=&quot;_blank&quot;&gt;black grit on the edge of my hand&lt;/a&gt;, which wouldn&amp;#8217;t wipe off (or erase off), but did come off nicely with soap and water. Mind you, I was dragging my hand pretty hard and pretty much trying to get a reaction out of it. If you&amp;#8217;re left-handed and writing normally, it probably won&amp;#8217;t be a problem.&lt;/p&gt;
&lt;h3&gt;Overall&lt;/h3&gt;
&lt;p&gt;Well, they gave it a good shot. I like the idea in theory, but the execution could use some work. The cheap-sounding rattle when shaken, the inconsistent liquid graphite flow, and the poor erasability with the Mars plastic eraser limit it to occasional use at this time. I look forward to future development in this field, but I&amp;#8217;m not putting away my Pentel just yet.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/08/review-sharpie-liquid-pencil&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Since man&#8217;s first forays into the written word, his dreams and aspirations have centered around improving the weakest link in the compositional process: the interface between nebulous mind and printed matter.</p>
<p style="text-align: center;"><a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342878081.jpg.html" target="_blank"><img src="http://photo.hoopycat.com/d/17111-2/28342878081.jpg" alt="Sharpie Liquid Pencil" width="80%" /></a></p>
<p>Certainly, the advent of the printing press and the widespread acceptance of the word processor revolutionized writing as we know it, but the actual implements of drafting have changed comparatively little. We still scribble with pens and pencils and type on keyboards that would be familiar to <a href="http://www.straightdope.com/columns/read/221/was-the-qwerty-keyboard-purposely-designed-to-slow-typists">many typists alive during the civil war</a>.</p>
<p>Perhaps this is because great writers, like great carpenters or engineers, never blame their tools for their own inadequacies. Investing in <a href="http://www.imdb.com/title/tt0098382/quotes?qt0395324">the right tool for the right job</a> is one of the most important investments you can make, but is a mechanical pencil the best we can do?</p>
<p>Most of my <a href="http://whatpulse.org/stats/users/286092/">writing output is digital</a> nowadays, so my &#8220;analog&#8221; writing needs center around tactical writing situations. I still prefer a mechanical pencil and paper for mathematics work, note-taking, and jotting down reminders. Even though I carry a netbook most days, pencil and paper affords me maximum freedom to arrange and annotate notes just so, with drawings and diagrams requiring no additional effort.</p>
<p>This works out pretty well, but I have a few issues with mechanical pencils: broken leads, incessant clicking to dispense more lead, and a tendency to make noise due to the leads rolling around inside the chamber. Also, my favorite mechanical pencil, a <a href="http://www.staples.com/Pentel-Quicker-Clicker-Automatic-Pencils-.5mm-Smoke-Barrel/product-nr_499731">Pentel 0.5 mm</a>, has a relatively slender profile and causes a little more fatigue than I&#8217;d like, especially compared to the <a href="http://www.staples.com/Pilot-G-2-Retractable-Gel-Ink-Pens-Fine-Point-Black-Dozen/product_429174">Pilot G-2 fine point</a> I enjoy. Even though I have no reason to ditch my beloved Pentels, I owe it to myself to see what&#8217;s out there.</p>
<p>Enter the <a href="http://blog.sharpie.com/2010/08/introducing-the-new-sharpie-liquid-pencil/">Sharpie Liquid Pencil</a>. This curious device writes like a pen, but its output is equivalent to #2 pencil lead and is erasable as such. While <a href="http://www.amazon.com/Liquaphite-Unleaded-Patented-Technology-Refills/dp/B002S5KRPS/">Pentech&#8217;s Liquaphite</a> has been on the market for some time now, the Sharpie&#8217;s major advantage is price: about $2 each, versus about $50 each for the Pentech.</p>
<h3>The Physics</h3>
<p><a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342943233.jpg.html" target="_blank"><img style="float: right;" src="http://photo.hoopycat.com/d/17102-4/28342943233.jpg" alt="Liquid pencils in their natural habitat" width="40%" /></a>I ordered a two-pack of Sharpie Liquid Pencils from Amazon.com, for about $6 with tax. After a brief backorder, the devices arrived. The two-pack comes with a set of six bonus erasers, which are <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342900993.jpg.html" target="_blank">loosely floating around inside the blister pack</a> (I had to do a brief search and rescue operation after opening the package).</p>
<p>It is a bog-standard retail package of the sort you&#8217;ve all seen before, so I immediately popped it open and weighed it using the hoopycat.com scales of science. The liquid pencil <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342862721.jpg.html" target="_blank">weighed in at 12 grams</a>, compared to <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342838145.jpg.html" target="_blank">11 grams for my recently-reloaded Pentel</a> and <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342810113.jpg.html" target="_blank">10 grams for my Pilot G-2</a>. I would consider this reasonable, within the expected error range of the scale.</p>
<p>As far as handfeel and geometry go, the Sharpie is almost indistinguishable from the Pilot G-2. It feels solid, has good balance, and has the padded grip right where I like it. The grip lacks the texture of the Pilot, but this is not a dealbreaker for me.</p>
<p>Curiously, the Sharpie rattles when shaken. This is due to the clicker retraction mechanism, which involves the entire top quarter of the barrel. Unfortunately, there&#8217;s too much mass there and too many places for plastic-on-plastic contact, so its operation is not completely silent. A smaller &#8220;button,&#8221; such as on the G-2, would have likely improved the situation.</p>
<h3>The Output</h3>
<p><a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342613121.jpg.html" target="_blank"><img style="float: right;" src="http://photo.hoopycat.com/d/17147-2/28342613121.jpg" alt="Comparison writing test" width="50%" /></a>Alas, my tests revealed that the Sharpie Liquid Pencil&#8217;s writing quality is more like that of a cheap ballpoint pen than a quality mechanical pencil. I tested on a variety of surfaces, including a <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342788993.jpg.html" target="_blank">sticky note</a>, some <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342725889.jpg.html" target="_blank">copy paper</a>, the backs of the <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342702081.jpg.html" target="_blank">packing slip</a> and <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342685313.jpg.html" target="_blank">shipping envelope</a>, a sheet of <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342663553.jpg.html" target="_blank">newsprint</a>, and the <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342637441.jpg.html" target="_blank">writing pads I use for note-taking</a>. Overall, I found the marks to be spotty and irregular, as if the flow rate through the ball were inconsistent depending on angle and velocity.</p>
<p>This is a curse that befalls a number of pens, but is certainly an unwelcome introduction to the pencil. I think this, above all, will be the dealbreaker for notes and homework. While the liquid pencil&#8217;s <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342590209.jpg.html" target="_blank">quality improved with greater downforce and velocity</a>, this is not acceptable for lectures due to the resulting fatigue.</p>
<p>A <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/writing-example.png.html" target="_blank">high-resolution scan of the writing pad test</a> is available in the <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/" target="_blank">photo gallery</a>, along with a number of other images.</p>
<h3>Hiding the Evidence</h3>
<p><a title="Third row: erased with Mars eraser; fourth row: erased with built-in eraser" href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342747137.jpg.html" target="_blank"><img style="float: right;" src="http://photo.hoopycat.com/d/17129-2/28342747137.jpg" alt="Erasing test" width="50%" /></a>The ability to erase is one of the key features of a pencil, and in this category, the Sharpie is no slouch. The built-in eraser erased the text from a post-it note perfectly, but my standard <a href="http://www.amazon.com/Mars-White-Pencil-Eraser-Four/dp/B00006IFAN/" target="_blank">Staedtler Mars</a> plastic eraser left a little bit behind. In the image on the right, the third row was erased with the Staedtler, and the fourth was with the built-in eraser.</p>
<p>One downside to the built-in eraser: it goes fast. I had a noticeable bevel on it from just erasing two words, and I&#8217;m not entirely sure it would survive my typical sentence.</p>
<p>After 24 hours at room temperature, marks were essentially un-erasable by either eraser. They just get a bit lighter without fully disappearing.</p>
<h3>Unsuccessful Smear Campaign</h3>
<p>My more sinister colleagues often worry about their clumsy left hands smearing ink from particularly juicy specimens. While it is harder than you&#8217;d think to write left-handed (I hear only 10% of people can do it), I did try writing backwards to no avail. I eventually gave up, wrote a chunk of text, and then dragged the edge of my hand across it.</p>
<p style="text-align: center; "><a title="Well that's a drag." href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342569089.jpg.html" target="_blank"><img style="vertical-align: middle;" src="http://photo.hoopycat.com/d/17153-2/28342569089.jpg" alt="Skin-on-paper drag test" width="80%" /></a></p>
<p style="text-align: left; ">I sure wasn&#8217;t expecting that to happen.</p>
<p style="text-align: left; ">Rather than smearing, the writing disappeared with about as much effectiveness as my Mars eraser! It appeared as a <a href="http://photo.hoopycat.com/v/SharpieLiquidPencil/28342552705.jpg.html" target="_blank">black grit on the edge of my hand</a>, which wouldn&#8217;t wipe off (or erase off), but did come off nicely with soap and water. Mind you, I was dragging my hand pretty hard and pretty much trying to get a reaction out of it. If you&#8217;re left-handed and writing normally, it probably won&#8217;t be a problem.</p>
<h3>Overall</h3>
<p>Well, they gave it a good shot. I like the idea in theory, but the execution could use some work. The cheap-sounding rattle when shaken, the inconsistent liquid graphite flow, and the poor erasability with the Mars plastic eraser limit it to occasional use at this time. I look forward to future development in this field, but I&#8217;m not putting away my Pentel just yet.</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/08/review-sharpie-liquid-pencil">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/08/review-sharpie-liquid-pencil#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=319</wfw:commentRss>
		</item>
				<item>
			<title>Hanging out with my PEAPs: Wireless Access Control with IEEE 802.1x, PEAP, and RADIUS</title>
			<link>http://blog.hoopycat.com/2010/08/wireless-access-control-with-ieee-802-1x-peap-and-radius</link>
			<pubDate>Sun, 15 Aug 2010 14:53:17 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Howto</category>			<guid isPermaLink="false">318@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;I&amp;#8217;ve been having some weird kernel lockup problems when using &lt;a href=&quot;http://www.rit.edu/its/services/wireless/wpafaq.html&quot;&gt;the authenticated WPA2 network at RIT&lt;/a&gt;. &amp;#160;Since I can&amp;#8217;t effectively bring my kernel bug&amp;#160;&lt;a href=&quot;http://beeradvocate.com/beer/profile/710/36010&quot;&gt;troubleshooting tools&lt;/a&gt; to campus, I decided I needed to bring the wireless network home. &amp;#160;This meant converting the home wireless network from the usual shared-secret configuration to a &lt;a href=&quot;http://wiki.freeradius.org/Protected_Extensible_Authentication_Protocol&quot;&gt;Protected Extensible Authentication Protocol&lt;/a&gt; (PEAP)-based system.&lt;/p&gt;
&lt;h3&gt;Access Point Configuration&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;&lt;img style=&quot;float: right;&quot; src=&quot;http://photo.hoopycat.com/d/17083-3/27568562817.jpg&quot; alt=&quot;Belkin F5D7230-4 in its natural habitat&quot; width=&quot;266&quot; height=&quot;200&quot; /&gt;My access point is a Belkin F5D7230-4, a humble piece of crap that I wouldn&amp;#8217;t recommend unless you enjoy rebooting or power-cycling network infrastructure. &amp;#160;What did I do wrong to get cursed with such terrible wireless networking problems?&lt;/p&gt;
&lt;p&gt;I digress.&lt;/p&gt;
&lt;p&gt;The access point is set up with Channel and SSID configured in a working fashion, along with Use as Access Point and System Settings adjusted to disable NAT and give the access point a usable LAN IP (192.168.1.2). &amp;#160;The real magic is under the Security tab.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allowed Client Type: WPA2 Only&lt;/li&gt;
&lt;li&gt;Authentication: 802.1X&lt;/li&gt;
&lt;li&gt;Session Idle Timeout: 0&lt;/li&gt;
&lt;li&gt;Re-Authentication Period: 0&lt;/li&gt;
&lt;li&gt;Quiet Period: 10&lt;/li&gt;
&lt;li&gt;Server-IP: 192.168.1.10&lt;/li&gt;
&lt;li&gt;Server-Port: 1812&lt;/li&gt;
&lt;li&gt;Secret Key: a long, random string used as a shared secret with the RADIUS server&lt;/li&gt;
&lt;li&gt;NAS-ID: wifi-sodtech1 &amp;#160;(I&amp;#8217;m an optimist)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this case, 192.168.1.10 is the IP address of a local server that I&amp;#8217;m going to use for RADIUS. &amp;#160;The RADIUS server doesn&amp;#8217;t have to be local, but it should be reliably reachable.&lt;/p&gt;
&lt;h3&gt;FreeRADIUS&lt;/h3&gt;
&lt;p&gt;Next thing you will need is a RADIUS server. &amp;#160;I chose FreeRADIUS as the current best-of-breed RADIUS server for this application, since it supports EAP &amp;#8220;out of the box&amp;#8221; and has a configuration format much less treacherous than my last RADIUS server. &amp;#160;If you are looking to use your distribution&amp;#8217;s packages, note that &lt;a href=&quot;http://serverfault.com/questions/47815/setting-up-radius-ldap-for-wpa2-on-ubuntu&quot;&gt;FreeRADIUS 2.1.8 or above is required&lt;/a&gt;, which means Ubuntu 10.04 LTS (Lucid) is the way to go.&lt;/p&gt;
&lt;p&gt;To install it: &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;apt-get install freeradius freeradius-mysql&lt;/span&gt;. &amp;#160;Ding, fries are done.&lt;/p&gt;
&lt;p&gt;After you install it, the first thing you want to do is add a test user and try it out. &amp;#160;FreeRADIUS has an &lt;a href=&quot;http://wiki.freeradius.org/Basic_configuration_HOWTO&quot;&gt;excellent introduction to this process&lt;/a&gt; on their wiki. &amp;#160;Note that you can certainly use the &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;users&lt;/span&gt; file to maintain your user&amp;#8217;s credentials: it&amp;#8217;s quick, it&amp;#8217;s easy, and it works just fine. &amp;#160;I chose to use a MySQL database, however, since I eventually want to make a pretty web front end for managing users. &amp;#160;But we&amp;#8217;ll get there.&lt;/p&gt;
&lt;p&gt;An important thing to note: FreeRADIUS &lt;a href=&quot;http://deployingradius.com/documents/protocols/oracles.html&quot;&gt;must have access to the cleartext&lt;/a&gt; version of the password in this scenario. &amp;#160;It cannot do what it needs to do with a crypted or hashed password. &amp;#160;This may be a problem in some circumstances. &amp;#160;MSCHAPv2 does include mechanisms for challenge-response authentication without cleartext being stored on the server or transported over the network, most commonly implemented by &lt;a href=&quot;http://deployingradius.com/documents/configuration/active_directory.html&quot;&gt;using Active Directory as an authentication oracle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next thing you will need to do is add an entry to &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;clients.conf&lt;/span&gt; for your access point. &amp;#160;Based upon the well-documented entry for the localhost test client, I created a client stanza for my access point:&lt;/p&gt;
&lt;p&gt;&lt;script src=&quot;http://gist.github.com/525614.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;I also chose to change the logging from &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;destination = files&lt;/span&gt; to &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;destination = syslog&lt;/span&gt;, to reduce log file creep. &amp;#160;And, just for paranoia&amp;#8217;s sake, I changed the secret for the localhost test client. &amp;#160;At this point, restart your FreeRADIUS server, reboot your access point, and create a new connection from your laptop.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img style=&quot;vertical-align: middle;&quot; src=&quot;http://drop.hoopycat.com/wifi-wpa2-peap-ubuntu.png&quot; alt=&quot;Wireless configuration for PEAP on Ubuntu + Network Manager&quot; width=&quot;230&quot; height=&quot;230&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Easy as pie. &amp;#160;Note that the CA Certificate option on your client should be left blank at this point, because you&amp;#8217;re using the standard auto-generated SSL certificate.&lt;/p&gt;
&lt;h3&gt;A &amp;#8220;real&amp;#8221; SSL Certificate&lt;/h3&gt;
&lt;p&gt;To generate a new one, I use DigiCert&amp;#8217;s nifty &lt;a href=&quot;https://www.digicert.com/easy-csr/openssl.htm&quot;&gt;OpenSSL CSR Wizard&lt;/a&gt; to create an &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;openssl&lt;/span&gt; command line. &amp;#160;For the Common Name, I chose &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;wifi.sodtech.net&lt;/span&gt;, although it doesn&amp;#8217;t really matter as long as you can get a certificate signed to that CN. &amp;#160;I then sent the resultant CSR to &lt;a href=&quot;http://www.cacert.org/&quot;&gt;CAcert.org&lt;/a&gt;, which sent a signed certificate back. &amp;#160;You could, of course, use a local CA or a commercial CA depending on your situation. &amp;#160;It&amp;#8217;s pretty much the same as setting up an SSL&amp;#8217;d web server.&lt;/p&gt;
&lt;p&gt;I stuck the .crt in &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;/etc/ssl/certs/&lt;/span&gt; and the .key in &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;/etc/ssl/private/&lt;/span&gt;, adjusting permissions as appropriate. &amp;#160;I then adjusted the symlinks in &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;/etc/freeradius/certs/&lt;/span&gt; to point at these files instead of the default snake oil certificate. &amp;#160;Upon restart of FreeRADIUS, I could point my laptop&amp;#8217;s configuration at &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;/etc/ssl/certs/cacert.org.pem&lt;/span&gt; and verify that I wasn&amp;#8217;t attaching to some rogue network. &amp;#160;Hooray!&lt;/p&gt;
&lt;h3&gt;Storing Credentials in a Database&lt;/h3&gt;
&lt;p&gt;There&amp;#8217;s nothing wrong with using the &lt;span style=&quot;font-family: 'andale mono', times;&quot;&gt;users&lt;/span&gt; file to store your users, especially if you only have a few. &amp;#160;But, if you have a lot of users or want to automate various things, some sort of database backend is crucial. &amp;#160;FreeRADIUS supports &lt;a href=&quot;http://wiki.freeradius.org/Rlm_sql&quot;&gt;a wide variety of SQL servers&lt;/a&gt;, along with &lt;a href=&quot;http://wiki.freeradius.org/Rlm_ldap&quot;&gt;LDAP&lt;/a&gt; and &lt;a href=&quot;http://deployingradius.com/documents/configuration/active_directory.html&quot;&gt;Active Directory&lt;/a&gt;. &amp;#160;All it needs is to know how to get a cleartext password for a particular username (or some other way to get a yes/no answer for a session with the information it has, which is possible with AD).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://wiki.freeradius.org/SQL_HOWTO&quot;&gt;FreeRADIUS wiki covers SQL configuration&lt;/a&gt; nicely, including importing the schema found in &lt;span style=&quot;font-family: mceinline;&quot;&gt;/etc/freeradius/sql/mysql/schema.sql&lt;/span&gt;, but here&amp;#8217;s the summary of my configuration changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;radiusd.conf     
&lt;ul&gt;
&lt;li&gt;modules {     
&lt;ul&gt;
&lt;li&gt;Uncomment $INCLUDE sql.conf&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sites-available/default     
&lt;ul&gt;
&lt;li&gt;authorize {     
&lt;ul&gt;
&lt;li&gt;comment out unix (optional)&lt;/li&gt;
&lt;li&gt;uncomment sql&lt;/li&gt;
&lt;li&gt;comment out expiration, logintime (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;accounting {     
&lt;ul&gt;
&lt;li&gt;comment out unix (optional)&lt;/li&gt;
&lt;li&gt;comment out radutmp (optional)&lt;/li&gt;
&lt;li&gt;uncomment sql&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;post-auth {     
&lt;ul&gt;
&lt;li&gt;uncomment sql&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sites-available/inner-tunnel     
&lt;ul&gt;
&lt;li&gt;authorize {     
&lt;ul&gt;
&lt;li&gt;comment out unix (optional)&lt;/li&gt;
&lt;li&gt;uncomment sql&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;post-auth {     
&lt;ul&gt;
&lt;li&gt;uncomment sql&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;sql.conf     
&lt;ul&gt;
&lt;li&gt;In sql{}, change the server credentials as required.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;users     
&lt;ul&gt;
&lt;li&gt;Comment out the original test user!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And there you go.&lt;/p&gt;
&lt;h3&gt;Is PEAP for you?&lt;/h3&gt;
&lt;p&gt;Probably not. &amp;#160;However, when I set out to configure it, I was expecting it to be a lot more complicated than it was. &amp;#160;If you have an access point that speaks 802.1X and RADIUS, you might want to give this a try to add it to your box of enterprise tools. &amp;#160;For a security-minded organization, this can be one part of reducing the risk of a wireless network. &amp;#160;On a home network, however, it is probably overkill.&lt;/p&gt;
&lt;p&gt;Oh&amp;#8230; and the kernel lockup bug? &amp;#160;Doesn&amp;#8217;t happen here. &amp;#160;Dang.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Edit 2010/08/15: Clarified cleartext password requirement; added mention of (and links to) Active Directory-related configuration.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/08/wireless-access-control-with-ieee-802-1x-peap-and-radius&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I&#8217;ve been having some weird kernel lockup problems when using <a href="http://www.rit.edu/its/services/wireless/wpafaq.html">the authenticated WPA2 network at RIT</a>. &#160;Since I can&#8217;t effectively bring my kernel bug&#160;<a href="http://beeradvocate.com/beer/profile/710/36010">troubleshooting tools</a> to campus, I decided I needed to bring the wireless network home. &#160;This meant converting the home wireless network from the usual shared-secret configuration to a <a href="http://wiki.freeradius.org/Protected_Extensible_Authentication_Protocol">Protected Extensible Authentication Protocol</a> (PEAP)-based system.</p>
<h3>Access Point Configuration</h3>
<p style="text-align: left;"><img style="float: right;" src="http://photo.hoopycat.com/d/17083-3/27568562817.jpg" alt="Belkin F5D7230-4 in its natural habitat" width="266" height="200" />My access point is a Belkin F5D7230-4, a humble piece of crap that I wouldn&#8217;t recommend unless you enjoy rebooting or power-cycling network infrastructure. &#160;What did I do wrong to get cursed with such terrible wireless networking problems?</p>
<p>I digress.</p>
<p>The access point is set up with Channel and SSID configured in a working fashion, along with Use as Access Point and System Settings adjusted to disable NAT and give the access point a usable LAN IP (192.168.1.2). &#160;The real magic is under the Security tab.</p>
<ul>
<li>Allowed Client Type: WPA2 Only</li>
<li>Authentication: 802.1X</li>
<li>Session Idle Timeout: 0</li>
<li>Re-Authentication Period: 0</li>
<li>Quiet Period: 10</li>
<li>Server-IP: 192.168.1.10</li>
<li>Server-Port: 1812</li>
<li>Secret Key: a long, random string used as a shared secret with the RADIUS server</li>
<li>NAS-ID: wifi-sodtech1 &#160;(I&#8217;m an optimist)</li>
</ul>
<p>In this case, 192.168.1.10 is the IP address of a local server that I&#8217;m going to use for RADIUS. &#160;The RADIUS server doesn&#8217;t have to be local, but it should be reliably reachable.</p>
<h3>FreeRADIUS</h3>
<p>Next thing you will need is a RADIUS server. &#160;I chose FreeRADIUS as the current best-of-breed RADIUS server for this application, since it supports EAP &#8220;out of the box&#8221; and has a configuration format much less treacherous than my last RADIUS server. &#160;If you are looking to use your distribution&#8217;s packages, note that <a href="http://serverfault.com/questions/47815/setting-up-radius-ldap-for-wpa2-on-ubuntu">FreeRADIUS 2.1.8 or above is required</a>, which means Ubuntu 10.04 LTS (Lucid) is the way to go.</p>
<p>To install it: <span style="font-family: 'andale mono', times;">apt-get install freeradius freeradius-mysql</span>. &#160;Ding, fries are done.</p>
<p>After you install it, the first thing you want to do is add a test user and try it out. &#160;FreeRADIUS has an <a href="http://wiki.freeradius.org/Basic_configuration_HOWTO">excellent introduction to this process</a> on their wiki. &#160;Note that you can certainly use the <span style="font-family: 'andale mono', times;">users</span> file to maintain your user&#8217;s credentials: it&#8217;s quick, it&#8217;s easy, and it works just fine. &#160;I chose to use a MySQL database, however, since I eventually want to make a pretty web front end for managing users. &#160;But we&#8217;ll get there.</p>
<p>An important thing to note: FreeRADIUS <a href="http://deployingradius.com/documents/protocols/oracles.html">must have access to the cleartext</a> version of the password in this scenario. &#160;It cannot do what it needs to do with a crypted or hashed password. &#160;This may be a problem in some circumstances. &#160;MSCHAPv2 does include mechanisms for challenge-response authentication without cleartext being stored on the server or transported over the network, most commonly implemented by <a href="http://deployingradius.com/documents/configuration/active_directory.html">using Active Directory as an authentication oracle</a>.</p>
<p>The next thing you will need to do is add an entry to <span style="font-family: 'andale mono', times;">clients.conf</span> for your access point. &#160;Based upon the well-documented entry for the localhost test client, I created a client stanza for my access point:</p>
<p><script src="http://gist.github.com/525614.js"></script></p>
<p>I also chose to change the logging from <span style="font-family: 'andale mono', times;">destination = files</span> to <span style="font-family: 'andale mono', times;">destination = syslog</span>, to reduce log file creep. &#160;And, just for paranoia&#8217;s sake, I changed the secret for the localhost test client. &#160;At this point, restart your FreeRADIUS server, reboot your access point, and create a new connection from your laptop.</p>
<p style="text-align: center;"><img style="vertical-align: middle;" src="http://drop.hoopycat.com/wifi-wpa2-peap-ubuntu.png" alt="Wireless configuration for PEAP on Ubuntu + Network Manager" width="230" height="230" /></p>
<p>Easy as pie. &#160;Note that the CA Certificate option on your client should be left blank at this point, because you&#8217;re using the standard auto-generated SSL certificate.</p>
<h3>A &#8220;real&#8221; SSL Certificate</h3>
<p>To generate a new one, I use DigiCert&#8217;s nifty <a href="https://www.digicert.com/easy-csr/openssl.htm">OpenSSL CSR Wizard</a> to create an <span style="font-family: 'andale mono', times;">openssl</span> command line. &#160;For the Common Name, I chose <span style="font-family: 'andale mono', times;">wifi.sodtech.net</span>, although it doesn&#8217;t really matter as long as you can get a certificate signed to that CN. &#160;I then sent the resultant CSR to <a href="http://www.cacert.org/">CAcert.org</a>, which sent a signed certificate back. &#160;You could, of course, use a local CA or a commercial CA depending on your situation. &#160;It&#8217;s pretty much the same as setting up an SSL&#8217;d web server.</p>
<p>I stuck the .crt in <span style="font-family: 'andale mono', times;">/etc/ssl/certs/</span> and the .key in <span style="font-family: 'andale mono', times;">/etc/ssl/private/</span>, adjusting permissions as appropriate. &#160;I then adjusted the symlinks in <span style="font-family: 'andale mono', times;">/etc/freeradius/certs/</span> to point at these files instead of the default snake oil certificate. &#160;Upon restart of FreeRADIUS, I could point my laptop&#8217;s configuration at <span style="font-family: 'andale mono', times;">/etc/ssl/certs/cacert.org.pem</span> and verify that I wasn&#8217;t attaching to some rogue network. &#160;Hooray!</p>
<h3>Storing Credentials in a Database</h3>
<p>There&#8217;s nothing wrong with using the <span style="font-family: 'andale mono', times;">users</span> file to store your users, especially if you only have a few. &#160;But, if you have a lot of users or want to automate various things, some sort of database backend is crucial. &#160;FreeRADIUS supports <a href="http://wiki.freeradius.org/Rlm_sql">a wide variety of SQL servers</a>, along with <a href="http://wiki.freeradius.org/Rlm_ldap">LDAP</a> and <a href="http://deployingradius.com/documents/configuration/active_directory.html">Active Directory</a>. &#160;All it needs is to know how to get a cleartext password for a particular username (or some other way to get a yes/no answer for a session with the information it has, which is possible with AD).</p>
<p>The <a href="http://wiki.freeradius.org/SQL_HOWTO">FreeRADIUS wiki covers SQL configuration</a> nicely, including importing the schema found in <span style="font-family: mceinline;">/etc/freeradius/sql/mysql/schema.sql</span>, but here&#8217;s the summary of my configuration changes:</p>
<ul>
<li>radiusd.conf     
<ul>
<li>modules {     
<ul>
<li>Uncomment $INCLUDE sql.conf</li>
</ul>
</li>
</ul>
</li>
<li>sites-available/default     
<ul>
<li>authorize {     
<ul>
<li>comment out unix (optional)</li>
<li>uncomment sql</li>
<li>comment out expiration, logintime (optional)</li>
</ul>
</li>
<li>accounting {     
<ul>
<li>comment out unix (optional)</li>
<li>comment out radutmp (optional)</li>
<li>uncomment sql</li>
</ul>
</li>
<li>post-auth {     
<ul>
<li>uncomment sql</li>
</ul>
</li>
</ul>
</li>
<li>sites-available/inner-tunnel     
<ul>
<li>authorize {     
<ul>
<li>comment out unix (optional)</li>
<li>uncomment sql</li>
</ul>
</li>
<li>post-auth {     
<ul>
<li>uncomment sql</li>
</ul>
</li>
</ul>
</li>
<li>sql.conf     
<ul>
<li>In sql{}, change the server credentials as required.</li>
</ul>
</li>
<li>users     
<ul>
<li>Comment out the original test user!</li>
</ul>
</li>
</ul>
<p>And there you go.</p>
<h3>Is PEAP for you?</h3>
<p>Probably not. &#160;However, when I set out to configure it, I was expecting it to be a lot more complicated than it was. &#160;If you have an access point that speaks 802.1X and RADIUS, you might want to give this a try to add it to your box of enterprise tools. &#160;For a security-minded organization, this can be one part of reducing the risk of a wireless network. &#160;On a home network, however, it is probably overkill.</p>
<p>Oh&#8230; and the kernel lockup bug? &#160;Doesn&#8217;t happen here. &#160;Dang.</p>
<hr />
<p>Edit 2010/08/15: Clarified cleartext password requirement; added mention of (and links to) Active Directory-related configuration.</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/08/wireless-access-control-with-ieee-802-1x-peap-and-radius">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/08/wireless-access-control-with-ieee-802-1x-peap-and-radius#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=318</wfw:commentRss>
		</item>
				<item>
			<title>RIT's 19th Undergraduate Research and Innovation Symposium</title>
			<link>http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium</link>
			<pubDate>Fri, 13 Aug 2010 13:40:25 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">School</category>			<guid isPermaLink="false">317@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;&lt;a href=&quot;http://www.rit.edu/&quot;&gt;RIT&lt;/a&gt; hosted their 19th annual &lt;a href=&quot;http://www.rit.edu/cos/undergraduateresearchsymposium/&quot;&gt;Undergraduate Research and Innovation Symposium&lt;/a&gt; on Friday, August 13,&amp;#160;showcasing over 100 undergraduate research projects across (and between) all of RIT&amp;#8217;s disciplines. &amp;#160;I figured it was well worth waking up early on a Friday for&amp;#160;the promise of a free lunch and an opportunity to test my&amp;#160;&lt;a href=&quot;http://maps.google.com/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Clinton+%26+Asbury,+Rochester,+NY+14620+(Clinton+%26+Bly)&amp;amp;daddr=RIT+Gleason+Circle&amp;amp;hl=en&amp;amp;geocode=Fd84kgIdogJg-ymzYaUbF7XWiTEDjmkm6r6Etw%3BFWFmkQIdesJe-yl_2G59YEzRiTHXTgODprKX8g&amp;amp;mra=ls&amp;amp;dirflg=r&amp;amp;ttype=arr&amp;amp;date=08%2F13%2F10&amp;amp;time=8:00am&amp;amp;noexp=0&amp;amp;noal=0&amp;amp;sort=&amp;amp;sll=43.11126,-77.634888&amp;amp;sspn=0.091732,0.220757&amp;amp;ie=UTF8&amp;amp;ll=43.118778,-77.634888&amp;amp;spn=0.091721,0.220757&amp;amp;z=12&amp;amp;start=0&quot;&gt;arrive-by-8am bus routing&lt;/a&gt; to RIT, but the quality of the research and presentations certainly surpassed my expectations.&lt;/p&gt;
&lt;p&gt;With so many presentations, the sessions were split across five tracks, with a ten-minute time limit per presentation. &amp;#160;Fortunately, they were grouped logically: I could avoid the ones that would go over my head, saving me from falling asleep.&lt;/p&gt;
&lt;p&gt;My morning tracks were focused on the humanistic applications of technology, with presentations focusing on urban gardening, data visualization, improved power wheelchairs and cookstoves, and a plot to turn &lt;a href=&quot;http://en.wikipedia.org/wiki/Containerization&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;shipping containers&lt;/span&gt;&lt;/a&gt; into disaster housing.&lt;/p&gt;
&lt;p&gt;Over lunch, RIT alum Jennifer Indovina, CEO and co-founder of &lt;a href=&quot;http://www.tenrehte.com/&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Tenrehte Technologies, Inc.&lt;/span&gt;&lt;/a&gt;, presented a buoyant keynote address recounting her startup&amp;#8217;s experience creating the &lt;a href=&quot;http://www.tenrehte.com/products/&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PICOwatt&lt;/span&gt;&lt;/a&gt; smart plug device. &amp;#160;Tenrehte&amp;#8217;s journey (that&amp;#8217;s &amp;#8220;ethernet,&amp;#8221; backwards) from nascent idea to underdog winner of 2010 CES Best of Show (&quot;green&amp;#8221; category) was sudden and unexpected: when your CES contingent consists of two people and you&amp;#8217;re going up against Google and Microsoft, you don&amp;#8217;t expect to bring home the hardware. &amp;#160;But they did. &amp;#160;Jennifer attributes it to the PICOwatt being a real product designed to directly improve people&amp;#8217;s lives, rather than just being a vigorous marketing plan.&lt;/p&gt;
&lt;p&gt;The afternoon sessions included &lt;a href=&quot;http://www.youtube.com/watch?v=ZbOrEpXb2AQ&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;an awesome video by Qian Yi Lau Li&lt;/span&gt;&lt;/a&gt;, documenting the power wheelchair project presented previously, along with a dirigible-based wind turbine system. &amp;#160;A pair of projects highlighted the challenges of developing applications for the OLPC XO laptop platform. &amp;#160;The final session of the afternoon featured instructional interactivity through the digital immersive cube, bringing better techniques to interactive physics experiments, and a &lt;a href=&quot;http://en.wikipedia.org/wiki/Microelectromechanical_systems&quot;&gt;MEMS&lt;/a&gt; thermally-actuated switch.&lt;/p&gt;
&lt;p&gt;After the break, a list of the presentations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium#more317&quot;&gt;Read more &amp;raquo;&lt;/a&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://www.rit.edu/">RIT</a> hosted their 19th annual <a href="http://www.rit.edu/cos/undergraduateresearchsymposium/">Undergraduate Research and Innovation Symposium</a> on Friday, August 13,&#160;showcasing over 100 undergraduate research projects across (and between) all of RIT&#8217;s disciplines. &#160;I figured it was well worth waking up early on a Friday for&#160;the promise of a free lunch and an opportunity to test my&#160;<a href="http://maps.google.com/maps?f=d&amp;source=s_d&amp;saddr=Clinton+%26+Asbury,+Rochester,+NY+14620+(Clinton+%26+Bly)&amp;daddr=RIT+Gleason+Circle&amp;hl=en&amp;geocode=Fd84kgIdogJg-ymzYaUbF7XWiTEDjmkm6r6Etw%3BFWFmkQIdesJe-yl_2G59YEzRiTHXTgODprKX8g&amp;mra=ls&amp;dirflg=r&amp;ttype=arr&amp;date=08%2F13%2F10&amp;time=8:00am&amp;noexp=0&amp;noal=0&amp;sort=&amp;sll=43.11126,-77.634888&amp;sspn=0.091732,0.220757&amp;ie=UTF8&amp;ll=43.118778,-77.634888&amp;spn=0.091721,0.220757&amp;z=12&amp;start=0">arrive-by-8am bus routing</a> to RIT, but the quality of the research and presentations certainly surpassed my expectations.</p>
<p>With so many presentations, the sessions were split across five tracks, with a ten-minute time limit per presentation. &#160;Fortunately, they were grouped logically: I could avoid the ones that would go over my head, saving me from falling asleep.</p>
<p>My morning tracks were focused on the humanistic applications of technology, with presentations focusing on urban gardening, data visualization, improved power wheelchairs and cookstoves, and a plot to turn <a href="http://en.wikipedia.org/wiki/Containerization"><span style="color: #000000;">shipping containers</span></a> into disaster housing.</p>
<p>Over lunch, RIT alum Jennifer Indovina, CEO and co-founder of <a href="http://www.tenrehte.com/"><span style="color: #000000;">Tenrehte Technologies, Inc.</span></a>, presented a buoyant keynote address recounting her startup&#8217;s experience creating the <a href="http://www.tenrehte.com/products/"><span style="color: #000000;">PICOwatt</span></a> smart plug device. &#160;Tenrehte&#8217;s journey (that&#8217;s &#8220;ethernet,&#8221; backwards) from nascent idea to underdog winner of 2010 CES Best of Show ("green&#8221; category) was sudden and unexpected: when your CES contingent consists of two people and you&#8217;re going up against Google and Microsoft, you don&#8217;t expect to bring home the hardware. &#160;But they did. &#160;Jennifer attributes it to the PICOwatt being a real product designed to directly improve people&#8217;s lives, rather than just being a vigorous marketing plan.</p>
<p>The afternoon sessions included <a href="http://www.youtube.com/watch?v=ZbOrEpXb2AQ"><span style="color: #000000;">an awesome video by Qian Yi Lau Li</span></a>, documenting the power wheelchair project presented previously, along with a dirigible-based wind turbine system. &#160;A pair of projects highlighted the challenges of developing applications for the OLPC XO laptop platform. &#160;The final session of the afternoon featured instructional interactivity through the digital immersive cube, bringing better techniques to interactive physics experiments, and a <a href="http://en.wikipedia.org/wiki/Microelectromechanical_systems">MEMS</a> thermally-actuated switch.</p>
<p>After the break, a list of the presentations.</p>
<p><a href="http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium#more317">Read more &raquo;</a><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/08/rit-undergraduate-research-and-innovation-symposium#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=317</wfw:commentRss>
		</item>
				<item>
			<title>Voicemail notifications with Asterisk and Google Voice</title>
			<link>http://blog.hoopycat.com/2010/07/voicemail-notifications-with-asterisk-and-google-voice</link>
			<pubDate>Thu, 29 Jul 2010 23:12:07 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Geekery</category>
<category domain="alt">Howto</category>			<guid isPermaLink="false">316@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;&lt;strong&gt;We use &lt;a href=&quot;http://www.asterisk.org/&quot;&gt;Asterisk&lt;/a&gt;&lt;/strong&gt; 1.4 for our home telephone system, with &lt;a href=&quot;http://www.freepbx.org/&quot;&gt;FreePBX&lt;/a&gt; 2.7 as the front end.&amp;#160; This allows great flexibility to do strange things, although a home PBX is certainly a little overkill for a two-person, three-bedroom urban house.&lt;/p&gt;
&lt;p&gt;Recently, I decided to give &lt;a href=&quot;https://www.google.com/voice&quot;&gt;Google Voice&lt;/a&gt; a spin for voicemail processing.&amp;#160; I&amp;#8217;m using a single Google Voice account for my cellphone and home phone extension.&amp;#160; I&amp;#8217;m not going to elaborate on how the actual call forwarding to Google Voice is accomplished, but the &lt;strong&gt;key parts of the FreePBX and Google Voice configuration&lt;/strong&gt; are:&lt;/p&gt;
&lt;table border=&quot;0&quot; rules=&quot;all&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;strong&gt;FreePBX&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Misc Destination&lt;/strong&gt;: Google Voice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ring Group&lt;/strong&gt;: Destination if No Answer set to Misc Destination&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;strong&gt;Google Voice&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;strong&gt;All forwarding disabled&lt;/strong&gt; &amp;#8211; prevents loop&lt;/li&gt;
&lt;li&gt;Home &lt;strong&gt;phone number set as &amp;#8220;mobile&amp;#8221;&lt;/strong&gt; (&quot;other&amp;#8221; carrier, of course)&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To make the voicemail integration more seamless from my end, I decided that I &lt;strong&gt;needed to have two features&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Voicemail notifications on SIP phones&lt;/li&gt;
&lt;li&gt;Normal feature code to retrieve voicemail&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I couldn&amp;#8217;t completely gut the existing voicemail system, as my wife still uses it.&amp;#160; So, I had to improvise.&amp;#160; First, the &amp;#8220;easier&amp;#8221; of the two features:&lt;/p&gt;
&lt;h3&gt;Per-extension feature code handling&lt;/h3&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;FreePBX&amp;#8217;s structure is such that an&lt;strong&gt; administrator can override parts of the dialplan&lt;/strong&gt; if required.&amp;#160; This is one of those situations.&amp;#160; Into &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;extensions_override_freepbx.conf&lt;/span&gt;, I copied the existing context from &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;extensions_additional.conf&lt;/span&gt; and made a few modifications:&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;script src=&quot;http://gist.github.com/499571.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;On line 6, I added &lt;span style=&quot;background-color: #ccffcc;&quot;&gt;&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;GotoIf($[&quot;${AMPUSER}&amp;#8221; = &amp;#8220;103&amp;Prime;]?googryan)&lt;/span&gt;&lt;/span&gt;, which goes to the &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;googryan&lt;/span&gt; label if the caller is user 103 (me).&amp;#160; Then, I added lines 18 through 20 to the end, as the destination for &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;googryan&lt;/span&gt;.&amp;#160; The first plays a nice little message telling me to wait.&amp;#160; The second line is a little bit of Asterisk magic.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;I didn&amp;#8217;t want to have to hit * to get to Google Voice&amp;#8217;s PIN prompt, so I wanted Asterisk to hit * for me.&amp;#160; &lt;span style=&quot;background-color: #ccffcc;&quot;&gt;&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;Dial(Local/15855550000@from-internal,15,D(w*))&lt;/span&gt;&lt;/span&gt; does this by opening a channel to &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;15855550000@from-internal&lt;/span&gt; (thereby using the normal call routing rules), then it waits for a couple moments and hits * (that&amp;#8217;s the &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;D(w*)&lt;/span&gt; part).&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;This works out really well.&amp;#160; &lt;a href=&quot;http://theivrvoice.com/&quot;&gt;Allison Smith&lt;/a&gt; politely introduces me to &lt;a href=&quot;http://googlevoiceblog.blogspot.com/2010/06/new-voice-of-google-voice.html&quot;&gt;Kiki Baessell&lt;/a&gt;, who asks me for my PIN, and I&amp;#8217;m there.&amp;#160; Bam.&lt;/p&gt;
&lt;h3&gt;Voicemail notifications on SIP phones&lt;/h3&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;This is the more interesting of the two features.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;I&amp;#8217;m using &lt;a href=&quot;http://code.google.com/p/pygooglevoice/&quot;&gt;pygooglevoice&lt;/a&gt;, a library of &lt;strong&gt;Python bindings for the Google Voice API&lt;/strong&gt;.&amp;#160; Installing pygooglevoice was pretty easy: &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;sudo easy_install pygooglevoice&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;Once installed, check out the &lt;a href=&quot;http://sphinxdoc.github.com/pygooglevoice/&quot;&gt;documentation&lt;/a&gt; for some &lt;a href=&quot;http://sphinxdoc.github.com/pygooglevoice/examples.html&quot;&gt;example code&lt;/a&gt;.&amp;#160; I take that back, actually.&amp;#160; Check out the &lt;a href=&quot;http://sphinxdoc.github.com/pygooglevoice/scripts.html&quot;&gt;command line script&lt;/a&gt; first.&amp;#160; By typing &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;gvoice&lt;/span&gt; and entering your e-mail address and password, you get a &lt;strong&gt;delicious command line interface&lt;/strong&gt; to Google Voice.&amp;#160; Try &amp;#8220;&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;help&lt;/span&gt;&amp;#8221; if you&amp;#8217;re stumped.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;It turns out that getting the voicemail status from Google Voice was the easy part.&amp;#160; Telling Asterisk about it, however, was more difficult.&amp;#160; I could not find a mechanism where Asterisk could ask my program directly, so I decided to &lt;strong&gt;create fake &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;msg0000.txt&lt;/span&gt;&lt;/strong&gt;, &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;msg0001.txt&lt;/span&gt;, etc files in the actual voicemail folders to match the current number of voicemails.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;Being fancy, I also tried to make sure it would work &amp;#8220;seamlessly&amp;#8221; with Asterisk&amp;#8217;s own voicemail, just in case I need to use that for whatever reason.&amp;#160; I do this by considering any other files on that &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;msg####&lt;/span&gt; (such as a &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;msg####.wav&lt;/span&gt;) an indicator that it is an Asterisk-based voicemail and not one of our doppelgangers.&amp;#160; I hope Asterisk has the same courtesy.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;So, here&amp;#8217;s the code.&amp;#160; It sucks, of course, but it was an afternoon project.&amp;#160; So far, it&amp;#8217;s working good.&amp;#160; I&amp;#8217;m firing it from &lt;strong&gt;cron every three minutes&lt;/strong&gt;, which seems wasteful: I might change it to only check during times I&amp;#8217;m awake, since I won&amp;#8217;t hear the voicemail indicator when I&amp;#8217;m asleep.&amp;#160; But that&amp;#8217;s another project&amp;#8230;&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;script src=&quot;http://gist.github.com/499562.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/07/voicemail-notifications-with-asterisk-and-google-voice&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><strong>We use <a href="http://www.asterisk.org/">Asterisk</a></strong> 1.4 for our home telephone system, with <a href="http://www.freepbx.org/">FreePBX</a> 2.7 as the front end.&#160; This allows great flexibility to do strange things, although a home PBX is certainly a little overkill for a two-person, three-bedroom urban house.</p>
<p>Recently, I decided to give <a href="https://www.google.com/voice">Google Voice</a> a spin for voicemail processing.&#160; I&#8217;m using a single Google Voice account for my cellphone and home phone extension.&#160; I&#8217;m not going to elaborate on how the actual call forwarding to Google Voice is accomplished, but the <strong>key parts of the FreePBX and Google Voice configuration</strong> are:</p>
<table border="0" rules="all">
<tbody>
<tr>
<td style="text-align: center;"><span style="font-size: medium;"><strong>FreePBX</strong></span></td>
<td>
<ul>
<li><strong>Misc Destination</strong>: Google Voice</li>
<li><strong>Ring Group</strong>: Destination if No Answer set to Misc Destination</li>
</ul>
</td>
</tr>
<tr>
<td style="text-align: center;"><span style="font-size: medium;"><strong>Google Voice</strong></span></td>
<td>
<ul style="text-align: left;">
<li><strong>All forwarding disabled</strong> &#8211; prevents loop</li>
<li>Home <strong>phone number set as &#8220;mobile&#8221;</strong> ("other&#8221; carrier, of course)</li>
</ul>
</td>
</tr>
</tbody>
</table>
<p>To make the voicemail integration more seamless from my end, I decided that I <strong>needed to have two features</strong>:</p>
<ol>
<li>Voicemail notifications on SIP phones</li>
<li>Normal feature code to retrieve voicemail</li>
</ol>
<p>I couldn&#8217;t completely gut the existing voicemail system, as my wife still uses it.&#160; So, I had to improvise.&#160; First, the &#8220;easier&#8221; of the two features:</p>
<h3>Per-extension feature code handling</h3>
<p style="padding-left: 30px;">FreePBX&#8217;s structure is such that an<strong> administrator can override parts of the dialplan</strong> if required.&#160; This is one of those situations.&#160; Into <span style="font-family: courier new,courier;">extensions_override_freepbx.conf</span>, I copied the existing context from <span style="font-family: courier new,courier;">extensions_additional.conf</span> and made a few modifications:</p>
<p style="padding-left: 30px;"><script src="http://gist.github.com/499571.js"></script></p>
<p style="padding-left: 30px;">On line 6, I added <span style="background-color: #ccffcc;"><span style="font-family: courier new,courier;">GotoIf($["${AMPUSER}&#8221; = &#8220;103&Prime;]?googryan)</span></span>, which goes to the <span style="font-family: courier new,courier;">googryan</span> label if the caller is user 103 (me).&#160; Then, I added lines 18 through 20 to the end, as the destination for <span style="font-family: courier new,courier;">googryan</span>.&#160; The first plays a nice little message telling me to wait.&#160; The second line is a little bit of Asterisk magic.</p>
<p style="padding-left: 30px;">I didn&#8217;t want to have to hit * to get to Google Voice&#8217;s PIN prompt, so I wanted Asterisk to hit * for me.&#160; <span style="background-color: #ccffcc;"><span style="font-family: courier new,courier;">Dial(Local/15855550000@from-internal,15,D(w*))</span></span> does this by opening a channel to <span style="font-family: courier new,courier;">15855550000@from-internal</span> (thereby using the normal call routing rules), then it waits for a couple moments and hits * (that&#8217;s the <span style="font-family: courier new,courier;">D(w*)</span> part).</p>
<p style="padding-left: 30px;">This works out really well.&#160; <a href="http://theivrvoice.com/">Allison Smith</a> politely introduces me to <a href="http://googlevoiceblog.blogspot.com/2010/06/new-voice-of-google-voice.html">Kiki Baessell</a>, who asks me for my PIN, and I&#8217;m there.&#160; Bam.</p>
<h3>Voicemail notifications on SIP phones</h3>
<p style="padding-left: 30px;">This is the more interesting of the two features.</p>
<p style="padding-left: 30px;">I&#8217;m using <a href="http://code.google.com/p/pygooglevoice/">pygooglevoice</a>, a library of <strong>Python bindings for the Google Voice API</strong>.&#160; Installing pygooglevoice was pretty easy: <span style="font-family: courier new,courier;">sudo easy_install pygooglevoice</span></p>
<p style="padding-left: 30px;">Once installed, check out the <a href="http://sphinxdoc.github.com/pygooglevoice/">documentation</a> for some <a href="http://sphinxdoc.github.com/pygooglevoice/examples.html">example code</a>.&#160; I take that back, actually.&#160; Check out the <a href="http://sphinxdoc.github.com/pygooglevoice/scripts.html">command line script</a> first.&#160; By typing <span style="font-family: courier new,courier;">gvoice</span> and entering your e-mail address and password, you get a <strong>delicious command line interface</strong> to Google Voice.&#160; Try &#8220;<span style="font-family: courier new,courier;">help</span>&#8221; if you&#8217;re stumped.</p>
<p style="padding-left: 30px;">It turns out that getting the voicemail status from Google Voice was the easy part.&#160; Telling Asterisk about it, however, was more difficult.&#160; I could not find a mechanism where Asterisk could ask my program directly, so I decided to <strong>create fake <span style="font-family: courier new,courier;">msg0000.txt</span></strong>, <span style="font-family: courier new,courier;">msg0001.txt</span>, etc files in the actual voicemail folders to match the current number of voicemails.</p>
<p style="padding-left: 30px;">Being fancy, I also tried to make sure it would work &#8220;seamlessly&#8221; with Asterisk&#8217;s own voicemail, just in case I need to use that for whatever reason.&#160; I do this by considering any other files on that <span style="font-family: courier new,courier;">msg####</span> (such as a <span style="font-family: courier new,courier;">msg####.wav</span>) an indicator that it is an Asterisk-based voicemail and not one of our doppelgangers.&#160; I hope Asterisk has the same courtesy.</p>
<p style="padding-left: 30px;">So, here&#8217;s the code.&#160; It sucks, of course, but it was an afternoon project.&#160; So far, it&#8217;s working good.&#160; I&#8217;m firing it from <strong>cron every three minutes</strong>, which seems wasteful: I might change it to only check during times I&#8217;m awake, since I won&#8217;t hear the voicemail indicator when I&#8217;m asleep.&#160; But that&#8217;s another project&#8230;</p>
<p style="padding-left: 30px;"><script src="http://gist.github.com/499562.js"></script></p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/07/voicemail-notifications-with-asterisk-and-google-voice">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/07/voicemail-notifications-with-asterisk-and-google-voice#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=316</wfw:commentRss>
		</item>
				<item>
			<title>Running PHP 5.2 on Ubuntu 10.04 LTS</title>
			<link>http://blog.hoopycat.com/2010/07/running-php-5-2-on-ubuntu-10-04-lts</link>
			<pubDate>Sun, 25 Jul 2010 20:17:05 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Howto</category>			<guid isPermaLink="false">314@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;Recently, I was tasked with installing a &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; environment on an existing &lt;a href=&quot;https://help.ubuntu.com/community/Server/TechSpecs/1004LTS&quot;&gt;Ubuntu 10.04 LTS (lucid)&lt;/a&gt; server.&amp;#160; This release is the first Ubuntu release to ship with PHP 5.3.&amp;#160; Unfortunately, while the &lt;a href=&quot;http://drupal.org/node/360605&quot;&gt;Drupal core is reasonably happy&lt;/a&gt; with PHP 5.3 as of late, there are likely still some modules out there that might break.&lt;/p&gt;
&lt;p&gt;The installation for the environment in question required PHP 5.2, and I was not about to argue with it.&amp;#160; Fortunately, some research found a &lt;a href=&quot;http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/&quot;&gt;blog post with a PHP-downgrading shellscript&lt;/a&gt; that looked quite promising.&amp;#160; So, I decided to base my approach off of that.&lt;/p&gt;
&lt;p&gt;There are alternative methods available.&amp;#160; A common, but misguided, approach is to uninstall the existing PHP components and compile your own PHP from source.&amp;#160; I am a strong believer that compiling software on a modern production server is a bad idea, for security and reliability reasons.&amp;#160; Another approach is to use a &lt;a href=&quot;https://launchpad.net/ubuntu/+ppas&quot;&gt;Personal Package Archive&lt;/a&gt; on &lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt;.&amp;#160; This is better, but I would much rather rely on the &lt;a href=&quot;https://wiki.ubuntu.com/SecurityTeam&quot;&gt;Ubuntu security team&lt;/a&gt; for updates than someone else (myself included!)&lt;/p&gt;
&lt;p&gt;Since PHP 5.2 ships with karmic, lucid isn&amp;#8217;t that much different than karmic, and karmic is still supported, why not just use the tried-and-true package management techniques?&lt;/p&gt;
&lt;h3 style=&quot;padding-left: 30px;&quot;&gt;Build a Testbed&lt;br /&gt;&lt;/h3&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;Being a dull boy, I wanted to try this out &amp;#8220;in the lab&amp;#8221; before I went and blew up a client&amp;#8217;s server.&amp;#160; To do this, I used a freshly-deployed &lt;a href=&quot;http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0&quot;&gt;VPS instance&lt;/a&gt; (testbox).&amp;#160; First, I used &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;&lt;a href=&quot;http://manpages.ubuntu.com/manpages/lucid/man1/dpkg.1.html&quot;&gt;dpkg&lt;/a&gt;&lt;/span&gt; to clear the package selections from testbox.&amp;#160; Then, I cloned the selections from the production server (prodbox).&amp;#160; Finally, I logged into testbox and ran &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;&lt;a href=&quot;http://linux.die.net/man/8/apt-get&quot;&gt;apt-get&lt;/a&gt; dselect-upgrade&lt;/span&gt; to apply the selections:&lt;/p&gt;
&lt;pre style=&quot;padding-left: 60px;&quot;&gt;home$ ssh root@testbox dpkg --clear-selections&lt;/pre&gt;
&lt;pre style=&quot;padding-left: 60px;&quot;&gt;home$ ssh prodbox dpkg --get-selections | ssh root@testbox dpkg --set-selections&lt;/pre&gt;
&lt;pre style=&quot;padding-left: 60px;&quot;&gt;home$ ssh root@testbox&lt;/pre&gt;
&lt;pre style=&quot;padding-left: 60px;&quot;&gt;testbox# apt-get dselect-upgrade&lt;/pre&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;Note: it goes without saying that &lt;span style=&quot;background-color: #ffff00;&quot;&gt;logging in as root on a routine basis is Bad&lt;/span&gt;, and &lt;span style=&quot;background-color: #ffff00;&quot;&gt;allowing remote ssh logins to root is also bad&lt;/span&gt;.&amp;#160; This is, however, a testbox.&amp;#160; I had previously used &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;&lt;a href=&quot;http://linux.die.net/man/1/ssh-copy-id&quot;&gt;ssh-copy-id&lt;/a&gt;&lt;/span&gt; to install my public key on both testbox and prodbox.&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;I created the most basic of basic PHP pages, &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;/var/www/testing.php&lt;/span&gt;, containing nothing more than:&lt;/p&gt;
&lt;pre style=&quot;padding-left: 60px;&quot;&gt;&amp;lt;? phpinfo(); ?&amp;gt;&lt;/pre&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;This gave me a URL to go to (&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;http://testbox/testing.php&lt;/span&gt;) to make sure PHP was &amp;#8220;there&amp;#8221; and happy.&amp;#160; Once this was done, I shut down the instance and duplicated the image so I had a &amp;#8220;known good&amp;#8221; image.&lt;/p&gt;
&lt;h3 style=&quot;padding-left: 30px;&quot;&gt;Develop the Script&lt;/h3&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;After booting, my next order of business was to look through the original script, figure out what it does, and make sure it &amp;#8220;does the right thing.&quot;&amp;#160; Here, in short, is what it does:&lt;/p&gt;
&lt;ol style=&quot;padding-left: 60px;&quot;&gt;
&lt;li&gt;Gets the list of all installed packages with &amp;#8220;&lt;span style=&quot;font-family: courier new,courier;&quot;&gt;php&lt;/span&gt;&amp;#8221; in their name using &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;dpkg -l&lt;/span&gt; and &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;grep&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Removes all of them &amp;#8211; configs and all &amp;#8211; with &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;apt-get purge&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Using &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;&lt;a href=&quot;http://linux.die.net/man/8/apt-cache&quot;&gt;apt-cache&lt;/a&gt; search&lt;/span&gt;, get a list of all php-related packages and create &lt;a href=&quot;https://help.ubuntu.com/community/PinningHowto&quot;&gt;pins&lt;/a&gt; for them in &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;/etc/apt/preferences.d/php&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Add the karmic repositories to &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;/etc/apt/sources.list.d/karmic.list&lt;/span&gt;, then &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;apt-get update&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Install all of the packages that were installed before using &lt;span style=&quot;font-family: courier new,courier;&quot;&gt;apt-get -t karmic install&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Restart &lt;a href=&quot;http://httpd.apache.org/&quot;&gt;Apache&lt;/a&gt;, just because you&amp;#8217;re probably running Apache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;I went through line-by-line, copying the &amp;#8220;good stuff&amp;#8221; to a shell script as I went along.&amp;#160; Once I was done, hoorah!&amp;#160; I had PHP 5.2 and all seemed well.&lt;/p&gt;
&lt;h3 style=&quot;padding-left: 30px;&quot;&gt;Test and Deploy the Script&lt;/h3&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;I replaced this working image with a copy of the &amp;#8220;known good&amp;#8221; image, uploaded the script, and fired it.&amp;#160; Hoorah!&amp;#160; All was well.&amp;#160; Once that was set, I made sure a backup of prodbox was at the ready, just in case.&amp;#160; :-)&amp;#160; I then fired the script off on the real server, and&amp;#8230; hoorah!&amp;#160; I checked out anything that might have broken, and indeed, all was well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The script is available at &lt;a href=&quot;http://gist.github.com/489868&quot;&gt;http://gist.github.com/489868&lt;/a&gt;&lt;/strong&gt; with, of course, no guarantees of anything.&amp;#160; Hopefully this will be useless sooner rather than later, but we can hope!&lt;/p&gt;
&lt;p&gt;&lt;script src=&quot;http://gist.github.com/489868.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/07/running-php-5-2-on-ubuntu-10-04-lts&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Recently, I was tasked with installing a <a href="http://drupal.org/">Drupal</a> environment on an existing <a href="https://help.ubuntu.com/community/Server/TechSpecs/1004LTS">Ubuntu 10.04 LTS (lucid)</a> server.&#160; This release is the first Ubuntu release to ship with PHP 5.3.&#160; Unfortunately, while the <a href="http://drupal.org/node/360605">Drupal core is reasonably happy</a> with PHP 5.3 as of late, there are likely still some modules out there that might break.</p>
<p>The installation for the environment in question required PHP 5.2, and I was not about to argue with it.&#160; Fortunately, some research found a <a href="http://mrkandy.wordpress.com/2010/04/16/install-php-5-2-x-in-ubuntu-10-04-lucid/">blog post with a PHP-downgrading shellscript</a> that looked quite promising.&#160; So, I decided to base my approach off of that.</p>
<p>There are alternative methods available.&#160; A common, but misguided, approach is to uninstall the existing PHP components and compile your own PHP from source.&#160; I am a strong believer that compiling software on a modern production server is a bad idea, for security and reliability reasons.&#160; Another approach is to use a <a href="https://launchpad.net/ubuntu/+ppas">Personal Package Archive</a> on <a href="https://launchpad.net/">Launchpad</a>.&#160; This is better, but I would much rather rely on the <a href="https://wiki.ubuntu.com/SecurityTeam">Ubuntu security team</a> for updates than someone else (myself included!)</p>
<p>Since PHP 5.2 ships with karmic, lucid isn&#8217;t that much different than karmic, and karmic is still supported, why not just use the tried-and-true package management techniques?</p>
<h3 style="padding-left: 30px;">Build a Testbed<br /></h3>
<p style="padding-left: 30px;">Being a dull boy, I wanted to try this out &#8220;in the lab&#8221; before I went and blew up a client&#8217;s server.&#160; To do this, I used a freshly-deployed <a href="http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0">VPS instance</a> (testbox).&#160; First, I used <span style="font-family: courier new,courier;"><a href="http://manpages.ubuntu.com/manpages/lucid/man1/dpkg.1.html">dpkg</a></span> to clear the package selections from testbox.&#160; Then, I cloned the selections from the production server (prodbox).&#160; Finally, I logged into testbox and ran <span style="font-family: courier new,courier;"><a href="http://linux.die.net/man/8/apt-get">apt-get</a> dselect-upgrade</span> to apply the selections:</p>
<pre style="padding-left: 60px;">home$ ssh root@testbox dpkg --clear-selections</pre>
<pre style="padding-left: 60px;">home$ ssh prodbox dpkg --get-selections | ssh root@testbox dpkg --set-selections</pre>
<pre style="padding-left: 60px;">home$ ssh root@testbox</pre>
<pre style="padding-left: 60px;">testbox# apt-get dselect-upgrade</pre>
<p style="padding-left: 30px;">Note: it goes without saying that <span style="background-color: #ffff00;">logging in as root on a routine basis is Bad</span>, and <span style="background-color: #ffff00;">allowing remote ssh logins to root is also bad</span>.&#160; This is, however, a testbox.&#160; I had previously used <span style="font-family: courier new,courier;"><a href="http://linux.die.net/man/1/ssh-copy-id">ssh-copy-id</a></span> to install my public key on both testbox and prodbox.</p>
<p style="padding-left: 30px;">I created the most basic of basic PHP pages, <span style="font-family: courier new,courier;">/var/www/testing.php</span>, containing nothing more than:</p>
<pre style="padding-left: 60px;">&lt;? phpinfo(); ?&gt;</pre>
<p style="padding-left: 30px;">This gave me a URL to go to (<span style="font-family: courier new,courier;">http://testbox/testing.php</span>) to make sure PHP was &#8220;there&#8221; and happy.&#160; Once this was done, I shut down the instance and duplicated the image so I had a &#8220;known good&#8221; image.</p>
<h3 style="padding-left: 30px;">Develop the Script</h3>
<p style="padding-left: 30px;">After booting, my next order of business was to look through the original script, figure out what it does, and make sure it &#8220;does the right thing."&#160; Here, in short, is what it does:</p>
<ol style="padding-left: 60px;">
<li>Gets the list of all installed packages with &#8220;<span style="font-family: courier new,courier;">php</span>&#8221; in their name using <span style="font-family: courier new,courier;">dpkg -l</span> and <span style="font-family: courier new,courier;">grep</span>.</li>
<li>Removes all of them &#8211; configs and all &#8211; with <span style="font-family: courier new,courier;">apt-get purge</span>.</li>
<li>Using <span style="font-family: courier new,courier;"><a href="http://linux.die.net/man/8/apt-cache">apt-cache</a> search</span>, get a list of all php-related packages and create <a href="https://help.ubuntu.com/community/PinningHowto">pins</a> for them in <span style="font-family: courier new,courier;">/etc/apt/preferences.d/php</span>.</li>
<li>Add the karmic repositories to <span style="font-family: courier new,courier;">/etc/apt/sources.list.d/karmic.list</span>, then <span style="font-family: courier new,courier;">apt-get update</span>.</li>
<li>Install all of the packages that were installed before using <span style="font-family: courier new,courier;">apt-get -t karmic install</span>.</li>
<li>Restart <a href="http://httpd.apache.org/">Apache</a>, just because you&#8217;re probably running Apache.</li>
</ol>
<p style="padding-left: 30px;">I went through line-by-line, copying the &#8220;good stuff&#8221; to a shell script as I went along.&#160; Once I was done, hoorah!&#160; I had PHP 5.2 and all seemed well.</p>
<h3 style="padding-left: 30px;">Test and Deploy the Script</h3>
<p style="padding-left: 30px;">I replaced this working image with a copy of the &#8220;known good&#8221; image, uploaded the script, and fired it.&#160; Hoorah!&#160; All was well.&#160; Once that was set, I made sure a backup of prodbox was at the ready, just in case.&#160; :-)&#160; I then fired the script off on the real server, and&#8230; hoorah!&#160; I checked out anything that might have broken, and indeed, all was well.</p>
<p><strong>The script is available at <a href="http://gist.github.com/489868">http://gist.github.com/489868</a></strong> with, of course, no guarantees of anything.&#160; Hopefully this will be useless sooner rather than later, but we can hope!</p>
<p><script src="http://gist.github.com/489868.js"></script></p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/07/running-php-5-2-on-ubuntu-10-04-lts">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/07/running-php-5-2-on-ubuntu-10-04-lts#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=314</wfw:commentRss>
		</item>
				<item>
			<title>Lifehacking: the quest for efficiency</title>
			<link>http://blog.hoopycat.com/2010/04/lifehacking-the-quest-for-efficiency</link>
			<pubDate>Fri, 02 Apr 2010 16:03:59 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">Useless Blatherings</category>
<category domain="main">Geekery</category>			<guid isPermaLink="false">313@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;This morning, in my quest to get caught up on my RSS feeds, a &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/&quot;&gt;discussion about the best lifehacks&lt;/a&gt; mentioned in the &lt;a href=&quot;http://www.reddit.com/r/tldr/comments/biop5/march_25th_2010_dark_flow_pc_building/&quot;&gt;daily&lt;/a&gt; best-of &lt;a href=&quot;http://www.reddit.com/r/tldr/&quot;&gt;tldr&lt;/a&gt; &lt;a href=&quot;http://www.reddit.com/&quot;&gt;reddit&lt;/a&gt; caught my eye.  I consider myself a bit of a lifehacker, but it's mostly that engineering mindset coming through: there &lt;i&gt;must&lt;/i&gt; be a more efficient way to live life, too.&lt;/p&gt;

&lt;p&gt;A few of the hacks from reddit appealed to me, and I thought it prudent to pass them along:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&quot;Putting my clothes in my closet with the hangers reversed once a year. As I pull clothes out, I reverse the hanger. Every year I give away any clothes that I never took out.&quot;  -- &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mvh7j&quot;&gt;elblanco&lt;/a&gt;  &lt;i&gt;(Note: I do something like this, but since my closet has weird physics, I mostly just do it with a stack-like structure.  If it hits the far end of the rod, it goes.)&lt;/i&gt;&lt;/li&gt;
  &lt;li&gt;&quot;When you need to remember to bring something with you, put your car keys on it the night before...&quot; -- &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mv998&quot;&gt;drewlb&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&quot;For anyone just starting university, or grad school, in a program where you will write many papers: put EVERYTHING you ever read or remotely think will be useful into a bibliography database like Endnote (for Word users) or BibTeX. You can pdf almost everything to a massive folder and link to it.  Then, not only is the info at your finger tips for however long you're in school, but the software writes the bibliography for you. NO idea why schools aren't teaching this alongside general advice on writing all sorts of term papers...&quot; -- &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mvhpo&quot;&gt;dolichoblond&lt;/a&gt; &lt;i&gt;(Note: if you use Firefox and OpenOffice, check out &lt;a href=&quot;http://www.zotero.org/&quot;&gt;Zotero&lt;/a&gt;.)&lt;/i&gt;&lt;/li&gt;
  &lt;li&gt;&quot;Not original or clever by any means but I'll share anyway: I put my keys, cell phone, and wallet in the same, separate pockets every day. When I walk out the door I just need to tap each pocket to make sure they're in there and I can leave knowing I have my three essential items. It's never failed me.&quot;  -- &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mw8dv&quot;&gt;DT7&lt;/a&gt; &lt;i&gt;(Note: as &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mwron&quot;&gt;kitsuneudon&lt;/a&gt; points out, this is the &quot;spectacles, testicles, wallet and watch&quot; self-check)&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And last, but definitely not least:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&quot;Babywipes for the bathroom. Seriously, your life will be +1.&quot;  -- &lt;a href=&quot;http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mva4i&quot;&gt;giveitago&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are plenty more like this out there, of course, and I highly recommend always thinking about ways to make life more efficient.  Think about why you're doing something and how else you could accomplish the end goal.  Even if you don't actually save time, it's a great mindset to be in.&lt;/p&gt;

&lt;p&gt;While I don't personally follow it (yeah, I'm backlogged enough already), they tell me &lt;a href=&quot;http://lifehacker.com/&quot;&gt;lifehacker.com&lt;/a&gt; is a popular site for these sorts of things.&lt;/p&gt;

&lt;p&gt;Speaking of life, &lt;a href=&quot;http://blog.tanyakhovanova.com/?p=214&quot;&gt;this post from mathematician Tanya Khovanova&lt;/a&gt; includes some tips for success from &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Horton_Conway&quot;&gt;John H. Conway&lt;/a&gt;.  In short, work more than one problem at a time:&lt;/p&gt;

&lt;blockquote&gt;If you only work on one problem and get stuck, you might get depressed. It is nice to have an easier back-up problem. The back-up problem will work as an anti-depressant and will allow you to go back to your difficult problem in a better mood. John told me that for him the best approach is to juggle six problems at a time.&lt;/blockquote&gt;

&lt;p&gt;Oh, and if you like to keep an eye on how far behind I am with my RSS reading, just take a look at &lt;a href=&quot;http://www.google.com/reader/shared/rtucker&quot;&gt;my Google Reader shared items page&lt;/a&gt;.  They let me share stuff with the global interweb by hitting just one button, which sure beats this whole writing-a-blog-post thing, so I tend to fire quick stuff from there once or twice a day.  It's kind of a lifehack as well.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/04/lifehacking-the-quest-for-efficiency&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>This morning, in my quest to get caught up on my RSS feeds, a <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/">discussion about the best lifehacks</a> mentioned in the <a href="http://www.reddit.com/r/tldr/comments/biop5/march_25th_2010_dark_flow_pc_building/">daily</a> best-of <a href="http://www.reddit.com/r/tldr/">tldr</a> <a href="http://www.reddit.com/">reddit</a> caught my eye.  I consider myself a bit of a lifehacker, but it's mostly that engineering mindset coming through: there <i>must</i> be a more efficient way to live life, too.</p>

<p>A few of the hacks from reddit appealed to me, and I thought it prudent to pass them along:</p>

<ul>
  <li>"Putting my clothes in my closet with the hangers reversed once a year. As I pull clothes out, I reverse the hanger. Every year I give away any clothes that I never took out."  -- <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mvh7j">elblanco</a>  <i>(Note: I do something like this, but since my closet has weird physics, I mostly just do it with a stack-like structure.  If it hits the far end of the rod, it goes.)</i></li>
  <li>"When you need to remember to bring something with you, put your car keys on it the night before..." -- <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mv998">drewlb</a></li>
  <li>"For anyone just starting university, or grad school, in a program where you will write many papers: put EVERYTHING you ever read or remotely think will be useful into a bibliography database like Endnote (for Word users) or BibTeX. You can pdf almost everything to a massive folder and link to it.  Then, not only is the info at your finger tips for however long you're in school, but the software writes the bibliography for you. NO idea why schools aren't teaching this alongside general advice on writing all sorts of term papers..." -- <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mvhpo">dolichoblond</a> <i>(Note: if you use Firefox and OpenOffice, check out <a href="http://www.zotero.org/">Zotero</a>.)</i></li>
  <li>"Not original or clever by any means but I'll share anyway: I put my keys, cell phone, and wallet in the same, separate pockets every day. When I walk out the door I just need to tap each pocket to make sure they're in there and I can leave knowing I have my three essential items. It's never failed me."  -- <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mw8dv">DT7</a> <i>(Note: as <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mwron">kitsuneudon</a> points out, this is the "spectacles, testicles, wallet and watch" self-check)</i></li>
</ul>

<p>And last, but definitely not least:</p>

<ul>
  <li>"Babywipes for the bathroom. Seriously, your life will be +1."  -- <a href="http://www.reddit.com/r/AskReddit/comments/bi1xh/reddit_what_are_your_best_lifehacks/c0mva4i">giveitago</a></li>
</ul>

<p>There are plenty more like this out there, of course, and I highly recommend always thinking about ways to make life more efficient.  Think about why you're doing something and how else you could accomplish the end goal.  Even if you don't actually save time, it's a great mindset to be in.</p>

<p>While I don't personally follow it (yeah, I'm backlogged enough already), they tell me <a href="http://lifehacker.com/">lifehacker.com</a> is a popular site for these sorts of things.</p>

<p>Speaking of life, <a href="http://blog.tanyakhovanova.com/?p=214">this post from mathematician Tanya Khovanova</a> includes some tips for success from <a href="http://en.wikipedia.org/wiki/John_Horton_Conway">John H. Conway</a>.  In short, work more than one problem at a time:</p>

<blockquote>If you only work on one problem and get stuck, you might get depressed. It is nice to have an easier back-up problem. The back-up problem will work as an anti-depressant and will allow you to go back to your difficult problem in a better mood. John told me that for him the best approach is to juggle six problems at a time.</blockquote>

<p>Oh, and if you like to keep an eye on how far behind I am with my RSS reading, just take a look at <a href="http://www.google.com/reader/shared/rtucker">my Google Reader shared items page</a>.  They let me share stuff with the global interweb by hitting just one button, which sure beats this whole writing-a-blog-post thing, so I tend to fire quick stuff from there once or twice a day.  It's kind of a lifehack as well.</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/04/lifehacking-the-quest-for-efficiency">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/04/lifehacking-the-quest-for-efficiency#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=313</wfw:commentRss>
		</item>
				<item>
			<title>Conditional redirection with lighttpd: evolving my webtmp folder</title>
			<link>http://blog.hoopycat.com/2010/01/conditional-redirection-with-lighttpd-evolving-my-webtmp-folder</link>
			<pubDate>Sun, 10 Jan 2010 14:54:34 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">Geekery</category>
<category domain="main">Howto</category>			<guid isPermaLink="false">311@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;Very often, I need to quickly host a file for use in a forum post or on IRC.  My usual approach has been to mount a &quot;temporary&quot; directory from my web server on my desktop, over ssh.  However, I recently started using &lt;a href=&quot;https://www.dropbox.com/referrals/NTM1OTcxMDU5&quot;&gt;Dropbox&lt;/a&gt; to keep my important files synced: with this, I can access my school work from school without having to resort to ssh heroics or remembering to carry a flash drive with me (let's not get started on keeping it synchronized).  Dropbox offers 2GB of storage for free, and they include a handy Public folder you can use to share files.  Nice.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;http://drop.hoopycat.com/mario.png&quot; href=&quot;http://drop.hoopycat.com/mario.png&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://drop.hoopycat.com/mario.png&quot; width=&quot;100px&quot; /&gt;&lt;/a&gt;My little temporary directory, in practice, isn't very temporary.  I rarely delete anything from it; indeed, the oldest image is nearing two years old.  I also keep throughput test files there, and I kinda need those to be on my server.  However, I hate remembering multiple long URLs, especially ones like &lt;code&gt;&lt;a href=&quot;http://www.hoopycat.com/~rtucker/tmp/moooar.PNG&quot;&gt;http://www.hoopycat.com/~rtucker/tmp/moooar.PNG&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href=&quot;http://dl.dropbox.com/u/3597105/system-fullpower.png&quot;&gt;http://dl.dropbox.com/u/3597105/system-fullpower.png&lt;/a&gt;&lt;/code&gt;.  I also want to be able to transparently move files around as my needs change.  And, most importantly, I want my stuff under the hoopycat.com domain for maximum flexibility.&lt;/p&gt;

&lt;p&gt;So, I set up a dedicated hostname: &lt;code&gt;http://drop.hoopycat.com/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here's the flow:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A request is received for &lt;code&gt;http://drop.hoopycat.com/&lt;em&gt;filename&lt;/em&gt;&lt;/code&gt;.  (Note: requests for &lt;code&gt;/&lt;/code&gt; get redirected to &lt;code&gt;http://hoopycat.com/&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;If &lt;em&gt;filename&lt;/em&gt; exists in &lt;code&gt;~rtucker/public_html/tmp&lt;/code&gt;, serve it up.&lt;/li&gt;
  &lt;li&gt;If it doesn't, issue a HTTP redirect to &lt;code&gt;http://dl.dropbox.com/u/3597105/&lt;em&gt;filename&lt;/em&gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Easy enough, and it works darn well.  I do no checks for the file's existence on Dropbox, so their 404 page gets served up for &lt;a href=&quot;http://drop.hoopycat.com/aoeuaoeu.snth&quot;&gt;totally bogus URLs&lt;/a&gt;. This is not a big deal in practice.&lt;/p&gt;

&lt;p&gt;The configuration of lighttpd is simple, using &lt;code&gt;mod_magnet&lt;/code&gt; and a small &lt;a href=&quot;http://en.wikipedia.org/wiki/Lua_%28programming_language%29&quot;&gt;Lua&lt;/a&gt; script.  To &lt;code&gt;lighttpd.conf&lt;/code&gt; or a &lt;code&gt;conf-available/&lt;/code&gt; file of your choice, add:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;server.modules += ( &quot;mod_magnet&quot; )&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;$HTTP[&quot;host&quot;] == &quot;drop.hoopycat.com&quot; {&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;server.document-root = &quot;/home/rtucker/public_html/tmp/&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;url.redirect += ( &quot;^/$&quot; =&amp;gt; &quot;http://hoopycat.com/&quot; )&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;magnet.attract-physical-path-to = ( &quot;/etc/lighttpd/conditional-redirect.lua&quot; )&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then, create &lt;code&gt;/etc/lighttpd/conditional-redirect.lua&lt;/code&gt; with the following script, borrowed from an example at &lt;a href=&quot;http://redmine.lighttpd.net/projects/lighttpd/wiki/AbsoLUAtion&quot;&gt;http://redmine.lighttpd.net/projects/lighttpd/wiki/AbsoLUAtion&lt;/a&gt;:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;local filename = lighty.env[&quot;physical.path&quot;]&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;local stat = lighty.stat( filename )&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; if not stat then&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;local static_name = string.match( filename, &quot;tmp/([^/]+)$&quot; )&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;lighty.header[&quot;Location&quot;] = &quot;http://dl.dropbox.com/u/3597105/&quot; .. static_name&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;return 302&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Remember to replace&lt;/strong&gt; the &lt;code&gt;dl.dropbox.com&lt;/code&gt; URL with yours (and change everything else, too).&lt;/p&gt;

&lt;p&gt;Assuming DNS is set up correctly and &lt;code&gt;mod_magnet&lt;/code&gt; is installed (it's &lt;code&gt;lighttpd-mod-magnet&lt;/code&gt; in Ubuntu 8.04), a restart of lighttpd should yield good results!&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2010/01/conditional-redirection-with-lighttpd-evolving-my-webtmp-folder&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Very often, I need to quickly host a file for use in a forum post or on IRC.  My usual approach has been to mount a "temporary" directory from my web server on my desktop, over ssh.  However, I recently started using <a href="https://www.dropbox.com/referrals/NTM1OTcxMDU5">Dropbox</a> to keep my important files synced: with this, I can access my school work from school without having to resort to ssh heroics or remembering to carry a flash drive with me (let's not get started on keeping it synchronized).  Dropbox offers 2GB of storage for free, and they include a handy Public folder you can use to share files.  Nice.</p>

<p><a rel="http://drop.hoopycat.com/mario.png" href="http://drop.hoopycat.com/mario.png"><img align="right" src="http://drop.hoopycat.com/mario.png" width="100px" /></a>My little temporary directory, in practice, isn't very temporary.  I rarely delete anything from it; indeed, the oldest image is nearing two years old.  I also keep throughput test files there, and I kinda need those to be on my server.  However, I hate remembering multiple long URLs, especially ones like <code><a href="http://www.hoopycat.com/~rtucker/tmp/moooar.PNG">http://www.hoopycat.com/~rtucker/tmp/moooar.PNG</a></code> and <code><a href="http://dl.dropbox.com/u/3597105/system-fullpower.png">http://dl.dropbox.com/u/3597105/system-fullpower.png</a></code>.  I also want to be able to transparently move files around as my needs change.  And, most importantly, I want my stuff under the hoopycat.com domain for maximum flexibility.</p>

<p>So, I set up a dedicated hostname: <code>http://drop.hoopycat.com/</code>.</p>

<p>Here's the flow:</p>
<ul>
  <li>A request is received for <code>http://drop.hoopycat.com/<em>filename</em></code>.  (Note: requests for <code>/</code> get redirected to <code>http://hoopycat.com/</code>).</li>
  <li>If <em>filename</em> exists in <code>~rtucker/public_html/tmp</code>, serve it up.</li>
  <li>If it doesn't, issue a HTTP redirect to <code>http://dl.dropbox.com/u/3597105/<em>filename</em></code>.</li>
</ul>

<p>Easy enough, and it works darn well.  I do no checks for the file's existence on Dropbox, so their 404 page gets served up for <a href="http://drop.hoopycat.com/aoeuaoeu.snth">totally bogus URLs</a>. This is not a big deal in practice.</p>

<p>The configuration of lighttpd is simple, using <code>mod_magnet</code> and a small <a href="http://en.wikipedia.org/wiki/Lua_%28programming_language%29">Lua</a> script.  To <code>lighttpd.conf</code> or a <code>conf-available/</code> file of your choice, add:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">server.modules += ( "mod_magnet" )</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">$HTTP["host"] == "drop.hoopycat.com" {</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;server.document-root = "/home/rtucker/public_html/tmp/"</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;url.redirect += ( "^/$" =&gt; "http://hoopycat.com/" )</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;magnet.attract-physical-path-to = ( "/etc/lighttpd/conditional-redirect.lua" )</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">}</span></code></td></tr>
</table></div>

<p>Then, create <code>/etc/lighttpd/conditional-redirect.lua</code> with the following script, borrowed from an example at <a href="http://redmine.lighttpd.net/projects/lighttpd/wiki/AbsoLUAtion">http://redmine.lighttpd.net/projects/lighttpd/wiki/AbsoLUAtion</a>:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">local filename = lighty.env["physical.path"]</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">local stat = lighty.stat( filename )</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default"> if not stat then</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">&#160;&#160;local static_name = string.match( filename, "tmp/([^/]+)$" )</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">&#160;&#160;lighty.header["Location"] = "http://dl.dropbox.com/u/3597105/" .. static_name</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">return 302</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">end</span></code></td></tr>
</table></div>

<p><strong>Remember to replace</strong> the <code>dl.dropbox.com</code> URL with yours (and change everything else, too).</p>

<p>Assuming DNS is set up correctly and <code>mod_magnet</code> is installed (it's <code>lighttpd-mod-magnet</code> in Ubuntu 8.04), a restart of lighttpd should yield good results!</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2010/01/conditional-redirection-with-lighttpd-evolving-my-webtmp-folder">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2010/01/conditional-redirection-with-lighttpd-evolving-my-webtmp-folder#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=311</wfw:commentRss>
		</item>
				<item>
			<title>A backported whois client for Ubuntu 8.04 LTS (Hardy)</title>
			<link>http://blog.hoopycat.com/2009/12/backported-whois-client-for-ubuntu-8-04-lts-hardy</link>
			<pubDate>Sun, 27 Dec 2009 16:11:56 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Geekery</category>			<guid isPermaLink="false">310@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;I still run &lt;a href=&quot;https://wiki.ubuntu.com/HardyHeron&quot;&gt;Ubuntu Hardy&lt;/a&gt; (8.04 LTS) on servers, since I'm willing to trade some newer features for package stability.  Alas, once in awhile, this stability becomes a problem: the &lt;a href=&quot;http://www.linux.it/~md/software/&quot;&gt;standard whois client&lt;/a&gt; uses a set of compiled-in mappings to determine how to route whois queries, and this falls out of date surprisingly fast:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;$ whois 109.74.207.9&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Unknown AS number or IP network. Please upgrade this program.&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I've &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/whois/+bug/492322&quot;&gt;opened a Launchpad bug with the hopes that this gets SRU'd at some point&lt;/a&gt;, but I'm not confident enough in my packaging abilities to go forward with this myself (yet).  So, at least in the interim, I've created a &lt;a href=&quot;https://launchpad.net/~rtucker/+archive/whois-delegation-backport&quot;&gt;Personal Package Archive with whois 4.7.36&lt;/a&gt;, backported from the &lt;a href=&quot;https://wiki.ubuntu.com/LucidLynx&quot;&gt;Lucid Lynx&lt;/a&gt; (10.04) repo.  If you're interested in this, you can configure your system to use it in place of the normal whois:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add the repository to your &lt;code&gt;/etc/apt/sources.list&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;deb &lt;a href=&quot;http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu&quot;&gt;http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu&lt;/a&gt; hardy main&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;deb-src &lt;a href=&quot;http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu&quot;&gt;http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu&lt;/a&gt; hardy main&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;ul&gt;
  &lt;li&gt;Add the public key to your apt keyring:&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 15B7BC85&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Run &lt;code&gt;sudo apt-get update&lt;/code&gt; and &lt;code&gt;sudo apt-get upgrade&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You can find more information and instructions at the Launchpad page for this PPA: &lt;a href=&quot;https://launchpad.net/~rtucker/+archive/whois-delegation-backport&quot;&gt;https://launchpad.net/~rtucker/+archive/whois-delegation-backport&lt;/a&gt;.  Also, be aware that, in the (unlikely) event of a security problem in the whois package, it may not get fixed in a timely manner if you're using this PPA.  You have been warned.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/12/backported-whois-client-for-ubuntu-8-04-lts-hardy&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I still run <a href="https://wiki.ubuntu.com/HardyHeron">Ubuntu Hardy</a> (8.04 LTS) on servers, since I'm willing to trade some newer features for package stability.  Alas, once in awhile, this stability becomes a problem: the <a href="http://www.linux.it/~md/software/">standard whois client</a> uses a set of compiled-in mappings to determine how to route whois queries, and this falls out of date surprisingly fast:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">$ whois 109.74.207.9</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">Unknown AS number or IP network. Please upgrade this program.</span></code></td></tr>
</table></div>

<p>I've <a href="https://bugs.launchpad.net/ubuntu/+source/whois/+bug/492322">opened a Launchpad bug with the hopes that this gets SRU'd at some point</a>, but I'm not confident enough in my packaging abilities to go forward with this myself (yet).  So, at least in the interim, I've created a <a href="https://launchpad.net/~rtucker/+archive/whois-delegation-backport">Personal Package Archive with whois 4.7.36</a>, backported from the <a href="https://wiki.ubuntu.com/LucidLynx">Lucid Lynx</a> (10.04) repo.  If you're interested in this, you can configure your system to use it in place of the normal whois:</p>

<ul>
  <li>Add the repository to your <code>/etc/apt/sources.list</code>:</li>
</ul>
<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">deb <a href="http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu">http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu</a> hardy main</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">deb-src <a href="http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu">http://ppa.launchpad.net/rtucker/whois-delegation-backport/ubuntu</a> hardy main</span></code></td></tr>
</table></div>
<ul>
  <li>Add the public key to your apt keyring:</li>
</ul>
<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 15B7BC85</span></code></td></tr>
</table></div>

<ul>
  <li>Run <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code>!</li>
</ul>


<p>You can find more information and instructions at the Launchpad page for this PPA: <a href="https://launchpad.net/~rtucker/+archive/whois-delegation-backport">https://launchpad.net/~rtucker/+archive/whois-delegation-backport</a>.  Also, be aware that, in the (unlikely) event of a security problem in the whois package, it may not get fixed in a timely manner if you're using this PPA.  You have been warned.</p>

<p>Enjoy!</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/12/backported-whois-client-for-ubuntu-8-04-lts-hardy">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/12/backported-whois-client-for-ubuntu-8-04-lts-hardy#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=310</wfw:commentRss>
		</item>
				<item>
			<title>The Dehumidifier Always Tweets Twice: Recent dehumidifier news</title>
			<link>http://blog.hoopycat.com/2009/12/the-dehumidifier-always-tweets-twice-recent-dehumidifier-news</link>
			<pubDate>Fri, 11 Dec 2009 23:12:06 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Geekery</category>			<guid isPermaLink="false">309@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;I can tell you're delighted to hear of the state of dehumidification in the basement.  Winter is here, which is known for being bone dry.  Thus, the dehumidifier's going to be taking it easy much of the winter, but it will still be ready to act when snow thaws and the basement gets damp!&lt;/p&gt;

&lt;p&gt;The dehumidifier has every right to take it easy, now that it has taken the blogosphere by storm!  Yes, &lt;a href=&quot;http://www.aboutdehumidifiers.co.uk/blogposts/20091211-twittering-dehumidifier.html&quot;&gt;the About Dehumidifiers blog wrote about our humble dehumidifier today&lt;/a&gt;, specifically with regards its Twitter support.  Very cool.&lt;/p&gt;

&lt;p&gt;In software news, the blog widget (on the right edge of this page) and the &lt;code&gt;!d&lt;/code&gt; command on &lt;a href=&quot;irc://irc.oftc.net/linode&quot;&gt;the Linode IRC channel&lt;/a&gt; now include a rough estimate of how much time is left on the tank.  This is not an exact science, but the estimates will probably improve in the spring.  I've also been playing with the capacitance-to-percentage conversion code.  Anything to liven it up, I suppose.&lt;/p&gt;

&lt;p&gt;Oh, and those random characters after the Twitter updates?  Twitter started filtering duplicate status texts a little while back, resulting in no updates going through for awhile.  Adding random text was a &lt;a href=&quot;http://github.com/rtucker/munin-dehumid-status/commit/101aa2d1b658be7908c0c0925ca1a8aa6a5de50c&quot;&gt;quick, 15-second fix&lt;/a&gt;, but it has worked well so far.  Maybe I'll do something else in the future...&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/12/the-dehumidifier-always-tweets-twice-recent-dehumidifier-news&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I can tell you're delighted to hear of the state of dehumidification in the basement.  Winter is here, which is known for being bone dry.  Thus, the dehumidifier's going to be taking it easy much of the winter, but it will still be ready to act when snow thaws and the basement gets damp!</p>

<p>The dehumidifier has every right to take it easy, now that it has taken the blogosphere by storm!  Yes, <a href="http://www.aboutdehumidifiers.co.uk/blogposts/20091211-twittering-dehumidifier.html">the About Dehumidifiers blog wrote about our humble dehumidifier today</a>, specifically with regards its Twitter support.  Very cool.</p>

<p>In software news, the blog widget (on the right edge of this page) and the <code>!d</code> command on <a href="irc://irc.oftc.net/linode">the Linode IRC channel</a> now include a rough estimate of how much time is left on the tank.  This is not an exact science, but the estimates will probably improve in the spring.  I've also been playing with the capacitance-to-percentage conversion code.  Anything to liven it up, I suppose.</p>

<p>Oh, and those random characters after the Twitter updates?  Twitter started filtering duplicate status texts a little while back, resulting in no updates going through for awhile.  Adding random text was a <a href="http://github.com/rtucker/munin-dehumid-status/commit/101aa2d1b658be7908c0c0925ca1a8aa6a5de50c">quick, 15-second fix</a>, but it has worked well so far.  Maybe I'll do something else in the future...</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/12/the-dehumidifier-always-tweets-twice-recent-dehumidifier-news">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/12/the-dehumidifier-always-tweets-twice-recent-dehumidifier-news#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=309</wfw:commentRss>
		</item>
				<item>
			<title>Revisited: Asterisk and FreePBX under Ubuntu 9.10 and Lighttpd on a Linode VPS</title>
			<link>http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode</link>
			<pubDate>Sun, 06 Dec 2009 18:42:12 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">Geekery</category>
<category domain="main">Howto</category>			<guid isPermaLink="false">308@http://blog.hoopycat.com/</guid>
						<description>&lt;blockquote&gt;&lt;strong&gt;This document has been superseded&lt;/strong&gt; by an &lt;a href=&quot;http://library.linode.com/communications/voip-services/&quot;&gt;official article in the Linode Library&lt;/a&gt;, written by the most excellent and brave Amanda Folson, for Ubuntu 9.10 and Apache.  If you're deploying Asterisk and FreePBX on a dedicated Linode, I highly recommend following that procedure.  However, if you're a crazy person and want to use lighttpd on a multi-purpose system, feel free to give my procedure a try.&lt;/blockquote&gt;

&lt;p&gt;I originally wrote &lt;a href=&quot;http://blog.hoopycat.com/2009/08/asterisk-freepbx-ubuntu-lighttpd-linode&quot;&gt;this howto&lt;/a&gt; for Ubuntu 9.04 (Jaunty) a few months before Ubuntu 9.10 (Karmic) was released.  I happen to have a spare system lying around right now, so I figure I might as well update this for 9.10!&lt;/p&gt;

&lt;h2&gt;Summary of major changes since the 9.04 document&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Kernel package&lt;/strong&gt;: It appears &lt;code&gt;linux-image-server&lt;/code&gt; no longer installs a Xen-aware kernel, so I now use &lt;code&gt;linux-image-ec2&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Zaptel replaced with DAHDI&lt;/strong&gt;: Digium &lt;a href=&quot;http://blogs.digium.com/2008/05/19/zaptel-project-being-renamed-to-dahdi/&quot;&gt;replaced Zaptel with DAHDI&lt;/a&gt; for Asterisk 1.6, which now ships with Ubuntu.  This requires a change in package names, in addition to the usual changes one would expect between 1.4 and 1.6.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;More links to the Linode Library&lt;/strong&gt;: Since I wrote the original post in August, Linode has really fleshed out &lt;a href=&quot;http://library.linode.com/&quot;&gt;their documentation&lt;/a&gt;.  I've harmonized some of the &quot;opening moves&quot; with their getting-started documentation to reduce confusion.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Now using upstart for spawning the FastCGI handlers&lt;/strong&gt;: I figured there was a less cheesy way to do that.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;Some concerns&lt;/h2&gt;

&lt;p&gt;I'm occasionally seeing the boot process locking up for awhile with nasty-looking kernel bug errors:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[&amp;#160;&amp;#160; 66.572527] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[&amp;#160;&amp;#160;132.080097] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[&amp;#160;&amp;#160;197.578163] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[&amp;#160;&amp;#160;263.072534] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It eventually seems to pull out of it, but you might not want to do this on your production box until you're sure everything is happy and keen.  If anyone knows anything about these errors, let me know.  That said, I've been on a conference bridge with myself for the past ten minutes and everything's fine.&lt;/p&gt;

&lt;p&gt;Without further adieu, here's the howto!&lt;/p&gt;

&lt;h2&gt;Rationale&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://www.freepbx.org/&quot;&gt;FreePBX&lt;/a&gt; is a popular &lt;a href=&quot;http://www.php.net/&quot;&gt;PHP&lt;/a&gt; front end for the &lt;a href=&quot;http://www.asterisk.org/&quot;&gt;Asterisk PBX system&lt;/a&gt;.  It morphs the complex yet very flexible Asterisk configuration into something easier to use (yet still very extensible).  When I worked for a business-class VoIP provider back in the day, we used FreePBX (and its predecessor, AMP) for most of our customer-premise PBX servers.&lt;/p&gt;

&lt;p&gt;I prefer configuring and managing my Asterisk system using FreePBX.  However, I can't justify an entire server for Asterisk, so I need it to coexist with a number of other applications.  What I can justify is a &lt;a href=&quot;http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0&quot;&gt;VPS with relatively little memory&lt;/a&gt;, so some tuning is required.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.freepbx.org/support/documentation/installation/install-process-for-centos-5-1&quot;&gt;usual installation instructions&lt;/a&gt; assume the use of &lt;a href=&quot;http://www.centos.org/&quot;&gt;CentOS&lt;/a&gt;, &lt;a href=&quot;http://httpd.apache.org/&quot;&gt;Apache&lt;/a&gt; and &lt;a href=&quot;http://us.php.net/manual/en/install.unix.apache2.php&quot;&gt;mod_php&lt;/a&gt; for the stack.  There are a few downsides to this configuration.&lt;/p&gt;

&lt;a href=&quot;http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode#more308&quot;&gt;Read more &amp;raquo;&lt;/a&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<blockquote><strong>This document has been superseded</strong> by an <a href="http://library.linode.com/communications/voip-services/">official article in the Linode Library</a>, written by the most excellent and brave Amanda Folson, for Ubuntu 9.10 and Apache.  If you're deploying Asterisk and FreePBX on a dedicated Linode, I highly recommend following that procedure.  However, if you're a crazy person and want to use lighttpd on a multi-purpose system, feel free to give my procedure a try.</blockquote>

<p>I originally wrote <a href="http://blog.hoopycat.com/2009/08/asterisk-freepbx-ubuntu-lighttpd-linode">this howto</a> for Ubuntu 9.04 (Jaunty) a few months before Ubuntu 9.10 (Karmic) was released.  I happen to have a spare system lying around right now, so I figure I might as well update this for 9.10!</p>

<h2>Summary of major changes since the 9.04 document</h2>

<ul>
  <li><strong>Kernel package</strong>: It appears <code>linux-image-server</code> no longer installs a Xen-aware kernel, so I now use <code>linux-image-ec2</code>.</li>
  <li><strong>Zaptel replaced with DAHDI</strong>: Digium <a href="http://blogs.digium.com/2008/05/19/zaptel-project-being-renamed-to-dahdi/">replaced Zaptel with DAHDI</a> for Asterisk 1.6, which now ships with Ubuntu.  This requires a change in package names, in addition to the usual changes one would expect between 1.4 and 1.6.</li>
  <li><strong>More links to the Linode Library</strong>: Since I wrote the original post in August, Linode has really fleshed out <a href="http://library.linode.com/">their documentation</a>.  I've harmonized some of the "opening moves" with their getting-started documentation to reduce confusion.</li>
  <li><strong>Now using upstart for spawning the FastCGI handlers</strong>: I figured there was a less cheesy way to do that.</li>

</ul>

<h2>Some concerns</h2>

<p>I'm occasionally seeing the boot process locking up for awhile with nasty-looking kernel bug errors:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">[&#160;&#160; 66.572527] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">[&#160;&#160;132.080097] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">[&#160;&#160;197.578163] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">[&#160;&#160;263.072534] BUG: soft lockup - CPU#1 stuck for 61s! [invoke-rc.d:1215]</span></code></td></tr>
</table></div>

<p>It eventually seems to pull out of it, but you might not want to do this on your production box until you're sure everything is happy and keen.  If anyone knows anything about these errors, let me know.  That said, I've been on a conference bridge with myself for the past ten minutes and everything's fine.</p>

<p>Without further adieu, here's the howto!</p>

<h2>Rationale</h2>

<p><a href="http://www.freepbx.org/">FreePBX</a> is a popular <a href="http://www.php.net/">PHP</a> front end for the <a href="http://www.asterisk.org/">Asterisk PBX system</a>.  It morphs the complex yet very flexible Asterisk configuration into something easier to use (yet still very extensible).  When I worked for a business-class VoIP provider back in the day, we used FreePBX (and its predecessor, AMP) for most of our customer-premise PBX servers.</p>

<p>I prefer configuring and managing my Asterisk system using FreePBX.  However, I can't justify an entire server for Asterisk, so I need it to coexist with a number of other applications.  What I can justify is a <a href="http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0">VPS with relatively little memory</a>, so some tuning is required.</p>

<p>The <a href="http://www.freepbx.org/support/documentation/installation/install-process-for-centos-5-1">usual installation instructions</a> assume the use of <a href="http://www.centos.org/">CentOS</a>, <a href="http://httpd.apache.org/">Apache</a> and <a href="http://us.php.net/manual/en/install.unix.apache2.php">mod_php</a> for the stack.  There are a few downsides to this configuration.</p>

<a href="http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode#more308">Read more &raquo;</a><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/12/asterisk-freepbx-ubuntu-910-karmic-lighttpd-linode#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=308</wfw:commentRss>
		</item>
				<item>
			<title>Keep track of configuration changes using etckeeper</title>
			<link>http://blog.hoopycat.com/2009/12/keep-track-of-configuration-changes-using-etckeeper</link>
			<pubDate>Sun, 06 Dec 2009 15:33:09 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">Geekery</category>
<category domain="main">Howto</category>			<guid isPermaLink="false">307@http://blog.hoopycat.com/</guid>
						<description>&lt;p&gt;I do stupid things sometimes.&lt;/p&gt;

&lt;p&gt;On a Linux system (and most other Unix-like systems), the &lt;code&gt;/etc&lt;/code&gt; directory holds most of the fundamental system configuration files.  Within its hierarchy lies a number of very important nuggets:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;/etc/passwd&lt;/code&gt; and its clandestine friend &lt;code&gt;/etc/shadow&lt;/code&gt;: Usernames, passwords, and home directories for all local users.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/etc/resolv.conf&lt;/code&gt;: Nameservers for resolving hostnames.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/etc/sudoers&lt;/code&gt;: The list of users who may use the &lt;code&gt;sudo&lt;/code&gt; command to temporarily assume root privileges.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;/etc/network/interfaces&lt;/code&gt; on Debian-derived systems or &lt;code&gt;/etc/sysconfig/network-scripts&lt;/code&gt; on RedHat-derived systems: Network configuration, such as IP addresses and interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;http://blog.hoopycat.com/media/blogs/ryan/etc-screenshot.png&quot;&gt;&lt;img src=&quot;http://blog.hoopycat.com/media/blogs/ryan/etc-screenshot.png&quot; alt=&quot;[screenshot of /etc]&quot; title=&quot;And this is a newly-deployed system. I get the same feeling looking at a mature /etc as I do looking at the Hubble Deep Field.&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;... and much, much, MUCH more.&lt;/p&gt;

&lt;p&gt;As you can imagine, there's a lot of room for mistakes here.  Whether you're adjusting network configuration slightly, configuring your web server, or adding/removing users, there's a good chance you'll regret it later on.  It happens to everyone, usually at a very inconvenient time following a supposedly-&quot;quick&quot; reboot.&lt;/p&gt;

&lt;p&gt;You can't avoid mistakes, but you can make it easier to find and fix them when they emerge.  If you're familiar with &lt;em&gt;revision control&lt;/em&gt;, you understand a couple key goals: you should be able to determine what change was made, when it was made, and by whom.  This is where &lt;strong&gt;&lt;em&gt;etckeeper&lt;/em&gt;&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Ideally, you should just be able to fire up &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;svn&lt;/code&gt;, or what-have-you on your /etc and be done with it.  However, as &lt;a href=&quot;http://kitenet.net/~joey/blog/entry/announcing_etckeeper/&quot;&gt;&lt;em&gt;etckeeper&lt;/em&gt;'s Joey Hess points out&lt;/a&gt;, revision control systems tend to ignore empty directories, file permissions, and other things endemic to the &lt;code&gt;/etc&lt;/code&gt; landscape:&lt;/p&gt;

&lt;blockquote&gt;
So instead I followed the lead of &lt;a href=&quot;http://www.jukie.net/~bart/blog/20070312134706&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;http://bryan-murdock.blogspot.com/2007/07/put-etc-under-revision-control-with-git.html&quot;&gt;blogs&lt;/a&gt; combined with David H&amp;#228;rdeman's &lt;code&gt;metastore&lt;/code&gt; for solving the metadata storage problem. I also hacked in a solution to the empty directory storage problem, and a few other issues with trying to use git for this thing that it was not really designed for.
&lt;/blockquote&gt;

&lt;p&gt;He also added a killer feature to &lt;em&gt;etckeeper&lt;/em&gt;: automatic commits before and after &lt;code&gt;apt-get&lt;/code&gt; and &lt;code&gt;aptitude&lt;/code&gt; runs.  This means you can see exactly what installing or removing a package did to your &lt;code&gt;/etc&lt;/code&gt;, as well as which packages were added or removed.  Very awesome.&lt;/p&gt;

&lt;h2&gt;Installing &lt;em&gt;etckeeper&lt;/em&gt; on Ubuntu&lt;/h2&gt;

&lt;p&gt;It's pretty simple.  For this installation, I'll be using a freshly-deployed virtual server.  &lt;em&gt;etckeeper&lt;/em&gt; is the first thing I'm installing, but you can install it on a mature system, of course.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server: &lt;a href=&quot;http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0&quot;&gt;Linode 360&lt;/a&gt; &lt;a href=&quot;http://www.xen.org/&quot;&gt;Xen-based&lt;/a&gt; virtual private server&lt;/li&gt;
&lt;li&gt;Distribution: Ubuntu 9.10, 32-bit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, since this is a brand-new system, I edit &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; to enable the &lt;em&gt;universe&lt;/em&gt; repositories, by uncommenting the relevant lines:&lt;/p&gt;

&lt;div class=&quot;image_block&quot;&gt;&lt;a href=&quot;http://blog.hoopycat.com/media/blogs/ryan/sources-list-enable-universe-ubuntu-9.10.png&quot;&gt;&lt;img src=&quot;http://blog.hoopycat.com/media/blogs/ryan/sources-list-enable-universe-ubuntu-9.10.png&quot; alt=&quot;[screenshot of /etc/apt/sources.list being edited in vi]&quot; title=&quot;&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/div&gt; 

&lt;p&gt;I then run &lt;code&gt;apt-get update&lt;/code&gt; to pull in up-to-date package lists, and &lt;code&gt;apt-get upgrade&lt;/code&gt; to apply any updates.&lt;/p&gt;

&lt;p&gt;That's the hard part.  Now, let's install &lt;code&gt;etckeeper&lt;/code&gt; and its friend &lt;code&gt;git-core&lt;/code&gt;:&lt;/p&gt;


&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# apt-get install etckeeper git-core&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;(apt-get does its thing)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added vim/vimrc&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added vim/vimrc.tiny&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added xml/catalog&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added xml/catalog.old&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added xml/xml-core.xml&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;added xml/xml-core.xml.old&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Committed revision 1.&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Processing triggers for libc-bin ...&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;ldconfig deferred processing now taking place&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~#&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;p&gt;By default, this uses the &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Bazaar_%28software%29&quot;&gt;Bazaar&lt;/a&gt;&lt;/em&gt; revision control system.  If you're OK with &lt;em&gt;bzr&lt;/em&gt;, then by all means use it.  However, I use &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Git_%28software%29&quot;&gt;git&lt;/a&gt;&lt;/em&gt; for everything else, so I prefer to use it with &lt;em&gt;etckeeper&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To change to &lt;em&gt;git&lt;/em&gt;, you'll first want to remove the existing stuff using &lt;code&gt;etckeeper uninit&lt;/code&gt;:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# etckeeper uninit&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;** Warning: This will DESTROY all recorded history for /etc,&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;** including the bzr repository and ignore file.&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Are you sure you want to do this? [yN] y&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Proceeding..&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then, edit the top of &lt;code&gt;/etc/etckeeper/etckeeper.conf&lt;/code&gt; to comment out the &lt;em&gt;bzr&lt;/em&gt; line and uncomment the &lt;em&gt;git&lt;/em&gt; line:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;# The VCS to use.&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;# VCS=&quot;hg&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;VCS=&quot;git&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;# VCS=&quot;bzr&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;# VCS=&quot;darcs&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then, reinitialize &lt;em&gt;etckeeper&lt;/em&gt; with &lt;code&gt;etckeeper init&lt;/code&gt;, and do your first commit with &lt;code&gt;etckeeper commit&lt;/code&gt;:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# etckeeper init&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Initialized empty Git repository in /etc/.git/&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# etckeeper commit 'initial commit'&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; create mode 100644 wgetrc&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; create mode 100644 xml/catalog&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; create mode 100644 xml/catalog.old&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; create mode 100644 xml/xml-core.xml&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; create mode 100644 xml/xml-core.xml.old&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~#&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Using &lt;em&gt;etckeeper&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;To be adequately used, anything like &lt;em&gt;etckeeper&lt;/em&gt; must be simple and easy to use.  Fortunately, it is.  You just have to remember one thing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;etckeeper commit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let's make a simple change and show how it's done.  Perhaps we'll add a regrettable typo somewhere:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# echo halt &amp;gt;&amp;gt; /etc/rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We're done with this edit, so let's commit it into &lt;em&gt;etckeeper&lt;/em&gt;.  By the way, you can either specify a brief commit message on the command line, or it will fire up an editor to let you enter a longer log message.&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# etckeeper commit 'enabling alternate h in rc.local'&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[master 5c403d3] enabling alternate h in rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; 1 files changed, 1 insertions(+), 0 deletions(-)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We can now use normal &lt;em&gt;git&lt;/em&gt; tools to examine this revision!&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:~# cd /etc&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:/etc# git log&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;commit 5c403d3e74c24a6f0bce5abe70f0bfac65c8d837&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Author: root &amp;lt;root@localhost.(none)&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Date:&amp;#160;&amp;#160; Sun Dec 6 16:23:08 2009 +0000&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;enabling alternate h in rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;commit e5c3218de86f0cc2e477cbf960d381c8fcdbd8fe&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Author: root &amp;lt;root@localhost.(none)&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Date:&amp;#160;&amp;#160; Sun Dec 6 16:19:50 2009 +0000&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;initial commit&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:/etc# git diff e5c3218 5c403d3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;diff --git a/rc.local b/rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;index 65634df..cd0acfd 100755&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;--- a/rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;+++ b/rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;@@ -12,3 +12,4 @@&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; # By default this script does nothing.&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; exit 0&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;+halt&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Reverting bad changes&lt;/h2&gt;

&lt;p&gt;And yes, you can use &lt;code&gt;gitk&lt;/code&gt; and &lt;code&gt;git bisect&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt; and whatever the heck else you want to use.  That's the point.  Even more importantly, since this edit was clearly a serious mistake (two of them, actually), we can toast it:&lt;/p&gt;

&lt;p class=&quot;amcode&quot;&gt;Code:&lt;/p&gt;&lt;div class=&quot;codeblock amc_code amc_short&quot;&gt;&lt;table&gt;&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:/etc# git revert 5c403d3&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc2&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;Finished one revert.&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc3&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;[master 2a973c7] Revert &quot;enabling alternate h in rc.local&quot;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc4&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt; 1 files changed, 0 insertions(+), 1 deletions(-)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc5&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:/etc# git status&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc6&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;# On branch master&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc7&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;nothing to commit (working directory clean)&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc8&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;root@localhost:/etc# tail -2 rc.local&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_odd&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc9&quot;&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr class=&quot;amc_code_even&quot;&gt;&lt;td class=&quot;amc_line&quot;&gt;&lt;div class=&quot;amc0&quot;&gt;&lt;div class=&quot;amc1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&lt;span class=&quot;amc_default&quot;&gt;exit 0&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;Further things to explore&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;etckeeper&lt;/em&gt; will, by default, run before and after each &lt;em&gt;apt&lt;/em&gt; run.  If you'd rather it not run before, you can affect this behavior in &lt;code&gt;/etc/etckeeper/etckeeper.conf&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;It will also do a daily autocommit of any changes in &lt;code&gt;/etc&lt;/code&gt;.  You can turn this off in &lt;code&gt;/etc/etckeeper/etckeeper.conf&lt;/code&gt; as well.  If you do, it might be a good idea to &lt;a href=&quot;http://github.com/rtucker/mail-git-status&quot;&gt;run something that checks for uncommitted changes&lt;/a&gt; nightly, e-mailing you if you've been lazy.&lt;/li&gt;
  &lt;li&gt;You probably don't want to push your &lt;code&gt;/etc&lt;/code&gt; to a public &lt;em&gt;git&lt;/em&gt; repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd like to give props to &lt;a href=&quot;http://kovaya.com/miscellany/&quot;&gt;Yaakov&lt;/a&gt; for introducing me to &lt;em&gt;etckeeper&lt;/em&gt;.  I believe it's an effective and easy way to keep yourself sane, even on single-administrator systems.  I don't know how I survived working on systems with multiple administrators and no revision control, but I'd rather not do so again.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/12/keep-track-of-configuration-changes-using-etckeeper&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I do stupid things sometimes.</p>

<p>On a Linux system (and most other Unix-like systems), the <code>/etc</code> directory holds most of the fundamental system configuration files.  Within its hierarchy lies a number of very important nuggets:</p>

<ul>
  <li><code>/etc/passwd</code> and its clandestine friend <code>/etc/shadow</code>: Usernames, passwords, and home directories for all local users.</li>
  <li><code>/etc/resolv.conf</code>: Nameservers for resolving hostnames.</li>
  <li><code>/etc/sudoers</code>: The list of users who may use the <code>sudo</code> command to temporarily assume root privileges.</li>
  <li><code>/etc/network/interfaces</code> on Debian-derived systems or <code>/etc/sysconfig/network-scripts</code> on RedHat-derived systems: Network configuration, such as IP addresses and interfaces.</li>
</ul>

<div class="image_block"><a href="http://blog.hoopycat.com/media/blogs/ryan/etc-screenshot.png"><img src="http://blog.hoopycat.com/media/blogs/ryan/etc-screenshot.png" alt="[screenshot of /etc]" title="And this is a newly-deployed system. I get the same feeling looking at a mature /etc as I do looking at the Hubble Deep Field." width="100%" /></a></div>

<p>... and much, much, MUCH more.</p>

<p>As you can imagine, there's a lot of room for mistakes here.  Whether you're adjusting network configuration slightly, configuring your web server, or adding/removing users, there's a good chance you'll regret it later on.  It happens to everyone, usually at a very inconvenient time following a supposedly-"quick" reboot.</p>

<p>You can't avoid mistakes, but you can make it easier to find and fix them when they emerge.  If you're familiar with <em>revision control</em>, you understand a couple key goals: you should be able to determine what change was made, when it was made, and by whom.  This is where <strong><em>etckeeper</em></strong> comes in.</p>

<p>Ideally, you should just be able to fire up <code>git</code>, <code>svn</code>, or what-have-you on your /etc and be done with it.  However, as <a href="http://kitenet.net/~joey/blog/entry/announcing_etckeeper/"><em>etckeeper</em>'s Joey Hess points out</a>, revision control systems tend to ignore empty directories, file permissions, and other things endemic to the <code>/etc</code> landscape:</p>

<blockquote>
So instead I followed the lead of <a href="http://www.jukie.net/~bart/blog/20070312134706">these</a> <a href="http://bryan-murdock.blogspot.com/2007/07/put-etc-under-revision-control-with-git.html">blogs</a> combined with David H&#228;rdeman's <code>metastore</code> for solving the metadata storage problem. I also hacked in a solution to the empty directory storage problem, and a few other issues with trying to use git for this thing that it was not really designed for.
</blockquote>

<p>He also added a killer feature to <em>etckeeper</em>: automatic commits before and after <code>apt-get</code> and <code>aptitude</code> runs.  This means you can see exactly what installing or removing a package did to your <code>/etc</code>, as well as which packages were added or removed.  Very awesome.</p>

<h2>Installing <em>etckeeper</em> on Ubuntu</h2>

<p>It's pretty simple.  For this installation, I'll be using a freshly-deployed virtual server.  <em>etckeeper</em> is the first thing I'm installing, but you can install it on a mature system, of course.</p>

<ul>
<li>Server: <a href="http://www.linode.com/?r=f4079e5bd594cdb5820aaec4a8eaca7b533dd6d0">Linode 360</a> <a href="http://www.xen.org/">Xen-based</a> virtual private server</li>
<li>Distribution: Ubuntu 9.10, 32-bit</li>
</ul>

<p>First, since this is a brand-new system, I edit <code>/etc/apt/sources.list</code> to enable the <em>universe</em> repositories, by uncommenting the relevant lines:</p>

<div class="image_block"><a href="http://blog.hoopycat.com/media/blogs/ryan/sources-list-enable-universe-ubuntu-9.10.png"><img src="http://blog.hoopycat.com/media/blogs/ryan/sources-list-enable-universe-ubuntu-9.10.png" alt="[screenshot of /etc/apt/sources.list being edited in vi]" title="" width="100%" /></a></div> 

<p>I then run <code>apt-get update</code> to pull in up-to-date package lists, and <code>apt-get upgrade</code> to apply any updates.</p>

<p>That's the hard part.  Now, let's install <code>etckeeper</code> and its friend <code>git-core</code>:</p>


<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# apt-get install etckeeper git-core</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">(apt-get does its thing)</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">...</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">added vim/vimrc</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">added vim/vimrc.tiny</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">added xml/catalog</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">added xml/catalog.old</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">added xml/xml-core.xml</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code><span class="amc_default">added xml/xml-core.xml.old</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">Committed revision 1.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc1"><div class="amc1"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"><div class="amc1"></div></div></td><td><code><span class="amc_default">Processing triggers for libc-bin ...</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"><div class="amc1"></div></div></td><td><code><span class="amc_default">ldconfig deferred processing now taking place</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"><div class="amc1"></div></div></td><td><code><span class="amc_default">root@localhost:~#</span></code></td></tr>
</table></div>


<p>By default, this uses the <em><a href="http://en.wikipedia.org/wiki/Bazaar_%28software%29">Bazaar</a></em> revision control system.  If you're OK with <em>bzr</em>, then by all means use it.  However, I use <em><a href="http://en.wikipedia.org/wiki/Git_%28software%29">git</a></em> for everything else, so I prefer to use it with <em>etckeeper</em>.</p>

<p>To change to <em>git</em>, you'll first want to remove the existing stuff using <code>etckeeper uninit</code>:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# etckeeper uninit</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">** Warning: This will DESTROY all recorded history for /etc,</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">** including the bzr repository and ignore file.</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">Are you sure you want to do this? [yN] y</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default">Proceeding..</span></code></td></tr>
</table></div>

<p>Then, edit the top of <code>/etc/etckeeper/etckeeper.conf</code> to comment out the <em>bzr</em> line and uncomment the <em>git</em> line:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default"># The VCS to use.</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default"># VCS="hg"</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">VCS="git"</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default"># VCS="bzr"</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default"># VCS="darcs"</span></code></td></tr>
</table></div>

<p>Then, reinitialize <em>etckeeper</em> with <code>etckeeper init</code>, and do your first commit with <code>etckeeper commit</code>:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# etckeeper init</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">Initialized empty Git repository in /etc/.git/</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">root@localhost:~# etckeeper commit 'initial commit'</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">...</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default"> create mode 100644 wgetrc</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default"> create mode 100644 xml/catalog</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default"> create mode 100644 xml/catalog.old</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default"> create mode 100644 xml/xml-core.xml</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code><span class="amc_default"> create mode 100644 xml/xml-core.xml.old</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">root@localhost:~#</span></code></td></tr>
</table></div>

<h2>Using <em>etckeeper</em></h2>

<p>To be adequately used, anything like <em>etckeeper</em> must be simple and easy to use.  Fortunately, it is.  You just have to remember one thing:</p>

<p><code>etckeeper commit</code></p>

<p>Let's make a simple change and show how it's done.  Perhaps we'll add a regrettable typo somewhere:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# echo halt &gt;&gt; /etc/rc.local</span></code></td></tr>
</table></div>

<p>We're done with this edit, so let's commit it into <em>etckeeper</em>.  By the way, you can either specify a brief commit message on the command line, or it will fire up an editor to let you enter a longer log message.</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# etckeeper commit 'enabling alternate h in rc.local'</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">[master 5c403d3] enabling alternate h in rc.local</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default"> 1 files changed, 1 insertions(+), 0 deletions(-)</span></code></td></tr>
</table></div>

<p>We can now use normal <em>git</em> tools to examine this revision!</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:~# cd /etc</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">root@localhost:/etc# git log</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">commit 5c403d3e74c24a6f0bce5abe70f0bfac65c8d837</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default">Author: root &lt;root@localhost.(none)&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">Date:&#160;&#160; Sun Dec 6 16:23:08 2009 +0000</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;enabling alternate h in rc.local</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code><span class="amc_default">commit e5c3218de86f0cc2e477cbf960d381c8fcdbd8fe</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">Author: root &lt;root@localhost.(none)&gt;</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc1"><div class="amc1"></div></div></td><td><code><span class="amc_default">Date:&#160;&#160; Sun Dec 6 16:19:50 2009 +0000</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"><div class="amc1"></div></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"><div class="amc1"></div></div></td><td><code><span class="amc_default">&#160;&#160;&#160;&#160;initial commit</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"><div class="amc1"></div></div></td><td><code><span class="amc_default">root@localhost:/etc# git diff e5c3218 5c403d3</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"><div class="amc1"></div></div></td><td><code><span class="amc_default">diff --git a/rc.local b/rc.local</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"><div class="amc1"></div></div></td><td><code><span class="amc_default">index 65634df..cd0acfd 100755</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"><div class="amc1"></div></div></td><td><code><span class="amc_default">--- a/rc.local</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"><div class="amc1"></div></div></td><td><code><span class="amc_default">+++ b/rc.local</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"><div class="amc1"></div></div></td><td><code><span class="amc_default">@@ -12,3 +12,4 @@</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc2"></div></div></td><td><code><span class="amc_default"> # By default this script does nothing.</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc1"><div class="amc2"></div></div></td><td><code><span class="amc_default"> </span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"><div class="amc2"></div></div></td><td><code><span class="amc_default"> exit 0</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"><div class="amc2"></div></div></td><td><code><span class="amc_default">+halt</span></code></td></tr>
</table></div>

<h2>Reverting bad changes</h2>

<p>And yes, you can use <code>gitk</code> and <code>git bisect</code> and <code>git push</code> and whatever the heck else you want to use.  That's the point.  Even more importantly, since this edit was clearly a serious mistake (two of them, actually), we can toast it:</p>

<p class="amcode">Code:</p><div class="codeblock amc_code amc_short"><table><tr class="amc_code_odd"><td class="amc_line"><div class="amc1"></div></td><td><code><span class="amc_default">root@localhost:/etc# git revert 5c403d3</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc2"></div></td><td><code><span class="amc_default">Finished one revert.</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc3"></div></td><td><code><span class="amc_default">[master 2a973c7] Revert "enabling alternate h in rc.local"</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc4"></div></td><td><code><span class="amc_default"> 1 files changed, 0 insertions(+), 1 deletions(-)</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc5"></div></td><td><code><span class="amc_default">root@localhost:/etc# git status</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc6"></div></td><td><code><span class="amc_default"># On branch master</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc7"></div></td><td><code><span class="amc_default">nothing to commit (working directory clean)</span></code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc8"></div></td><td><code><span class="amc_default">root@localhost:/etc# tail -2 rc.local</span></code></td></tr>
<tr class="amc_code_odd"><td class="amc_line"><div class="amc9"></div></td><td><code>&nbsp;</code></td></tr>
<tr class="amc_code_even"><td class="amc_line"><div class="amc0"><div class="amc1"></div></div></td><td><code><span class="amc_default">exit 0</span></code></td></tr>
</table></div>

<h2>Further things to explore</h2>

<ul>
  <li><em>etckeeper</em> will, by default, run before and after each <em>apt</em> run.  If you'd rather it not run before, you can affect this behavior in <code>/etc/etckeeper/etckeeper.conf</code>.</li>
  <li>It will also do a daily autocommit of any changes in <code>/etc</code>.  You can turn this off in <code>/etc/etckeeper/etckeeper.conf</code> as well.  If you do, it might be a good idea to <a href="http://github.com/rtucker/mail-git-status">run something that checks for uncommitted changes</a> nightly, e-mailing you if you've been lazy.</li>
  <li>You probably don't want to push your <code>/etc</code> to a public <em>git</em> repository.</li>
</ul>

<p>I'd like to give props to <a href="http://kovaya.com/miscellany/">Yaakov</a> for introducing me to <em>etckeeper</em>.  I believe it's an effective and easy way to keep yourself sane, even on single-administrator systems.  I don't know how I survived working on systems with multiple administrators and no revision control, but I'd rather not do so again.</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/12/keep-track-of-configuration-changes-using-etckeeper">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/12/keep-track-of-configuration-changes-using-etckeeper#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=307</wfw:commentRss>
		</item>
				<item>
			<title>Team of RIT engineering students wins IEEE Student Design Contest</title>
			<link>http://blog.hoopycat.com/2009/11/team-of-rit-engineering-students-wins-ieee-student-design-contest</link>
			<pubDate>Sat, 21 Nov 2009 15:47:20 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="alt">School</category>
<category domain="main">Geekery</category>			<guid isPermaLink="false">306@http://blog.hoopycat.com/</guid>
						<description>&lt;a rel=&quot;http://edge.rit.edu/content/P09003/public/187.jpg&quot;&gt;&lt;img src=&quot;http://edge.rit.edu/content/P09003/public/187.jpg&quot; align=&quot;right&quot; width=&quot;50%&quot; alt=&quot;[Photo of the handheld game]&quot; title=&quot;Shall we play a game?&quot; /&gt;&lt;/a&gt;&lt;p&gt;Kudos to a team of engineering students from RIT not only for placing first in the &lt;a href=&quot;http://ieee.rit.edu/sdc9/index.php&quot;&gt;9th Annual Student Design Contest&lt;/a&gt;, but for doing it with a senior design project of considerable awesomeness:&lt;/p&gt;

&lt;blockquote&gt;The goal of this project is to create a custom handheld game for Luke, a nine-year-old child with severe visual limitations. To accommodate this limitation, the handheld was designed to engage multiple senses with a lower emphasis on visual interpretation. It is expected that this handheld will provide educational and physical benefits. The lower emphasis on visual cues will help Luke to develop other senses such as touch and hearing. Although visual cues are not a primary focus they are included, this will provide a common activity in which all children can enjoy and will facilitate Luke to interact with his peers while providing entertaining and educational benefits. [&lt;a href=&quot;http://ieee.rit.edu/sdc9/teams.php&quot;&gt;link&lt;/a&gt;]&lt;/blockquote&gt;

&lt;p&gt;The contest was held in May, but RIT&amp;#8217;s PR department did not &lt;a href=&quot;http://www.rit.edu/news/?r=47086&quot;&gt;issue a press release until mid-October&lt;/a&gt;.  Today, the Rochester Democrat and Chronicle published an &lt;a href=&quot;http://www.democratandchronicle.com/article/20091121/NEWS01/911210346/RIT-game-wins-award-and-young-boy-s-heart&quot;&gt;article focusing on why the team chose this project&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;The idea of a game for Luke started about 3&amp;#189; years ago with his pediatrician, Dr. Julie Lenhard of Perinton.

Lenhard noticed that when Luke and his brother came to her office for checkups, Jack could look at books and magazines or draw pictures while sitting in the waiting room. But because of his vision problem, Luke had nothing similar to do.

&amp;#8220;I thought, wouldn&amp;#8217;t it be great if Luke had a (Nintendo) Game Boy sort of toy that was suited for him, that he could play with quietly in the many various situations when the adults were boring and talking and he had nothing to do,&amp;#8221; Lenhard said.&lt;/blockquote&gt;

&lt;a rel=&quot;http://edge.rit.edu/content/P09003/public/229.jpg&quot;&gt;&lt;img src=&quot;http://edge.rit.edu/content/P09003/public/229.jpg&quot; width=&quot;50%&quot; align=&quot;left&quot; alt=&quot;[Photo of inside of handheld game]&quot; title=&quot;That's a P8X32A-Q44, per the schematic&quot; /&gt;&lt;/a&gt;&lt;p&gt;The device itself is based on the &lt;a href=&quot;http://www.parallax.com/propeller/&quot;&gt;Parallax Propeller P8X32A&lt;/a&gt;, a 32-bit multicore microcontroller optimized for high-performance embedded applications.  More information on the architecture and design process, as well as schematics and source code, is available on &lt;a href=&quot;http://edge.rit.edu/content/P09003/public/Home&quot;&gt;the project&amp;#8217;s web site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Certainly, designing and building a project that actually &lt;em&gt;makes a difference&lt;/em&gt; in someone&amp;#8217;s life is a rarity for undergrads.  Over the summer, my wife worked on the modernization project at &lt;a href=&quot;http://www.fairport.org/BrooksHill.cfm&quot;&gt;Brooks Hill Elementary&lt;/a&gt; (where Luke&amp;#8217;s parents teach, and presumably where he goes to school), and she reports he&amp;#8217;s the sweetest little kid in the world&lt;sup&gt;1&lt;/sup&gt;, which makes it all the more awesome.&lt;/p&gt;

&lt;p&gt;&amp;#8212;&amp;#8212;&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;em&gt;With apologies to everyone else whose little kid is the sweetest in the world.&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/11/team-of-rit-engineering-students-wins-ieee-student-design-contest&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<a rel="http://edge.rit.edu/content/P09003/public/187.jpg"><img src="http://edge.rit.edu/content/P09003/public/187.jpg" align="right" width="50%" alt="[Photo of the handheld game]" title="Shall we play a game?" /></a><p>Kudos to a team of engineering students from RIT not only for placing first in the <a href="http://ieee.rit.edu/sdc9/index.php">9th Annual Student Design Contest</a>, but for doing it with a senior design project of considerable awesomeness:</p>

<blockquote>The goal of this project is to create a custom handheld game for Luke, a nine-year-old child with severe visual limitations. To accommodate this limitation, the handheld was designed to engage multiple senses with a lower emphasis on visual interpretation. It is expected that this handheld will provide educational and physical benefits. The lower emphasis on visual cues will help Luke to develop other senses such as touch and hearing. Although visual cues are not a primary focus they are included, this will provide a common activity in which all children can enjoy and will facilitate Luke to interact with his peers while providing entertaining and educational benefits. [<a href="http://ieee.rit.edu/sdc9/teams.php">link</a>]</blockquote>

<p>The contest was held in May, but RIT&#8217;s PR department did not <a href="http://www.rit.edu/news/?r=47086">issue a press release until mid-October</a>.  Today, the Rochester Democrat and Chronicle published an <a href="http://www.democratandchronicle.com/article/20091121/NEWS01/911210346/RIT-game-wins-award-and-young-boy-s-heart">article focusing on why the team chose this project</a>:</p>

<blockquote>The idea of a game for Luke started about 3&#189; years ago with his pediatrician, Dr. Julie Lenhard of Perinton.

Lenhard noticed that when Luke and his brother came to her office for checkups, Jack could look at books and magazines or draw pictures while sitting in the waiting room. But because of his vision problem, Luke had nothing similar to do.

&#8220;I thought, wouldn&#8217;t it be great if Luke had a (Nintendo) Game Boy sort of toy that was suited for him, that he could play with quietly in the many various situations when the adults were boring and talking and he had nothing to do,&#8221; Lenhard said.</blockquote>

<a rel="http://edge.rit.edu/content/P09003/public/229.jpg"><img src="http://edge.rit.edu/content/P09003/public/229.jpg" width="50%" align="left" alt="[Photo of inside of handheld game]" title="That's a P8X32A-Q44, per the schematic" /></a><p>The device itself is based on the <a href="http://www.parallax.com/propeller/">Parallax Propeller P8X32A</a>, a 32-bit multicore microcontroller optimized for high-performance embedded applications.  More information on the architecture and design process, as well as schematics and source code, is available on <a href="http://edge.rit.edu/content/P09003/public/Home">the project&#8217;s web site</a>.</p>

<p>Certainly, designing and building a project that actually <em>makes a difference</em> in someone&#8217;s life is a rarity for undergrads.  Over the summer, my wife worked on the modernization project at <a href="http://www.fairport.org/BrooksHill.cfm">Brooks Hill Elementary</a> (where Luke&#8217;s parents teach, and presumably where he goes to school), and she reports he&#8217;s the sweetest little kid in the world<sup>1</sup>, which makes it all the more awesome.</p>

<p>&#8212;&#8212;</p>
<p><sup>1</sup> <em>With apologies to everyone else whose little kid is the sweetest in the world.</em></p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/11/team-of-rit-engineering-students-wins-ieee-student-design-contest">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/11/team-of-rit-engineering-students-wins-ieee-student-design-contest#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=306</wfw:commentRss>
		</item>
				<item>
			<title>Self-intervention: Charity address labels</title>
			<link>http://blog.hoopycat.com/2009/11/self-intervention-charity-address-labels</link>
			<pubDate>Fri, 20 Nov 2009 03:07:31 +0000</pubDate>			<dc:creator>Ryan</dc:creator>
			<category domain="main">Useless Blatherings</category>			<guid isPermaLink="false">305@http://blog.hoopycat.com/</guid>
						<description>&lt;a rel=&quot;http://photo.hoopycat.com/d/1917-2/1119092142.jpg&quot; href=&quot;http://photo.hoopycat.com/v/MiscImages/1119092142.jpg.html&quot;&gt;&lt;img src=&quot;http://photo.hoopycat.com/d/1917-2/1119092142.jpg&quot; alt=&quot;[photo of address label stack]&quot; title=&quot;awwww kitty&quot; width=&quot;50%&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;
&lt;p&gt;I rummaged through our mailing-supplies drawer this morning, hoping to find more postage.  In the process, I discovered my charity address label collection loomed a little larger than I remember.  This evening, I decided to see what all's in there.&lt;/p&gt;

&lt;p&gt;Needless to say, it is mammoth.  I appear to have been hoarding these things for many years.  All have the right address, but there's just a ludicrous quantity of them.&lt;/p&gt;

&lt;p&gt;Here is the pile:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;11 marine-themed labels from the American Diabetes Association (I've been using these lately; there used to be a lot more.)&lt;/li&gt;

  &lt;li&gt;55 bird-themed labels (and 6 general-purpose bird stickers) from the Audubon Society&lt;/li&gt;

  &lt;li&gt;90 shiny labels from Amnesty International&lt;/li&gt;

  &lt;li&gt;15 line-art cat and dog labels from Lollypop Farm&lt;/li&gt;

  &lt;li&gt;40 labels with nearly photo-realistic fruit from Feeding America&lt;/li&gt;

  &lt;li&gt;24 orange kitten labels from Lollypop Farm&lt;/li&gt;

  &lt;li&gt;24 labels featuring piles of gray kittens&lt;/li&gt;

  &lt;li&gt;36 kites, suns, giraffes, and cardinals from the Muscular Dystrophy Association&lt;/li&gt;

  &lt;li&gt;42 Christmas-themed labels from the March of Dimes (with 24 Christmas-themed stickers)&lt;/li&gt;

  &lt;li&gt;24 labels featuring hands feeding dogs and/or lifting kittens from Lollypop Farm&lt;/li&gt;

  &lt;li&gt;80 more nearly photo-realistic fruit from Feeding America&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;Total&lt;/strong&gt;: 441 address labels.&lt;/p&gt;

&lt;p&gt;Which should I keep?  The orange kittens or the fruits?  And no, there were no stamps in the pile.  Drat.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blog.hoopycat.com/2009/11/self-intervention-charity-address-labels&quot;&gt;Original post&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<a rel="http://photo.hoopycat.com/d/1917-2/1119092142.jpg" href="http://photo.hoopycat.com/v/MiscImages/1119092142.jpg.html"><img src="http://photo.hoopycat.com/d/1917-2/1119092142.jpg" alt="[photo of address label stack]" title="awwww kitty" width="50%" align="right" /></a>
<p>I rummaged through our mailing-supplies drawer this morning, hoping to find more postage.  In the process, I discovered my charity address label collection loomed a little larger than I remember.  This evening, I decided to see what all's in there.</p>

<p>Needless to say, it is mammoth.  I appear to have been hoarding these things for many years.  All have the right address, but there's just a ludicrous quantity of them.</p>

<p>Here is the pile:</p>

<ul>
  <li>11 marine-themed labels from the American Diabetes Association (I've been using these lately; there used to be a lot more.)</li>

  <li>55 bird-themed labels (and 6 general-purpose bird stickers) from the Audubon Society</li>

  <li>90 shiny labels from Amnesty International</li>

  <li>15 line-art cat and dog labels from Lollypop Farm</li>

  <li>40 labels with nearly photo-realistic fruit from Feeding America</li>

  <li>24 orange kitten labels from Lollypop Farm</li>

  <li>24 labels featuring piles of gray kittens</li>

  <li>36 kites, suns, giraffes, and cardinals from the Muscular Dystrophy Association</li>

  <li>42 Christmas-themed labels from the March of Dimes (with 24 Christmas-themed stickers)</li>

  <li>24 labels featuring hands feeding dogs and/or lifting kittens from Lollypop Farm</li>

  <li>80 more nearly photo-realistic fruit from Feeding America</li>
</ul>


<p><strong>Total</strong>: 441 address labels.</p>

<p>Which should I keep?  The orange kittens or the fruits?  And no, there were no stamps in the pile.  Drat.</p><div class="item_footer"><p><small><a href="http://blog.hoopycat.com/2009/11/self-intervention-charity-address-labels">Original post</a></small></p></div>]]></content:encoded>
								<comments>http://blog.hoopycat.com/2009/11/self-intervention-charity-address-labels#comments</comments>
			<wfw:commentRss>http://blog.hoopycat.com/?tempskin=_rss2&#38;disp=comments&#38;p=305</wfw:commentRss>
		</item>
			</channel>
</rss>
