<?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>Perlblogs</title>
	<atom:link href="http://perlblogs.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://perlblogs.com</link>
	<description>Posts from selected Perl bloggers</description>
	<lastBuildDate>Sat, 13 Mar 2010 00:01:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Learning to Fail to Learn</title>
		<link>http://www.modernperlbooks.com/mt/2010/03/learning-to-fail-to-learn.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/03/learning-to-fail-to-learn.html#comments</comments>
		<pubDate>Fri, 12 Mar 2010 22:41:26 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.160</guid>
		<description><![CDATA[
        I've been writing about Moose in the Modern Perl book draft recently.  Moose is clearly the right way to teach object orientation in the context of Perl 5, and I've enjoyed how Moose makes doing the right thing easy.

Yesterday I explained inh...]]></description>
			<content:encoded><![CDATA[
        <p>I've been writing about <a href="http://moose.perl.org/">Moose</a> in the <a href="http://github.com/chromatic/modern_perl_book/">Modern Perl book draft</a> recently.  Moose is clearly the right way to teach object orientation in the context of Perl 5, and I've enjoyed how Moose makes doing the right thing easy.</p>

<p>Yesterday I explained inheritance in the context of Moose and Perl 5 OO.</p>

<p>I'd already explained <a href="http://www.modernperlbooks.com/mt/2009/04/the-why-of-perl-roles.html">Perl roles</a>.  If I didn't have to acknowledge that people reading the book will eventually run across legacy code, I could happily gloss over inheritance as an idea that turns out to be much less useful than it first appears.  I suspect that inheritance seems great to OO novices because it's spectacular and interesting: code appears seemingly for free out of nowhere!  That's easy to understand, while the subtle utility of polymorphism and parametric polymorphism require you to have struggled with the problems they solve so you understand their value.</p>

<p>Would so many of us appreciate Moose if we hadn't wasted so much time doing things the hard way?</p>

<p>I spend a lot of time thinking about how to teach people to appreciate and to understand modern Perl in ways that do not lead them down the dark alleys and bumpy roads where I had to learn to program the hard way.  I'm very stubborn, and I'm perfectly comfortable taking apart something to figure out how it works.  (The people who fix bugs in your favorite programming languages likely share this trait.)</p>

<p>I don't believe that attribute is a necessary precondition for learning to program well.</p>

<p>However, I do wonder if it's more difficult to understand the value of a
non-obvious system until you realize the drawbacks of the system you do
understand.  I've seen novices insist that they absolutely must use symbolic
references instead of hashes, or that manual iteration instead of list
transformation is so much easier, or what have you that I wonder about the
diactic value of trying to show people the best general approach as I
understand it now first, then mentioning other ways that aren't as good.</p>

<p>Consider an example.  I <em>know</em> better ways to write <a
href="http://search.cpan.org/perldoc?Test::Builder">Test::Builder</a> because
I've implemented it three times now, in Perl 5, Perl 6, and PIR.  I like to
think I'd have listened if someone suggested infelicities in its original
design, but only the experience of implementing and using it helped me to
understand what it really needed to do.</p>

<p>I wonder.  Is it possible to teach Perl 5 in such a way that novices don't
have to suffer all of the miscues that the rest of us have in the past decade?
If so, how do I do that?  (If not, what does that imply about new adoption of
Perl 5 and adoption of Perl 6 in general?)</p>

<p>Maybe I'm conflating learning a language with learning how to design
programs&mdash;but how do you separate the two when your goal is merely to
teach people how to solve problems?</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/03/learning-to-fail-to-learn.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What CPAN Doesn&#8217;t Do</title>
		<link>http://www.modernperlbooks.com/mt/2010/03/what-cpan-doesnt-do.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/03/what-cpan-doesnt-do.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 22:29:20 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.159</guid>
		<description><![CDATA[
        Configuration-Free CPAN Installations and What's Wrong with Module::Install both hinted at a fundamental difficulty in managing software from the CPAN.  Enough teasing.

The fundamental assumption of the CPAN that makes managing software throu...]]></description>
			<content:encoded><![CDATA[
        <p><a href="http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html">Configuration-Free CPAN Installations</a> and <a href="http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html">What's Wrong with Module::Install</a> both hinted at a fundamental difficulty in managing software from the CPAN.  Enough teasing.</p>

<p>The fundamental assumption of the CPAN that makes managing software through CPAN clients difficult is that <em>newer software can always replace older software</em>.</p>

<p>That's not the CPAN's problem, not really.  <a
href="http://www.modernperlbooks.com/mt/2009/12/the-guess-the-version-game.html">Perl
5 has this version number problem too</a>, and it's the source of much of the
backwards compatibility troubles in the Perl 5 world.</p>

<p>On the CPAN, no one agrees on what version numbers mean.  No one agrees on
backwards compatibility concerns.  No one agrees about what makes one release
"stable" and another release "testing" or what you can change in an API.</p>

<p>I'm not sure it's the job of CPAN or the CPAN maintainers to try to solve this problem.  The lack of rules and ceremony over the <em>function</em> of uploaded code and the loose agreement on the <em>form</em> of uploaded code have allowed CPAN to thrive where other languages with their own packaging and distribution systems have fragmented into incompatible, warring fiefdoms.</p>

<p>Even still, fighting over whether <code>Module::Build</code> is of the devil
because (insert silly reason here) or complaining that
<code>Module::Install</code> is a stupid patch over a pile of nasty, almost
unsupported hacks misses the real point.  The best possible improvement in the
Perl 5/CPAN ecosystem is to know which versions of which distributions work
together, and for end users to be able to download a known-working graph of
their desired distribution and its dependencies.</p>

<p>In other words, the big problem isn't that <code>Module::Install</code> has
a nicer interface (arguable) or <code>ExtUtils::MakeMaker</code> is a horrific
pile of barely-working hacks that shouldn't have survived into the 21st century
(indisputable).  The problem is the integration of separate components managed
by separate maintainers with wildly disparate ideas of the semantics of change
over indeterminate periods of time.</p>

<p>At any single given point in time, any given CPAN distribution should work correctly with its currently available upstream dependencies.  With the current system, we cannot guarantee that perturbation in those dependency graphs will percolate to users at any point in the future.</p>

<p>In my mind, <a href="http://use.perl.org/~Alias/journal/40225">arguing over
whether an improvement to the CPAN ecosystem can take over for every use case
of the current tools</a> is stupid and wrong (or, more charitably, a silly
distraction).  Improving the user and developer experiences of the current
tools and the current system is good, but the real improvements in the system
will not occur at the interface level.</p>

<p>(Of course, the problem with Adam's point of view is that requiring any
credible replacement to handle every possible failure case before stamping it
with an imprimatur is that "better" is not an all or nothing concern.  I have
no illusion that it's possible to fix the Perl 5 versioning scheme for every
case.  If we can fix it for 90% of cases, surely that's a reasonable
improvement.)</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/03/what-cpan-doesnt-do.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl one-liner to sample your Mac&#8217;s voices</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/eWWrWVOsfgw/perl-one-liner-to-sample-your-macs-voices.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/eWWrWVOsfgw/perl-one-liner-to-sample-your-macs-voices.html#comments</comments>
		<pubDate>Wed, 10 Mar 2010 05:29:51 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:perlbuzz.com,2010://1.764</guid>
		<description><![CDATA[
        I've been following stories about Roger Ebert's new voice, which a company has made so that they can apparently plug it into his Mac.  In his appearances on camera, the voice he's been using is the Mac "Alex" voice.  What other voices does you...]]></description>
			<content:encoded><![CDATA[
        <p>I've been following stories about <a href="http://gizmodo.com/5483870/roger-eberts-new-voice">Roger Ebert's new voice</a>, which a company has made so that they can apparently plug it into his Mac.  In his appearances on camera, the voice he's been using is the Mac "Alex" voice.  What other voices does your Mac have? Here's a Perl one-liner to play them.</p>

<p>From the Terminal window, paste this in at the prompt:</p>

<pre>
perl -le'for (@ARGV){m{/(\w+?)\.SpeechVoice};' \
  -e'$_=$1;s/([a-z])([A-Z])/$1 $2/g;' \
  -e'print qq{say -v "$_" This is $_};}' \
  /System/Library/Speech/Voices/* | sh -x
</pre>

<p>On my Mac, "Organ" isn't found, but I don't know why.</p>

        

    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=eWWrWVOsfgw:RO71XFJfsHo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=eWWrWVOsfgw:RO71XFJfsHo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=eWWrWVOsfgw:RO71XFJfsHo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=eWWrWVOsfgw:RO71XFJfsHo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=eWWrWVOsfgw:RO71XFJfsHo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=eWWrWVOsfgw:RO71XFJfsHo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/eWWrWVOsfgw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/PerlBuzz/~3/eWWrWVOsfgw/perl-one-liner-to-sample-your-macs-voices.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perlbuzz news roundup for 2010-03-09</title>
		<link>http://feedproxy.google.com/~r/PerlBuzz/~3/VsPK3suXzdg/perlbuzz-news-roundup-for-2010-03-09.html</link>
		<comments>http://feedproxy.google.com/~r/PerlBuzz/~3/VsPK3suXzdg/perlbuzz-news-roundup-for-2010-03-09.html#comments</comments>
		<pubDate>Tue, 09 Mar 2010 16:46:42 +0000</pubDate>
		<dc:creator>Andy Lester</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:perlbuzz.com,2010://1.762</guid>
		<description><![CDATA[
        
These links are collected from the
Perlbuzz Twitter feed.
If you have suggestions for news bits, please mail me at
andy@perlbuzz.com.




What's going on with San Francisco Perl Mongers? (blogs.perl.org)
Contributing is easy: A first-timer ta...]]></description>
			<content:encoded><![CDATA[
        <p>
These links are collected from the
<a href="http://twitter.com/perlbuzz">Perlbuzz Twitter feed</a>.
If you have suggestions for news bits, please mail me at
<a href="mailto:andy@perlbuzz.com">andy@perlbuzz.com</a>.
</p>

<ul>

<li>What's going on with San Francisco Perl Mongers? (<a href="http://blogs.perl.org/users/phred/2010/01/sfpm-annual-report-and-plans.html">blogs.perl.org</a>)</li>
<li>Contributing is easy: A first-timer talks about adding to CPAN (<a href="http://blogs.perl.org/users/david/2010/02/contributing-is-easy.html">blogs.perl.org</a>)</li>
<li>Help keep the world safe from SQL injection: (<a href="http://perlbuzz.com/2010/02/help-keep-the-world-safe-from-sql-injection.html">perlbuzz.com</a>)</li>
<li>How to learn how to get help in Perl (<a href="http://use.perl.org/~redspike/journal/40162">use.perl.org</a>)</li>
<li>The Perl Foundation wants your input on grant proposals for 2010 (<a href="http://news.perlfoundation.org/2010/02/2010q1_grant_proposals.html">news.perlfoundation.org</a>)</li>
<li>Why Ruby is prettier and Padre changes the Perl community (<a href="http://use.perl.org/~Alias/journal/40170">use.perl.org</a>)</li>
<li>Manage your Perl modules with git (<a href="http://www.effectiveperlprogramming.com/blog/60">effectiveperlprogramming.com</a>)</li>
<li>Call for papers for YAPC::NA 2010 in Columbus. Theme: Modern Perl 5 (<a href="http://news.perlfoundation.org/2010/02/yapcna_2010_call_for_papers.html">news.perlfoundation.org</a>)</li>
<li>Famous Perl One-Liners Explained part 5: Text conversion and substitution (<a href="http://www.catonmat.net/blog/perl-one-liners-explained-part-five/">catonmat.net</a>)</li>
<li>The Italians like ack, too (<a href="http://www.cattlegrid.info/blog/2009/11/ack-a-better-grep.html">cattlegrid.info</a>)</li>
<li>Bash completion for perldoc (<a href="http://blogs.perl.org/users/aristotle/2010/02/more-bash-completion-help-for-perldoc.html">blogs.perl.org</a>)</li>
<li>cpanminus, the new CPAN shell superstar (<a href="http://marcus.nordaaker.com/2010/02/cpanminus-the-new-cpan-superstar/">marcus.nordaaker.com</a>)</li>
<li>RT <a href="http://twitter.com/chromatic">@chromatic</a>_x Kudos to *many* active #perl 5 porters for the successful 5.11 release series: (<a href="http://ur1.ca/n5cv">ur1.ca</a>)</li>
<li>Testing a DB-intensive app (<a href="http://blog.urth.org/2010/02/testing-a-database-intensive-application.html">blog.urth.org</a>)</li>
<li>More news on the TPF wiki overhaul (<a href="http://use.perl.org/~perl6doc/journal/40211">use.perl.org</a>)</li>
<li>Do you still program in Perl? (<a href="http://www.reddit.com/r/programming/comments/b3vnu/do_you_still_program_in_perl/">reddit.com</a>)</li>
<li>Benchmarking is for losers, Profiling rulez! (<a href="http://blog.urth.org/2010/03/benchmarking-versus-profiling.html">blog.urth.org</a>)</li>
<li>Damian Conway's been posting a series of columns on vim: (<a href="http://blogs.perl.org/users/ovid/2010/03/whats-the-mad-doctor-doing.html">blogs.perl.org</a>)</li>
<li>Testing and looging with Dist::Zilla (<a href="http://rjbs.manxome.org/rubric/entry/1821">rjbs.manxome.org</a>)</li>
<li>Safe.pm 2.25 fixes security hole (<a href="http://blogs.perl.org/users/rafael_garcia-suarez/2010/03/new-safepm-fixes-security-hole.html">blogs.perl.org</a>)</li>
<li>Serving production web requests with the Catalyst development server (<a href="http://blog.afoolishmanifesto.com/archives/1303">blog.afoolishmanifesto.com</a>)</li>
</ul>
        
    <div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=VsPK3suXzdg:-acereh4S5I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=VsPK3suXzdg:-acereh4S5I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=VsPK3suXzdg:-acereh4S5I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=VsPK3suXzdg:-acereh4S5I:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?i=VsPK3suXzdg:-acereh4S5I:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/PerlBuzz?a=VsPK3suXzdg:-acereh4S5I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/PerlBuzz?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/PerlBuzz/~4/VsPK3suXzdg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://feedproxy.google.com/~r/PerlBuzz/~3/VsPK3suXzdg/perlbuzz-news-roundup-for-2010-03-09.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CPAN Testers 2.0 end-February update and next steps</title>
		<link>http://www.dagolden.com/index.php/708/cpan-testers-2-0-end-february-update-and-next-steps/</link>
		<comments>http://www.dagolden.com/index.php/708/cpan-testers-2-0-end-february-update-and-next-steps/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 04:59:04 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=708</guid>
		<description><![CDATA[It&#8217;s never great to post an &#8220;end-February&#8221; report a week into March, but that&#8217;s how things are going lately.  I&#8217;ve been busy with family and work obligations that have meant less CT2.0 hacking.  I&#8217;m sorry this is coming late, but I hope I will give anyone interested a sense of where things stand.
I [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s never great to post an &#8220;end-February&#8221; report a week into March, but that&#8217;s how things are going lately.  I&#8217;ve been busy with family and work obligations that have meant less CT2.0 hacking.  I&#8217;m sorry this is coming late, but I hope I will give anyone interested a sense of where things stand.</p>
<p>I should note that the original deadline for finishing CT2.0 was March 1 and clearly we&#8217;re not there yet.  I&#8217;ve discussed the situation with Robert and Ask at the <a href="http://noc.perl.org/">Perl NOC</a>, and they&#8217;ve been willing to extend the deadline for cutting off CT1.0 for a while longer.  Thank you, Robert and Ask, for your understanding!</p>
<p>Progress in the last couple weeks:</p>
<ul>
<li>I did some alpha testing of the CT2.0 Metabase hosted on <a href="http://amazon.com/aws/">Amazon</a>.  Based on that, I revised yet again <em>(sigh)</em> the user registration/credentials approach to minimize the hassle for old and new registrants.</li>
<li>Florian Ragwitz wrote a <a href="http://www.catalystframework.org/">Catalyst</a> app to help distribute new credentials files to legacy CT1.0 users.  I haven&#8217;t deployed it yet (since I now need to regenerate all the credentials), but greatly appreciate his quick turnaround.</li>
<li>I implemented the Metabase search capabilities that Barbie will need to update the CPAN Testers statistics database.  This will be based on the excellent <a href="http://search.cpan.org/perldoc?SQL::Abstract">SQL::Abstract</a> approach to WHERE clause construction.</li>
<li>I wrote several helper modules to simplify configuration of a CPAN Testers metabase in preparation for deployment.  The first of these has already been uploaded to CPAN: <a href="http://search.cpan.org/perldoc?Net::Amazon::Config">Net::Amazon::Config</a></li>
<li>I finalized the &#8220;version 0&#8243; API for the Metabase web service and revised the interface between the Catalyst app and the Metabase to reflect the latest changes to the library.</li>
</ul>
<p>In the last several weeks, members the #catalyst and #moose IRC channels were very, very helpful and patiently answered my many stupid questions.  Thank you in particular to confound, perigrin, rafl, rjbs, stevan and t0m.</p>
<p>Coming up:</p>
<ul>
<li>Deploy all my new code onto the server for &#8220;beta&#8221; testing</li>
<li>Release all the code to CPAN that people will need to configure their clients for beta testing</li>
<li>Regenerate user profiles and deploy rafl&#8217;s app to distribute them to legacy users</li>
<li>Whip the server into production shape (e.g. proper boot scripts to auto-start the CT2.0 apps on restart)</li>
<li>Get back to work on legacy report migration</li>
</ul>
<p>It&#8217;s at the point now where I suspect the &#8220;hard thinking&#8221; part is pretty much done and it&#8217;s a lot of grotty but straightforward tasks to go.  Hopefully, beta testing won&#8217;t reveal any major issues and the end of March update will be focused on planning on orderly transition from CT1.0 to CT2.0.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/708/cpan-testers-2-0-end-february-update-and-next-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configuration-Free CPAN Installations</title>
		<link>http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html#comments</comments>
		<pubDate>Sat, 06 Mar 2010 20:11:00 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.158</guid>
		<description><![CDATA[
        Module::Install
exists because installing CPAN distributions is not always perfectly
easy.

Unfortunately, it didn't help&#8212;at least, not entirely.  According to
the completely unscientific process by which I install CPAN distributions,
Mo...]]></description>
			<content:encoded><![CDATA[
        <p><a
href="http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html">Module::Install
exists because installing CPAN distributions is not always perfectly
easy</a>.</p>

<p>Unfortunately, it didn't help&mdash;at least, not entirely.  According to
the completely unscientific process by which I install CPAN distributions,
<code>Module::Install</code> accounts for a greater amount of pain than it
should, at least according to its frequency of use.  (Again, this is completely
<em>unscientific</em>.  I could guess that half of the CPAN client sessions
which encounter Module::Install require me to fix things manually, but it's
probably closer to 20%.  It's more memorable because of my severe dislike for
M::I <em>prompting</em> to install dependencies during configuration time.)</p>

<p>M::I addresses a real bootstrapping problem.  I want to be able to use
libraries during configuration, building, testing, and installation.  I don't
know which versions of those libraries you have available.  Bundling known-good
versions of those libraries with the distribution itself solves part of that
problem...</p>

<p>... except when it doesn't.  If I were to use M::I, I would have to
re-release all of my distributions for every new release of every bundled
library, at least if they contain important bug fixes for the various platforms
about which I care.  The cheap perfume of static linking leaves its musk heavy
in the air.</p>

<p>It's easy to fall into the trap of a false dilemma.  "You fool!" you prepare
to comment below.  "It's either that or the chaos of trying to make do with
whatever version of those dependencies users may or may not have installed on
their systems!"  You're right; those are two possibilities.  They're not the
only two possibilities.</p>

<p>Part of the real problem is that bootstrapping during configuration is much
too late.  By the time you're running the configuration system, you're already
running the configuration system.  If your version of the configuration system
is too old or too new, you have a problem.  Bail out?  Revert?  Upgrade?
There's no good heuristic for determining this.  (The CPAN itself has an
opinion.  That's part of the problem.)</p>

<p>M::I hackers do deserve credit for helping to develop the <em>META.yml</em>
standard.  (I think M::I is the wrong approach, but I intend no slight toward
its users, advocates, and developers.  Invention requires the courage to get
things wrong sometimes, even as it requires the courage to abandon false
leads.) The <a
href="http://module-build.sourceforge.net/META-spec-current.html">META.yml</a>
specification is a big step in the right direction.  If <em>most</em> CPAN
modules have static requirements and follow a standard set of conventions,
there's little or no configuration necessary.  A sufficiently smart CPAN client
can perform the appropriate configuration without running code from the
distribution itself.</p>

<p>You can't avoid that in all cases; distributions with XS components, for
example, need to probe system information.  Good luck writing a sufficiently
smart CPAN client and getting the community to agree on specific standards that
let you find OpenGL headers in a cross-platform fashion, for example.  Yet if
80% of CPAN distributions can get by with static, upload-time configuration, a
lot of complexity of installation can go away.</p>

<p>Yes, that would make <code>Module::Build</code> and
<code>ExtUtils::MakeMaker</code> unnecessary for (probably) most CPAN
distributions, at least at the point of configuration, building, and
installation.  (I'm a recent fan of <a
href="http://search.cpan.org/perldoc?Dist::Zilla">Dist::Zilla</a> for
automating away tedium on behalf of distribution maintainers; there's less need
for <code>Module::Install</code> in such a world.  If I never write another
<em>Build.PL</em> again, so much the better.)</p>

<p>That helps, but the real problem with CPAN installations is that the CPAN
itself is merely an uploading, indexing, and mirroring system.  Projects such
as <em>META.yml</em> attempt to add (and extract) meaning from the system, but
they cannot work around one fundamental design feature of the CPAN.
<em>That</em> limitation is the source of most woes for end users.</p>

<p>Clever readers (or experienced CPAN users) have already identified this
limitation.  I'll reveal it in the next installment.</p>

        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/03/configuration-free-cpan-installations.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The 99% Rule</title>
		<link>http://www.modernperlbooks.com/mt/2010/03/the-99-rule.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/03/the-99-rule.html#comments</comments>
		<pubDate>Wed, 03 Mar 2010 00:41:02 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.157</guid>
		<description><![CDATA[
        David Golden praised Tatsuhiko Miyagawa's excellent new cpanminus CPAN client in The power of not being all things to all people.  You should consider using cpanminus.

Don't overlook something else insightful that David wrote:

It's a lot of ...]]></description>
			<content:encoded><![CDATA[
        <p>David Golden praised Tatsuhiko Miyagawa's excellent new <a href="http://search.cpan.org/perldoc?App::cpanminus">cpanminus</a> CPAN client in <a href="http://www.dagolden.com/index.php/689/the-power-of-not-being-all-things-to-all-people/">The power of not being all things to all people</a>.  You should consider using cpanminus.</p>

<p>Don't overlook something else insightful that David wrote:</p>

<blockquote>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.</blockquote>

<p>The only reliable way I've ever seen to "make the easy things easy and the hard things possible" is to make the easy things the default without preventing customization of the hard things.  That's a design principle for languages, APIs, and tools.</p>

<p>Figure out what's most common (though not necessarily what people think they want, but what they need).  Optimize for that.  Consider what they might need and don't prevent it.</p>

<p>That's not easy, and what people need will change over time, but if you want to solve problems well, you have to solve the right problems.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/03/the-99-rule.html/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[Uncategorized]]></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&#8217;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&#8217;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&#8217;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&#8217; 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&#8217;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&#8217;t shake the nagging thought that cpanminus should never have been necessary in the first place.</p>
<p>What I&#8217;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&#8217;t promise that it works for all of CPAN or that it works everywhere that Perl does.  He doesn&#8217;t have to.  Making it work for 99% of CPAN for 99% of people is more than good enough.</p>
<p>I&#8217;ve been co-maintaining various parts of the Perl toolchain for a while now.  It&#8217;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&#8217;t even get to use CPAN to make life easier.  I don&#8217;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&#8217;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&#8217;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>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s Wrong with Module::Install</title>
		<link>http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html#comments</comments>
		<pubDate>Mon, 01 Mar 2010 23:33:39 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.156</guid>
		<description><![CDATA[
        I've never liked ExtUtils::MakeMaker.  I've liked Module::Build from the beginning.  I've never, ever liked Module::Install, even though Ingy sat in my living room and hacked on what would eventually become M::I way back several years ago.

I ...]]></description>
			<content:encoded><![CDATA[
        <p>I've never liked <a href="http://search.cpan.org/perldoc?ExtUtils::MakeMaker">ExtUtils::MakeMaker</a>.  I've liked <a href="http://search.cpan.org/perldoc?Module::Build">Module::Build</a> from the beginning.  I've never, ever liked <a href="http://search.cpan.org/perldoc?Module::Install">Module::Install</a>, even though <a href="http://ingy.net/">Ingy</a> sat in my living room and hacked on what would eventually become M::I way back several years ago.</p>

<p>I don't believe <a href="http://chris.prather.org/shot-on-sight.md.html">people who use Module::Install should be shot on sight</a>, but I do believe that Module::Install has set the usability of the CPAN back by several years.</p>

<p>Ingy <em>did</em> identify a real problem: there's too much code strewn about the configuration and build systems of the CPAN and not enough code shared.  When he found himself writing something complicated to configure, compile, and install a new distribution, he'd crib code from someone like Tim Bunce or Graham Barr or Nick Ing-Simmons.  In other words, to make the CPAN&mdash;perhaps the world's largest repository of redistributable and sharable library code&mdash;work, he had to copy and paste code.</p>

<p>M::I did get that right; turning the configuration and build system into reusable, redistributable libraries also available from the CPAN helped reduce the amount of boilerplate code and the amount of copy and paste code in configuration systems.  The people behind M::I have also helped push for better configuration of CPAN clients and better tracking of dependencies and versions and types of dependencies (optional, compilation, bundling, testing, et cetera).  The CPAN ecosystem is better off for that work, even though M::I itself isn't the answer.</p>

<p>One of M::I's biggest failings, of course, is that it prolongs the lifespan of EU::MM.  Unfortunately, I think Ingy missed the big problem when he saw copy and paste code.  To do anything reasonably complex with EU::MM, you have to be able to write Perl 5 code which generates (and modifies with regular expressions) cross-platform Makefiles which themselves call into Perl 5 code because Perl 5 has a sane baseline of well-understood and reliable behavior across platforms in a way that Makefiles and shells do not.</p>

<p>If that's not sufficient horror, consider that the way to customize EU::MM behavior the last time I looked at it (Two notes here.  First, its current maintainer <em>refuses</em> to add new features or change existing features because it's so awful to maintain.  Second, I wrote tests for some of those behaviors, so I've read and understood the code.) you write a custom <em>superclass</em> called <code>MY</code> from which EU::MM <em>inherits</em> to change the behavior of the various steps of generating cross-platform Makefiles which may or may not invoke Perl 5 to perform shell functions.</p>

<p>I am not making this up and I did not make any typos.  EU:MM <em>inherits from</em> your custom class.</p>

<p>Keeping EU::MM viable long past the point where Module::Build did everything n a saner way is but a little crime.  (There's a reason almost no one recommends the use of <code>h2xs</code> to make skeletons for new modules anymore; most new modules aren't mere wrappers around C libraries.  The need for a compilation step with a pure-Perl distribution seems more than a little bit superfluous.)</p>

<p>Module::Install reinvoking your current CPAN client recursively to install dependencies when your current CPAN client already has a perfectly good way to install dependencies is a slightly larger crime.  (I understand the justification; what if someone is trying to install a distribution from a tarball manually without a CPAN client, but is there a Principle of Least Possible Differentiation at work with that design choice?)</p>

<p>I don't particularly care that using M::I as a distribution maintainer means that you have to keep track of every new release of M::I which could fix bugs or make upgrading impossible and release a new version of every one of your distributions with the new M::I because of its autobundling problems, because if you get your kicks that way, more power to you.  (Don't expect me to jump up and down for joy at upgrading all of your distributions on my machines, though.)</p>

<p>I never particularly cared for the FUD about Module::Build from some M::I discussions, especially the nonsense about "Module::Build doesn't support <code>--install</code> so it spews files all over the place!" (as if EU::MM ever worked properly there) or "Module::Build doesn't support uninstalling!" (as if anyone ever used that from the CPAN client to know that it worked with <em>any</em> system.)</p>

<p>I appreciate that Module::Install provided a much nicer interface than EU::MM did, and that that interface worked transparently to hide the nasty details of EU::MM.  Those are true benefits, and I don't blame anyone for choosing M::I for that reason.</p>

<p>Even so, Module::Install's greatest crime is that it's been a distraction from identifying and fixing the real problems of the CPAN... but that's another post.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/03/whats-wrong-with-moduleinstall.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl 5, Support, and Bugfixes</title>
		<link>http://www.modernperlbooks.com/mt/2010/02/perl-5-support-and-bugfixes.html</link>
		<comments>http://www.modernperlbooks.com/mt/2010/02/perl-5-support-and-bugfixes.html#comments</comments>
		<pubDate>Fri, 26 Feb 2010 21:34:55 +0000</pubDate>
		<dc:creator>chromatic</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">tag:www.modernperlbooks.com,2010:/mt//1.155</guid>
		<description><![CDATA[
        I wrote what I understand to be the strategy behind releasing new minor releases of Perl 5.  Though the development branch of Perl 5 follows a monthly release cycle, the maintenance branch currently does not.  If it's difficult to predict what...]]></description>
			<content:encoded><![CDATA[
        <p>I wrote what I understand to be <a href="http://www.modernperlbooks.com/mt/2010/02/the-unwritten-rules-of-perl-5-minor-releases.html">the strategy behind releasing new minor releases of Perl 5</a>.  Though the development branch of Perl 5 follows a monthly release cycle, the maintenance branch currently does not.  If it's difficult to predict what changes volunteer developers will make in the future, it's doubly difficult to predict which bugs they will fix (or will need to fix).</p>

<p>Thus any support document must explain the responsibilities of <em>users</em> who encounter bugs and what they should expect from developers.</p>

<p>A bug you discover in a new major release of Perl 5 is a candidate for a new minor release if it is:</p>

<ul>

<li>A security or dataloss bug</li>
<li>A regression introduced in the new major release</li>
<li>A failure to build on a supported platform combination</li>
<li>A failing core test on a supported platform</li>

</ul>

<p>I've organized that list in rough order of decreasing severity.  The most likely candidate for a fix is the second; it indicates an undertested aspect of the system.  Behavior should not change between Perl 5 releases accidentally.  If a patch modified behavior on which your code depends and if that change did not occur as part of a deliberate, communicated plan, a fix is likely.</p>

<p>Of course, any fix in a minor release needs to maintain binary compatibility within the release family.</p>

<p>The easiest way (at least for developers) to find and fix such bugs is before the release of a new major version of Perl 5.  That's one goal of the monthly releases: to encourage you to test all of the code you care about with versions of Perl 5 in development.  That's also one reason for the Perl 5 release candidates (though it's likely too late for big fixes by then).</p>

<p>If you can't do that, the next step to reporting a bug is to reproduce it in
the smallest example possible.  10-15 lines of Perl 5 is good.  2-3 is ideal.
More than 20 is usually too big.  If you can provide a test case suitable for
adding to the core test suite, so much the better.  From there, test your code
with multiple releases of Perl 5.  It helps to browse the <a
href="http://perldoc.perl.org/perldelta.html">perldelta</a> documentation, but
the amount of detail between even minor releases can be daunting.  A post on <a
href="http://www.perlmonks.org/">PerlMonks</a> is a good step.</p>

<p>If you've gone through all of that, see <a href="http://perldoc.perl.org/perlbug.html">perldoc perlbug</a>.</p>

<p>This is all no guarantee that your bug will get fixed in a minor version&mdash;you should prepare for the possibility that, given enough time since the release of the corresponding major version, the best approach for p5p is <em>not</em> to backport a fix to a new minor version.  Even so, you will likely get one of several options:</p>

<ul>
<li>An explanation of why it's not a bug</li>
<li>A suggested workaround</li>
<li>A fix in the current version</li>
</ul>

<p>In the latter case, you will have the option of applying the relevant patch yourself or asking someone to backport it to your own custom Perl 5 if you wish.  That may not seem like the ideal situation (it isn't!), but at least with free software such as Perl, you always have that option.</p>
        
    ]]></content:encoded>
			<wfw:commentRss>http://www.modernperlbooks.com/mt/2010/02/perl-5-support-and-bugfixes.html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
