<?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>mattdorn.com &#187; software</title>
	<atom:link href="http://www.mattdorn.com/content/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mattdorn.com</link>
	<description>Generously funded by Matt Dorn</description>
	<lastBuildDate>Sun, 07 Feb 2010 00:07:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A few reflections on &#8220;Dreaming in Code&#8221;</title>
		<link>http://www.mattdorn.com/content/dreaming-in-code/</link>
		<comments>http://www.mattdorn.com/content/dreaming-in-code/#comments</comments>
		<pubDate>Fri, 07 Aug 2009 21:27:34 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.mattdorn.com/?p=76</guid>
		<description><![CDATA[


Some years ago I became aware of a software project called Chandler, a personal information manager/calendar/email client being developed by something called the Open Source Applications Foundation, which was started by by Mitch Kapor of Lotus fame.  It appeared on my radar for two reasons.  First, it seemed an unusually ambitious effort to [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>Some years ago I became aware of a software project called <a class="reference" href="http://chandlerproject.org/">Chandler</a>, a personal information manager/calendar/email client being developed by something called the <a class="reference" href="http://www.osafoundation.org/">Open Source Applications Foundation</a>, which was started by by Mitch Kapor of Lotus fame.  It appeared on my radar for two reasons.  First, it seemed an unusually ambitious effort to compete in a space that had been dominated by proprietary offerings like Microsoft Outlook; second, it was being written in what had quickly become my programming language of choice, Python.  When I learned that the project had attracted the full-time participation of industry heavyweights like Andy Hertzfeld, who played a key role in the development of the first Apple Macintosh, I was doubly interested.</p>
<p>It wasn&#8217;t long before Chandler lost my attention, though, as the hype surrounding it diminished amid complaints about its exceptionally slow progress.  Occasionally I wondered, though: How could a project with so much industry muscle behind it, being written in a language renowned for its productivity, go so far off track?  So when I read that a book-length treatment of the Chandler development process had been published, I couldn&#8217;t wait to get my hands on it.</p>
<p>Written by a fairly technically savvy layman, former <a class="reference" href="http://www.salon.com/">Salon</a> editor Scott Rosenberg, <a class="reference" href="http://www.dreamingincode.com/">Dreaming in Code</a> is an adept survey of the range of dysfunction  that plagues even the most talented software development teams.  His review of the available literature &#8212; ranging from Frederick Brooks&#8217;s <em>The Mythical Man-Month</em> (a book whose thesis furnished one of the few iron laws in the field) to Joel Spolsky&#8217;s rants on his popular &quot;Joel on Software&quot; blog &#8212; is comprehensive and informative, but probably the most insightful aspect of the book is its treatment of the aspects of software development that make it unique among disciplines.</p>
<p>For example, at the outset Rosenberg speaks of something he calls &quot;software time&quot;:</p>
<blockquote>
Time really does seem to behave differently around the act of making software.  When things go well, you can lose track of the passing hours in the state psychologists call &quot;flow.&quot; When things go badly, you get stuck, frozen between dimensions, unable to move or see a way forward.</blockquote>
<p>It is perhaps this quality, Roseberg suggests, that furnishes the foundation for Brooks&#8217;s Law, alluded to above, that &quot;adding manpower to a late software project makes it later&quot; &#8212; a seemingly paradoxical concept in most fields of endeavor.</p>
<p>Brooks provides further material for Rosenberg when he writes that &quot;the programmer, like the poet, works only slightly removed from pure thought-stuff.  He builds his castles in the air, from air, creating by exertion of the imagination.&quot;  The idealism implied by this description may be what&#8217;s behind a whole host of programming ills that lead software practitioners down a path of impracticality and ultimately cause projects to go far over budget, over schedule, or fail completely.</p>
<p>Among them is the &quot;Not Invented Here Syndrome.&quot;  The reusability of existing software components has long been one of several holy grails in the industry, and exponential increases in computing power as well as the rise of Open Source and the Internet have in many ways made it a reality.  The problem is that most programmers exhibit a tendency to want to reinvent the wheel.  On this matter Rosenberg quotes Larry Constantine at length:</p>
<blockquote>
Unfortunately, most programmers like to program. Some of them would rather program than eat or bathe.  Most of them would much rather cut code than chase documentation or search catalogs or try to figure out some other stupid programmer&#8217;s idiotic work. &#8230; Other things being equal, programmers design and build from scratch rather than recycle.</blockquote>
<p>Further complicating matters is that even the most talented programmers can undermine their own productivity by engaging in excessive &quot;axe-sharpening,&quot; or refining their development environments and tool sets, rather than focussing on solving the problem at hand.  Rosenberg offers a parable by Peter Drucker worth reproducing here:</p>
<blockquote>
<dl class="docutils">
<dt>A favorite story at management meetings is that of the three stonecutters who were asked what they were doing.  The first replied, &quot;I am making a living.&quot;  The second kept on hammering while he said, &quot;I am doing the best job of stonecutting in the entire country.&quot;  The third one looked up with a visionary gleam in his eyes and said, &quot;I am building a cathedral.&quot;</dt>
<dd>The third man is, of course, the true &quot;manager.&quot;  The first man knows what he wants to get out of the work and manages to do so.  He is likely to give a &quot;fair day&#8217;s work for a fair day&#8217;s pay.&quot;
It is the second man who is a problem.  Workmanship is essential, &#8230; but there is always a danger that the true workman, the true professional, will believe that he is accomplishing something when in effect he is just polishing stones or collecting footnotes.</dd>
</dl>
</blockquote>
<p>Programmers by their nature (or perhaps by the nature of the technology of their tools) tend to be the second man.</p>
<p>Finally, Rosenberg notes, in spite of an abundance of empirical evidence about the difficulty of successfully completing a software project (the book&#8217;s epigraph is Donald Knuth&#8217;s observation that &quot;software is hard&quot;), &quot;most of the programmers I have interviewed and gotten to know in the course of my research are consistently, and sometimes unaccountably, optimistic about their work.  If they are Sisyphuses, they are happy ones.&quot;</p>
<p>So are there any constructive lessons to be carried away from Rosenberg&#8217;s  cautionary tale?</p>
<p>Aside from implying that one ought to bring a greater awareness of the problems described above to software projects (e.g., counterbalancing programmers&#8217; unaccountable optimism when planning a project), the book does provide some insights gleaned from a few instances of successful software projects.</p>
<p>For example, Watts Humphrey, who took over IBM&#8217;s software organization in 1966, instituted a culture of planning where not only were plans mandatory, but &quot;had to be &#8216;bottom-up,&#8217; derived from the experience and knowledge of the programmers who would commit to meeting them, rather than &#8216;top-down,&#8217; imposed by executive fiat or marketing wish.&quot;  The result was an organization that &quot;did not miss a date for the next two and a half years.&quot;</p>
<p>In addition, after observing that a key problem in most software projects is the absence of a firm understanding of what it means to be &quot;done,&quot; Rosenberg reports that in the rare cases he&#8217;s seen where software projects are successful from both a budget and schedule perspective, the success is &quot;a by-product of iron-willed restraint &#8212; a choice firmly made and vocierfously reasserted at every challenge to limit a project&#8217;s scope.  Where you find software success stories, you invariably find people who are good at saying no.&quot;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/dreaming-in-code/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gnapsack 0.2 released</title>
		<link>http://www.mattdorn.com/content/gnapsack-02-released/</link>
		<comments>http://www.mattdorn.com/content/gnapsack-02-released/#comments</comments>
		<pubDate>Wed, 07 Feb 2007 16:03:33 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[backpack]]></category>
		<category><![CDATA[gnapsack]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=40</guid>
		<description><![CDATA[


Version 0.2 of my client for the Backpack Web Services API, Gnapsack, was released today, and now has a new home.  The two main enhancements are Windows compatibility and ability to handle multiple lists.

]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>Version 0.2 of my client for the <a class="reference" href="http://www.backpackit.com/">Backpack</a> Web Services API, Gnapsack, was released today, and now has a <a class="reference" href="http://gnapsack.textmethod.com/">new home</a>.  The two main enhancements are Windows compatibility and ability to handle multiple lists.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/gnapsack-02-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trac + Darcs + reStructuredText</title>
		<link>http://www.mattdorn.com/content/trac-darcs-restructuredtext/</link>
		<comments>http://www.mattdorn.com/content/trac-darcs-restructuredtext/#comments</comments>
		<pubDate>Thu, 01 Feb 2007 10:50:08 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[darcs]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[reStructuredText]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=38</guid>
		<description><![CDATA[


Edgewall Software&#8217;s Trac seems to have become something of a standard for agile management of software projects both within the Open Source community and within closed organizations, and after having the opportunity to use it on a recent project, I can appreciate why.  It&#8217;s simple to setup and manage, and its self-described &#34;minimalistic approach [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>Edgewall Software&#8217;s <a class="reference" href="http://trac.edgewall.org/">Trac</a> seems to have become something of a standard for agile management of software projects both within the Open Source community and within closed organizations, and after having the opportunity to use it on a recent project, I can appreciate why.  It&#8217;s simple to setup and manage, and its self-described &quot;minimalistic approach to web-based software project management&quot; is exactly along the lines of my own philosophy.</p>
<p>For that project I used a default setup with a <a class="reference" href="http://subversion.tigris.org/">Subversion</a> repository, and composed Wiki pages using the default Wiki markup. While Subversion is obviously a standard, for personal projects I prefer to use the distributed versioning system <a class="reference" href="/content/getting-started-with-darcs">Darcs</a>, and I usually insist on doing the majority of my text composition in <a class="reference" href="/content/the-pleasure-of-the-restructured-text">reStructuredText</a>.  So when I found out that there was a <a class="reference" href="http://progetti.arstecnica.it/trac+darcs/">Darcs plugin</a> for Trac and that it also <a class="reference" href="http://trac.edgewall.org/wiki/WikiRestructuredText">supports reStructuredText</a> , I got motivated to get a couple of <a class="reference" href="http://gnapsack.textmethod.com/">my own</a> <a class="reference" href="http://plonexl8.textmethod.com">projects</a> up and running. What follows is a brief description of the steps I took to do so.</p>
<div class="contents topic">
<p class="topic-title first"><a id="contents" name="contents">Contents</a></p>
<ul class="auto-toc simple">
<li><a class="reference" href="#get-the-software" id="id1" name="id1">1&nbsp;&nbsp;&nbsp;Get the software</a></li>
<li><a class="reference" href="#set-up-your-trac-instance" id="id2" name="id2">2&nbsp;&nbsp;&nbsp;Set up your Trac instance</a></li>
<li><a class="reference" href="#install-and-configure-the-trac-plugins" id="id3" name="id3">3&nbsp;&nbsp;&nbsp;Install and configure the Trac plugins</a></li>
<li><a class="reference" href="#configure-apache-and-mod-python" id="id4" name="id4">4&nbsp;&nbsp;&nbsp;Configure Apache and mod_python</a></li>
<li><a class="reference" href="#configure-user-authentication-and-permissions" id="id5" name="id5">5&nbsp;&nbsp;&nbsp;Configure user authentication and permissions</a></li>
<li><a class="reference" href="#final-notes" id="id6" name="id6">6&nbsp;&nbsp;&nbsp;Final notes</a><ul class="auto-toc">
<li><a class="reference" href="#darcs-tracs-bug" id="id7" name="id7">6.1&nbsp;&nbsp;&nbsp;Darcs+Tracs bug</a></li>
<li><a class="reference" href="#restructuredtext-in-trac" id="id8" name="id8">6.2&nbsp;&nbsp;&nbsp;reStructuredText in Trac</a></li>
</ul>
</li>
</ul>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id1" id="get-the-software" name="get-the-software">1&nbsp;&nbsp;&nbsp;Get the software</a></h2>
<p>I&#8217;m assuming your system has fundamentals like Python and Apache installed.  In addition:</p>
<ul>
<li><p class="first">Trac (I&#8217;m using v0.10.x)</p>
</li>
<li><p class="first">Darcs (I&#8217;m using v. 1.0.8)</p>
</li>
<li><p class="first">sqlite2 (I personally had problems with version 3 and the Darcs plugin on a Fedora Core 4 system, which have been reported to the project maintainers)</p>
</li>
<li><dl class="first docutils">
<dt>Trac plugins</dt>
<dd><ul class="first last simple">
<li><a class="reference" href="http://progetti.arstecnica.it/trac+darcs/">Darcs plugin</a></li>
<li><a class="reference" href="http://trac.edgewall.org/wiki/WebAdmin">Web Admin plugin</a></li>
<li><a class="reference" href="http://trac-hacks.org/wiki/AccountManagerPlugin">Account Manager plugin</a></li>
</ul>
</dd>
</dl>
</li>
<li><p class="first">Python docutils (for reStructuredText support)</p>
</li>
<li><p class="first"><a class="reference" href="http://silvercity.sourceforge.net/">SilverCity</a> (for syntax coloring of your code)</p>
</li>
<li><p class="first">Python setuptools (for working with Trac plugins)</p>
</li>
<li><p class="first">Apache mod_python</p>
</li>
</ul>
<p>Note that the items that are not linked above should be available via the package manager of most modern Linux systems.  You&#8217;ll want to install everything except that Trac plugins before moving on to the next step.</p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id2" id="set-up-your-trac-instance" name="set-up-your-trac-instance">2&nbsp;&nbsp;&nbsp;Set up your Trac instance</a></h2>
<p>Create a directory where you want to maintain your Trac projects and use the <tt class="docutils literal"><span class="pre">trac-admin</span></tt> command to create the instance and associate it with your Darcs repository:</p>
<pre class="literal-block">
trac-admin /path/to/MyProject initenv &quot;My Project&quot; sqlite:db/trac.db darcs /path/to/repo /usr/share/trac/templates/
</pre>
<p>The instance is successfully created, but you&#8217;ll get a warning that Trac is not supported.  That&#8217;s because you haven&#8217;t setup the plugins yet.</p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id3" id="install-and-configure-the-trac-plugins" name="install-and-configure-the-trac-plugins">3&nbsp;&nbsp;&nbsp;Install and configure the Trac plugins</a></h2>
<p>Download the source for each plugin into a temporary directory.  Trac handles plugins in the Python &quot;egg&quot; format.  So in the source directory of each, run the following command:</p>
<pre class="literal-block">
python setup.py bdist_egg
</pre>
<p>That will create a file with a <tt class="docutils literal"><span class="pre">.egg</span></tt> extension in the <tt class="docutils literal"><span class="pre">dist</span></tt> directory of the plugin you&#8217;ve downloaded, which you can now copy to the <tt class="docutils literal"><span class="pre">plugins</span></tt> directory of your new Trac instance.  Be sure to copy all three of them.</p>
<p>Now you need to update your Trac instance to understand the Darcs plugin:</p>
<pre class="literal-block">
trac-admin /path/to/MyProject upgrade
trac-admin /path/to/MyProject resync
</pre>
<p>Finally, add the following to the <tt class="docutils literal"><span class="pre">conf/trac.ini</span></tt> file of your instance, under the <tt class="docutils literal"><span class="pre">[components]</span></tt> section:</p>
<pre class="literal-block">
[components]
trac.web.auth.LoginModule = disabled
acct_mgr.web_ui.LoginModule = enabled
trac.ticket.report.* = disabled
</pre>
<p>You may wish to test your instance now, using Trac&#8217;s built-in Web server, and browsing to <tt class="docutils literal"><span class="pre">localhost:8000</span></tt>:</p>
<pre class="literal-block">
tracd --port 8000 /path/to/MyProject
</pre>
<p>or:</p>
<pre class="literal-block">
/usr/sbin/tracd --port 8000 /path/to/MyProject
</pre>
<p>Make sure you can browse your Darcs repo to confirm that the Darcs plugin is working.  If you&#8217;re not seeing syntax highlighting, check to make sure <a class="reference" href="http://silvercity.sourceforge.net/">SilverCity</a> has been installed correctly.</p>
<p>In this setup, however, we&#8217;ll ultimately be using Apache and mod_python to server the instance, and a few extra steps are needed.</p>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id4" id="configure-apache-and-mod-python" name="configure-apache-and-mod-python">4&nbsp;&nbsp;&nbsp;Configure Apache and mod_python</a></h2>
<p><a class="reference" href="http://trac.edgewall.org/wiki/TracModPython">Trac&#8217;s documentation on mod_python</a> is mostly adequate, with one exception.  You need to identify a cache directory for your instance&#8217;s egg plugins.  In your <tt class="docutils literal"><span class="pre">Location</span></tt> directive, composed in accordance with that documentation, including the following line should be sufficient:</p>
<pre class="literal-block">
SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs
</pre>
<p>For the sake of completeness, the <tt class="docutils literal"><span class="pre">Location</span></tt> directive inside the VirtualHost setup for your site should look something like this, if you have multiple Trac instances:</p>
<pre class="literal-block">
&lt;Location /projects&gt;
  SetHandler mod_python
  PythonHandler trac.web.modpython_frontend
  PythonOption TracEnvParentDir /path/to/my/trac/projects
  SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs
  PythonOption TracUriRoot /projects
&lt;/Location&gt;
</pre>
<p>Finally, the user under which Apache is run will need read and write access to the following directories in your instance:</p>
<ul class="simple">
<li>db</li>
<li>attachments</li>
<li>log</li>
</ul>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id5" id="configure-user-authentication-and-permissions" name="configure-user-authentication-and-permissions">5&nbsp;&nbsp;&nbsp;Configure user authentication and permissions</a></h2>
<p>By default, Trac allows the anonymous user access to nearly everything, so you&#8217;ll want to make some changes.  Fortunately the Web Admin and Account Manager plugins make this fairly easy to do.  Before you create any user accounts, I found it was easiest simply to start by adding the TRAC_ADMIN permission to the anonymous group via the command line admin tool:</p>
<pre class="literal-block">
trac-admin /path/to/projenv permission add anonymous TRAC_ADMIN
</pre>
<p>Once I have access to the &quot;Admin&quot; button in the Web interface as anonymous I performed the following:</p>
<ol class="arabic simple">
<li>In Accounts &gt; Configuration, identify the path to the HtPasswdStore.  Ideally this will probably be a location within your instance.  The Web server user will need to be able to write to the location.</li>
<li>In Accounts &gt; Users, add a user.  Note that you could also add a user by registering yourself via the &quot;Register&quot; link that should appear after having installed the Account Manager plugin.</li>
<li>In General &gt; Permissions, create an &quot;admin&quot; group in the &quot;Add Subject to Group&quot; box.</li>
<li>In the same box, add the newly created user to the admin group.</li>
<li>Now, remove any &quot;CREATE&quot; or &quot;DELETE&quot; or write-related permissions, especially TRAC_ADMIN, from the anonymous subject.</li>
<li>Using the &quot;Grant Permission&quot; box, add anything appropriate for your setup to the &quot;authenticated&quot; subject.  Make sure the TRAC_ADMIN permission is assigned to the newly created admin group.</li>
<li>Add any other groups appropriate to your project (e.g., developers, who would probably have access to everything except TRAC_ADMIN)</li>
</ol>
</div>
<div class="section">
<h2><a class="toc-backref" href="#id6" id="final-notes" name="final-notes">6&nbsp;&nbsp;&nbsp;Final notes</a></h2>
<p>It&#8217;s up to you to configure your ticket system with the appropriate values for components, milestones, versions, etc.</p>
<div class="section">
<h3><a class="toc-backref" href="#id7" id="darcs-tracs-bug" name="darcs-tracs-bug">6.1&nbsp;&nbsp;&nbsp;Darcs+Tracs bug</a></h3>
<p>Note that the only <a class="reference" href="http://trac.edgewall.org/ticket/4449">major bug with the Darcs plugin</a> that I&#8217;ve found is the broken &quot;view changes&quot; button.  That will need to be fixed before Trac+Darcs is a completely legitimate product.</p>
</div>
<div class="section">
<h3><a class="toc-backref" href="#id8" id="restructuredtext-in-trac" name="restructuredtext-in-trac">6.2&nbsp;&nbsp;&nbsp;reStructuredText in Trac</a></h3>
<p>Composing your Wiki pages in RST simply requires you to enclose your text with the following syntax:</p>
<pre class="literal-block">
{{{
#!rst

Your text goes here.

}}}
</pre>
<p>That&#8217;s an inconvenience, however minor, and I think a great Trac enhancement (which too my knowledge has not yet been suggested) would be the ability to set a default markup syntax in the configuration file.</p>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/trac-darcs-restructuredtext/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gnapsack 0.1.0 released</title>
		<link>http://www.mattdorn.com/content/gnapsack-010-released/</link>
		<comments>http://www.mattdorn.com/content/gnapsack-010-released/#comments</comments>
		<pubDate>Fri, 28 Apr 2006 18:51:29 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=33</guid>
		<description><![CDATA[


I have just released Gnapsack, a desktop client for Linux that uses the Backpack API.  Check out the site for info, screenshots, etc.  This is an open source (GPL) project.
While it only runs on Linux currently, I&#8217;m hoping to get someone to help me out with a Windows port.  It uses the [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>I have just released <a class="reference" href="http://www.mattdorn.com/open/gnapsack">Gnapsack</a>, a desktop client for Linux that uses the Backpack API.  Check out the site for info, screenshots, etc.  This is an open source (GPL) project.</p>
<p>While it only runs on Linux currently, I&#8217;m hoping to get someone to help me out with a Windows port.  It uses the Python bindings to the GTK widget set.  A good example of a PyGTK app that has been ported to Windows is the <a class="reference" href="http://griffith.vasconunes.net/">Griffith</a> film collection manager.</p>
<p>I may unwittingly be using some non-standard Python libraries&#8211;if any Linux users can give it a try and let me know if I should add items to the dependencies list, I&#8217;d appreciate it.</p>
<p>Anyone interesting in contributing to this project in general, please let me know, and I&#8217;ll get you oriented.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/gnapsack-010-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting started with Darcs</title>
		<link>http://www.mattdorn.com/content/getting-started-with-darcs/</link>
		<comments>http://www.mattdorn.com/content/getting-started-with-darcs/#comments</comments>
		<pubDate>Wed, 19 Apr 2006 13:53:54 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=32</guid>
		<description><![CDATA[


The following is a rudimentary set of instructions for setting up, on a Linux server, a Darcs repository which uses the most basic possible method for collaboration, in which a single administrator manually applies patches1 sent him/her via email (automatically, via the darcs send command issued by the contributor).2  Some notes on producing those [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>The following is a rudimentary set of instructions for setting up, on a Linux server, a Darcs repository which uses the most basic possible method for collaboration, in which a single administrator manually applies patches<a class="footnote-reference" href="#id3" id="id1" name="id1"><sup>1</sup></a> sent him/her via email (automatically, via the <tt class="docutils literal"><span class="pre">darcs</span> <span class="pre">send</span></tt> command issued by the contributor).<a class="footnote-reference" href="#id4" id="id2" name="id2"><sup>2</sup></a>  Some notes on producing those patches and managing the repository are also included.  Further information, including info on how to retract changes, is available in the <a class="reference" href="http://darcs.net/manual/">Darcs manual</a>.</p>
<div class="section">
<h2><a id="preparing-the-central-darcs-respository" name="preparing-the-central-darcs-respository">Preparing the central Darcs respository</a></h2>
<p>Upload your public files to where your public repo will be, and then create a repository there, recursively adding the project&#8217;s files to it:</p>
<pre class="literal-block">
cd proj_folder
darcs init
darcs add -r *
</pre>
<p>Then record a comment for the patch:</p>
<pre class="literal-block">
darcs record -a
</pre>
<p>The <tt class="docutils literal"><span class="pre">-a</span></tt> flag will apply all the patches without prompting the user to approve each one.  In the case of creating a new project, that means &quot;addfile&quot; patches (which are not really patches in the traditional sense) will be submitted for each file, along with the &quot;hunks&quot; containing the new code represented by the new files.</p>
<p>You can avoid any prompt at all by issuing the command with an extra flag and the patch name:</p>
<pre class="literal-block">
darcs record -am &quot;Project imported.&quot;
</pre>
<p>The first time you do this, you&#8217;ll be prompted to add an email address for the &quot;patch&#8217;s author&quot;, which in turn will create the <tt class="docutils literal"><span class="pre">_darcs/prefs/author</span></tt> file in your project directory.</p>
<p>Because this will be a basic repository where sent patches will be applied by the administrator, you&#8217;ll also want to manually add a file called <tt class="docutils literal"><span class="pre">email</span></tt> to that same directory (<tt class="docutils literal"><span class="pre">_darcs/prefs</span></tt>).  That file should contain a single line: the email address of the administrator who will apply the patches.  Subsequently issuing of the <tt class="docutils literal"><span class="pre">darcs</span> <span class="pre">send</span></tt> command by project contributors will use that email address as the destination for the patch.</p>
<p>You must now make the repository available to remote users.  The easiest way to do that is via the Apache Web server.  Make a directory in your Apache root called <tt class="docutils literal"><span class="pre">repos</span></tt> and in that directory, and simply symlink to the directory of your Darcs-enabled project.  You may have to check to make sure that the appropriate Apache directive allows for following of symlinks.  In my case, I also had to make the project directory (and its parent directory, in fact) world-executable.</p>
<p>The main repository is now available for retrieval by collaborators.  As the Darcs documentation states, &quot;As long as you’re running a web server and making your repo available to the world, you may as well make it easy for people to see what changes you’ve made.&quot;  There&#8217;s a CGI script that allows users to browse the patch history of your projects.  In Ubuntu Linux (Breezy), the <tt class="docutils literal"><span class="pre">darcs-server</span></tt> package handles its installation for you, installing the file <tt class="docutils literal"><span class="pre">/usr/lib/cgi-bin/darcs.cgi</span></tt>.  That works out-of-the-box with Ubuntu&#8217;s Apache install.  If you&#8217;ve installed darcs manually, you may have to run <tt class="docutils literal"><span class="pre">make</span> <span class="pre">installserver</span></tt> to do the same.  Note that you can change the name and location of your <tt class="docutils literal"><span class="pre">repos</span></tt> directory, mentioned above, in <tt class="docutils literal"><span class="pre">/etc/darcs/cgi.conf</span></tt>.</p>
</div>
<div class="section">
<h2><a id="applying-patches" name="applying-patches">Applying patches</a></h2>
<p>As patches start coming in via email from contributors, you&#8217;ll need to apply them to the central repo.</p>
<p>The most direct way to do that would to be to login via a shell to the central repository&#8217;s server, and:</p>
<pre class="literal-block">
cd /path/to/project
darcs apply /path/to/patch
</pre>
<p>Another possible option is for the project administrator to maintain a local repo in addition to the central repo, apply any patches there (also using <tt class="docutils literal"><span class="pre">darcs</span> <span class="pre">apply</span></tt>), and then use his or her shell account to &quot;push&quot; the local repo changes to the central repo server:</p>
<pre class="literal-block">
darcs push username&#64;website.com:/path/to/repos/proj_name
</pre>
</div>
<div class="section">
<h2><a id="contributing-to-the-repo" name="contributing-to-the-repo">Contributing to the repo</a></h2>
<p>If you&#8217;re a contributor who wants to work with the project for the first time you retrieve it from the Web like so:</p>
<pre class="literal-block">
darcs get http://www.website.com/repos/proj_name
</pre>
<p>Now you have a copy of the repo, a fully functional branch.</p>
<p>After working with the project, making changes, etc., you can view the changes you&#8217;ve made since your last repo update:</p>
<pre class="literal-block">
darcs whatsnew
</pre>
<p>(Add the <tt class="docutils literal"><span class="pre">--summary</span></tt> flag for less verbose output, also add the &#8211;look-for-adds flag to see any new files that have been created since your last check-in.  You&#8217;ll need to add them manually (see below).)</p>
<p>Name your patch and comment on the details of your changes:</p>
<pre class="literal-block">
darcs record -a
</pre>
<p>And send them to the central repo (in our case, via email):</p>
<pre class="literal-block">
darcs send -a
</pre>
<p>(Note the <tt class="docutils literal"><span class="pre">-a</span></tt> flag in the above two commands, indicating all patches; otherwise you&#8217;ll have to approve them one-by-one.)</p>
<p>Note that &quot;darcs send&quot; will fail if you do not have a local mail agent installed.  In that case, the best way is simply to output the patch as a file, like so:</p>
<pre class="literal-block">
darcs send -a --output=/tmp/changes.patch
</pre>
<p>Note also that if you added any files, you&#8217;ll need to explicitly add them to the repo:</p>
<pre class="literal-block">
darcs add myscript.py
</pre>
<p>If you want to subsequently pull other contributors&#8217; changes from the repo:</p>
<pre class="literal-block">
darcs pull http://www.website.com/repos/proj_name
</pre>
<p>Add the <tt class="docutils literal"><span class="pre">-a</span></tt> flag to avoid being asked to confirm on a per-patch basis.</p>
</div>
<div class="section">
<h2><a id="tagging-versions-and-getting-tagged-versions" name="tagging-versions-and-getting-tagged-versions">Tagging versions and getting tagged versions</a></h2>
<p>From the <a class="reference" href="http://darcs.net/manual/">Darcs manual</a>:</p>
<blockquote>
While pull and unpull can be used to construct different &quot;versions&quot; in a repository, it is often desirable to name speciﬁc conﬁgurations of patches so they can be identiﬁed and retrieved easily later. This is how darcs implements what is usually known as versions. The command for this is tag, and it records a tag in the current repository.</blockquote>
<p>So, to tag a version 1.0, for example, in the project directory execute:</p>
<pre class="literal-block">
darcs tag 1.0
</pre>
<p>And to get the tree for that version later:</p>
<pre class="literal-block">
darcs get --tag &quot;1.0&quot; http://www.website.com/repos/proj_name
</pre>
<table class="docutils footnote" frame="void" id="id3" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1" name="id3">[1]</a></td><td>According to Darcs&#8217; &quot;theory of patches,&quot; pretty much any change to the tree&#8211;including the adding and removing of files&#8211;is a &quot;patch.&quot;</td></tr>
</tbody>
</table>
<table class="docutils footnote" frame="void" id="id4" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id2" name="id4">[2]</a></td><td>The <a class="reference" href="http://darcs.net/manual/">Darcs manual</a> describes other methods like the <tt class="docutils literal"><span class="pre">darcs</span> <span class="pre">push</span></tt> command, which requires SSH accounts on the server running Darcs for the users collborating on your project, and also includes instructions for an interesting setup involving automatic application of patches arriving via PGP-signed email messages from authorized addresses.</td></tr>
</tbody>
</table>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/getting-started-with-darcs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kill Your Word Processor</title>
		<link>http://www.mattdorn.com/content/kill-your-word-processor/</link>
		<comments>http://www.mattdorn.com/content/kill-your-word-processor/#comments</comments>
		<pubDate>Wed, 07 Dec 2005 12:42:11 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=23</guid>
		<description><![CDATA[


There once was a time when I regarded the word processor as a milestone in the evolution of publishing technology that began with Gutenberg&#8217;s printing press. I was astonished at the results that could be achieved when using Microsoft Word in conjunction with TrueType fonts and a low-cost HP inkjet printer.  For a few [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>There once was a time when I regarded the word processor as a milestone in the evolution of publishing technology that began with Gutenberg&#8217;s printing press. I was astonished at the results that could be achieved when using Microsoft Word in conjunction with TrueType fonts and a low-cost HP inkjet printer.  For a few hundred dollars, virtually anyone could quickly produce professional-looking documents that just a few years earlier required expensive typesetting equipment and human resources skilled in its use.  Unaware of the coming Web publishing revolution and the subsequent importance of online documents, I believed that surely the word processor represented a quantum leap not only in the history of publishing, but also made a substantial contribution to the empowerment of the individual.</p>
<p>Today, I have a contempt for all word processors that borders on dementia.</p>
<p>Like most of the company&#8217;s products, Microsoft Office voraciously devours disk space and memory.  Here in Argentina, where I often rely on older computers in cybercafes and the university where I study, a machine with 128 MB of RAM running Windows XP and Microsoft Office 2003 can easily choke on any document you try to feed it, thrashing for minutes at a time on simple actions like sending the document to the printer.  But the problem extends beyond Microsoft bloatware&#8211;even on the iron-clad <a class="reference" href="http://www.ubuntulinux.org/">Ubuntu Linux</a> system I&#8217;ve got running on my IBM ThinkPad T23, every time I try to access the help system in <a class="reference" href="http://www.openoffice.org">OpenOffice</a> (to figure out why it wasn&#8217;t properly encoding accented Spanish characters from an imported Microsoft Word document) the program freezes my machine so completely that the only way to restart it is to pull the plug.  Without denigrating the achievement of OpenOffice as a high-quality <a class="reference" href="http://www.fsf.org">Free Software</a> office suite, this is the most severe crash issue (if not one of only two or three such issues, period) I&#8217;ve experienced in seven years of using Linux.  Even when OpenOffice functions properly, it is far from the lightest application on my desktop in terms of load times and memory consumption.</p>
<p>To question the utility of the vast majority of the features of the contemporary word processor is nothing new.  It was once (and perhaps still is) a commonplace to state that 90% (or some such proportion) of users of Microsoft Word use only 10% of the program&#8217;s features.  Without denying that some users really need such features as mail merge, embedded spreadsheets, etc., I propose taking that line of thinking to a logical near-extreme.  The 90% of users who use only 10% of the features of a word processor can live without a word processor entirely.</p>
<div class="section">
<h2><a id="the-tools" name="the-tools">The Tools</a></h2>
<p>I suggest that all the average user really needs is a text editor (which saves documents in plain text rather than some proprietary and/or arcane format) that can fulfill the following functions<a class="footnote-reference" href="#id2" id="id1" name="id1"><sup>1</sup></a> :</p>
<ul class="simple">
<li>Copy/cut/paste</li>
<li>Undo</li>
<li>Find and replace</li>
<li>Spell check</li>
</ul>
<p>These functions are handled by the lightweight text editor I&#8217;m using to compose this document, <a class="reference" href="http://www.gnome.org/projects/gedit/">gedit</a> for the <a class="reference" href="http://www.gnome.org">GNOME Desktop</a> for Linux.</p>
<p>Some ancillary functions, such as image processing, thesaurus, etc. can and should be fulfilled by separate programs that specialize in these features and therefore can do a much better job of them.</p>
<p>But what about font sizes and styles, page numbering, footnotes, indentation, text alignment, etc., etc.&#8211;features that do in fact comprise the 10% of features that almost all users need?</p>
<p>Here it&#8217;s necessary to draw a crucial distinction between what has become widely known as WYSIWYG (What You See Is What You Get) document composition and what has subsequently been described as WYSIWYM (What You See Is What You Mean), a semantic approach that recommends the document author concentrate on the content of the document without considering the presentation of that content.  When composition is complete, the presentation of that document can be outsourced to another program.  In my current way of thinking, that other program is <a class="reference" href="http://www.latex-project.org/intro.html">LaTeX</a>, a document typesetting system that was originally developed for authors of mathematics- and science-related documents, but which can be useful for any type of document.</p>
<p>What I&#8217;m doing here is separating the process of composition from the typesetting of the document, the latter of which I believe becomes a distraction in the composition process.  What if in your super-simple text editor, you could easily indicate, say, using a system of easy-to-understand symbols, or &quot;markup&quot; in the relevant parlance, to indicate where your footnotes are, where your emphasized text is, etc.  There exist several such systems, but the one that I believe is the most appropriate for the average user is <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> (reST), about which I&#8217;ve <a class="reference" href="/content/the-pleasure-of-the-restructured-text/">briefly written</a> in the pages of this site. As for the matter of page numbering, line spacing, etc. in the final document, that would be left to the typesetting system (LaTeX, mentioned above), which would permit you to choose a professionally developed document style which performs those functions according to a standard appropriate to your field of work.  The <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> project (originally project developed to facilitate documentation of the Python programming language) provides reST conversion to LaTeX, which in turn provides conversion utilities to more common document formats like PDF.  You could choose to install this system on your own computer, or if a service which provides this functionality were available via a Web site (which I currently plan to develop), you could simply submit your text document for processing via your Web browser and receive a PDF or HTML document in return.</p>
<p>Your source document&#8211;the document to which you would make subsequent revisions&#8211;would continue to be the fully legible plain text document which uses the reST markup, and which can thus be continue to be edited in virtually any program capable of dealing with plain text.</p>
</div>
<div class="section">
<h2><a id="other-motivations" name="other-motivations">Other Motivations</a></h2>
<p>Rather than going into further technical detail at this point, I&#8217;d like to point out some deeper motivations for wishing to see the word processor consigned to the dustbin of history (or at least for wanting to see it forced to occupy a marginal space more proportional with those 10% of users who need its advanced functionality).  The information technology revolution, and in particular ubiquitous Internet access, has resulted in a capacity for distraction that undermines the productivity gains promised by IT as well as the utility of the broad information access it provides.  The classic dilemma of how to efficiently turn information into knowledge has never been so acute.</p>
<p>Paul Ford, a Harper&#8217;s editor, Web developer, and NPR commentator, has published an extremely <a class="reference" href="http://www.43folders.com/2005/10/24/paul-ford-distractions">insightful article</a> which explores these themes.  In it he refers to the measures he has taken to deal with this problem as &quot;Amish computing&quot;:</p>
<blockquote>
&#8230; I can honestly say that since broadband Internet came to my home a year and a half ago my stock of new, fresh, fun ideas has grown very thin. It&#8217;s just too much. My mind can&#8217;t wander, because, with anything that interests me, I can look it up on Wikipedia to gain some context. Before I know it I&#8217;ve got thirty tabs open at once in Firefox. Then new email comes in. &#8230; I&#8217;ve started using an <a class="reference" href="http://www1.alphasmart.com/products/neo.html">Alphasmart Neo</a> to draft text, and WordPerfect for DOS to edit and revise. My average daily word count has doubled as a result, and my stock of fresh ideas seems to be replenishing.</blockquote>
<p>Ford subsequently extended these thoughts to a general audience in a recent <a class="reference" href="http://www.npr.org/templates/story/story.php?storyId=5025301">NPR commentary</a>, suggesting the ubiquitousness of the problem.</p>
<p>What&#8217;s interesting about Ford&#8217;s analysis for our purposes here is not so much the distraction potential inherent in the Internet, but in the computer&#8211;the knowledge worker&#8217;s tool&#8211;itself.  Ford&#8217;s solution involves composing text on a device away from his computer, and reverting to a very early version of a popular word processor program which not only has a reduced feature set, but which by virtue of being a DOS program restricts the opportunity for distraction by other items on his desktop (i.e., there is no &quot;desktop&quot; in DOS).  Only incidentally does that desktop include a Web browser.  Once a painless way of typesetting a document in accordance with what I&#8217;ve described above is made available, my suggestion to Ford will be that he do away with WordPerfect entirely and compose his documents in reST directly on his Alphasmart Neo.</p>
</div>
<div class="section">
<h2><a id="advantages" name="advantages">Advantages</a></h2>
<p>Leaving aside my own preference for parsimony regarding computer hardware resources, I&#8217;d like to summarize some of the chief advantages to the approach discussed above:</p>
<ul class="simple">
<li>Documents are legible by any text editor and thus fundamentally independent of any single program</li>
<li>The WYSIWYM (What You See Is What You Mean) approach helps the user cut through the distractions inherent in the use of information technology tools and resources.</li>
</ul>
</div>
<div class="section">
<h2><a id="challenges" name="challenges">Challenges</a></h2>
<p>A few potential challenges to the perspective outlined in this document might include:</p>
<ul class="simple">
<li>To what extent am I artifically assuming a scarcity of hardware resources in criticizing bloatware?  I.e., in 10 years time, might not every consumer electronic device have enough muscle to run even the most bloated word processor program?</li>
<li>Collaboration: If your document composition process includes a lot of collaboration, how practical is it to convince your collaborators of the legitimacy of this argument, wean them off their dependency on Microsoft Word, and to get them to learn reST, which while basically simple, does have some quirks which will no doubt annoy many users?</li>
<li>Am I drawing an artificial distinction between word processors and text editors?  Is a text editor not just a lightweight word processor?</li>
</ul>
<table class="docutils footnote" frame="void" id="id2" rules="none">
<colgroup><col class="label" /><col /></colgroup>
<tbody valign="top">
<tr><td class="label"><a class="fn-backref" href="#id1" name="id2">[1]</a></td><td>This list may expand as I experiment with weaning myself off of word processors entirely, but I&#8217;m convinced that the list will never reach the point of requiring anything more than a lightweight text editor like Notepad for Windows.</td></tr>
</tbody>
</table>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/kill-your-word-processor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A few amateur reflections on Open Source development</title>
		<link>http://www.mattdorn.com/content/a-few-amateur-reflections-on-open-source-development/</link>
		<comments>http://www.mattdorn.com/content/a-few-amateur-reflections-on-open-source-development/#comments</comments>
		<pubDate>Mon, 16 May 2005 13:45:21 +0000</pubDate>
		<dc:creator>mdorn</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://67.207.132.145/wordpress/?p=4</guid>
		<description><![CDATA[


I recently had to add CSV logging functionality to the PloneFormMailer product for a customer. This isn&#8217;t the first time we&#8217;ve wanted to add some customization to an Open Source project. The temptation in such situations is always to simply make your changes, and maintain your own personal fork of the project. That&#8217;s generally the [...]]]></description>
			<content:encoded><![CDATA[
<div class="document">
<!-- -*- mode: rst -*- -->
<p>I recently had to add CSV logging functionality to the PloneFormMailer product for a customer. This isn&#8217;t the first time we&#8217;ve wanted to add some customization to an Open Source project. The temptation in such situations is always to simply make your changes, and maintain your own personal fork of the project. That&#8217;s generally the quickest way to get your own project squared away with the least expenditure of mental energy, but it doesn&#8217;t show a lot of foresight.</p>
<p>Leaving aside the ethical obligation of contributing back to a project which you&#8217;ve benefited from, there&#8217;s a self-interest element at work as well: If you don&#8217;t contribute your changes to the project&#8217;s main branch, then every time you want to take advantage of, say, a bug-fix release or a release with some new enhancement you need, you have to undertake to merge your own customizations, which can end up being pretty time-consuming.</p>
<p>The dilemma comes when you customize an open source project in some way that&#8217;s not likely to be of interest to other users of the project&#8211;any patch you may contribute will be unlikely to be accepted to the project, probably because the risk of introducing new bugs into the system outweighs the relative advantages of the new functionality.</p>
<p>But if your own contribution is of sufficient interest to the general user base of the project, you ought to be able to get it included the project&#8217;s main branch. Still, the maintainers of any Open Source project are likely to review patches from third parties with a lot of suspicion, so you&#8217;ll want to take extra care to make it as easy as possible for the maintainer to approve any contribution you make.</p>
<p>Some guidelines can be found here: <a class="reference" href="http://www.kegel.com/academy/opensource.html">http://www.kegel.com/academy/opensource.html</a></p>
<p>In the case of the CSV enhancement to PloneFormMailer, it seemed like a really common use case, so I wrote to the project maintainer and he responded that he was indeed interested in a patch.</p>
<p>My understanding is that typically such patches are done against the latest release, not against some unreleased repository branch. In this case, though, the maintainer requested that any patch I supplied be created against the trunk.</p>
<p>Because I know that the product is now being maintained in SVN at svn.plone.org, I used svn to create the patch, which will make it as easy as possible to merge the changes:</p>
<blockquote>
cd /svn/working/directory
svn diff &gt; /tmp/csv_logging.diff</blockquote>
<p>That created a patch for both of the two files I modified in the product&#8217;s root directory.</p>
<p>I also wrote a unit test based on the PloneTestCase framework (in the absence of any test suite in the last release), but discovered that in the trunk a test suite had been begun using doctest, which I&#8217;m not familiar with.</p>
<p>Whether the patch is accepted or rejected, I&#8217;ll update here with any lessons learned from the process.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.mattdorn.com/content/a-few-amateur-reflections-on-open-source-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
