<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>NeilB</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/neilb/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/neilb//846</id>
    <updated>2013-05-01T20:46:14Z</updated>
    <subtitle>A blog about the Perl programming language</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>Reviewing web frameworks</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/05/reviewing-web-frameworks.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4636</id>

    <published>2013-05-01T20:29:16Z</published>
    <updated>2013-05-01T20:46:14Z</updated>

    <summary> One of my next reviews is going to be web frameworks. I&apos;ve posted my current plans on my new blog, where I&apos;ll be recording progress as I work through the review. I plan to implement the same application in...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
One of my next reviews is going to be web frameworks. I've posted my current plans on my <a href="http://neilb.org/">new blog</a>, where I'll be recording progress as I work through the review. I plan to implement the same application in each of the main frameworks I review, but would also be happy if others want to join in.
</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Encouraging bloggers to use the &apos;extended&apos; feature</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/encouraging-bloggers-to-use-the-extended-feature.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4472</id>

    <published>2013-03-24T21:47:47Z</published>
    <updated>2013-03-25T13:08:05Z</updated>

    <summary>This is a collection of ideas for how we can encourage bloggers using blogs.perl.org to split their posts into an abstract and body. Attempts at education have largely failed, so I think we should try something else....</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>This is a collection of ideas for how we can encourage bloggers using blogs.perl.org to split their posts into an abstract and body. Attempts at education have largely failed, so I think we should try something else.</p>]]>
        <![CDATA[<h3>Idea #1: boilerplate in the body</h3>

<p>When you create a new post, you start off in the abstract, cunningly called the <em>body</em>, and it's empty. Instead it could have some boilerplate in it, such as:
</p>

<blockquote>
This is the abstract for your post. Put one or two short paragraphs here, summarising your post, and then put the rest of your <s>bullsh</s> article in the <b>extended</b> section.
</blockquote>

<p>
This would serve as both reminder and education.
</p>

<h3>Idea #2: start off in extended</h3>

<p>Instead of starting off in the abstract, start the blogger off in the <b>extended</b> section, and put a one-line abstract in, along the lines of:</p>

<blockquote>
Another gripping installment from <em>insert name here</em>.
</blockquote>

<p>This could be made entertaining by randomly selecting the boilerplate from a file, <em>&agrave; la</em> fortune(6).
</p>

<h3>Idea #3: Change the names of body and extended</h3>

<p>Change the labels <b>body</b> and <b>extended</b> to <b>abstract</b> and <b>body</b>.

<h3>Idea #4: Limit the length of the abstract</h3>

<p>
Limit the number of characters that can go in the abstract. When you get close you'd be warned. It could either be a hard limit (force everyone to split into short abstract and longer body), or just a soft limit, aimed more at educating users, and encouraging them to provide a separate abstract.
</p>
<p>
Suggested by sillymoose (see comments).
</p>

<h3>While I'm here ...</h3>

<p>Thanks to <a href="http://dave.org.uk">Dave Cross</a> and <a href="http://aaroncrane.co.uk">Aaron Crane</a>, who run this service for us. I'll be submitting these ideas to them, but am posting them here in case / hope they prompt additional (better?!) ideas.</p>
]]>
    </content>
</entry>

<entry>
    <title>Idea: perl community homepage</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/idea-perl-community-homepage.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4461</id>

    <published>2013-03-23T21:42:38Z</published>
    <updated>2013-03-26T20:11:25Z</updated>

    <summary> One of my problems related to Perl is that I&apos;m not aware of a lot of things going on in the perl world, and there isn&apos;t a single place I can go to try and keep up. I suspect...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
One of my problems related to Perl is that I'm not aware of a lot of things going on in the perl world,
and there isn't a single place I can go to try and keep up.
I suspect I'm not the only one. This post outlines an idea for a "perl community home page", where you could go to "keep up". I've whipped up a <a href="http://theperlhub.com/">prototype</a>, which is just a static page with a mashup of various feeds and static data.
</p>

]]>
        <![CDATA[<p>
I think we need a single place which aggregates all sorts of information from around the Perl world,
provides an index to the online perl world,
and just as importantly that crowd-sources information from members of the Perl community.
This would be useful not just for existing perl users, but for those just starting out, and people outside looking in.
Last night I hacked up a prototype &mdash; a static page generated by a big hacky script:
</p>
<p align=center>
<a href="http://theperlhub.com/"><img alt="perlhub.png" src="http://blogs.perl.org/users/neilb/perlhub.png" width="500" height="270" class="mt-image-none" style="" /></a>
</p>
<p>
This would be a "front page for the perl community". It has feeds from a range of Perl sites,
and data that would be provided by users: details of your perl blog, talks you've given,
perl sites not currently listed.
</p>
<p>
This is kind of a mashup of <a href="http://perl.org">perl.org</a>, <a href="https://metacpan.org">metacpan</a> and <a href="http://perlmonks.org">perlmonks</a>.
As MetaCPAN is to CPAN, I think this could be to Perl: MetaPerl.
It could even be the front page to MetaCPAN, and MetaCPAN already provides some of the information needed,
but I don't think it fits within MetaCPAN's mission. Olaf? To be honest, I think perl.org is the most appropriate place for this.
</p>
<p>
It's an idea and an experimental prototype, so it's not on CPAN, it's on <a href="https://github.com/neilbowers/perl-hub/">github</a> :-)
</p>
<p>
The <a href="https://github.com/neilbowers/perl-hub/blob/master/conf/links.json">perl sites</a>,
<a href="https://github.com/neilbowers/perl-hub/blob/master/conf/blogs.json">blogs</a>,
<a href="https://github.com/neilbowers/perl-hub/blob/master/conf/events.json">events</a>, and
<a href="https://github.com/neilbowers/perl-hub/blob/master/conf/talks.json">talks</a>
are all just JSON lists, if you want to add things that are missing.
</p>
<p>
At the moment I'm going with <a href="http://theperlhub.com">theperlhub.com</a> for the name, or perhaps <a href="http://perlhub.org">perlhub.org</a>.</p>
]]>
    </content>
</entry>

<entry>
    <title>The CPAN Unknown Usage problem</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/the-cpan-unknown-usage-problem.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4429</id>

    <published>2013-03-14T00:50:00Z</published>
    <updated>2013-03-14T20:56:16Z</updated>

    <summary> To help CPAN authors keep track of who is using their modules, we could introduce two concepts: &quot;follow module&quot; and &quot;I&apos;m using this module&quot;. Both would be similar to the &apos;following&apos; and +1 features found in nearly all social...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cpanproblems" label="CPAN Problems" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
