<?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>dagolden &#187; Uncategorized</title>
	<atom:link href="http://www.dagolden.com/index.php/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dagolden.com</link>
	<description>Whatever comes to mind</description>
	<lastBuildDate>Mon, 23 Jan 2012 03:43:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Visualizing the Perl 5 support policy</title>
		<link>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/</link>
		<comments>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 03:43:33 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[p5p]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[perl programming]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1605</guid>
		<description><![CDATA[My last post showed historical Perl 5 release cycles, but comments I got on and off the blog suggested that my vaguely positive sentiments about the official support policy were misunderstood. This post expands and clarifies my view. I have redone my Perl 5 release cycle graph again with a few changes. First, for the [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="http://www.dagolden.com/index.php/1587/visualizing-perl-5-release-cycles/" target="_blank">last post</a> showed historical Perl 5 release cycles, but comments I got on and off the blog suggested that my vaguely positive sentiments about the <a href="http://perldoc.perl.org/perlpolicy.html" target="_blank">official support policy</a> were misunderstood.  This post expands and clarifies my view.</p>
<p>I have redone my Perl 5 release cycle graph again with a few changes.  First, for the v5.4 through v5.8 series, I have broken the line to the final release, which I consider to be "outliers".  <strong>I think the Perl community was lucky to get those releases</strong> — was lucky that someone stepped up and made them — and that they don't reflect a "normal development" or support cycle.</p>
<p>Second, I have <strong>projected an estimated lifecycle under the official support policy</strong> for v5.12, v5.14 and the not-yet-released v5.16. This represents an expectation for the normal support lifetime of these releases and I think shows a better contrast of expectations resulting from the support policy introduced with v5.14 compared to historical releases.</p>
<p><a href="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline-2.png"><img src="http://www.dagolden.com/wp-content/uploads/2012/01/perl5-release-timeline-2-300x214.png" alt="Perl 5 Release Timeline (Amended)" title="perl5-release-timeline-2" width="300" height="214" class="aligncenter size-medium wp-image-1606" /></a></p>
<p class="aligncenter"><em>click for larger view</em></p>
<p>My observations (ignoring outliers):</p>
<ul>
<li><strong>Prior to v5.14, there was a (sometimes lengthy) gap between the end of one stable series and the start of the next.</strong></li>
<li>The actively maintained periods of v5.4, v5.5 and v5.6 were shorter than the proposed support windows under the new policy</li>
<li>v5.8 had two different support paradigms.  Between v5.8.0 and v5.8.1 was a long gap similar to the v5.6 series.  v5.8.1 to v5.8.8 had a more regularly-spaced series of support releases.</li>
<li>v5.10 had the longest gap between initial release (v5.10.0) and the subsequent support release (v5.10.1)</li>
<li>v5.12 has had the most consistent pattern of support releases after the initial release, and is the only stable Perl 5 to have a (regular, not outlier) support release after the release of the next stable version</li>
<li>v5.14 was the first stable Perl 5 released under the new annual-release cycle</li>
</ul>
<p><strong>The new support policy most resembles a return to the best support period seen historically</strong> (v5.8.1 to v5.8.8), but without the subsequent gap to the next stable release.  </p>
<p>Why do I think this new policy is a positive step forward? Here are some reasons:</p>
<ul>
<li>The support policy is <strong>actually written down</strong>.  What expectations did anyone have prior?  I don't know.  But if I'm using Perl 5, I'd rather know what to expect that have to guess and hope for the best.</li>
<li><strong>The new policy offers a support window longer in practice than any Perl 5 except v5.8</strong> and more regular than any period except between v5.8.1 and v5.8.8</li>
<li>The new stable Perl 5 is available for migration testing mid-way through the support window of the prior stable release.  If there are issues with migration, users can be confident of support for their existing version for an additional year (and emergency security support for a year after that).</li>
<li>The annual release cycle means the change between one stable release and the next will be smaller, lowering migration risk</li>
</ul>
<p><strong>The new policy does cut off the "long tail" of expectations for an outlier release</strong>.  I can understand that for some companies or OS packagers, a two-year support window (three for security) might feel too short, even if that is longer than was typically seen historically.</p>
<p>Here is where the annual stable release cycle and monthly development release cycle offer a huge side benefit: there is now a well-documented, frequently-used, regularly-updated <a href="http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/release_managers_guide.pod" title="Release Manager's Guide" target="_blank">release manager's guide</a> for Perl 5.  Now, <strong>the release process is so easy that a moderately-skilled Perl software engineer without much prior exposure to the Perl source repository can make a Perl 5 release tarball in about a day</strong>.</p>
<p>This means that even if the core Perl 5 development team isn't supporting, say, v5.12 anymore, a motivated company or community group could do the work necessary to prepare their own "outlier" release and either petition the Perl 5 core team to release it or could release their own stable "micro-fork" for others with long-term support needs.  (There might even be a profitable business opportunity selling support for Perl versions past the official support window.)</p>
<p><strong>Previously, Perl 5 development used to be bursty, with long delays between stable releases and with unclear expectations for support.  Now, Perl 5 development happens like clockwork, and has a clear, written support policy.</strong></p>
<p><small><em>[Note: this post represents my individual opinion and was not reviewed by the Perl 5 Porters core development team; it may or may not represent the views of other core developers; it is certainly not an "official" statement of the Perl 5 Porters in any way]</em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1605/visualizing-the-perl-5-support-policy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five Test::More features you might not be using yet</title>
		<link>http://www.dagolden.com/index.php/1322/five-testmore-features-you-might-not-be-using-yet/</link>
		<comments>http://www.dagolden.com/index.php/1322/five-testmore-features-you-might-not-be-using-yet/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 21:10:21 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1322</guid>
		<description><![CDATA[I've been using Test::More for so long that I sometimes forget about new features that have been added in the last couple years. If you're like me and would like a refresher, here's a list of five useful features that you might want to start using. Unless otherwise noted, you will need at least version [...]]]></description>
			<content:encoded><![CDATA[<p>I've been using <a href="http://p3rl.org/Test::More">Test::More</a> for so long that I sometimes forget about new features that have been added in the last couple years.  If you're like me and would like a refresher, here's a list of five useful features that you might want to start using.  Unless otherwise noted, you will need at least version 0.88 of Test::More.</p>
<h2>1. done_testing instead of no_plan</h2>
<p>If you don't know how many tests you are going to run (or don't want to keep count yourself), you used to have to specify 'no_plan' at the start of your tests.  That can lead to surprises if your tests exit prematurely.  Instead, put the <code>done_testing</code> function at the end of your tests.  This ensures that all tests actually run.</p>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.88;

ok(1, &quot;first test&quot;);
ok(1, &quot;second test&quot;);

done_testing;
</pre>
<h2>2. new_ok for object creation</h2>
<p>You used to have to create an object and then call <code>isa_ok</code> on it.  Now those two can be combined with <code>new_ok</code>.  It will also let you pass arguments in an arrayref to be used in the call to <code>new</code>.</p>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.88;

require Foo;
my $obj = new_ok(&quot;Foo&quot;);
# ... use $obj in testing ...

done_testing();
</pre>
<p><em>Changed "require_ok" to "require" per Ovid's comment, below.</em></p>
<h2>3. Add diagnostics only in verbose testing</h2>
<p>The old <code>diag</code> function always prints to stderr.  Particularly for debugging notes, that can clutter up the output when run under a harness.  You can now use the <code>note()</code> function to add diagnostics that are only seen in verbose output.</p>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.88;

note(&quot;Testing on perl $]&quot;);
ok(1, &quot;first test&quot;);

done_testing();
</pre>
<h2>4. Explain data structures in diagnostics</h2>
<p>I often find myself wanting to dump a data structure in diagnostics, and wind up loading Data::Dumper to do that.  Now Test::More can do that for you with the <code>explain()</code> function.  The output is a string that you can pass to <code>diag</code> or <code>note</code>.</p>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.88;

my $want = { pi =&gt; 3.14, e =&gt; 2.72, i =&gt; -1 };
my $have = get_data();

is_deeply($have, $want) or diag explain $have;

done_testing();
</pre>
<h2>5. Encapsulate related tests in a subtest (0.96)</h2>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.96;

pass(&quot;First test&quot;);

subtest 'An example subtest' =&gt; sub {
  pass(&quot;This is a subtest&quot;);
  pass(&quot;So is this&quot;);
};

pass(&quot;Third test&quot;);

done_testing();
</pre>
<p>Subtests can have their own plan, but if they don't have one, Test::More acts like there was an implicit <code>done_testing</code> at the end of the code reference.  That means you don't have to keep count of tests in a subtest and things still work safely.</p>
<p>You can use a 'skip_all' plan in a subtest, too, which is a useful way of constructing a SKIP block without having to count how many tests are being skipped the way you would with the <code>skip()</code> function.</p>
<pre class="brush: perl; title: ; notranslate">
use strict; use warnings;
use Test::More 0.96;

pass(&quot;First test&quot;);

subtest 'Like a SKIP block' =&gt; sub {
  plan 'skip_all' unless $required_condition;
  pass(&quot;This is a subtest&quot;);
  # ... many more tests that you don't have to count ...
};

pass(&quot;Third test&quot;);

done_testing();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1322/five-testmore-features-you-might-not-be-using-yet/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>How to script git with perl and Git::Wrapper</title>
		<link>http://www.dagolden.com/index.php/998/how-to-script-git-with-perl-and-gitwrapper/</link>
		<comments>http://www.dagolden.com/index.php/998/how-to-script-git-with-perl-and-gitwrapper/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 03:17:41 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=998</guid>
		<description><![CDATA[If you work with git, eventually you will want to script something that git doesn't do already and can't be accomplished with an alias. If you use Perl, the Git::Wrapper module makes scripting git easy. The big advantage of Git::Wrapper is that it wraps the binary version of git, which keeps your perl and git [...]]]></description>
			<content:encoded><![CDATA[<p>If you work with <a href="http://git-scm.com/">git</a>, eventually you will want to script something that git doesn't do already and can't be accomplished with an alias.  If you use <a href="http://perl.org/">Perl</a>, the <a href="http://p3rl.org/Git::Wrapper">Git::Wrapper</a> module makes scripting git easy.</p>
<p>The big advantage of Git::Wrapper is that it wraps the binary version of git, which keeps your perl and git independent.  Upgrade perl and not git?  Add Git::Wrapper and you're done.  Upgrade git while keeping your existing perl?  No problem.  If you get your git from an OS distribution package, but <a href="http://p3rl.org/App::perlbrew">roll your own perl</a>, then Git::Wrapper is for you!</p>
<p>Git::Wrapper just makes it really easy to pass git commands and get back useful data.  It really shines on "git log" commands, as it parses each commit message into Git::Wrapper::Log objects with accessors for id, author, date, and message.  For everything else, it's not much more than a wrapper around qx(), but it returns arrays of lines and throws exceptions when things go wrong, which just saves a little time and code.</p>
<p>Here is a short example that I whipped up recently to automate the process of adding a <a href="http://github.com/">github</a> repository remote for someone when they send me a pull request.  (It also uses my <a href="http://p3rl.org/Getopt::Lucid">Getopt::Lucid</a> module, but as the name suggests, it should be clear what that does.)</p>
<pre class="brush: perl; title: ; notranslate">
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
use autodie;
use Git::Wrapper;
use Getopt::Lucid qw/:all/;

# USAGE: github-remote [-r REPO] [NAME]
#     NAME -- a github user name (or defaults to 'dagolden')
#     REPO -- a github repository path (or is parsed out of my private origin repo)

my $opts = Getopt::Lucid-&gt;getopt([
  Param('repo|r'),
]);

my $who = shift @ARGV;

# Get a wrapper for the current directory
my $git = Git::Wrapper-&gt;new(&quot;.&quot;);

# Locate the origin repository URL
my ($origin) = grep { /origin/ } $git-&gt;remote(&quot;-v&quot;);
die &quot;Couldn't determine origin\n&quot; unless $origin;
$origin =~ s/^origin\s+//;
$origin =~ s/\s+\(.*$//;

# Parse out the repository path
my $repo = $opts-&gt;get_repo;
unless ( $repo ) {
  # me@git.example.com:my-repo-name.git
  ($repo) = $origin =~ m/^[^:]+:(.+)$/;
}

# Set up someone else's github repo
if ( $who ) {
  $git-&gt;remote(&quot;add&quot;, $who, &quot;git://github.com/${who}/${repo}&quot;);
}
# Or set up my own github mirror
else {
  $git-&gt;remote(&quot;add&quot;, &quot;github&quot;, &quot;git\@github.com:dagolden/${repo}&quot;);
}
</pre>
<p>That's it.  I admit the program is a little crufty because of how I manage my repositories with a private origin that I mirror to a github repository, but there's almost no cruft around interactions with git.  Consider this:</p>
<pre class="brush: perl; title: ; notranslate">
  $git-&gt;remote(&quot;add&quot;, $who, &quot;git://github.com/${who}/${repo}&quot;);
</pre>
<p>If the command fails (if there's already $who as a remote name), an exception will be thrown. That means I don't have to write any error handling myself, which is perfect for a simple automation program like this one.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/998/how-to-script-git-with-perl-and-gitwrapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What I&#039;m working on in Perl</title>
		<link>http://www.dagolden.com/index.php/773/what-im-working-on-in-perl/</link>
		<comments>http://www.dagolden.com/index.php/773/what-im-working-on-in-perl/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 22:23:03 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[perl programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=773</guid>
		<description><![CDATA[Andy just asked "What are you working on in Perl?" but rather than reply in a comment, I thought it would be a good Ironman post of my own, so here we go: CPAN Meta Spec version 2 -- I released the final spec and will soon be looking to rally toolchain developers to implement [...]]]></description>
			<content:encoded><![CDATA[<p>Andy just asked <a href="http://perlbuzz.com/2010/04/what-are-you-working-on-in-perl.html">"What are you working on in Perl?"</a> but rather than reply in a comment, I thought it would be a good Ironman post of my own, so here we go:</p>
<ul>
<li>CPAN Meta Spec version 2 -- I <a href="http://www.dagolden.com/index.php/759/cpan-meta-spec-version-2-released/">released the final spec</a> and will soon be looking to rally toolchain developers to implement it.</li>
<li>CPAN Testers 2.0 -- I <a href="http://www.dagolden.com/index.php/743/cpan-testers-2-0-beta-test-update/">launched CPAN Testers 2.0 Beta site</a>, the eventual replacement for the current practice of sending CPAN Testers reports over email and I'm continuing to monitor it, tweak it and fix little bugs</li>
<li>Perl 5 core development -- I'm scheduled to be the release-engineer for Perl 5.13.3 in July.  In addition, my goals for Perl 5.13 include getting HTTP support for CPAN clients into the core, simplifying CPAN configuration further and implementing CPAN Meta.</li>
<li>Drafting a formal description of the expectations for Perl build systems that use Build.PL.  Right now it's only Module::Build, but it could be other things in the future.  I've started <a href="http://github.com/dagolden/cpan-api-buildpl">a very rough draft</a> of what cpan clients should expect Build.PL (and the resulting Build) to support.</li>
<li>Dist::Zilla -- I've been converting my distributions over to Dist::Zilla as I work on them.  It's a huge time saver for me (something I hope to blog about more later).  I've also implemented some plugins recently: <a href="http://search.cpan.org/perldoc?Dist::Zilla::Plugin::CheckExtraTests">DZP::CheckExtraTests</a>, <a href="http://search.cpan.org/perldoc?Dist::Zilla::Plugin::BumpVersionFromGit">DZP::BumpVersionFromGit</a> and <a href="http://search.cpan.org/perldoc?Dist::Zilla::Plugin::Twitter">DZP::Twitter</a></li>
<li>I <a href="http://www.dagolden.com/index.php/739/modulebuild-repository-migrated-to-git/">converted the Module::Build repository</a> to git to encourage more contributions and to make it easier to apply them.  I released a development version, <a href="http://search.cpan.org/~dagolden/Module-Build-0.36_08/">0.36_08</a>, with some recent additions.</li>
</ul>
<p>Here are several other things released to CPAN in the last couple months not mentioned above:</p>
<ul>
<li><a href="http://search.cpan.org/perldoc?File::chdir">File-chdir-0.1003</a> -- maintenance release for 5.13.X</li>
<li><a href="http://search.cpan.org/perldoc?Acme::Module::Build::Tiny">Acme-Module-Build-Tiny-0.04</a> -- a half-serious replacement for Module::Build</li>
<li><a href="http://search.cpan.org/perldoc?Version::Next">Version-Next-0.001</a> 	-- increment module version numbers simply and correctly</li>
<li><a href="http://search.cpan.org/perldoc?ExtUtils::CBuilder">ExtUtils-CBuilder-0.2703</a> -- better Windows support for MSVC</li>
<li><a href="http://search.cpan.org/perldoc?Net::Amazon::Config">Net-Amazon-Config-0.001</a> -- simple utility to manage Amazon Web Services credentials</li>
<li><a href="http://search.cpan.org/perldoc?CPAN::Visitor">CPAN-Visitor-0.001</a> -- generic traversal of distributions in a local CPAN  or minicpan repository</li>
<li><a href="http://search.cpan.org/perldoc?Capture::Tiny">Capture-Tiny-0.07</a> -- the only output capturing program you should ever need</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/773/what-im-working-on-in-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The power of not being all things to all people</title>
		<link>http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/</link>
		<comments>http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 23:35:03 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=689</guid>
		<description><![CDATA[The Perl community seems abuzz about the cool new cpanminus client by Tatsuhiko Miyagawa. After about two weeks of development, this is a reasonably functional CPAN client with just a fraction of the overhead, complexity and verbosity of the CPAN and CPANPLUS clients that come with the Perl core. It's a remarkable achievement, not only [...]]]></description>
			<content:encoded><![CDATA[<p>The Perl community seems abuzz about the cool new <b><a href="http://search.cpan.org/perldoc?App::cpanminus">cpanminus</a></b> client by <a href="http://bulknews.typepad.com/">Tatsuhiko Miyagawa</a>.  After about two weeks of development, this is a reasonably functional CPAN client with just a fraction of the overhead, complexity and verbosity of the <a href="http://search.cpan.org/perldoc?CPAN">CPAN</a> and <a href="http://search.cpan.org/perldoc?CPANPLUS">CPANPLUS</a> clients that come with the Perl core.</p>
<p>It's a remarkable achievement, not only technically, but in the reaction it has sparked.  As one of the (sometimes reluctant) maintainers of CPAN and CPANPLUS, I've realized that I both love and hate cpanminus.</p>
<ul>
<li>I love that Miyagawa has done so much with so little and in such a short span of time</li>
<li>I hate that fanboy-types flocked to it and trashed the older clients without noting cpanminus' limitations</li>
<li>I love that Perl toolchain maintainers have rallied around Miyagawa and contributed their wisdom to make cpanminus better instead of rejecting it</li>
<li>I hate that one of Perl's great strengths (CPAN) has legacy clients that are so unwieldy, hated and difficult to maintain</li>
</ul>
<p>Miyagawa graciously acknowledges standing on the shoulders of giants.  Still, I can't shake the nagging thought that cpanminus should never have been necessary in the first place.</p>
<p>What I've come to realize is that <strong>cpanminus is another example of the power of not being all things to all people</strong>.  Miyagawa doesn't promise that it works for all of CPAN or that it works everywhere that Perl does.  He doesn't have to.  Making it work for 99% of CPAN for 99% of people is more than good enough.</p>
<p>I've been co-maintaining various parts of the Perl toolchain for a while now.  It's a frustrating challenge needing to make thing work everywhere, for everything, and trying as hard as possible not to break backwards compatibility.  Plus, I don't even get to use CPAN to make life easier.  I don't get to use handy tools like <a href="http://search.cpan.org/perldoc?Moose::Manual">Moose</a> or <a href="http://search.cpan.org/perldoc?DateTime">DateTime</a> or <a href="http://search.cpan.org/perldoc?Regexp::Common">Regexp::Common</a> or <a href="http://search.cpan.org/perldoc?DBD::SQLite">SQLite</a> or anything in the Config::* namespace or even basic tools like <a href="http://search.cpan.org/perldoc?Archive::Zip">Archive::Zip</a>.  Nearly everything is done by hand. </p>
<p>Things have to work with just core Perl on a diverse set of platforms and with an incredibly limited set of assumptions.  For example, the Perl core <em>still</em> doesn't come with an HTTP client, so CPAN has to rely on FTP or command line programs to bootstrap LWP.  (This is something I personally plan to tackle during the Perl 5.13 development series later this year.)</p>
<p>I think this is an ongoing challenge for core Perl development in general.  It's a lot of work to be all things to all people and I keep wondering whether making things simpler and better for 99% of people would be a better choice.  (Anyone else for <code>use strict</code> by default?  I hope that finally comes to pass in Perl 5.14.)  chromatic writes about this topic often in his <a href="http://www.modernperlbooks.com/">Modern Perl blog</a> and I usually tend to agree with the points he makes.  (<strike>October</strike> <a href="http://www.modernperlbooks.com/mt/2009/02/">February 2009</a> had a particularly good series of posts.)</p>
<p>In the meantime, I look at cpanminus with greed and envy.  Miyagawa++</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Good, fast or cheap -- pick again</title>
		<link>http://www.dagolden.com/index.php/595/good-fast-or-cheap-pick-again/</link>
		<comments>http://www.dagolden.com/index.php/595/good-fast-or-cheap-pick-again/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 03:37:28 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan-testers]]></category>
		<category><![CDATA[metabase]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=595</guid>
		<description><![CDATA[I'm not sure when exactly I started thinking about new infrastructure for CPAN Testers, but it might have been a couple years ago around the time I released CPAN::Reporter 1.0. That was when I decided that Net::SMTP needed to be the default "transport" option, to avoid problems people were already having with local report submission [...]]]></description>
			<content:encoded><![CDATA[<p>I'm not sure when exactly I started thinking about new infrastructure for <a href="http://www.cpantesters.org/">CPAN Testers</a>, but it might have been a couple years ago around the time I released <a href="http://search.cpan.org/dist/CPAN-Reporter/">CPAN::Reporter</a> 1.0.  That was when I decided that <a href="http://search.cpan.org/dist/Net-SMTP/">Net::SMTP</a> needed to be the default "transport" option, to avoid problems people were already having with local report submission via sendmail.  It was a necessary change, but only a temporary fix for the bigger problem.  At the <a href="http://perl-qa.hexten.net/wiki/index.php/OsloQAWorkshop2008">Oslo QA hackathon</a> in spring 2008, <a href="http://rjbs.manxome.org/journal">Ricardo</a>, <a href="http://e-diot.dk/wordpress/">Jonas </a>and I <a href="http://use.perl.org/~dagolden/journal/36113">worked up the first draft</a> of a framework for "CPAN Testers 2.0" (CT2.0).  </p>
<p>What happened next was the inevitable result of the proverb: "good, fast, or cheap -- pick two".  CT2.0 was designed to be a good replacement for CT1.0, and it was being done by (cheap) all volunteer labor.  So, despite some <a href="http://www.dagolden.com/index.php/35/belated-perl-qa-hackathon-progress-report/">progress towards a proof of concept</a> a year later at the <a href="http://qa-hackathon.org/">Birmingham QA hackathon</a>, there has been no real end in sight for CT1.0.</p>
<p><a href="http://www.dagolden.com/index.php/583/cpan-testers-too-much-of-a-good-thing-right-now/">That all changed last week</a>.  With a firm deadline to hit, it's time to reconsider the good, fast or cheap tradeoff.  <Em>Fast</em> is now critical.  I think the design is <em>good enough</em>.  What can be done quickly won't replace all of the CT1.0 ecosystem right away but just the core transport and report repository parts.</p>
<p>I think <em>cheap </em>is what is going to change.  It's still volunteer labor, but I think there's a way to need less of it.  My current hypothesis for a plan to hit the deadline is to implement the <a href="http://www.dagolden.com/index.php/261/metabase-opinions-from-anyone-about-anything/">Metabase </a>framework on top of <a href="http://aws.amazon.com/">Amazon Web Services</a> (AWS).  That offloads scalability and reliability concerns, changing those technical and administrative challenges into resource challenges.  </p>
<p>I've already <a href="http://www.dagolden.com/index.php/164/kitty-hawk-moment-for-cpan-testers-20/">successfully demonstrated a proof of concept</a> that the existing <a href="http://search.cpan.org/dist/Test-Reporter/">Test::Reporter</a> based testing clients can feed a CT2.0 Metabase.  How well the framework scales remains a big unknown, but by implementing on top of AWS, we can throw resources at the problem in the short-run by deploying more EC2 instances to deal with bottlenecks.  If the <a href="http://devel.cpantesters.org/">SQLite databases that drive the CPAN Testers statistics sites</a> have to be regenerated from scratch each night, that's just a MapReduce job.  If the Metabase web app is too slow to deal with the test report volume, we just deploy more instances and stick a load balancer in front.</p>
<p>Having that flexibility simplifies the job of getting CT2.0 off the ground to a handful of to-do's:</p>
<ul>
<li>Implement a Metabase backend on top of AWS</li>
<li>Create an AWS virtual machine to accept reports and publish to the CT2.0 Metabase on AWS</li>
<li>Migrate existing NNTP reports to the CT2.0 Metabase</li
<li>Implement a web app to serve up new and legacy reports from the CT2.0 Metabase</li>
<li>Design a process to update the CPAN Testers stats database with newly uploaded reports (from scratch if necessary)</li>
<li>Update CPAN Testers websites to link to the new CT2.0 reports archive site</li>
<li>Get testers to switch to Test::Reporter::Transport::Metabase</li>
</ul>
<p>I think that gets most of what we need by March 1 and without a whole lot of new code to write and test and without a lot of sysadmin or DBA time and attention required.  It's a limited implementation, but will solve the need of the Perl NOC to get CPAN Testers reports off their email infrastructure.</p>
<p>I'll be writing up more details and plans over the next week.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/595/good-fast-or-cheap-pick-again/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

