<?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>Coyote Tracks &#187; my projects</title>
	<atom:link href="http://kai.mactane.org/blog/tag/my-projects/feed/" rel="self" type="application/rss+xml" />
	<link>http://kai.mactane.org/blog</link>
	<description>The prints of an Internet-enabled coyote.</description>
	<lastBuildDate>Fri, 10 Sep 2010 01:40:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hummingbird Updated to Version 0.60</title>
		<link>http://kai.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/</link>
		<comments>http://kai.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 02:49:27 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[hummingbird]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[oops]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[should have known better]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=109</guid>
		<description><![CDATA[I&#8217;ve always questioned the wisdom of building a startup company based around someone else&#8217;s platform, like Facebook games or Gmail inbox add-ons. You&#8217;re totally at the mercy of the other company. (Many people have found out how silly it was to go up against Microsoft or Apple in just the same way.)
And yet, here I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve always questioned the wisdom of building a startup company based around someone else&#8217;s platform, like Facebook games or Gmail inbox add-ons. You&#8217;re totally at the mercy of the other company. (Many people have found out how silly it was to go up against Microsoft or Apple in just the same way.)</p>
<p>And yet, here I am with <a href="/software/hummingbird/">Hummingbird</a>, which is totally dependent on Twitter&#8217;s bandwidth. (In my own defense, I can only point out that: a) I wrote it because I needed the functionality; and b) I&#8217;m not building a money-making company around Hummingbird. I&#8217;m just giving it away.)</p>
<p>In the past couple of weeks, I&#8217;ve noticed that Twitter can sometimes take an astonishingly long time to provide an update. Hummingbird works by requesting URLs like <a href="http://twitter.com/statuses/user_timeline/kmactane.xml?count=25">http://twitter.com/statuses/user_timeline/kmactane.xml?count=25</a>, and (up until now) it worked on the assumption that Twitter couldn&#8217;t possibly take longer than 10 or 15 seconds to respond to such a request.</p>
<p>That turns out not to be the case.</p>
<p>In fact, my recent tests have shown that Twitter can sometimes take <em>over 5 full minutes</em> to finish responding to such a request. This is a problem, because the default installation of Hummingbird tries to update its cached data once every 5 minutes. And since I assumed the request would be fulfilled in, at most, 10% of that time, I didn&#8217;t bother building in any concurrency checking.</p>
<p>I&#8217;ve just completely reorganized most of Hummingbird&#8217;s architecture. The interface that a blog owner sees (in the sense of the configuration variables in <code>hummingbird.php</code>, and the calling syntax for blog pages and cron jobs) is still the same. However, all of the code for retrieving data from Twitter has been spun off into a new <code>hummingbird-cache.php</code> file, which can be launched into the background by the rest of Hummingbird, so that it can patiently take as long as it needs to in order to update the blog&#8217;s tweets cache.</p>
<h3>The Major Change This Causes</h3>
<p>In Hummingbird&#8217;s previous incarnations, it would freshen an out-of-date cache before displaying it. The assumption was that every once in a while, someone might have to wait a few more seconds before seeing your blog page. However, everyone would always see an up-to-date record of your tweets. (Where &#8220;up-to-date&#8221; means &#8220;no more than 5 minutes old, absolute tops&#8221;. If you tweet so relentlessly that that&#8217;s a problem, you probably don&#8217;t have enough time to keep up your blog&#8230;)</p>
<p>Now that we know that Twitter can take over 5 minutes to give you the data needed to freshen your tweets cache, that design is not acceptable. Instead, Hummingbird is now committed to showing the contents of your tweets cache as quickly as possible, and <em>only then</em> does it fork the cache-update process into the background.</p>
<p>This means that, <em>if you&#8217;re not using cron</em> or some other automatic job-scheduling facility to run Hummingbird every 5 minutes, visitors who arrive at your blog after a period of inactivity will see an out-of-date, stale listing of your tweets. </p>
<p>If you have a cron job set to keep Hummingbird fresh, you&#8217;ll be fine. (A page view will also trigger an update, so if you get so much traffic that there&#8217;s never a 5-minute period during which your page doesn&#8217;t get hit, you&#8217;ll also be fine.)</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/08/20/hummingbird-updated-to-version-0-60/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>An Installation Shell-Script for Palm Pr&#275; Developers</title>
		<link>http://kai.mactane.org/blog/2009/08/02/an-installation-shell-script-for-palm-pre-developers/</link>
		<comments>http://kai.mactane.org/blog/2009/08/02/an-installation-shell-script-for-palm-pre-developers/#comments</comments>
		<pubDate>Sun, 02 Aug 2009 22:28:16 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[palm pre]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[shell scripting]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=101</guid>
		<description><![CDATA[Last week, I wrote that I'd been working on a script to easily install homebrew apps on the Palm Pr&#275;. It now looks like there are much better ways to handle such things&#160;&#8212; I've become quite a fan of fileCoaster, myself, and of course webOSQuickInstall is a wonderful piece of work, as well. But just [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, I wrote that I'd been working on a script to easily install homebrew apps on the Palm Pr&#275;. It now looks like there are much better ways to handle such things&nbsp;&mdash; I've become quite a fan of fileCoaster, myself, and of course webOSQuickInstall is a wonderful piece of work, as well. But just in case anyone might find this shell script useful, I'll release it for general use.
</p>
<p><strong>Assumptions</strong>
</p>

<ol>
	<li>You have a web-accessible server where you put your development .ipk files.</li>
	<li>You can ssh into your Pr&#275;.</li>
</ol>

<p><strong>Download</strong>
</p>
<p>You can download the script at <a href="http://kai.mactane.org/software/libraries/download/homebrew.sh">http://kai.mactane.org/software/libraries/download/homebrew.sh</a>.
</p>
<p><strong>Installation</strong>
</p>
<p>Just drop the shell script into your home directory and make it executable. If you want to be able to use the "my" argument, you'll also need to edit the three configuration variables at the beginning: MY_HOSTNAME, STDPATH, and STDVERSION.
</p>
<p><strong>Usage</strong>
</p>
<p>For most purposes, you'll just want to install your own package that you've been working on. Assuming you've set the config variables correctly, you can just type <code>./homebrew.sh my <em>appname</em></code>, where the <em>appname</em> is the base name of your package.
</p>
<p>If you're installing multiple .ipks and you don't need to restart the GUI manager for each one, you can use the "skip" command on all but the last:
</p>
<p><code>./homebrew.sh skip my foo<br />
./homebrew.sh skip my bar<br />
./homebrew.sh skip my baz<br />
./homebrew.sh my quux
</code>
</p>
<p>You can also supply a complete URL: <code>./homebrew.sh http://forums.precentral.net/spe_attachment/download-23971-com.palm.net.precoder.fcoaster_1.0.2_all.ipk</code> will download and install fileCoaster, so you won't have to mess with my script any more.
</p>
<p><strong>What It Does</strong>
</p>
<p>It automates the process of <a href="http://www.webos-internals.org/wiki/Installing_Homebrew_Apps_With_A_Rooted_Pr&#275;">installing homebrew apps with a rooted Pr&#275;</a>, as described on the webOS Internals wiki. Basically, it remounts the root partition in read-write mode, <code>wget</code>s your .ipk file, installs it, does the "Good Housekeeping" backup, remounts the root partition in read-only mode again, and then restarts the GUI manager.
</p>

]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/08/02/an-installation-shell-script-for-palm-pre-developers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Productivity on Various Fronts</title>
		<link>http://kai.mactane.org/blog/2009/07/26/productivity-on-various-fronts/</link>
		<comments>http://kai.mactane.org/blog/2009/07/26/productivity-on-various-fronts/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 00:56:35 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[j-babble]]></category>
		<category><![CDATA[japanese]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[palm pre]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=93</guid>
		<description><![CDATA[I&#8217;ve actually made some progress on coding projects this weekend. My Palm Pr&#275; &#8220;Magic 8 Ball&#8221; application now responds to the Pr&#275;&#8217;s accelerometer: if you rotate the Pr&#275;, the app stays right-side up (including readjusting the position of the backdrop image). Even cooler, you no longer have to tap a button to trigger the fortune; [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve actually made some progress on coding projects this weekend. My Palm Pr&#275; &#8220;Magic 8 Ball&#8221; application now responds to the Pr&#275;&#8217;s accelerometer: if you rotate the Pr&#275;, the app stays right-side up (including readjusting the position of the backdrop image). Even cooler, you no longer have to tap a button to trigger the fortune; now you shake the phone instead. (Last Saturday night, a friend expected to be able to shake the phone and have it &#8220;shake the magic 8-Ball&#8221;. But that wasn&#8217;t actually possible for third-party devs like me at the time; the accelerometer support only arrived in the webOS 1.1.0 update, which came out on Thursday.)</p>
<p>I&#8217;ve also got a reasonably good script for installing, updating, and uninstalling homebrew apps for the Pr&#275;. Instead of the annoying, <a href="http://www.webos-internals.org/wiki/Installing_Homebrew_Apps_With_A_Rooted_Pre#Using_wget">six-step process for installing homebrew apps on a rooted Pr&#275;</a>, I just shell in and type <code>./homebrew.sh&nbsp;my&nbsp;8ball</code>, and the homebrew.sh script does it all for me. I need to publish that thing, now that I&#8217;ve got it working fairly well.</p>
<p>Additionally, my Japanese sentence generator, called &#8220;J-Babble&#8221;, now does proper plain past tenses (the <i>-ta</i> and <i>-nakatta</i> forms), which will make it more useful for me as a tool to keep me from backsliding when I&#8217;m busy. I&#8217;d link to that, but it&#8217;s not really a general-use tool yet. It&#8217;s more just for me. Maybe some day, I&#8217;ll give it the option for people to customize what vocabulary and grammatical forms they know, so it can just generate stuff they have a chance of understanding. For now, though, its use is just for me: when my life gets too busy for me to read my Japanese textbook and try to make new progress, I can at least bring up J-Babble once a day and get 25 randomly-generated, but grammatically correct and semantically sensible, sentences in Japanese. It&#8217;s just enough to keep the neural pathways from atrophying; it allows me to hold my place instead of losing ground.</p>
<p>(I&#8217;ve gotten some housework done, too, but this isn&#8217;t the place to talk about that.)</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/07/26/productivity-on-various-fronts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcement: Hummingbird Upgraded to Version 0.51</title>
		<link>http://kai.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/</link>
		<comments>http://kai.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 22:11:10 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=91</guid>
		<description><![CDATA[I&#8217;ve just upgraded Hummingbird from version 0.5 to its new version: 0.51. Since I recently starting using the #PalmPr&#275; hashtag in my tweets, I suddenly noticed that Hummingbird didn&#8217;t make hashtags clickable.
Well, now it does.
The change is pretty minimal, but it also incurred some overhead in my web site: the Hummingbird web page needed to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just upgraded Hummingbird from version 0.5 to its new version: 0.51. Since I recently starting using the #PalmPr&#275; hashtag in my tweets, I suddenly noticed that Hummingbird didn&#8217;t make hashtags clickable.</p>
<p>Well, now it does.</p>
<p>The change is pretty minimal, but it also incurred some overhead in my web site: <a href="http://kai.mactane.org/software/hummingbird/">the Hummingbird web page</a> needed to be updated to match the new feature. And since that feature meant adding a new CSS class, I had to update the &#8220;CSS Styling&#8221; section as well as the &#8220;Features&#8221; section&#8230; and add a new &#8220;Version History&#8221; section&#8230;</p>
<p>All in all, it was harder to update the documentary web page than to update the software itself. In a way, that implies that my code was pretty clean. If you want, you can <a href="http://kai.mactane.org/software/libraries/download/hummingbird.php">download the new version here</a>.</p>
<p>See, I&#8217;m not neglecting everything to work on Palm Pr&#275; programming! (I&#8217;m also doing some contracting, which is taking up even more time.) </p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/07/15/announcement-hummingbird-upgraded-to-version-0-51/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Notes on LJ Content Sieve</title>
		<link>http://kai.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/</link>
		<comments>http://kai.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 21:07:42 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=78</guid>
		<description><![CDATA[My latest project is something I call &#8220;LJ Content Sieve&#8221;: a Greasemonkey script to filter out content on one&#8217;s Livejournal views based on nearly any attribute of a post or comment.
However, Livejournal is very customizable. It has 31 different &#8220;layouts&#8221;, each of which can then be further &#8220;themed&#8221; by application of CSS. This means that [...]]]></description>
			<content:encoded><![CDATA[<p>My latest project is something I call &#8220;LJ Content Sieve&#8221;: a Greasemonkey script to filter out content on one&#8217;s Livejournal views based on nearly any attribute of a post or comment.</p>
<p>However, Livejournal is very customizable. It has 31 different &#8220;layouts&#8221;, each of which can then be further &#8220;themed&#8221; by application of CSS. This means that a user viewing a given journal, community, or single post, at a given time, may receive an HTML document containing any of 31 different DOM structures.</p>
<p>This means that finding a post&#8217;s author, or title, or even just a single post or comment, is not a straightforward process. I&#8217;ve set myself up a Ruby script that downloaded my &#8220;friends&#8221; view, a representative entry with lots of comments, and my own journal view, thus giving me a set of 93 fixtures that I can test against. The Ruby script also tweaked each fixture in the process of spooling it to my hard drive, by adding the proper calls to JSUnit files.</p>
<p>At the end of each document&#8217;s &lt;head&gt; element, there&#8217;s a call to <code>jsUnitCore.js</code>. Then, at the end of each &lt;body&gt;, I add a call to the <code>lj-content-sieve.user.js</code> script itself, as well as a set of test files that depends on which fixture this is. Every fixture gets an <code>ljcs-global-tests.js</code> call added to it&nbsp;&mdash; that file contains tests that should work anywhere, regardless of what sort of page you&#8217;re on.</p>
<p>Then all the &#8220;friends&#8221; page fixtures get an <code>ljcs-friends-tests.js</code> file, which tests operations that should happen on every friends page. For example, determining which entries need to be deleted. (In contrast, single-entry pages get <code>ljcs-entry-tests.js</code>, and the page from my own journal&nbsp;&mdash; which stands in for a view of a community&nbsp;&mdash; gets <code>ljcs-self-tests.js</code>.)</p>
<p>Finally, each fixture page gets a test file based on its layout: the &#8220;3 Column&#8221; layout gets <code>ljcs-3&nbsp;Column-tests.js</code>, while &#8220;Cuteness Attack&#8221; gets <code>ljcs-Cuteness&nbsp;Attack-tests.js</code>. (Hey, I didn&#8217;t write or name the layouts; I just have to make sure LJCS works with all of &#8216;em.) These files will test that the actual DOM manipulations work properly.</p>
<p>Without test-driven development and automated testing to ensure that each layout and page-type is being handled properly, I don&#8217;t think this project would be manageable at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/07/04/notes-on-lj-content-sieve/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Would Shlemiel the Painter Optimize Prematurely?</title>
		<link>http://kai.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/</link>
		<comments>http://kai.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 21:34:51 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[big o notation]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[my projects]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=73</guid>
		<description><![CDATA[I don&#8217;t want to optimize this code prematurely. And &#8220;while you&#8217;re still writing it&#8221; is probably premature. On the other hand, totally ignoring algorithmic complexity is a sure route to a Shlemiel the Painter&#8217;s algorithm.
Do I really want to just write the whole thing, and then start profiling it to see where the hot spots [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t want to <a href="http://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/">optimize this code prematurely</a>. And &#8220;while you&#8217;re still writing it&#8221; is probably premature. On the other hand, totally ignoring algorithmic complexity is a sure route to a <a href="http://www.joelonsoftware.com/articles/fog0000000319.html">Shlemiel the Painter&#8217;s algorithm</a>.</p>
<p>Do I really want to just write the whole thing, and then start profiling it to see where the hot spots are, and then possibly have to re-design the whole thing? That seems like the complete opposite of &#8220;work smarter, not harder&#8221;. Then again, it doesn&#8217;t matter if you write an O(<i>n</i><sup>2</sup>) or even O(<i>n</i>!) algorithm if <i>n</i> is always going to be small&#8230; and in this application, I expect low-to-middling <i>n</i> values.</p>
<p>Of course, even if <i>n</i> will always be small, and increasing CPU power is my friend&#8230; even if it performs fast enough to make users happy, I&#8217;ll still know there&#8217;s a problem down there in the details. That may be the deciding factor.</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/06/18/would-shlemiel-the-painter-optimize-prematurely/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Launching SSHblock</title>
		<link>http://kai.mactane.org/blog/2009/06/16/launching-sshblock/</link>
		<comments>http://kai.mactane.org/blog/2009/06/16/launching-sshblock/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 18:59:26 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[system administration]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=71</guid>
		<description><![CDATA[My latest software project is now available&#8230; where &#8220;latest&#8221; means &#8220;the latest thing I&#8217;ve launched, even if I actually wrote it over a year ago.&#8221;
The story is simple: I was tired of seeing &#8220;failed password&#8221; messages from sshd cluttering up my logs. I was also annoyed at the constant flow of dictionary attacks, even if [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://kai.mactane.org/software/sshblock/">latest software project is now available</a>&#8230; where &#8220;latest&#8221; means &#8220;the latest thing I&#8217;ve <em>launched</em>, even if I actually wrote it over a year ago.&#8221;</p>
<p>The story is simple: I was tired of seeing &#8220;failed password&#8221; messages from sshd cluttering up my logs. I was also annoyed at the constant flow of dictionary attacks, even if I knew they&#8217;d never get in. So I whipped up a quick Perl script that acted as some glue between <a href="http://swatch.sourceforge.net/">Swatch</a> and iptables, and which would also give me some amount of reporting and history on who and what it was blocking.</p>
<p>Then I posted about it in my online journal, and a friend said it sounded useful. So I started getting it ready for release as a package that anyone could use&#8230;</p>
<p>And promptly realized that doing a decent, professional job of it would take more time than I had available. Fast-forward to now, when I&#8217;m unemployed and can only spend so many hours per day job-hunting&nbsp;&mdash; the result is that the world gets more software!</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/06/16/launching-sshblock/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eyeball-Deep in Legalese</title>
		<link>http://kai.mactane.org/blog/2009/06/02/eyeball-deep-in-legalese/</link>
		<comments>http://kai.mactane.org/blog/2009/06/02/eyeball-deep-in-legalese/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 00:37:01 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[legal issues]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=59</guid>
		<description><![CDATA[I used to not have a problem when I wanted to release software. I&#8217;d just release it under the GPL (what we&#8217;d now call the GPLv2), and be pretty happy with that decision.
Now there&#8217;s GPLv3, and I&#8217;m really uncertain whether I like it at all. I understand that Tivoization is a serious problem, but I [...]]]></description>
			<content:encoded><![CDATA[<p>I used to not have a problem when I wanted to release software. I&#8217;d just release it under the GPL (what we&#8217;d now call the GPLv2), and be pretty happy with that decision.</p>
<p>Now there&#8217;s GPLv3, and I&#8217;m really uncertain whether I like it at all. I understand that Tivoization is a serious problem, but I don&#8217;t quite understand the special non-consumer exemption for the anti-Tivoization clause. There are some other new and weird clauses the FSF has added, dealing with patents, and the WIPO Copyright treaty of 1996, and so on.</p>
<p>The GPL used to be pretty simple and elegant. Now? I recognize that the FSF is trying to make the best of a pretty bad situation. But their license has become something bizarre and awkward.</p>
<p>Theoretically, I could still use the old version. But that feels kind of odd, too, now that version 3 is out.</p>
<p>So now I have to look at things like the CPL, the Apache License, and so on. I&#8217;m already fairly sure I don&#8217;t want to use the MIT or modified BSD licenses; one of the things I liked about the GPL is that it keeps other people from dragging my open-source work into a proprietary package. I&#8217;m releasing it as open source for a reason, after all.</p>
<p>All of this is merely by of saying: I&#8217;m getting ready to release another software package. I&#8217;m not so sure the Creative Commons license I used on <a href="http://kai.mactane.org/software/hummingbird">Hummingbird</a> is quite as appropriate for this package, so I&#8217;m having to do some annoying research.</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/06/02/eyeball-deep-in-legalese/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcing Hummingbird</title>
		<link>http://kai.mactane.org/blog/2009/05/27/announcing-hummingbird/</link>
		<comments>http://kai.mactane.org/blog/2009/05/27/announcing-hummingbird/#comments</comments>
		<pubDate>Wed, 27 May 2009 20:01:06 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=57</guid>
		<description><![CDATA[If you read Coyote Tracks*, you&#8217;ve probably noticed that I recently set up a thing over there in the right-hand side that says &#8220;My Latest Tweets&#8221;. At first, that was just a little PHP widget that I&#8217;d hacked together myself. But then I realized it could actually be useful to other people, because it does [...]]]></description>
			<content:encoded><![CDATA[<p>If you read <cite>Coyote Tracks</cite>*, you&#8217;ve probably noticed that I recently set up a thing over there in the right-hand side that says &#8220;My Latest Tweets&#8221;. At first, that was just a little PHP widget that I&#8217;d hacked together myself. But then I realized it could actually be useful to other people, because it does a bunch of things that many of the other &#8220;latest tweets&#8221; widgets in existence <em>don&#8217;t</em> do.</p>
<p>So I decided to get it cleaned up and make a real, distributable software package out of it. That took a few days, especially when I started banging on it, and trying to ensure that it had a prayer of working on anyone else&#8217;s server. Plus there was the time involved for writing the docs.</p>
<p>But now that all of that stuff is done, I am pleased to announce: <a href="/software/hummingbird/">Hummingbird</a>. A lightweight, pretty, and compact gizmo for displaying your latest tweets on a blog or other PHP-powered web page.</p>
<p>* And if you don&#8217;t read <cite>Coyote Tracks</cite>&#8230; what the heck is wrong with you? *g*</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/05/27/announcing-hummingbird/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Site Updated and Software Publication</title>
		<link>http://kai.mactane.org/blog/2009/05/20/site-updated-and-software-publication/</link>
		<comments>http://kai.mactane.org/blog/2009/05/20/site-updated-and-software-publication/#comments</comments>
		<pubDate>Wed, 20 May 2009 22:57:24 +0000</pubDate>
		<dc:creator>Kai MacTane</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[functional programming]]></category>
		<category><![CDATA[my projects]]></category>
		<category><![CDATA[paradigms]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://kai.mactane.org/blog/?p=55</guid>
		<description><![CDATA[Just updated my software page to bring it a little more up-to-date with what I&#8217;ve been doing in the past few years. It&#8217;s funny to see how my coding style has evolved and grown continually over that time. There were some things I used to be showing off that were almost totally procedural; even some [...]]]></description>
			<content:encoded><![CDATA[<p>Just updated <a href="http://kai.mactane.org/software/">my software page</a> to bring it a little more up-to-date with what I&#8217;ve been doing in the past few years. It&#8217;s funny to see how my coding style has evolved and grown continually over that time. There were some things I used to be showing off that were almost totally procedural; even some of the things I&#8217;m still linking to (but which I wrote two or three years ago) make very little use of functional programming or anonymous functions in JavaScript.</p>
<p>It&#8217;s really tempting to completely refactor some of that stuff, but I haven&#8217;t got the time. I actually have at least one more software project that I should really package up and publish&nbsp;&mdash; a thing that might be helpful for system administrators who are being annoyed by SSH dictionary attacks.</p>
<p>Writing something that works on your own machine is one thing. Making a full release? That&#8217;s quite different! It needs documentation, and that documentation needs to explain all the things that you &#8220;just know&#8221;. It needs some kind of install mechanism, or else it needs to explain how to install the stuff manually&nbsp;&mdash; and you need to make absolutely sure that you haven&#8217;t forgotten any of the things you wrote, changed, or tweaked while you were making it work!</p>
]]></content:encoded>
			<wfw:commentRss>http://kai.mactane.org/blog/2009/05/20/site-updated-and-software-publication/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