To help CPAN authors keep track of who is using their modules,
we could introduce two concepts: "follow module" and "I'm using this module".
Both would be similar to the 'following' and +1 features found
in nearly all social media services, and ++ in MetaCPAN.
</p>
]]>
        <![CDATA[<p>
One of the problems for most CPAN authors is that you've no idea how many
people, if any, are using your module. This can be an issue if you're thinking
of changing the interface, or perhaps thinking of just deleting it from CPAN.
</p>
<p>
I've seen a number of suggestions saying that the number of downloads
should be shared, but there are a number of problems with this, not least
that the CPAN testers would skew your figures, and plenty of people download
modules but then never use them.
</p>
<h2>"I'm using module Foo::Bar"</h2>
<p>
You would mark a module as being <b>used</b> (for example MetaCPAN could display an "I'm using this" link next to the module). All modules would have a "registered user
count" tally held for them, which would be public.
</p>
<p>
<ul>
<li>You would explicitly say that you're using particular modules.
<li>Their dependencies would be marked as implicitly used by you.
These can change as the dependencies change.
<li>Marking a module as "being used" would implicitly "follow" the module, as described below.
</ul>
<p>
Having recorded that you're using a module, you could specify communication
preferences: whether you're happy to receive email from the module author. The author would be able to send email to everyone who's signed up for this, for example with
suggestions for an API change, soliciting feedback. By default the author
wouldn't know the individual email addresses.
</p>
<h2>Following a module</h2>
<p>
Following a module would be similar, but you wouldn't be counted as a user:
</p>
<ul>
<li>Following would <b>not</b> be inherited by dependencies, unlike Using.
<li>Maybe you could ask to be emailed the relevant section from Changes whenever a new version is released, but perhaps more useful would be including this in a personal MetaCPAN RSS feed.
</ul>
<p>
How is this different from MetaCPAN's ++? I think the ++ is more of a
"I like this module", but doesn't imply usage, and doesn't necessarily
imply interest in following.
</p>
<p>
The downside of "follow" and "I'm using" as buttons displayed against a
module is that they'd muddy the concept of ++, and people might be more likely
to bother clicking on ++, but not on "follow" or "I'm using".
The upside is that they give data with a much clearer interpretation,
even though you'd miss a lot of users.
</p>
<p>
For all the reviews I've written, I generally end up using one or two
of the modules, but would follow all of the others.
</p>
<h2>Following a CPAN Author</h2>
<p><a href="https://metacpan.org/author/OALDERS">Olaf</a> suggested we might want to think about following an author as well.</p>
<p>
Following an author would trigger an automatic follow on any modules released
by the author.
</p>
<p>
This needs a bit of thought with respect to the PAUSE permissions model:
if you follow someone, and they're the owner of a module, then you probably
want to be informed. But what if they're co-maint on a module owned by someone
else, and do a release of that &mdash; should you be informed? Probably.
Should you be informed if someone else subsequently does a release? Probably not.
</p>
<h2>CPAN News</h2>
<p>
This would essentially let you configure a personal RSS feed for CPAN. This would include news related to the modules and authors you're following.
</p>
<p>Other things I'd like to be able to include in my CPAN news feed:</p>
<ul>
<li>Optionally include all new modules. Even better would be the ability to say "but don't include anything in Acme::* or Take::BeLike::*
<li>When following an author, if the author has told MetaCPAN about their perl blog, then this could be included as well. That way you could follow a bunch of module authors, and if they start blogging, then you'd transparently start seeing their posts.
</ul>
<p>
This would be a single RSS feed for CPAN news. Perhaps going beyond the scope of MetaCPAN, but I think this would be a real hook.
</p>
<h2>Where does this fit?</h2>
<p>
MetaCPAN is the obvious place to put this, but another option is a separate
service queried by MetaCPAN and used by the CPAN shell, cpanm, etc.
</p>]]>
    </content>
</entry>

