<?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>Xaprb &#187; sourceforge</title>
	<atom:link href="http://www.xaprb.com/blog/tag/sourceforge/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xaprb.com/blog</link>
	<description>Stay curious!</description>
	<lastBuildDate>Thu, 09 Feb 2012 03:58:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Sourceforge reintroduces persistent login cookies</title>
		<link>http://www.xaprb.com/blog/2009/02/27/sourceforge-reintroduces-persistent-login-cookies/</link>
		<comments>http://www.xaprb.com/blog/2009/02/27/sourceforge-reintroduces-persistent-login-cookies/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 16:38:21 +0000</pubDate>
		<dc:creator>Xaprb</dc:creator>
				<category><![CDATA[Commentary]]></category>
		<category><![CDATA[World Wide Web]]></category>
		<category><![CDATA[laziness]]></category>
		<category><![CDATA[New York Times]]></category>
		<category><![CDATA[sourceforge]]></category>

		<guid isPermaLink="false">http://www.xaprb.com/blog/?p=883</guid>
		<description><![CDATA[Sourceforge has reintroduced persistent login cookies. Here&#8217;s the bug request I submitted about this, a long time ago. The thing is, I don&#8217;t really care much anymore. I&#8217;ve moved my open-source projects off Sourceforge onto Google Code. I am about 10x more productive there. This lesson can be applied to pretty much everything on the [...]


<strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2006/10/23/permit-cookies-a-firefox-extension-that-makes-cookie-whitelisting-easy/' rel='bookmark' title='Permanent Link: Permit Cookies: a Firefox extension that makes cookie whitelisting easy'>Permit Cookies: a Firefox extension that makes cookie whitelisting easy</a></li>
<li><a href='http://www.xaprb.com/blog/2008/11/23/google-code-rocks-my-world/' rel='bookmark' title='Permanent Link: Google Code rocks my world'>Google Code rocks my world</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Sourceforge has reintroduced persistent login cookies.  Here&#8217;s <a href="http://sourceforge.net/tracker/?func=detail&#038;atid=350001&#038;aid=1855476&#038;group_id=1">the bug request</a> I submitted about this, a long time ago.</p>

<p>The thing is, I don&#8217;t really care much anymore.  I&#8217;ve moved my open-source projects off Sourceforge onto Google Code.  I am about 10x more productive there.</p>

<p>This lesson can be applied to pretty much everything on the web these days.  Make it even the slightest bit hard to use your service, and people will use what&#8217;s easy instead.  (Sourceforge&#8217;s user interface is more than slightly hard to use.)</p>

<p>The New York Times is the same way for me.  They want me to log in to read the news stories.  They say it&#8217;s free, and I say ok, then why do I need an account?  Forget it.</p>

<p>Am I selfish?  Do I want something for nothing?  Am I lazy and impatient beyond imagining?  Yes.</p>

<p>Am I typical? Yes.</p>

<p><strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2006/10/23/permit-cookies-a-firefox-extension-that-makes-cookie-whitelisting-easy/' rel='bookmark' title='Permanent Link: Permit Cookies: a Firefox extension that makes cookie whitelisting easy'>Permit Cookies: a Firefox extension that makes cookie whitelisting easy</a></li>
<li><a href='http://www.xaprb.com/blog/2008/11/23/google-code-rocks-my-world/' rel='bookmark' title='Permanent Link: Google Code rocks my world'>Google Code rocks my world</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.xaprb.com/blog/2009/02/27/sourceforge-reintroduces-persistent-login-cookies/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Code rocks my world</title>
		<link>http://www.xaprb.com/blog/2008/11/23/google-code-rocks-my-world/</link>
		<comments>http://www.xaprb.com/blog/2008/11/23/google-code-rocks-my-world/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 02:47:33 +0000</pubDate>
		<dc:creator>Xaprb</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Maatkit]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Google Code]]></category>
		<category><![CDATA[sourceforge]]></category>
		<category><![CDATA[Trac]]></category>

		<guid isPermaLink="false">http://www.xaprb.com/blog/?p=712</guid>
		<description><![CDATA[Google Code just rocks. It is clean, sparse, elegant, and it has all the functionality I need. Its template-driven issue tracking system (totally flexible and totally easy to flex!), niceties like cross-references between issues and Subversion revisions, simple but completely adequate Wiki, and nice download system are the bomb. And the code reviews and ability [...]


<strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/10/04/javascript-formatting-and-parsing-functions-now-on-google-code/' rel='bookmark' title='Permanent Link: Javascript formatting and parsing functions now on Google Code'>Javascript formatting and parsing functions now on Google Code</a></li>
<li><a href='http://www.xaprb.com/blog/2009/07/01/how-to-add-a-wiki-homepage-sidebar-and-toc-in-google-code/' rel='bookmark' title='Permanent Link: How to add a wiki homepage, sidebar, and TOC in Google Code'>How to add a wiki homepage, sidebar, and TOC in Google Code</a></li>
<li><a href='http://www.xaprb.com/blog/2005/12/15/more-ways-to-use-udfs-instead-of-openxml/' rel='bookmark' title='Permanent Link: More alternatives to <code>openxml</code>'>More alternatives to <code>openxml</code></a></li>
<li><a href='http://www.xaprb.com/blog/2008/11/01/ubuntu-810-rocks-my-inspiron-1501/' rel='bookmark' title='Permanent Link: Ubuntu 8.10 rocks my Inspiron 1501'>Ubuntu 8.10 rocks my Inspiron 1501</a></li>
<li><a href='http://www.xaprb.com/blog/2008/05/04/you-have-the-right-to-see-code-samples-in-an-interview/' rel='bookmark' title='Permanent Link: You have the right to see code samples in an interview'>You have the right to see code samples in an interview</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/">Google Code</a> just rocks.  It is clean, sparse, elegant, and it has all the functionality I need.  Its template-driven issue tracking system (totally flexible and totally easy to flex!), niceties like cross-references between issues and Subversion revisions, simple but completely adequate Wiki, and nice download system are the bomb.  And the code reviews and ability to comment on revisions are super nice.  Oh, and it&#8217;s really nice that the data is stored in a place I feel pretty sure is safe.</p>

<p>It has all the nice features I admired a lot about <a href="http://trac.edgewall.org/">Trac</a>, which is my other favorite collaboration tool for software development.</p>

<p>A while ago I moved <a href="http://www.maatkit.org/">Maatkit</a> development to Google Code from Sourceforge.  It was a move I&#8217;d been considering but dreading.  A friend pushed me over the edge by promising to migrate the Subversion repo for me.  In all it was really painless, and certainly a move that has enabled Maatkit&#8217;s development to proceed much more quickly and smoothly than it would have at Sourceforge.  Not to pick on Sourceforge, but their interface is seemingly designed to prevent you from getting anything done &#8212; it is really hard to use in about every possible way, and makes simple tasks take hours (making a new release, anyone?).  And Sourceforge doesn&#8217;t even back up your data!  What&#8217;s the point of project hosting if you&#8217;re supposed to back up your own revision control, website, and database?</p>

<p>Thank you Google!</p>

<p><strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/10/04/javascript-formatting-and-parsing-functions-now-on-google-code/' rel='bookmark' title='Permanent Link: Javascript formatting and parsing functions now on Google Code'>Javascript formatting and parsing functions now on Google Code</a></li>
<li><a href='http://www.xaprb.com/blog/2009/07/01/how-to-add-a-wiki-homepage-sidebar-and-toc-in-google-code/' rel='bookmark' title='Permanent Link: How to add a wiki homepage, sidebar, and TOC in Google Code'>How to add a wiki homepage, sidebar, and TOC in Google Code</a></li>
<li><a href='http://www.xaprb.com/blog/2005/12/15/more-ways-to-use-udfs-instead-of-openxml/' rel='bookmark' title='Permanent Link: More alternatives to <code>openxml</code>'>More alternatives to <code>openxml</code></a></li>
<li><a href='http://www.xaprb.com/blog/2008/11/01/ubuntu-810-rocks-my-inspiron-1501/' rel='bookmark' title='Permanent Link: Ubuntu 8.10 rocks my Inspiron 1501'>Ubuntu 8.10 rocks my Inspiron 1501</a></li>
<li><a href='http://www.xaprb.com/blog/2008/05/04/you-have-the-right-to-see-code-samples-in-an-interview/' rel='bookmark' title='Permanent Link: You have the right to see code samples in an interview'>You have the right to see code samples in an interview</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.xaprb.com/blog/2008/11/23/google-code-rocks-my-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Maatkit version 2152 released</title>
		<link>http://www.xaprb.com/blog/2008/08/12/maatkit-version-2152-released/</link>
		<comments>http://www.xaprb.com/blog/2008/08/12/maatkit-version-2152-released/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 04:56:59 +0000</pubDate>
		<dc:creator>Xaprb</dc:creator>
				<category><![CDATA[Maatkit]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Ask Bjorn Hansen]]></category>
		<category><![CDATA[Daniel Nichter]]></category>
		<category><![CDATA[Google Code]]></category>
		<category><![CDATA[Percona]]></category>
		<category><![CDATA[sourceforge]]></category>

		<guid isPermaLink="false">http://www.xaprb.com/blog/2008/08/12/maatkit-version-2152-released/</guid>
		<description><![CDATA[Download Maatkit Maatkit version 2152 is ready for download. This release is also known as the &#8220;is this project really alive?&#8221; release. We thought we should delay until MySQL released a new Community Server version. Just kidding &#8212; it has nothing to do with that. This release is also very significant in that it&#8217;s the [...]


<strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/03/16/maatkit-version-1877-released/' rel='bookmark' title='Permanent Link: Maatkit version 1877 released'>Maatkit version 1877 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/24/maatkit-version-1709-released/' rel='bookmark' title='Permanent Link: Maatkit version 1709 released'>Maatkit version 1709 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/09/19/maatkit-version-2325-released/' rel='bookmark' title='Permanent Link: Maatkit version 2325 released'>Maatkit version 2325 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/10/18/maatkit-version-2442-released/' rel='bookmark' title='Permanent Link: Maatkit version 2442 released'>Maatkit version 2442 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/05/maatkit-version-1674-released/' rel='bookmark' title='Permanent Link: Maatkit version 1674 released'>Maatkit version 1674 released</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="download"><a href="http://code.google.com/p/maatkit/">Download Maatkit</a></p>

<p><a href="http://www.maatkit.org/">Maatkit</a> version 2152 is ready for download.  This release is also known as the &#8220;is this project really alive?&#8221; release.  We thought we should delay until <a href="http://www.mysqlperformanceblog.com/2008/08/08/new-mysql-community-release-great-job-mysql/">MySQL released a new Community Server version</a>.  Just kidding &#8212; it has nothing to do with that.</p>

<span id="more-550"></span>

<p>This release is also very significant in that it&#8217;s the first one that has large code contributions by someone other than myself.  As you may know, <a href="http://www.percona.com/">Percona</a> (my employer) has hired the <a href="http://hackmysql.com/">very talented Daniel Nichter, author of mysqlreport and other goodies</a>, to help with Maatkit.  So far it is a match made in heaven, and Daniel did most of the coding for this release.</p>

<p>This is also our first release since <a href="http://develooper.com/">Ask</a> helped me move the project (thank you Ask!) to Google Code.  That means you finally get a decent interface for entering issues, etc, etc.  The only thing remaining on Sourceforge at this point is the online documentation, which I will probably move to maatkit.org soon.  But more importantly, it means the developers have a decent interface for issues, etc etc.  <a href="http://sourceforge.net/tracker/?func=detail&#038;aid=1855476&#038;group_id=1&#038;atid=350001">Sourceforge is just a bloody nightmare &#8212; their site keeps getting harder and harder to use</a>, both as a developer and as a user.  It had gotten to the point where simply adding the files to the site for download would take me hours.  I tried to automate it, in true Perl fashion, but their make-a-release forms resisted my every effort.  I cannot say what a relief it is to have usable project hosting that gets out of my way and lets me work.  A double thanks to Ask for pushing me over the edge on this &#8212; it had been on my mind a long time.  And thanks to Google, too, for a great project management interface.</p>

<p>Also note that the Sourceforge forums and mailing lists are dead.  Google Groups is the preferred replacement.</p>

<p>Keep reporting those bugs and feature requests!</p>

<p>As you might expect, the changelog for such a long release cycle is, er, large.  There&#8217;s a lot of new stuff here.  I&#8217;d like to highlight the new features in mk-parallel-dump and mk-parallel-restore &#8212; which I just used to reduce a job that would have taken weeks down to mere days &#8212; and a lot of new code in mk-table-sync, as well as the up-and-coming mk-audit, which is in release-early/often mode.</p>

<pre>
Changelog for mk-archiver:

2008-08-11: version 1.0.10

   * Files downloaded directly from SVN crashed due to version information.
   * Added more information to --statistics and changed --whyquit slightly.

Changelog for mk-audit:

2008-08-11: version 0.9.1

   * Files downloaded directly from SVN crashed due to version information.
   * Added useful functionality.

Changelog for mk-deadlock-logger:

2008-08-11: version 1.0.11

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-duplicate-key-checker:

2008-08-11: version 1.1.7

   * Files downloaded directly from SVN crashed due to version information.
   * Full-text indexes were not treated specially (issue 10).

Changelog for mk-fifo-split:

2008-08-11: version 1.0.1

   * Files downloaded directly from SVN crashed due to version information.
   * Added --offset option.
   * --statistics didn't calculate lines/sec properly.
   * Removed --sleep; EOF doesn't mean anything to a non-terminal.

Changelog for mk-find:

2008-08-11: version 0.9.12

   * Files downloaded directly from SVN crashed due to version information.
   * Added --exec_dsn so you can execute SQL on a different server.

Changelog for mk-heartbeat:

2008-08-11: version 1.0.10

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-parallel-dump:

2008-08-11: version 1.0.9

   * Files downloaded directly from SVN crashed due to version information.
   * Added --progress option.
   * CHANGE MASTER TO in 00_master_data.sql used the I/O thread position.
   * Added features to permit resuming of dumps.
   * --age without --sets did the opposite of what it should (isssue 7)
   * --stopslave died after complaining the slave was not running.

Changelog for mk-parallel-restore:

2008-08-11: version 1.0.8

   * Files downloaded directly from SVN crashed due to version information.
   * Added --progress option.

Changelog for mk-query-profiler:

2008-08-11: version 1.1.11

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-show-grants:

2008-08-11: version 1.0.11

   * Files downloaded directly from SVN crashed due to version information.
   * Anonymous users were not permitted (issue 28).

Changelog for mk-slave-delay:

2008-08-11: version 1.0.8

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-slave-find:

2008-08-11: version 1.0.2

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-slave-move:

2008-08-11: version 0.9.2

   * The -m option was not recognized as an alias for --timeout.
   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-slave-prefetch:

2008-08-11: version 1.0.3

   * Files downloaded directly from SVN crashed due to version information.
   * Added the --numprefix option for use in sharded data stores.
   * The Rotate binary log event type was not handled.

Changelog for mk-slave-restart:

2008-08-11: version 1.0.8

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-table-checksum:

2008-08-11: version 1.1.28

   * Files downloaded directly from SVN crashed due to version information.

Changelog for mk-table-sync:

2008-08-11: version 1.0.8

   * Files downloaded directly from SVN crashed due to version information.
   * --synctomaster did not abort when unable to discover the master.
   * An error waiting for the master to catch up caused other tables to fail.
   * Added --bufferinmysql to help make GroupBy algorithm more efficient.
   * Added safety checks to prevent changing data on a slave server.
   * Added --skipslavecheck to prevent safety checks on destination server.
   * Made the GroupBy algorithm the default replacement for Stream.
   * Added the GroupBy algorithm, which can sync tables without unique keys.
   * Syncing could stop and leave a row to delete in the destination.
   * Generate command-line help from the POD.

Changelog for mk-visual-explain:

2008-08-11: version 1.0.9

   * Files downloaded directly from SVN crashed due to version information.
</pre>

<p><strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/03/16/maatkit-version-1877-released/' rel='bookmark' title='Permanent Link: Maatkit version 1877 released'>Maatkit version 1877 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/24/maatkit-version-1709-released/' rel='bookmark' title='Permanent Link: Maatkit version 1709 released'>Maatkit version 1709 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/09/19/maatkit-version-2325-released/' rel='bookmark' title='Permanent Link: Maatkit version 2325 released'>Maatkit version 2325 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/10/18/maatkit-version-2442-released/' rel='bookmark' title='Permanent Link: Maatkit version 2442 released'>Maatkit version 2442 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/05/maatkit-version-1674-released/' rel='bookmark' title='Permanent Link: Maatkit version 1674 released'>Maatkit version 1674 released</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.xaprb.com/blog/2008/08/12/maatkit-version-2152-released/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Growth limits of open-source vis-a-vis MySQL Toolkit</title>
		<link>http://www.xaprb.com/blog/2007/11/05/growth-limits-of-open-source-vis-a-vis-mysql-toolkit/</link>
		<comments>http://www.xaprb.com/blog/2007/11/05/growth-limits-of-open-source-vis-a-vis-mysql-toolkit/#comments</comments>
		<pubDate>Mon, 05 Nov 2007 14:50:02 +0000</pubDate>
		<dc:creator>Xaprb</dc:creator>
				<category><![CDATA[Kurt Vonnegut]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Si Chen]]></category>
		<category><![CDATA[sourceforge]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[Zmanda]]></category>

		<guid isPermaLink="false">http://www.xaprb.com/blog/2007/11/05/growth-limits-of-open-source-vis-a-vis-mysql-toolkit/</guid>
		<description><![CDATA[<p><a href="http://opensourcestrategies.blogspot.com/2007/10/limits-of-open-source.html">Si Chen wrote recently about the growth limits of open-source projects</a>.  He points out that as a project becomes larger, it gets harder to maintain.  I can only agree.  As the <a href="http://mysqltoolkit.sourceforge.net">MySQL Toolkit</a> project has grown, it's become significantly more work to maintain, document, and enhance.</p>


<strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/12/23/does-mysql-really-have-an-open-source-business-model/' rel='bookmark' title='Permanent Link: Does MySQL really have an open-source business model?'>Does MySQL really have an open-source business model?</a></li>
<li><a href='http://www.xaprb.com/blog/2008/05/14/mysql-free-software-but-not-open-source/' rel='bookmark' title='Permanent Link: MySQL: Free Software but not Open Source'>MySQL: Free Software but not Open Source</a></li>
<li><a href='http://www.xaprb.com/blog/2009/03/08/making-maatkit-more-open-source-one-step-at-a-time/' rel='bookmark' title='Permanent Link: Making Maatkit more Open Source one step at a time'>Making Maatkit more Open Source one step at a time</a></li>
<li><a href='http://www.xaprb.com/blog/2009/04/29/what-does-an-open-source-sales-model-look-like/' rel='bookmark' title='Permanent Link: What does an open source sales model look like?'>What does an open source sales model look like?</a></li>
<li><a href='http://www.xaprb.com/blog/2011/07/04/measuring-open-source-success-by-jobs/' rel='bookmark' title='Permanent Link: Measuring open-source success by jobs'>Measuring open-source success by jobs</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p><a href="http://opensourcestrategies.blogspot.com/2007/10/limits-of-open-source.html">Si Chen wrote recently about the growth limits of open-source projects</a>.  He points out that as a project becomes larger, it gets harder to maintain.  I can only agree.  As the <a href="http://code.google.com/p/maatkit">MySQL Toolkit</a> project has grown, it&#8217;s become significantly more work to maintain, document, and enhance.  (This is why I&#8217;m asking you to <a href="http://www.xaprb.com/blog/2007/10/31/mysql-table-sync-bounty-lets-do-it/">sponsor me for a week off my regular job to work on MySQL Table Sync</a>, by the way.  Please toss some money in the hat.)</p>

<p>Rewriting code so it&#8217;s testable is a major focus for me now.  Some of these tools have gotten complicated enough that I can&#8217;t keep track of all the code.  In other words, they&#8217;re collapsing under their own weight.</p>

<p>Back in the project&#8217;s humble beginnings, it seemed adequate to just copy and paste a few lines here and there; after all, these are just scripts, right?  Right.  So I&#8217;ll just copy a few lines of code that do command-line option parsing and help screens.  Hey, it turns out that several of the tools can connect to more than one server, so simple -u, -h and -p options won&#8217;t do; so I invent a DSN-like notation that lets the tools connect to an arbitrary number of servers.  Copy and paste that code, too.  It&#8217;s only ten lines &#8212; no big deal.  Pretty soon I find out that many of the standard Perl modules aren&#8217;t available, for a lot of people.  And even when they&#8217;re available, people have old versions and can&#8217;t upgrade, so I can&#8217;t rely on basic things like the <code>quote_identifier()</code> function in DBI modules; time to write my own.  Well, that&#8217;s only a single line!  Surely that&#8217;s okay to copy and paste.</p>

<p>As Kurt Vonnegut says, &#8220;So it goes.&#8221;  This is the death not only of quality, but of maintainability and extensibility.  The Right Answer &#8482; is to write everything as modules, with proper test suites, and then make the scripts as minimalistic as possible &#8212; essentially gluing the modules together with a few lines of harder-to-test code.  That&#8217;s how I&#8217;m used to working, too, but for some reason I can&#8217;t explain, it seemed okay not to work that way with this project.  That has turned out to be a big mistake, which I&#8217;m slowly correcting out of necessity.</p>

<p>But it turns out it&#8217;s not that simple, either.  I&#8217;ve gotten a lot of emails, phone calls from friends, and bug reports about how hard it is to install or update Perl, or get a CPAN module, on many systems.  It turns out that a lot of companies are rightfully suspicious about CPAN (I have a tolerate-hate relationship with it myself), and won&#8217;t let my consultant friends install or upgrade any module without a lot of red tape.  OK, you say, so bundle and distribute the modules the toolkit needs, and they can be installed locally with the toolkit.  That sounds nice, but it&#8217;s even <strong>worse</strong> for a variety of reasons.  Just to mention one: did you know that it can be a pain in the butt even to set <code>@INC</code> so a module <em>sitting in the same directory with the script</em> will be found by the script?  (Please don&#8217;t tell me how easy it is, or I&#8217;ll let you respond to the next person trying to get it to work on an obscure platform with a Perl installation from the middle ages).  Okay, I&#8217;ll mention two reasons: some Perl modules have to be compiled and customized just for the operating system you&#8217;re installing them on, or they&#8217;ll segfault (of all things)!  Don&#8217;t get me wrong, I don&#8217;t think the grass is greener on the other side; no way do I want to try writing these things in C or Java.  Perl is about as portable as it gets.</p>

<p>The net result is that I have to do a lot of little tricks to make these things standalone programs, as much as humanly possible.  I&#8217;m trying to reduce dependencies on external modules, even those that are part of core Perl.  I&#8217;m re-inventing functionality because it&#8217;s not available in all versions.  I&#8217;m writing modules that can be tested, but I&#8217;m not shipping them as separate modules; I&#8217;m basically using <code>sed</code> to copy-and-paste the module&#8217;s code into the scripts.</p>

<p>Why am I doing all this work?</p>

<p>Because it&#8217;s less work than not doing it.</p>

<p>But it is <em>significantly</em> more work than just whacking together some &#8220;scripts&#8221; and uploading them.  That&#8217;s why there is a critical mass beyond which it gets harder to grow a project.  The solution to this is to find a way to do things differently, work smarter, not harder.  The challenge is to switch the fight against the demons of bad code and maintainability so it&#8217;s on my terms.  In other words, don&#8217;t fight against these characteristics of growth; make them work for me.  I won&#8217;t say I&#8217;ve learned that lesson completely, but I&#8217;m starting.  That&#8217;s why I&#8217;m automating basically everything about this project (though for some reason I can&#8217;t get WWW::Mechanize to stay logged into Sourceforge, so I&#8217;m having a hard time automating part of the release process).</p>

<p>I&#8217;m also considering ways to provide this toolkit without taking so much out of my own pocket.  What started out as me developing tools for my employer, and them graciously agreeing to let me make them available for Sourceforge, has gone far beyond my employer&#8217;s needs now.  I can&#8217;t ask my employer to carry the weight, so it has fallen to me for a while now.  That&#8217;s okay for some period while I work out how to do it differently, but not indefinitely.  Among other things, it cuts into time I want to spend with my wife.  Charging for support has definitely crossed my mind, as has some kind of community/enterprise split (such as the one <a href="http://www.zmanda.com/">Zmanda</a> does).  I don&#8217;t want to go there yet &#8212; so I&#8217;m just asking for a week of sponsored time off work, to begin with.</p>

<p>By the way, the process of replacing copy/pasted code isn&#8217;t without its hitches.  I just found and fixed a bug in MySQL Table Checksum that I caused by moving the DSN parsing code to a module.  And someone else just reported a different bug in another tool, where it turns out the copy/pasted code wasn&#8217;t quite identical and I changed the functionality by moving it to the module.  Release early, release often.  Rely on users to <a href="http://code.google.com/p/maatkit/">find bugs and report them</a>.  So it goes.</p>

<p><strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2008/12/23/does-mysql-really-have-an-open-source-business-model/' rel='bookmark' title='Permanent Link: Does MySQL really have an open-source business model?'>Does MySQL really have an open-source business model?</a></li>
<li><a href='http://www.xaprb.com/blog/2008/05/14/mysql-free-software-but-not-open-source/' rel='bookmark' title='Permanent Link: MySQL: Free Software but not Open Source'>MySQL: Free Software but not Open Source</a></li>
<li><a href='http://www.xaprb.com/blog/2009/03/08/making-maatkit-more-open-source-one-step-at-a-time/' rel='bookmark' title='Permanent Link: Making Maatkit more Open Source one step at a time'>Making Maatkit more Open Source one step at a time</a></li>
<li><a href='http://www.xaprb.com/blog/2009/04/29/what-does-an-open-source-sales-model-look-like/' rel='bookmark' title='Permanent Link: What does an open source sales model look like?'>What does an open source sales model look like?</a></li>
<li><a href='http://www.xaprb.com/blog/2011/07/04/measuring-open-source-success-by-jobs/' rel='bookmark' title='Permanent Link: Measuring open-source success by jobs'>Measuring open-source success by jobs</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.xaprb.com/blog/2007/11/05/growth-limits-of-open-source-vis-a-vis-mysql-toolkit/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MySQL Archiver 0.9.2 released</title>
		<link>http://www.xaprb.com/blog/2007/06/09/mysql-archiver-092-released/</link>
		<comments>http://www.xaprb.com/blog/2007/06/09/mysql-archiver-092-released/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 17:01:32 +0000</pubDate>
		<dc:creator>Xaprb</dc:creator>
				<category><![CDATA[archiving]]></category>
		<category><![CDATA[data warehousing]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqltoolkit]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sourceforge]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.xaprb.com/blog/2007/06/09/mysql-archiver-092-released/</guid>
		<description><![CDATA[<p>This release fixes some minor bugs and adds a plugin mechanism. Now you can extend MySQL Archiver with your own code easily. You could use this to run setup and tear-down, hook code into the archiving process, and more. Possibilities include building summary tables in a data warehouse during archiving, handling dependencies such as foreign keys before archiving each row, or applying advanced logic to determine which rows to archive.</p>


<strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2007/06/06/mysql-archiver-091-released/' rel='bookmark' title='Permanent Link: MySQL Archiver 0.9.1 released'>MySQL Archiver 0.9.1 released</a></li>
<li><a href='http://www.xaprb.com/blog/2007/11/05/mysql-archiver-can-now-archive-each-row-to-a-different-table/' rel='bookmark' title='Permanent Link: MySQL Archiver can now archive each row to a different table'>MySQL Archiver can now archive each row to a different table</a></li>
<li><a href='http://www.xaprb.com/blog/2007/07/20/mysql-toolkit-version-675-released/' rel='bookmark' title='Permanent Link: MySQL Toolkit version 675 released'>MySQL Toolkit version 675 released</a></li>
<li><a href='http://www.xaprb.com/blog/2007/07/05/mysql-toolkit-distribution-620-released/' rel='bookmark' title='Permanent Link: MySQL Toolkit distribution 620 released'>MySQL Toolkit distribution 620 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/24/maatkit-version-1709-released/' rel='bookmark' title='Permanent Link: Maatkit version 1709 released'>Maatkit version 1709 released</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="download"><a href="http://code.google.com/p/maatkit">Download MySQL Archiver</a></p>

<p>This release fixes some minor bugs and adds a plugin mechanism. Now you can extend MySQL Archiver with your own code easily. You could use this to run setup and tear-down, hook code into the archiving process, and more. Possibilities include building summary tables in a data warehouse during archiving, handling dependencies such as foreign keys before archiving each row, or applying advanced logic to determine which rows to archive.</p>

<p>The documentation contains full details about the plugin interface, including example code.</p>

<p><strong>Further Reading:</strong><ul><li><a href='http://www.xaprb.com/blog/2007/06/06/mysql-archiver-091-released/' rel='bookmark' title='Permanent Link: MySQL Archiver 0.9.1 released'>MySQL Archiver 0.9.1 released</a></li>
<li><a href='http://www.xaprb.com/blog/2007/11/05/mysql-archiver-can-now-archive-each-row-to-a-different-table/' rel='bookmark' title='Permanent Link: MySQL Archiver can now archive each row to a different table'>MySQL Archiver can now archive each row to a different table</a></li>
<li><a href='http://www.xaprb.com/blog/2007/07/20/mysql-toolkit-version-675-released/' rel='bookmark' title='Permanent Link: MySQL Toolkit version 675 released'>MySQL Toolkit version 675 released</a></li>
<li><a href='http://www.xaprb.com/blog/2007/07/05/mysql-toolkit-distribution-620-released/' rel='bookmark' title='Permanent Link: MySQL Toolkit distribution 620 released'>MySQL Toolkit distribution 620 released</a></li>
<li><a href='http://www.xaprb.com/blog/2008/01/24/maatkit-version-1709-released/' rel='bookmark' title='Permanent Link: Maatkit version 1709 released'>Maatkit version 1709 released</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.xaprb.com/blog/2007/06/09/mysql-archiver-092-released/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