<entry>
    <title>What&apos;s wrong with CPAN?</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/whats-wrong-with-cpan.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4413</id>

    <published>2013-03-11T23:14:32Z</published>
    <updated>2013-03-13T00:15:42Z</updated>

    <summary>This is an attempt to succinctly list all the different problems perceived with CPAN, and give them a name. No attempt at proposing solutions, or structuring a taxonomy / priority list, but data gathering....</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>This is an attempt to succinctly list all the different problems perceived with CPAN, and give them a name. No attempt at proposing solutions, or structuring a taxonomy / priority list, but data gathering.</p>]]>
        <![CDATA[<p>
Following Brendan's post on <a href="http://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html">the four major problems with CPAN</a>, and other posts recently, I've been thinking a lot about the general topic, and clearly so have many others. I thought it might be useful to try and come up with a shared list of "what's wrong with CPAN", so we can have a common terms of reference. Given things a label can help: for example <a href="http://babyl.dyndns.org/techblog/entry/metacpan-recommendations">Yanick</a> and <a href="http://blog.timbunce.org/2013/03/10/suggested-alternatives-as-a-metacpan-feature/">Tim</a> have both proposed solutions for the <em>best fit</em> problem.
</p>
<p>
Here's a first cut, from trawling various blog posts, comments, and personal mulling. A blog isn't the best format for this sort of exercise, so I've created a <a href="https://docs.google.com/document/d/1F7FhlSGMKof9gpOIHt8vNK-EGGwC4Cj4XkM_cz_iiUA/edit?usp=sharing">google doc</a>, which you can all edit.
I'll sync any updates in both directions.
</p>
<p>
I'm deliberately not describing possible solutions here, just shooting for a succinct list. There will be overlap, and some that are really just symptoms of others. You may not agree with some, but at this point I'm hoping more for the <a href="http://en.wikipedia.org/wiki/Union_(set_theory)">union</a> than <a href="http://en.wikipedia.org/wiki/Intersection_(set_theory)">intersection</a>.
I'd be happy to hear better names for some of these too!
</p>
<ul>
<li><b>Discoverability</b>: It's hard to find all the modules that are relevant for a particular need.</li>
<li><b>Whipupitude</b>: People don't look for existing competing modules before releasing a new module, as it's often quicker to just write the module you need than find one (or people do look, but don't find some of them, due to the discoverability problem).</li>
<li><b>Best fit</b>: Hard to tell which module is the "right one" for a need.<br>
<a href="http://babyl.dyndns.org/techblog/entry/metacpan-recommendations">Yanick on alternative dist recommendations</a>;
<a href="http://blog.timbunce.org/2013/03/10/suggested-alternatives-as-a-metacpan-feature/">TIMB on suggested alternatives</a>.</li>
<li><b>Me too</b>: When people perceive a problem with an existing module on CPAN, they're often quicker to release their own module than to work on "fixing" the existing one. This may be down to the orphan, communication, or resistance to change problems.</li>
<li><b>Orphans</b>: Too many modules are essentially unmaintained, but not explicitly so.<br>
<a href="http://blogs.perl.org/users/brian_d_foy/2013/02/mark-your-modules-as-adoptable-if-you-dont-want-them.html">brian d foy on ADOPTME user</a>.</li>
<li><b>Communication</b>: Contacting authors of modules is sometimes near impossible, if they've changed email addresses but not updated PAUSE. This is different from the Orphans problem</b>: I've had situations where when I've eventually tracked down the author, they're happy to give me co-maint.</li>
<li><b>Barrier to contribution</b>: It can feel / be hard to contribute to a module, and feels even more so if you just want to submit a small change (eg doc). [annocpan]</li>
<li><b>Maturity</b>: Hard to identify the maturity of a module (and maturity is in the eye of the beholder). There can be massive differences in performance, but you've no way of telling that unless you benchmark all the alternatives, with representative data.</li>
<li><b>Resistance to change</b>: Hard, or at least feels like it is, to rename or delete a module. Partly because of the unknown usage problem.</li>
<li><b>Unknown usage</b>: no way to really know whether your CPAN module is being used, unless it's by other CPAN modules, or if someone emails you.</li>
<li><b>Land-grab</b>: Namespaces are first-come, and once you've grabbed a namespace, it's essentially forever.</li>
<li><b>Convergence</b>: multiple solutions to a problem can inspire new approaches, but there's not much force for convergence, and attempts at convergence can often just add one more module to the mix.</li>
<li><b>Duplicated dependencies</b>: If you use a number of dists from CPAN in the same app, you can easily pull in multiple implementations of the same thing. Eg base vs parent vs superclass; exception handling; constants; OO framework; etc. you might argue this is a perl problem not a CPAN problem :-)</li>
<li><b>Private</b>: Many modules are used mainly / only for personal / semi-private needs.</li>
</ul>
<h2>Added</h2>
<ul>
<li><b>Poor design</b>: Many modules are poorly designed or over-engineered, solving problems in a specific way for the author that hinder more general reuse (thus prompting fragmentation)</li>
<li><b>Dependency indifference</b>: not caring about what your dependencies are, and as a result how many modules might be ultimately pulled in by someone using your module.</li>
<li><b>Community tools</b>: lack of community tools and therefore engagement, reviewing etc.</li>
<li><b>Lack of cooperation</b>: besides a few large / well-known dists, most modules are developed by single author with possibly a small number of contribut{ers,ions}. (as of November 2012, 79% of modules had a single PAUSE id against them; another 10% have an owner and 1 co-maint.</li>
<li><b>Contribution undervalued</b>: uploading your own module often given a disproportionately higher value than contributing to someone else's module (fixing a bug, submitting an addition, writing tests, documentation, etc).</li>
</ul>
<p>What else?</p>
<p>If it's not clear, I'm not trying to say that CPAN's shit: most of these problems are born out of CPAN's success.</p>]]>
    </content>
</entry>

<entry>
    <title>Don&apos;t release experiments to CPAN</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/dont-release-experiments-to-cpan.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4403</id>

    <published>2013-03-08T23:18:41Z</published>
    <updated>2013-03-10T16:30:44Z</updated>

    <summary>I&apos;m proposing an explicit community convention where experimental code isn&apos;t released to CPAN, but is shared on github, perhaps with an associated blog post, or discussion on PrePAN. This addresses just one of CPAN&apos;s problems, which have also been raised...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>I'm proposing an explicit community convention where experimental code isn't released to CPAN, but is shared on github, perhaps with an associated blog post, or discussion on <a href="http://www.prepan.org">PrePAN</a>.</p>
<p>
This addresses just one of <a href="http://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html">CPAN's problems</a>, which have also been raised today by Brendan Byrd.
</p>]]>
        <![CDATA[<h3>Motivation</h3>
<p>There are many modules on CPAN which appear to be the result of some experimentation. Once the author has demonstrated their point, (s)he loses interest, and the module lurks on CPAN, waiting to catch out the unwary.</p>
<p>I've reviewed a number of module categories now, and in a number of them I've hit such experiments. I've had email with some of the authors, who've admitted the heritage, and often comment "oh, I forgot about that module".</p>
<p>The problem with these modules is that they just reduce the signal-to-noise ratio of CPAN, and make life harder for users, particularly those new to Perl and CPAN. Consider the following:</p>
<ul>
<li>If you want to define some constants, <a href="http://neilb.org/reviews/constants.html">there are 21 modules</a>.</li>
<li>If you want to perform some kind of run-time loading, for example of plugins, there are <a href="http://neilb.org/reviews/module-loading.html">at least 43 modules</a> you might consider, for about a dozen use cases.</li>
<li>If you wanted a module to find dependencies of your code <a href="http://neilb.org/reviews/dependencies.html">there are 26 modules</a>, but only about 5 distinct use cases.</li>
</ul>
<p>In all of these categories there are modules that were experiments that never went anywhere.</p>
<p>Let me be clear: I don't want to suppress experimentation - it's a key contributor to progress. I imagine Moose started off as a wee experiment.</p>
<h3>Proposal</h3>
<p>If you've been experimenting and would like to share, either (a) to show "hey, look what I did", or (b) you're just not sure whether anyone else would use it:</p>
<ul>
<li>Put the module on github. Sure, there are other places you could put it, but github is fairly well linked into the Perl ecosphere, and cpanminus 1.6+ can install modules direct from github:
<pre>        cpanm git://github.com/miyagawa/Plack.git</pre></li>
<li>Write a blog post about it. If you don't have a blog, or your blog doesn't have a wide readership, then consider posting to blogs.perl.org as well. If you link to your blog, you might even gain some more readers.</li>
<li>Discuss your module on <a href="http://prepan.org">PrePAN</a>.</li>
<li>If there are existing modules on CPAN which are similar, you could email their authors, asking whether they might link to your github repository in the SEE ALSO section of their doc. Ok, I admit your success rate might not be good here.
<li>You could annotate these modules on <a href="http://www.annocpan.org">annocpan</a>.</li>
</ul>
<p>But if many modules start as experiments, how do you decide whether / when to release to CPAN? Just apply some common sense. For example, if you or anyone else starts relying on the module, then it's time for CPAN.</p>
<p>How might this idea evolve?</p>
<ul>
<li>If the name weren't already taken, PrePAN could be a place for uploading experimental modules. Maybe PrePAN could evolve to become that as well?</li>
<li>If MetaCPAN indexed all perl dists on github, it might not include them in search results by default, but could say "N additional things on github matched your query, click here to include them".</li>
</ul>
<p>You could also consider deleting any experiments you already have on CPAN: cpanminus can install from backpan. Check with the reverse dependencies service first.
Deleting modules from CPAN is worthy of a separate post, but Brendan Byrd might beat me to it.</p>

<h2>Revisited, 2 days later</h2>
<p>I think have should have more clearly defined what I mean(t) by <em>experiment</em>!</p>
<p>
There are a number of situations when I'd consider a module to be an experiment,
but the classic example (for me) is where you're writing a module with <em>no intention
to use it in any real code</em>. This might be to see whether something is possible,
possibly trying to (ab)use Perl in some unexpected way.
Such an experiment may obviously lead to something unexpected and useful.
</p>
<p>
Another category, but less clear-cut for me, is when you're creating something,
but you're not sure exactly what it is you're creating, and whether there might be a module on CPAN already.
Often the namespace(s) will change, and you may drop it anyway.
Typically at this stage I just don't share it, because I don't want to worry about namespaces
(even though you can free them after you rename, I know), but I've had a couple of cases where people
wanted to play with the code anyway. See below.
</p>
<p>
Some examples might clarify, and might help me refine what the hell I'm talking / thinking about!
</p>
<h3>Not experiments</h3>
I do <b>not</b> see the following as experiments:
<ul>
<li>Someone new to Perl writes a module which they're using at work. They proudly upload it to CPAN.
    They might have no idea whether it would be of interest to anyone else.<br>
    <span style="color: #666;">As an aside, one problem (with the current toolchain) is that authors aren't encouraged / helped
    to find modules on CPAN that might serve their needs, or which they might be able to take over
    and evolve (commented on by brian d foy <a href="http://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html#comment-393617">in a comment</a> on <a href="http://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html">Brendan Byrd's post on problems with CPAN</a>). A topic for another day.</span><br></li>
<li><a href="https://metacpan.org/author/ETHER">Karen</a>'s
    <a href="http://blogs.perl.org/users/ether/2013/03/yanwt-yet-another-no-warnings-tester.html">post</a>
    describing a <a href="http://search.cpan.org/~ether/Test-Warnings-0.001-TRIAL/">dev release of Test::Warnings</a>.
    Karen describes the <em>implementation</em> as experimental, but I don't see <em>the module</em> as an experiment &mdash;
    it's clearly written to meet a need, and will be used.
<li>Someone writes a module that's a complete hack (deadlines, we've all been there),
    but which they imagine they'll probably get around to doing a 'proper' version of eventually.<br>
    <span style="color: #666;">Aside: it's not very easy to tag your dist with maturity, as others have noted.
    You can't <em>just</em> look at the version: you'd miss Net::HTTP::Tiny 0.001. 10.7% of dists on CPAN have version 0.01 or 0.001.
    And you can't <em>just</em> look at reverse dependencies: Net::HTTP::Tiny has none &mdash; I tend to use it in some of my scripts, and HTTP::Tiny in modules.
    </span><br></li>
<li>Someone has a (possibly slightly crazy) idea for a module, which addresses something they see / have as a very real need,
    and which they think <em>might</em> pan out. I think this comes down to personal definition of experimental,
    and how you like to play that out,
    but if there are others already interested in joining in, then I'd always err on the side of CPAN.
</ul>
<h3>Experiments</h3>
<p>
Where you draw the line between experimental and not is a personal call.
From now on before I upload a new module (and as <a href="https://metacpan.org/author/NEILB">you can see</a>,
it's not something I've done many times), I'll just ask myself whether this is experimental, by my personal definition.
If so, I'll release it to GitHub, and possibly describe it in a blog post. And if someone else starts using it, I'll put it on CPAN.
</p>
<p>
I consider the following to be experiments:
</p>
<ul>
<li>I was looking for a tool to graph dependencies, and started searching for modules. I didn't find anything that met my needs, so knocked up <a href="http://neilb.org/reviews/dependencies.html#Devel::DependencyGrapher">a module</a>.
    I'd already found a handful of modules, so started writing <a href="http://neilb.org/reviews/dependencies.html">a review</a>,
    and decided I wouldn't put my module on CPAN until I finished the review, in case I found a module I was essentially duplicating.
    As I progressed I kept finding more modules, and others pointed out modules in namespaces I'd not even considered. Still I found nothing in
    direct competition with my module. But the 23rd module was, and so I may not ever release my module,
    but either submit changes, or refactor it as a helper module.
    If I find myself in this situation again, I'll put it on GitHub.</li>
<li>I have various modules and scripts I use when writing reviews.
    At some point I plan on releasing them to CPAN, but until recently, I seemed to
    tear them apart every time I wrote a review, including a change of namespace.
    I'm hoping to stabilise them soon, and will then put them on GitHub, and then ask <a href="https://metacpan.org/author/LLAP">Leo</a>
    (and anyone else interested) to comment on them. I probably won't put them on CPAN unless / until someone else writes a review
    using them, which may be never, and that's fine.
    </li>
<li> I suspect that <a href="https://metacpan.org/module/Module::Hash">Module::Hash</a> is an experiment.
    Someone new to Perl might come across this module and think
    "<em>This Toby guy <a href="https://metacpan.org/author/TOBYINK">seems to know what he's doing</a>, 
    the module is recent, it's well documented, so maybe this is the modern/new way to load modules at runtime</em>".
    To me this seems like a good candidate for "GitHub and blog post", and I can see the blog post generating comments,
    which may in turn lead to a CPAN release, or not.
    But if it doesn't meet <a href="https://metacpan.org/author/TOBYINK">Toby</a>'s definition of experiment, then fine,
    and my apologies to Toby.
<li>A number of modules in the Acme namespace :-)
</ul>
<p>
Furthermore, I'm not imagining that such code would be forever banished to GitHub, never allowed to sully CPAN.
Once code isn't an experiment, then I see it being uploaded to CPAN as well.
</p>
<h3>My process</h3>
<p>
This "experiments on GitHub not CPAN" idea addresses just one small part of the "problems with CPAN";
I was thinking about a much smaller percentage of CPAN modules that many of you seemed to think. Mea culpa.
</p>
<p>
My personal process when creating modules will now be something like:
</p>
<ul>
<li>Put the module on GitHub.
<li>Possibly <a href="http://www.cpan.org/modules/04pause.html#namespace">register the namespace</a>.
    I haven't always done this, but when I have, I've had thoughtful and helpful comments.
<li>Search for similar modules, and link to them in the SEE ALSO section.
<li>If there's an existing module close enough, see if I can contribute to that rather than release my module,
    or if it's gone stale, whether I can take it over.
<li>If it's not experimental, and I got to this point, then release to CPAN.
<li>Possibly write a blog post on it.
</ul>
<p>
Most (if not all?) of the people who've commented on this, and related posts, are not part of the demographic I'm worrying about
(read: screw the lot of you! ;-)
They are: new or casual Perl programmers and CPAN users.
CPAN is currently a seriously sub-optimal experience for such users.
</p>
<p>
A few years ago I was a born-again Perl newbie, and often when I turned to
CPAN for "a module to do X", I'd find a handful of modules and no easy way to determine which was the right one to use.
I decided I'd do a quick (ha!) review whenever I hit this, so (a) I'd make an informed decision, (b) it might help others,
and (c) the peanut gallery might point out gaps / flaws in my reviews, and improve the end result.
After doing a few reviews, I gave a <a href="http://www.slideshare.net/neilbowers/cpan-curation">talk on CPAN Curation</a>
at LPW 2011, where I listed some of the problems I saw with CPAN, and thoughts for how they might be addressed.
I'll revisit that in a separate post, as I've ended up thinking about it a lot over the last 2 or 3 days...
</p>
]]>
    </content>
</entry>

<entry>
    <title>CPAN modules that (can) load other modules</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/03/cpan-modules-that-can-load-other-modules.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4396</id>

    <published>2013-03-05T23:12:58Z</published>
    <updated>2013-03-08T08:58:09Z</updated>

    <summary> I&apos;ve published a review of CPAN modules that (can) load other modules. I started making this list of modules when looking at modules for getting dependency information: one class of such modules parse code looking for things that signify...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
I've published a <a href="http://neilb.org/reviews/module-loading.html">review of CPAN modules that (can) load other modules</a>. I started making this list of modules when looking at <a href="http://neilb.org/reviews/dependencies.html">modules for getting dependency information</a>: one class of such modules parse code looking for things that signify a dependency, either implicitly or explicitly.
</p>
]]>
        <![CDATA[<p>
There's still a fair bit to do, I've got a number of pull requests and offers to release updates outstanding, and no doubt I've missed some modules.
</p>
<table><tr valign=top><td align=right width=45><a href="http://play-perl.org/quest/511a57763a5ec3030700004f" target="_blank"><img alt="pp+1.png" src="http://blogs.perl.org/users/neilb/pp%2B1.png" style="padding: 0 10px 0 0; margin: 0; position: relative; top: 10px;" width="37" height="20"></a></td><td align=left>If you enjoyed this review, you could give me a +1 on the <a href="http://play-perl.org/quest/511a57763a5ec3030700004f" target="_blank">play-perl quest for this review</a>.</td></tr></table>
<h3>Updates</h3>
<ul>
<li>Added
<a href="https://metacpan.org/module/Acme::require::case"><tt>Acme::require::case</tt></a>,
<a href="https://metacpan.org/module/if"><tt>if</tt></a>,
and
<a href="https://metacpan.org/module/only"><tt>only</tt></a>,
which I'd missed.</li>
<li>Improved description of Module::Implementation (thanks Dave).</li>
<li>Added <a href="https://metacpan.org/module/pkg"><tt>pkg</tt></a> and
<a href="https://metacpan.org/module/UNIVERSAL::require"><tt>UNIVERSAL::require</tt></a>.</li>
</ul>
<br>]]>
    </content>
</entry>

<entry>
    <title>Perl programmer humour</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/02/perl-programmer-humour.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4373</id>

    <published>2013-02-24T09:32:20Z</published>
    <updated>2013-02-25T22:09:41Z</updated>

    <summary> Three examples of perl programmer humour I&apos;ve seen in code and/or documentation. Read the comments for more examples....</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    <category term="humourhumor" label="humour humor" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
Three examples of perl programmer humour I've seen in code and/or documentation.
Read the comments for more examples.
</p>]]>
        <![CDATA[<p>
At the end of a module we're all used to seeing the line:
</p>

<pre>
    1;
</pre>

<p>
I just noticed that <a href="https://metacpan.org/module/parent">parent</a>
has the following instead:
</p>

<pre>
    "All your base are belong to us"
</pre>

<p>
A reference to <a href="http://knowyourmeme.com/memes/all-your-base-are-belong-to-us">an internet meme</a>, and parent is a lightweight replacement for the <a href="https://metacpan.org/module/base">base</a> pragma.
</p>

<p>
Another module which made me smile: the SEE ALSO section for <a href="https://metacpan.org/module/Chart::Strip">Chart::Strip</a> says
</p>

<pre>
    Yellowstone National Park
</pre>

<p>
And the documentation for <a href="https://metacpan.org/module/Class::Singleton">Class::Singleton</a> has example objects called <tt>$highlander</tt> and <tt>$macleod</tt>, leading to the line "There can be only one", which is taken from the film <a href="http://www.imdb.com/title/tt0091203/">Highlander</a>.
</p>

<p>
What others have you seen?
</p>]]>
    </content>
</entry>

<entry>
    <title>PAUSE permissions should be case-insensitive</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2013/02/pause-permissions-should-be-case-insensitive.html" />
    <id>tag:blogs.perl.org,2013:/users/neilb//846.4327</id>

    <published>2013-02-14T23:36:00Z</published>
    <updated>2013-02-17T19:57:01Z</updated>

    <summary> The PAUSE permissions model is case-sensitive, which means that Foobar is treated as a different module from foobar. This all works fine unless your filesystem is case-insensitive, like on MacOSX, for example. In this article I expand on what...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>
The <a href="http://www.slideshare.net/neilbowers/pause-permissions">PAUSE permissions model</a>
is case-sensitive,
which means that Foobar is treated as a different module from foobar.
This all works fine unless your filesystem is case-insensitive,
like on MacOSX, for example.
In this article I expand on what the above means, and give some examples
of problems that already exist on CPAN.
</p>
</p>
My first thought is that PAUSE should be case-insenstive for its permissions model,
but maybe there's another solution?
</p>

]]>
        <![CDATA[<p>
If you upload a new module to <a href="http://www.cpan.org">CPAN</a>,
via <a href="http://pause.perl.org">PAUSE</a>,
you are granted ownership over the module's name by PAUSE,
and anyone else who subsequently tries to upload a module of the same name
will fail (see the PAUSE Permissions link above for an explanation of exactly what 'fail' means here).
You can see who has permissions for every module name on CPAN in
<a href="http://www.cpan.org/modules/06perms.txt">modules/06perms.txt</a>
(warning: file is 8.5M).
</p>
<p>
The permissions model is case-sensitive, which means that Foo::Bar is treated
as a different module from foo::bar, and Foo::bar. This is all fine if your
filesystem is case-sensitive. But MacOSX's filesystem isn't, so this can cause problems.
<a href="https://metacpan.org/module/File::stat">File::stat</a> is a core module.
I wasn't aware of File::stat's existence, and installed
<a href="https://metacpan.org/module/File::Stat">File::Stat</a> (different case of 'S' on 'Stat').
In this case I got lucky: File::stat wasn't overwritten because it's a core module and File::Stat was installed in <tt>site_perl</tt>, where it got picked up first.
I only discovered this because I'm using CPAN::Reporter, and various modules I tried to install
reported fails to CPAN Testers, because the wrong module was being run.
Fortunately for me, all I had to do was delete File::Stat from <tt>site_perl</tt>.
</p>

<p>
But this isn't the only example. I wrote a script to look for other cases,
and here are some of the ones it found:
</p>

<ul>
    <li><a href="https://metacpan.org/module/underscore">underscore</a>
        and <a href="https://metacpan.org/module/Underscore">Underscore</a></td>.
    <li>
        <a href="https://metacpan.org/module/sane">sane</a> and
        <a href="https://metacpan.org/module/Sane">Sane</a>.
    <li>
        <a href="https://metacpan.org/module/CONFIG::Hash">CONFIG::Hash</a> and
        <a href="https://metacpan.org/module/Config::Hash">Config::Hash</a>.
</ul>

<p>
There are also a lot of examples where at least one of the classes
is provided by a differently named module.
</p>

<ul>
    <li><a href="https://metacpan.org/module/any">any</a>
        and <a href="https://metacpan.org/source/YVESP/llg-1.07/LLg.pm#L192">Any</a>
        (provided by <a href="https://metacpan.org/module/YVESP/llg-1.07/LLg.pod">LLg</a>).
    <li><a href="https://metacpan.org/source/DROLSKY/Class-ClassDecorator-0.02/lib/Class/ClassDecorator.pm#L86">super</a> (in <a href="https://metacpan.org/module/Class::ClassDecorator">Class::ClassDecorator</a>)
        and <a href="https://metacpan.org/module/SUPER">SUPER</a>.
</ul>

<p>
These are still allocated permissions by PAUSE, so you can't define a class within
another of your modules if your inner class has the same name as something already on CPAN.
When you try and upload it to PAUSE, it will fail at the indexing stage.
So, for SUPER and super, looking at 06perms.txt:
</p>

<pre>
    SUPER,CHROMATIC,f
    SUPER,P5P,m
    super,DROLSKY,f
</pre>

<p>
I also found plenty of examples where someone has changed the capitalisation of
a class name between releases; for example:
</p>

<pre>
    GeoHash in dist Y/YA/YAPPO/GeoHash-0.01.tar.gz
    Geohash in dist Y/YA/YAPPO/Geohash-0.04.tar.gz
</pre>

<p>
This is a real problem: I broke a number of modules and only discovered it when two CPAN authors
emailed me about CPAN testers reports.
As a percentage of CPAN, there aren't all that many broken cases of the first type,
but there are more of the second type above.
And the number of CPAN dists is only increasing, so this could happen more and more.
</p>

<p>
I think PAUSE should be made case-insensitive for module permissions, and the currently 'broken' cases should be resolved (which would be a pain, I know).
Another approach would be to continue letting this happen, but notify authors
when they upload modules which will cause problems on MacOSX.
Perhaps search.cpan.org might flag them in the same way it flags 'unauthorised releases'?
</p>

<h2>Update:</h2>
<p>
I've forked PAUSE, and am going to have a go at making this change.
</p>]]>
    </content>
</entry>

<entry>
    <title>Creating a perl developer survey</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/12/creating-a-perl-developmer-survey.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4140</id>

    <published>2012-12-18T20:08:00Z</published>
    <updated>2012-12-18T20:08:55Z</updated>

    <summary>Having seen the Javascript developer survey, I thought that Perl should have one (there was one in 2010). Here&apos;s my current list of questions. I&apos;ve got these in a Google docs form, but won&apos;t show the options for each question....</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>Having seen the <a href="http://dailyjs.com/2012/12/17/javascript-survey/">Javascript developer survey</a>, I thought that Perl should have one (there was one in <a href="http://survey.perlfoundation.org/Data-PerlSurvey-2010/R/">2010</a>).</p>
<p>
Here's my current list of questions. I've got these in a Google docs form, but won't show the options for each question.
</p>
<ul>
<li>Is Perl your primary development language?
<li>What level of Perl experience would you give yourself?
<li>How long have you been programming in Perl?
<li>What version(s) of Perl do your systems run on?
<li>Is programming in Perl part of your daily job?
<li>How do you find reusable code, libraries and tools?
<li>Have you released any code to CPAN?
<li>Have you written any code in Perl 6?
<li>What is your preferred OO framework?
<li>What development environment(s) do you use for Perl?
<li>What framework, if any, do you use for web development?
<li>Other than Perl, what are your primary development languages?
</ul>
<p>
What other questions should be on the list?
</p>
<p>
If you program in Javascript, go fill in that survey as well.
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Identifying CPAN distributions you could help out with</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/12/modules-that-are-candidates-for-helping-out.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4122</id>

    <published>2012-12-12T00:13:00Z</published>
    <updated>2012-12-13T00:34:46Z</updated>

    <summary>The other day Andy Lester posed a question Where can someone find Perl modules to contribute to? My first answer was to look at the dists with the most bugs. I continued thinking about it, wondering how you could identify...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>The other day Andy Lester posed a question <a href="http://perlbuzz.com/2012/12/where-can-someone-find-some-perl-modules-to-help-with.html">Where can someone find Perl modules to contribute to?</a> My first answer was to look at the dists with the most bugs. I continued thinking about it, wondering how you could identify a module that is <em>ripe</em> for help.</p>
<p>This post outlines my next idea, and the top 20 dists based on my first implementation.</p>]]>
        <![CDATA[<p>
If you're going to contribute, it's most motivating to do something that's going to be used. So the idea is to look for dists that are still getting bugs raised against them, but that haven't seen a release for a good while.
</p>
<table><tr><th align=left>Dist</th><th width=5>&nbsp;</th><th>Released</th><th width=15>&nbsp;</th><th align=right>Bug days</th><th width=15>&nbsp;</th><th align=right>Gap</th><th width=15>&nbsp;</th><th align=right>Score</th></tr>
<tr><td align=left><a href='https://metacpan.org/release/Perl6-Parameters'>Perl6-Parameters</td><td>&nbsp;</td><td align=center>2002-08-17</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Perl6-Parameters'>2</a></td><th>&nbsp;</th><td align=right>3769</td><th>&nbsp;</th><td align=right>1884.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Crypt-Primes'>Crypt-Primes</td><td>&nbsp;</td><td align=center>2003-01-16</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Crypt-Primes'>2</a></td><th>&nbsp;</th><td align=right>3617</td><th>&nbsp;</th><td align=right>1808.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/TAP-Formatter-HTML'>TAP-Formatter-HTML</td><td>&nbsp;</td><td align=center>2010-03-21</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=TAP-Formatter-HTML'>1</a></td><th>&nbsp;</th><td align=right>997</td><th>&nbsp;</th><td align=right>997.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/SOAP-WSDL'>SOAP-WSDL</td><td>&nbsp;</td><td align=center>2010-03-28</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=SOAP-WSDL'>1</a></td><th>&nbsp;</th><td align=right>990</td><th>&nbsp;</th><td align=right>990.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Acme-Brainfuck'>Acme-Brainfuck</td><td>&nbsp;</td><td align=center>2004-04-06</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Acme-Brainfuck'>4</a></td><th>&nbsp;</th><td align=right>3169</td><th>&nbsp;</th><td align=right>792.25</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/POE-Component-CPAN-SQLite-Info'>POE-Component-CPAN-SQLite-Info</td><td>&nbsp;</td><td align=center>2008-10-14</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=POE-Component-CPAN-SQLite-Info'>2</a></td><th>&nbsp;</th><td align=right>1519</td><th>&nbsp;</th><td align=right>759.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/IO-Digest'>IO-Digest</td><td>&nbsp;</td><td align=center>2004-09-11</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Digest'>4</a></td><th>&nbsp;</th><td align=right>3011</td><th>&nbsp;</th><td align=right>752.75</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Net-CIDR-Set'>Net-CIDR-Set</td><td>&nbsp;</td><td align=center>2009-01-30</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Net-CIDR-Set'>2</a></td><th>&nbsp;</th><td align=right>1411</td><th>&nbsp;</th><td align=right>705.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/IO-Async-SSL'>IO-Async-SSL</td><td>&nbsp;</td><td align=center>2011-02-28</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Async-SSL'>1</a></td><th>&nbsp;</th><td align=right>653</td><th>&nbsp;</th><td align=right>653.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Proc-ParallelLoop'>Proc-ParallelLoop</td><td>&nbsp;</td><td align=center>2003-03-13</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Proc-ParallelLoop'>7</a></td><th>&nbsp;</th><td align=right>3556</td><th>&nbsp;</th><td align=right>508.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Log-SelfHistory'>Log-SelfHistory</td><td>&nbsp;</td><td align=center>2010-08-07</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Log-SelfHistory'>2</a></td><th>&nbsp;</th><td align=right>857</td><th>&nbsp;</th><td align=right>428.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/CGI-Application-Plugin-LinkIntegrity'>CGI-Application-Plugin-LinkIntegrity</td><td>&nbsp;</td><td align=center>2006-05-18</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=CGI-Application-Plugin-LinkIntegrity'>6</a></td><th>&nbsp;</th><td align=right>2395</td><th>&nbsp;</th><td align=right>399.17</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Catalyst-Authentication-Store-LDAP'>Catalyst-Authentication-Store-LDAP</td><td>&nbsp;</td><td align=center>2010-10-05</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Catalyst-Authentication-Store-LDAP'>2</a></td><th>&nbsp;</th><td align=right>798</td><th>&nbsp;</th><td align=right>399.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/XiaoI'>XiaoI</td><td>&nbsp;</td><td align=center>2008-08-18</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=XiaoI'>4</a></td><th>&nbsp;</th><td align=right>1574</td><th>&nbsp;</th><td align=right>393.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/IO-Plumbing'>IO-Plumbing</td><td>&nbsp;</td><td align=center>2008-08-21</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Plumbing'>4</a></td><th>&nbsp;</th><td align=right>1571</td><th>&nbsp;</th><td align=right>392.75</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Data-Transform-SAXBuilder'>Data-Transform-SAXBuilder</td><td>&nbsp;</td><td align=center>2008-08-27</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Data-Transform-SAXBuilder'>4</a></td><th>&nbsp;</th><td align=right>1565</td><th>&nbsp;</th><td align=right>391.25</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/PITA-POE-SupportServer'>PITA-POE-SupportServer</td><td>&nbsp;</td><td align=center>2008-09-02</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=PITA-POE-SupportServer'>4</a></td><th>&nbsp;</th><td align=right>1559</td><th>&nbsp;</th><td align=right>389.75</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Config-Tiny'>Config-Tiny</td><td>&nbsp;</td><td align=center>2011-03-24</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Config-Tiny'>2</a></td><th>&nbsp;</th><td align=right>628</td><th>&nbsp;</th><td align=right>314.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Pod-Spell'>Pod-Spell</td><td>&nbsp;</td><td align=center>2001-10-27</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Pod-Spell'>13</a></td><th>&nbsp;</th><td align=right>4052</td><th>&nbsp;</th><td align=right>311.69</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Text-Identify-BoilerPlate'>Text-Identify-BoilerPlate</td><td>&nbsp;</td><td align=center>2005-08-22</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Text-Identify-BoilerPlate'>9</a></td><th>&nbsp;</th><td align=right>2661</td><th>&nbsp;</th><td align=right>295.67</td></tr>
</table>
<ul>
<li><b>Released</b> is the date of the last release of the dist.
<li><b>Bug days</b> is the number of days since the last open bug was raised.
<li><b>Gap</b> is the number of days between the last release and the most recent bug.
<li><b>Score</b> is <b>Gap / bug days</b>.
</ul>
<p>
Here's the top 20 for a slightly different measure. In the table below, <b>gap</b> is the number of days between the most recently reported still-open bug and the oldest still-open bug. If there's only one bug, then gap will be 1, so the dist won't appear here.
</p>
<table><tr><th align=left>Dist</th><th width=5>&nbsp;</th><th>Released</th><th width=15>&nbsp;</th><th align=right>Bug days</th><th width=15>&nbsp;</th><th align=right>Gap</th><th width=15>&nbsp;</th><th align=right>Score</th></tr>
<tr><td align=left><a href='https://metacpan.org/release/SOAP-WSDL'>SOAP-WSDL</td><td>&nbsp;</td><td align=center>2010-03-28</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=SOAP-WSDL'>1</a></td><th>&nbsp;</th><td align=right>1596</td><th>&nbsp;</th><td align=right>1596.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/TAP-Formatter-HTML'>TAP-Formatter-HTML</td><td>&nbsp;</td><td align=center>2010-03-21</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=TAP-Formatter-HTML'>1</a></td><th>&nbsp;</th><td align=right>1500</td><th>&nbsp;</th><td align=right>1500.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Math-BigInt'>Math-BigInt</td><td>&nbsp;</td><td align=center>2011-09-04</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Math-BigInt'>2</a></td><th>&nbsp;</th><td align=right>2568</td><th>&nbsp;</th><td align=right>1284.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Params-Util'>Params-Util</td><td>&nbsp;</td><td align=center>2012-03-11</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Params-Util'>1</a></td><th>&nbsp;</th><td align=right>1174</td><th>&nbsp;</th><td align=right>1174.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/RT-Client-REST'>RT-Client-REST</td><td>&nbsp;</td><td align=center>2012-01-09</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=RT-Client-REST'>2</a></td><th>&nbsp;</th><td align=right>2251</td><th>&nbsp;</th><td align=right>1125.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/DBI'>DBI</td><td>&nbsp;</td><td align=center>2012-11-20</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=DBI'>2</a></td><th>&nbsp;</th><td align=right>2148</td><th>&nbsp;</th><td align=right>1074.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Crypt-Primes'>Crypt-Primes</td><td>&nbsp;</td><td align=center>2003-01-16</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Crypt-Primes'>2</a></td><th>&nbsp;</th><td align=right>2147</td><th>&nbsp;</th><td align=right>1073.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/IPC-Run'>IPC-Run</td><td>&nbsp;</td><td align=center>2012-08-30</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=IPC-Run'>4</a></td><th>&nbsp;</th><td align=right>3937</td><th>&nbsp;</th><td align=right>984.25</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Path-Class'>Path-Class</td><td>&nbsp;</td><td align=center>2012-12-09</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Path-Class'>3</a></td><th>&nbsp;</th><td align=right>2752</td><th>&nbsp;</th><td align=right>917.33</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Net-DNS'>Net-DNS</td><td>&nbsp;</td><td align=center>2012-12-12</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Net-DNS'>3</a></td><th>&nbsp;</th><td align=right>2593</td><th>&nbsp;</th><td align=right>864.33</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Filesys-SmbClient'>Filesys-SmbClient</td><td>&nbsp;</td><td align=center>2012-12-04</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Filesys-SmbClient'>4</a></td><th>&nbsp;</th><td align=right>3315</td><th>&nbsp;</th><td align=right>828.75</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Config-Tiny'>Config-Tiny</td><td>&nbsp;</td><td align=center>2011-03-24</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Config-Tiny'>2</a></td><th>&nbsp;</th><td align=right>1635</td><th>&nbsp;</th><td align=right>817.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/SQL-Translator'>SQL-Translator</td><td>&nbsp;</td><td align=center>2012-10-09</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Translator'>4</a></td><th>&nbsp;</th><td align=right>3261</td><th>&nbsp;</th><td align=right>815.25</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Authen-Captcha'>Authen-Captcha</td><td>&nbsp;</td><td align=center>2012-08-14</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Authen-Captcha'>4</a></td><th>&nbsp;</th><td align=right>3051</td><th>&nbsp;</th><td align=right>762.75</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/libwww-perl'>libwww-perl</td><td>&nbsp;</td><td align=center>2012-02-18</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=libwww-perl'>5</a></td><th>&nbsp;</th><td align=right>3634</td><th>&nbsp;</th><td align=right>726.80</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Storable'>Storable</td><td>&nbsp;</td><td align=center>2012-09-11</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Storable'>6</a></td><th>&nbsp;</th><td align=right>3892</td><th>&nbsp;</th><td align=right>648.67</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/SQL-Interp'>SQL-Interp</td><td>&nbsp;</td><td align=center>2012-02-08</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=SQL-Interp'>3</a></td><th>&nbsp;</th><td align=right>1824</td><th>&nbsp;</th><td align=right>608.00</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Net-CIDR-Set'>Net-CIDR-Set</td><td>&nbsp;</td><td align=center>2009-01-30</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Net-CIDR-Set'>2</a></td><th>&nbsp;</th><td align=right>1187</td><th>&nbsp;</th><td align=right>593.50</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/Perl-Tidy'>Perl-Tidy</td><td>&nbsp;</td><td align=center>2012-12-09</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=Perl-Tidy'>3</a></td><th>&nbsp;</th><td align=right>1771</td><th>&nbsp;</th><td align=right>590.33</td></tr>
<tr><td align=left><a href='https://metacpan.org/release/HTML-TagCloud'>HTML-TagCloud</td><td>&nbsp;</td><td align=center>2011-06-18</td><th>&nbsp;</th><td align=right><a href='https://rt.cpan.org/Public/Dist/Display.html?Name=HTML-TagCloud'>5</a></td><th>&nbsp;</th><td align=right>2230</td><th>&nbsp;</th><td align=right>446.00</td></tr>
</table>
<p>Note: these are really identifying modules that are potentially worthwhile candidates for <a href="http://www.cpan.org/modules/04pause.html#takeover">taking over</a> (getting co-maint), rather than modules where you could contribute without having to take over maintenance. That's a separate list!</p>
<p>Some thoughts for improving this:</p>
<ul>
<li>It's skewed towards bugs raised within the last few days &mdash; too much so. Maybe instead of <b>bug days</b> as the denominator, I should use log10, to smooth things out. 
<li>A dist may have been bug-free until yesterday, so hasn't needed any releases. I could look at the <em>number</em> of bugs that have been reported since the last release, that are still outstanding.</li>
<li>Even further, I could look at the elapsed time between the oldest open bug and the most recently reported open bug.
<li>Factor in the number of dists that are dependent on each dist, and weight the score based on this.</li>
</ul>
<p>
What else should be factored in? I'll play a bit more, then put a longer sortable list online. I love the fact that I could get hold of all the metadata needed to create this. Now I feel like I should find a bug to fix!
</p>]]>
    </content>
</entry>

<entry>
    <title>Please provide an abstract for posts to blogs.perl.org</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/12/all-i-want-for-christmas.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4115</id>

    <published>2012-12-09T19:41:00Z</published>
    <updated>2012-12-10T21:10:54Z</updated>

    <summary>When writing on blogs.perl.org, you can provide the first paragraph or two as an abstract, with the rest of your post as the &quot;extended&quot; body. In this post I&apos;ll try and convince you that doing this is more considerate of...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>When writing on blogs.perl.org, you can provide the first paragraph or two as an abstract, with the rest of your post as the "extended" body. In this post I'll try and convince you that doing this is more considerate of the readership, and good for you too!</p>]]>
        <![CDATA[<p>When you first start editing a new post, you're actually editing the abstract, which is helpfully titled <strong>BODY</strong>, because if you put all of your content in here, the abstract <em>is</em> the body.</p>
<p align=center><img alt="abstract.png" src="http://blogs.perl.org/users/neilb/abstract.png" width="300" height="93" class="mt-image-none" style="" /></p>
<p>Put a summary of your post here. Think of it as your pitch: you're trying to convince the reader to click on <em>Continue reading</em>.</p>
<p>Then click on the <strong>EXTENDED</strong> tab, and write the full body of your post in there.</p>
<p align=center><img alt="body.png" src="http://blogs.perl.org/users/neilb/body.png" width="300" height="83" class="mt-image-none" style="" /></p>
<p>So, why should you bother?</p>
<ul>
<li>It's much more considerate of the people who are reading this via a browser. If everyone did this, more posts would fit onto each page, and the reader can skim the abstracts to decide which they're interested in reading. Rather than scrolling past pages of code, looking for the next post.</li>
<li>This doesn't affect anyone reading via a feed: the full article is delivered.</li>
<li>It can help you with your writing. I always write the abstract first, knowing that this is all you're going to see, so I need to make it accurately and <em>concisely</em> summarise what follows.</li>
</ul>
<p>I wasn't even aware of this until Shawn Corey <a href="http://blogs.perl.org/users/shawnhcorey/2012/09/how-to-post-an-article-on-blogsperlorg.html">pointed it out</a>.</p>]]>
    </content>
</entry>

<entry>
    <title>Perl case studies</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/12/perl-case-studies.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4111</id>

    <published>2012-12-09T11:32:51Z</published>
    <updated>2012-12-10T17:00:31Z</updated>

    <summary>I&apos;ve often thought it would be interesting and useful to read about how various companies are using Perl. Richard Jelinek&apos;s talks at LPW 2012 have encouraged me to see whether (a) there&apos;s enough general interest in this to make it...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    <category term="marketing" label="Marketing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>I've often thought it would be interesting and useful to read about how various companies are using Perl. Richard Jelinek's talks at LPW 2012 have encouraged me to see whether (a) there's enough general interest in this to make it worth while, and (b) I/we can kick-start it. In this post I'll outline what I'm currently thinking about, to get feedback.</p>
]]>
        <![CDATA[<p>I'm thinking of a series of articles or case studies, one per organisation.  There would probably be a number of sections, for example:</p>
<ul style="margin-left: 1em;">
<li>a marketing style overview "our web site handles a gazillion requests
per month, and the whole thing is in Perl".
<li>how are they using perl and how do they see their usage evolving.
This would get into what frameworks they're using, what things they've
written for themselves vs used from CPAN, any interesting aspects of
their development process & tools.
<li>If appropriate, and they're happy to share, the architecture of their
system(s), and lessons they've learned about it/them, and what things
they plan to change.
<li>what prompted them to choose Perl, what do they particularly like
about it, and what don't they like. What partcular challenges have
they faced, whether Perl related or not.
<li>if the "cover story" was one key application or serice where they used
perl, then another section might cover "other ways we use perl"
<li>what are some areas where they don't use perl, and why
<li>reader contributed questions, curated rather than a free-for-all.
</ul>
<p>So I'm imagining a mixture of marketing showcase, technical implementation details, and other aspects. These might end up as quite long articles, but parts might be pulled out for use in different contexts. For example the marketing sections from a number might be included together elsewhere in the perl webverse.</p>
<p>For each organisation I'd see a number of Q&A sessions required, probably a mixture of email and/or Skype.</p>
<p>Questions?</p>
<ul style="margin-left: 1em;">
<li>Would <em>you</em> like to see such a series, and do you think it would be good for Perl?</li>
<li>What organisations could be included? We all know that booking.com uses Perl, and I know that imdb at least used to (don't know if they still do), but what and who else?</li>
<li>What other topics should be included? What specific questions should everyone be asked?</li>
</ul>
<h3>Update</h3>
<p>When asking "<em>what organisations could be included?</em>", I wasn't thinking who should be "allowed in", but asking the more general "what organisations are using Perl in a way that's worth writing about?" I just don't know many for sure, but I'm fairly sure there are some out there... So give me some names!</p>]]>
    </content>
</entry>

<entry>
    <title>Visually graphing module dependencies</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/12/prereq-grapher.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4094</id>

    <published>2012-12-02T23:50:17Z</published>
    <updated>2012-12-05T21:50:06Z</updated>

    <summary>I&apos;ve just released the first version of prereq-grapher, a script which generates the dependency graph for a module or script in any of the formats supported by Graph::Easy. The functionality lives in App::PrereqGrapher, which in turn uses Perl::PrereqScanner to extract...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>I've just released the first version of <a href="https://metacpan.org/module/prereq-grapher">prereq-grapher</a>, a script which generates the dependency graph for a module or script in any of the formats supported by <a href="https://metacpan.org/module/Graph::Easy">Graph::Easy</a>. The functionality lives in <a href="https://metacpan.org/module/App::PrereqGrapher">App::PrereqGrapher</a>, which in turn uses <a href="https://metacpan.org/module/Perl::PrereqScanner">Perl::PrereqScanner</a> to extract dependencies.</p>]]>
        <![CDATA[<p>For example, to generate the dependency graph for <a href="https://metacpan.org/module/Module::Path">Module::Path</a>, on Unix I'd run:</p>
<pre>
  % <b>prereq-grapher Module::Path</b>
  6 modules processed. Graph written to dependencies.dot
</pre>
<p>And then you can visualise this graph using graphviz:</p>
<p style="padding-left: 20px;"><img alt="dependency graph for Module::Path" src="http://blogs.perl.org/users/neilb/2012/12/02/module-path.png" width="586" height="242" class="mt-image-none" style="" /></p>
<p>
While writing my <a href="http://neilb.org/reviews/dependencies.html">review of CPAN modules for getting module dependency information</a>,
I knocked up a script to build the prerequisite graph using <a href="https://metacpan.org/module/Perl::PrereqScanner">Perl::PrereqScanner</a>. Last week someone emailed me asking if the script was available, so I put together a release...
</p>
<h3>Updates (for version 0.04)</h3>
<p>
The <b><tt>-nc</tt></b> and <b><tt>-nrc</tt></b> control whether and how core modules are included in the graph. The <b><tt>-nc</tt></b> (or <b><tt>-no-core</tt></b>) option says not to include core modules:</p>
<pre>
  % <b>prereq-grapher -nc HTTP::Client</b>
  2 modules processed. Graph written to dependencies.dot
</pre>
<p>Here's the output from that:</p>
<p style="padding-left: 20px;"><img alt="no-core.png" src="http://blogs.perl.org/users/neilb/no-core.png" width="291" height="103" class="mt-image-none" style="" /></p>
<p>The <b><tt>-nrc</tt></b> (or <b><tt>-no-recurse-core</tt></b>) option says to include core modules, but don't include <em>their</em> dependencies):
<pre>
  % <b>prereq-grapher -nrc HTTP::Client</b>
  17 modules processed. Graph written to dependencies.dot
</pre>
<p>Here's the output from that:</p>
<p style="padding-left: 20px;"><img alt="no-recurse-core.png" src="http://blogs.perl.org/users/neilb/no-recurse-core.png" width="285" height="356" class="mt-image-none" style="" /></p>
<p>By default it's now silent when dependencies aren't found locally; if you include the <b><tt>-verbose</tt></b> option you'll get a warning for each dependency not found.</p>
<h3>Update 2: limiting depth</h3>
<p>Paul Crovella told me he was using this to look at a rather large dependency graph, so I thought it might help to be able to create a subset of the graph, by limiting the depth recursed to. I release 0.05 today, which supports a <b>-depth</b> option.</p>
<p>For example, graphing App::PrereqGrapher produces a huge graph, after processing 305 modules. Here's just a small extract of the full graph:</p>
<p style="padding-left: 20px;"><img alt="depth-all.png" src="http://blogs.perl.org/users/neilb/depth-all.png" width="267" height="152" class="mt-image-none" style="" /></p>
<p>So, to get your head around dependencies you might then try:
<pre>
  % <b>prereq-grapher -d 2 App::PrereqGrapher</b>
  10 modules processed. Graph written to dependencies.dot
</pre>
<p>This produces a much more useful graph:</p>
<p style="padding-left: 20px;"><img alt="depth-2.png" src="http://blogs.perl.org/users/neilb/depth-2.png" width="642" height="249" class="mt-image-none" style="" /></p>]]>
    </content>
</entry>

<entry>
    <title>Problems building mod_perl on Mountain Lion (MacOSX 10.8)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/neilb/2012/11/problems-building-mod-perl-on-mountain-lion-macosx-108.html" />
    <id>tag:blogs.perl.org,2012:/users/neilb//846.4039</id>

    <published>2012-11-12T21:37:13Z</published>
    <updated>2012-11-12T22:05:11Z</updated>

    <summary>Over the weekend I upgraded my laptop to Mountain Lion, and decided to install Perl 5.16.2. I had problems getting mod_perl working. This is a summary of the problem and the (a?) solution, in the hope it might save others...</summary>
    <author>
        <name>Neil Bowers</name>
        <uri>http://neilb.org/reviews</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/neilb/">
        <![CDATA[<p>Over the weekend I upgraded my laptop to Mountain Lion, and decided to install Perl 5.16.2. I had problems getting mod_perl working. This is a summary of the problem and the (a?) solution, in the hope it might save others from banging their heads against it.</p>]]>
        <![CDATA[<p>I had previously installed Perl 5.16.1, Apache 2.2.22, and mod_perl 2.0.7 on MacOS X 10.7.5, and all went ok. This past weekend I decided to upgrade to 10.8.2, and thought I'd upgrade to perl 5.16.2 as well. After installing Mountain Lion, I installed Xcode, and then installed the command-line tools (resisting comment on that). To get the compiler working correctly, I had to refer to <a href="http://stackoverflow.com/questions/10357804/configure-error-c-compiler-cannot-create-executables">this stackoverflow question</a>.</p>

<p>
I followed my usual sequence: openssl, apache, perl. Everything compiled with no problem. But when I installed mod_perl 2.0.7 and tried to start apache, I got the following error:</p>

<pre style="font-size: 9pt;">
  httpd: Syntax error on line 60 of /usr/local/apache/conf/httpd.conf:
    Cannot load /usr/local/apache/modules/mod_perl.so into server:
    dlopen(/usr/local/apache/modules/mod_perl.so, 10):
    Symbol not found: _modperl_handler_name
    Referenced from: /usr/local/apache/modules/mod_perl.so Expected in: dynamic lookup
</pre>

<p>I'll spare you the <a href="http://mail-archives.apache.org/mod_mbox/perl-modperl/201211.mbox/thread">gory details</a>, but the problem was caused by the fact that there are two different C compilers, their interpretation of <i>inline</i> is different, and different configure processes pick up different compilers.</p>

<pre style="font-size: 9pt;">
  % <b>/usr/bin/cc --version | head -1</b>
  Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)

  % <b>/usr/bin/gcc --version | head -1</b>
  i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
</pre>

<p>OpenSSL, Apache, and the <a href="http://apr.apache.org">apache portable runtime</a> (APR) were all built with gcc. But Perl's Configure was picking up cc. So when building mod_perl, it was referring to an APR built with gcc, but Perl's config was telling it to use cc. Rebuilding everything and ensuring gcc was used throughout resolved the issue.
</p>]]>
    </content>
</entry>

</feed>
