<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dcterms="http://purl.org/rss/1.0/modules/dcterms/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <generator>Plagger/0.7.17</generator>
    <link>http://desert-island.me.uk:8888/~castaway/perl-noise/</link>
    <description>Everything Perl from the Web</description>
    <title>Perl Noise Aggregator</title>
    <pubDate>Thu, 09 Sep 2010 01:01:01 +0100</pubDate>
    <item>
      <author>nobody@example.com (denny)</author>
      <dc:creator>nobody@example.com (denny)</dc:creator>
      <link>http://perlisalive.com/articles/52</link>
      <description>Pudge announced (http://use.perl.org/articles/10/09/08/2053239.shtml) yesterday that use.perl.org (http://use.perl.org/) will be going offline from today.  He hopes to restore it as a static resource at a later date.A lot of the community has already migrated to the more attractive blogs.perl.org (http://blogs.perl.org/) anyway, so hopefully this shouldn't cause too much disruption.</description>
      <dc:date>2010-09-08T23:05:10Z</dc:date>
      <title>use.perl.org goes offline</title>
      <pubDate>Wed, 08 Sep 2010 23:05:10 -0000</pubDate>
      <content:encoded>Pudge announced (http://use.perl.org/articles/10/09/08/2053239.shtml) yesterday that use.perl.org (http://use.perl.org/) will be going offline from today.  He hopes to restore it as a static resource at a later date.A lot of the community has already migrated to the more attractive blogs.perl.org (http://blogs.perl.org/) anyway, so hopefully this shouldn't cause too much disruption.</content:encoded>
      <dcterms:modified>2010-09-08T23:05:10Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://perlisalive.com/articles/52</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/Z7UnKVSpzeo/useperl-is-going-to-die-soon.html</link>
      <description>No, really. Chris Nandor is changing employers, so he won't have access
to the machine that hosts use.perl after Friday. He's going to take a
database dump with him and turn the site into a static site so the
content will still be there for a bit, but eventually it's going to
disappear. This might mean that a reboot, power outage, disk failure, or
something else might means the current use.perl doesn't come back to
life.

The Perl community was very fortunate that Geeknet (and all the other
names they went by) allowed Chris to host the site. Use.perl was a test
bed for slashcode, so whatever Slashdot did or wanted to do, that's what
use.perl did. It was a good thing going for a long time, and many of us
owe Chris a lot of beer for use.perl, even if we didn't always like
slashcode.

Now it's time to figure out what to do without use.perl and all the links
to various posts in there. The main goals are:

  * Links to URLs within use.perl continue to serve the same content

  * People get to keep their use.perl content if they'd like to do
    something else with it.

Since its slash, a lot of the stuff is dynamic. Since use.perl basically
ran on autopilot, Chris doesn't have the bandwidth. Since use.perl won't
be connected to his new employer's tasks, he'll have even less time for
it. Maybe there's someone who has the bandwidth for it.

Some possible solutions we talked about:

  * Set up slashcode and serves the site dynamically. If hosting is a
    problem, talk to me. :)

  * Set up slashcode and serves the site statically. This might mean a
    caching layer that stores the computed page for every URL. I'm not
    sure if that will handle the Ajax stuff properly though.

  * Take the database dump and recreate the pages somehow.

  * Crawl the entire site and store the results as static pages.

One idea was to inject everything into blogs.perl.org. I don't know how
that would work of if the blogs.perl.org team want to do that. It would
require a very large URL rewriting component.

[IMAGE]</description>
      <dc:date>2010-09-08T22:36:32Z</dc:date>
      <title>Use.perl is going to die soon</title>
      <pubDate>Wed, 08 Sep 2010 22:36:32 -0000</pubDate>
      <content:encoded>&lt;p&gt;No, really. Chris Nandor is changing employers, so he won't have access to the machine that hosts use.perl after Friday. He's going to take a database dump with him and turn the site into a static site so the content will still be there for a bit, but eventually it's going to disappear. This might mean that a reboot, power outage, disk failure, or something else might means the current use.perl doesn't come back to life.&lt;/p&gt;

&lt;p&gt;The Perl community was very fortunate that Geeknet (and all the other names they went by) allowed Chris to host the site. Use.perl was a test bed for slashcode, so whatever Slashdot did or wanted to do, that's what use.perl did. It was a good thing going for a long time, and many of us owe Chris a lot of beer for use.perl, even if we didn't always like slashcode.&lt;/p&gt;

&lt;p&gt;Now it's time to figure out what to do without use.perl and all the links to various posts in there. The main goals are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links to URLs within use.perl continue to serve the same content&lt;/li&gt;
&lt;li&gt;People get to keep their use.perl content if they'd like to do something else with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since its slash, a lot of the stuff is dynamic. Since use.perl basically ran on autopilot, Chris doesn't have the bandwidth. Since use.perl won't be connected to his new employer's tasks, he'll have even less time for it. Maybe there's someone who has the bandwidth for it.&lt;/p&gt;

&lt;p&gt;Some possible solutions we talked about: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up slashcode and serves the site dynamically. If hosting is a problem, talk to me. :)&lt;/li&gt;
&lt;li&gt;Set up slashcode and serves the site statically. This might mean a caching layer that stores the computed page for every URL. I'm not sure if that will handle the Ajax stuff properly though.&lt;/li&gt;
&lt;li&gt;Take the database dump and recreate the pages somehow.&lt;/li&gt;
&lt;li&gt;Crawl the entire site and store the results as static pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One idea was to inject everything into blogs.perl.org. I don't know how that would work of if the blogs.perl.org team want to do that. It would require a very large URL rewriting component.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/Z7UnKVSpzeo"&gt;</content:encoded>
      <dcterms:modified>2010-09-08T22:36:32Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.989</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://blogs.perl.org/users/brian_d_foy/2010/09/useperl-is-going-to-die-soon.html</link>
      <description>No, really. Chris Nandor is changing employers, so he won't have access
to the machine that hosts use.perl after Friday. He's going to take a
database dump with him and turn the site into a static site so the
content will still be there for a bit, but eventually it's going to
disappear. This might mean that a reboot, power outage, disk failure, or
something else might means the current use.perl doesn't come back to
life.

The Perl community was very fortunate that Geeknet (and all the other
names they went by) allowed Chris to host the site. Use.perl was a test
bed for slashcode, so whatever Slashdot did or wanted to do, that's what
use.perl did. It was a good thing going for a long time, and many of us
owe Chris a lot of beer for use.perl, even if we didn't always like
slashcode.

Now it's time to figure out what to do without use.perl and all the links
to various posts in there. The main goals are:

  * Links to URLs within use.perl continue to serve the same content

  * People get to keep their use.perl content if they'd like to do
    something else with it.

Since its slash, a lot of the stuff is dynamic. Since use.perl basically
ran on autopilot, Chris doesn't have the bandwidth. Since use.perl won't
be connected to his new employer's tasks, he'll have even less time for
it. Maybe there's someone who has the bandwidth for it.

Some possible solutions we talked about:

  * Set up slashcode and serves the site dynamically. If hosting is a
    problem, talk to me. :)

  * Set up slashcode and serves the site statically. This might mean a
    caching layer that stores the computed page for every URL. I'm not
    sure if that will handle the Ajax stuff properly though.

  * Take the database dump and recreate the pages somehow.

  * Crawl the entire site and store the results as static pages.

One idea was to inject everything into blogs.perl.org. I don't know how
that would work of if the blogs.perl.org team want to do that. It would
require a very large URL rewriting component.</description>
      <dc:date>2010-09-08T22:13:42Z</dc:date>
      <title>Use.perl is going to die soon</title>
      <pubDate>Wed, 08 Sep 2010 22:13:42 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;No, really. Chris Nandor is changing employers, so he won't have access to the machine that hosts use.perl after Friday. He's going to take a database dump with him and turn the site into a static site so the content will still be there for a bit, but eventually it's going to disappear. This might mean that a reboot, power outage, disk failure, or something else might means the current use.perl doesn't come back to life.&lt;/p&gt;

&lt;p&gt;The Perl community was very fortunate that Geeknet (and all the other names they went by) allowed Chris to host the site. Use.perl was a test bed for slashcode, so whatever Slashdot did or wanted to do, that's what use.perl did. It was a good thing going for a long time, and many of us owe Chris a lot of beer for use.perl, even if we didn't always like slashcode.&lt;/p&gt;

&lt;p&gt;Now it's time to figure out what to do without use.perl and all the links to various posts in there. The main goals are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Links to URLs within use.perl continue to serve the same content&lt;/li&gt;
&lt;li&gt;People get to keep their use.perl content if they'd like to do something else with it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since its slash, a lot of the stuff is dynamic. Since use.perl basically ran on autopilot, Chris doesn't have the bandwidth. Since use.perl won't be connected to his new employer's tasks, he'll have even less time for it. Maybe there's someone who has the bandwidth for it.&lt;/p&gt;

&lt;p&gt;Some possible solutions we talked about: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up slashcode and serves the site dynamically. If hosting is a problem, talk to me. :)&lt;/li&gt;
&lt;li&gt;Set up slashcode and serves the site statically. This might mean a caching layer that stores the computed page for every URL. I'm not sure if that will handle the Ajax stuff properly though.&lt;/li&gt;
&lt;li&gt;Take the database dump and recreate the pages somehow.&lt;/li&gt;
&lt;li&gt;Crawl the entire site and store the results as static pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One idea was to inject everything into blogs.perl.org. I don't know how that would work of if the blogs.perl.org team want to do that. It would require a very large URL rewriting component.&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2010-09-08T22:13:42Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.989</guid>
    </item>
    <item>
      <author>nobody@example.com (dagolden)</author>
      <dc:creator>nobody@example.com (dagolden)</dc:creator>
      <category>perl-programming</category>
      <link>http://www.dagolden.com/index.php/1014/hacking-the-perl-core-to-push-and-pop-to-references/</link>
      <description>In a recent post, I said I wished that Perl's built in functions for
array containers would work directly on references.

Rather than this (today):

# Assuming $data-&gt;{$key1}{$key2} = []
push @{ $data-&gt;{$key1}{$key2} }, @stuff;

I wanted this (in the future):

# Assuming $data-&gt;{$key1}{$key2} = []
push $data-&gt;{$key1}{$key2}, @stuff;

I've finished a draft implementation that works for push, pop, shift,
unshift and splice. All existing Perl tests pass, as do new tests I've
written that explore this new functionality. It will even auto-vivify as
needed:

my $foo;
push $foo, @stuff; # $foo is now an arrayref

I'm still working on keys, values and each and those look much harder,
but I hope to have something to share by next week.</description>
      <dc:date>2010-09-08T21:33:24Z</dc:date>
      <dc:subject>perl-programming</dc:subject>
      <title>Hacking the Perl core for smarter push and pop</title>
      <pubDate>Wed, 08 Sep 2010 21:33:24 -0000</pubDate>
      <content:encoded>&lt;p&gt;In a &lt;a href="http://www.dagolden.com/index.php/986/if-perl-were-smarter-about-references/"&gt;recent post&lt;/a&gt;, I said I wished that Perl's built in functions for array containers would work directly on references.&lt;/p&gt;
&lt;p&gt;Rather than this (today):&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;
# Assuming $data-&amp;gt;{$key1}{$key2} = []
push @{ $data-&amp;gt;{$key1}{$key2} }, @stuff;
&lt;/pre&gt;
&lt;p&gt;I wanted this (in the future):&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;
# Assuming $data-&amp;gt;{$key1}{$key2} = []
push $data-&amp;gt;{$key1}{$key2}, @stuff;
&lt;/pre&gt;
&lt;p&gt;I've finished a draft implementation that works for push, pop, shift, unshift and splice.  All existing Perl tests pass, as do new tests I've written that explore this new functionality.  It will even auto-vivify as needed:&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;
my $foo;
push $foo, @stuff; # $foo is now an arrayref
&lt;/pre&gt;
&lt;p&gt;I'm still working on keys, values and each and those look much harder, but I hope to have something to share by next week.&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-09-08T21:33:24Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://www.dagolden.com/?p=1014</guid>
    </item>
    <item>
      <author>nobody@example.com (dagolden)</author>
      <dc:creator>nobody@example.com (dagolden)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/Jz32R7LzKGU/</link>
      <description>In a recent post, I said I wished that Perl's built in functions for
array containers would work directly on references.

Rather than this (today):

# Assuming $data-&gt;{$key1}{$key2} = []
push @{ $data-&gt;{$key1}{$key2} }, @stuff;

I wanted this (in the future):

# Assuming $data-&gt;{$key1}{$key2} = []
push $data-&gt;{$key1}{$key2}, @stuff;

I've finished a draft implementation that works for push, pop, shift,
unshift and splice. All existing Perl tests pass, as do new tests I've
written that explore this new functionality. It will even auto-vivify as
needed:

my $foo;
push $foo, @stuff; # $foo is now an arrayref

I'm still working on keys, values and each and those look much harder,
but I hope to have something to share by next week.

[IMAGE]</description>
      <dc:date>2010-09-08T21:33:24Z</dc:date>
      <title>Hacking the Perl core for smarter push and pop</title>
      <pubDate>Wed, 08 Sep 2010 21:33:24 -0000</pubDate>
      <content:encoded>&lt;p&gt;In a &lt;a href="http://www.dagolden.com/index.php/986/if-perl-were-smarter-about-references/"&gt;recent post&lt;/a&gt;, I said I wished that Perl's built in functions for array containers would work directly on references.&lt;/p&gt;
&lt;p&gt;Rather than this (today):&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;# Assuming $data-&amp;gt;{$key1}{$key2} = []
push @{ $data-&amp;gt;{$key1}{$key2} }, @stuff;
&lt;/pre&gt;
&lt;p&gt;I wanted this (in the future):&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;# Assuming $data-&amp;gt;{$key1}{$key2} = []
push $data-&amp;gt;{$key1}{$key2}, @stuff;
&lt;/pre&gt;
&lt;p&gt;I've finished a draft implementation that works for push, pop, shift, unshift and splice.  All existing Perl tests pass, as do new tests I've written that explore this new functionality.  It will even auto-vivify as needed:&lt;/p&gt;
&lt;pre class="brush: perl;"&gt;my $foo;
push $foo, @stuff; # $foo is now an arrayref
&lt;/pre&gt;
&lt;p&gt;I'm still working on keys, values and each and those look much harder, but I hope to have something to share by next week.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/Jz32R7LzKGU"&gt;</content:encoded>
      <dcterms:modified>2010-09-08T21:33:24Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://www.dagolden.com/?p=1014</guid>
    </item>
    <item>
      <author>nobody@example.com (pudge)</author>
      <dc:creator>nobody@example.com (pudge)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/MO01DgP-rks/article.pl</link>
      <description>As I am leaving my current job at Geeknet -- which has generously hosted
use Perl; for all these years, since the site began in 2000 -- I am
temporarily shutting down use Perl; tomorrow, Thursday, Sept. 8. I plan
to leave the site "static" for now, and then perhaps have it reappear
elsewhere.

Read more of this story at use Perl.

[IMAGE]</description>
      <dc:date>2010-09-08T20:51:00Z</dc:date>
      <title>use Perl; Shutting Down Indefinitely</title>
      <pubDate>Wed, 08 Sep 2010 20:51:00 -0000</pubDate>
      <content:encoded>As I am leaving my current job at Geeknet -- which has generously hosted use Perl; for all these years, since the site began in 2000 -- I am temporarily shutting down use Perl; tomorrow, Thursday, Sept. 8. I plan to leave the site "static" for now, and then perhaps have it reappear elsewhere.&lt;p&gt;&lt;a href="http://use.perl.org/article.pl?sid=10/09/08/2053239&amp;amp;from=rss"&gt;Read more of this story&lt;/a&gt; at use Perl.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/MO01DgP-rks"&gt;</content:encoded>
      <dcterms:modified>2010-09-08T20:51:00Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://use.perl.org/article.pl?sid=10/09/08/2053239&amp;from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>documentation modern perl perl 5</category>
      <link>http://www.modernperlbooks.com/mt/2010/09/a-perldoc-pruning.html</link>
      <description>I use perldoc all the time (the command-line version). I don't know how
to be a productive Perl programmer without perldoc -f or perldoc
Module::Name. Nor would I try.

One of Perl 5's selling points is that includes copious documentation of
the core language and common tasks. If you've skim perldoc perltoc once
in a while, you'll find documentation you really ought to read as well as
documentation you will wish you had read previously.

Then you'll come across something like perlobj which, bless its little
heart, really isn't that helpful anymore. It gives far too many
implementation details along with helpful-sounding but ultimately
unpleasant advice. (Explaining how to use indirect method invocation
before warning not to use it in the final paragraph of the section? A
lengthy discussion of garbage collection? A comaprison of Perl 5's
default OO with C++? Code examples which show how to bypass method
dispatch altogether as a didactic technique on how method dispatch
works?)

That's not the worst file in the documentation.

Writing documentation is difficult. Writing good documentation is very
difficult. Editing existing documentation is thankless and fragile and
prone to arguments: someone invested hours in writing that documentation
a decade ago. We should celebrate that work and offer our most sincere
gratitude to everyone who's helped create the voluminous Perl
documentation. Even so, when documentation has grown a layer of mold (or
when our understanding of the best way to do things has changed), we need
to do users the favor of giving them the best advice we have.

Sadly, we'll never see Programming Perl 4E, but we can work to improve
the core documentation in terms of advice, accuracy, organization, and
completeness. (Even a prominent link to the TPF Perl 5 wiki for "Object
Best Practices" in the documentation could keep it relevant in seven
years when so-called enterprise distributions begin to ship a Modern
Perl, but that's a far different need.)</description>
      <dc:date>2010-09-08T16:34:33Z</dc:date>
      <dc:subject>documentation modern perl perl 5</dc:subject>
      <title>A Perldoc Pruning</title>
      <pubDate>Wed, 08 Sep 2010 16:34:33 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;I use &lt;a href="http://perldoc.perl.org/"&gt;perldoc&lt;/a&gt; all the time (the command-line version).  I don't know how to be a productive Perl programmer without &lt;code&gt;perldoc -f&lt;/code&gt; or &lt;code&gt;perldoc &lt;em&gt;Module::Name&lt;/em&gt;&lt;/code&gt;.  Nor would I try.&lt;/p&gt;

&lt;p&gt;One of Perl 5's selling points is that includes copious documentation of the core language and common tasks.  If you've skim &lt;code&gt;perldoc perltoc&lt;/code&gt; once in a while, you'll find documentation you really ought to read as well as documentation you will wish you had read previously.&lt;/p&gt;

&lt;p&gt;Then you'll come across something like &lt;a href="http://perldoc.perl.org/perlobj.html"&gt;perlobj&lt;/a&gt; which,
&lt;code&gt;bless&lt;/code&gt; its little heart, really isn't that helpful anymore.  It
gives far too many implementation details along with helpful-sounding but
ultimately unpleasant advice.  (Explaining how to use indirect method
invocation before warning not to use it in the final paragraph of the section?
A lengthy discussion of garbage collection?  A comaprison of Perl 5's default
OO with C++?  Code examples which show how to bypass method dispatch altogether
as a didactic technique on how method dispatch works?)&lt;/p&gt;

&lt;p&gt;That's not the worst file in the documentation.&lt;/p&gt;

&lt;p&gt;Writing documentation is difficult.  Writing good documentation is very
difficult.  Editing existing documentation is thankless and fragile and prone
to arguments: someone invested &lt;em&gt;hours&lt;/em&gt; in writing that documentation a
decade ago.  We should celebrate that work and offer our most sincere gratitude to everyone who's helped create the voluminous Perl documentation.  Even so, when documentation has
grown a layer of mold (or when our understanding of the best way to do things
has changed), we need to do users the favor of giving them the best advice we
have.&lt;/p&gt;

&lt;p&gt;Sadly, we'll never see &lt;em&gt;Programming Perl 4E&lt;/em&gt;, but we can work to improve the core documentation in terms of advice, accuracy, organization, and completeness.  (Even a prominent link to the TPF Perl 5 wiki for "Object Best Practices" in the documentation could keep it relevant in seven years when so-called enterprise distributions begin to ship a Modern Perl, but that's a far different need.)&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-09-08T16:34:33Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:www.modernperlbooks.com,2010:/mt//1.226</guid>
    </item>
    <item>
      <author>nobody@example.com (jonasbn)</author>
      <dc:creator>nobody@example.com (jonasbn)</dc:creator>
      <category>Uncategorized cpan perl perlcritic policies release</category>
      <link>http://logiclab.org/wordpress/2010/09/08/cpan-release-perlcriticlogiclab-0-01-and-policies/</link>
      <description>After a long time I finally got my own Perl::Critic policies released and
uploaded to CPAN.

I have created a Task implementation bundle listing my two own policies
for now (I expect to add other policies used later on). This gives you
the opportunity to download the policies by themselves if they look like
something you would like to use or you can even bundle them yourself with
other policies you make use of.

This packaging is an experiment and is not the recommended way and so it
might change in the future, so let me know if you have any feedback on
the packaging, both if you are using Perl::Critic::logicLAB or the actual
policies directly.

The policies which have also just been released and currently listed in
Perl::Critic::logicLAB are:

  * Perl::Critic::Policy::logicLAB::ProhibitUseLib

  * Perl::Critic::Policy::logicLAB::RequireVersionFormat

Both are simple policies, but hopefully useful.

All should be available on CPAN by now.

jonasbn, Copenhagen</description>
      <dc:date>2010-09-08T14:05:35Z</dc:date>
      <dc:subject>Uncategorized cpan perl perlcritic policies release</dc:subject>
      <title>CPAN Release Perl::Critic::logicLAB 0.01 and policies</title>
      <pubDate>Wed, 08 Sep 2010 14:05:35 -0000</pubDate>
      <content:encoded>&lt;p&gt;After a long time I finally got my own Perl::Critic policies released and uploaded to CPAN.&lt;/p&gt;
&lt;p&gt;I have created a Task implementation bundle listing my two own policies for now (I expect to add other policies used later on). This gives you the opportunity to download the policies by themselves if they look like something you would like to use or you can even bundle them yourself with other policies you make use of.&lt;/p&gt;
&lt;p&gt;This packaging is an experiment and is not &lt;a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/DEVELOPER.pod#DISTRIBUTING_YOUR_POLICIES"&gt;the recommended way&lt;/a&gt; and so it might change in the future, so let me know if you have any feedback on the packaging, both if you are using Perl::Critic::logicLAB or the actual policies directly.&lt;/p&gt;
&lt;p&gt;The policies which have also just been released and currently listed in Perl::Critic::logicLAB are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://logicLAB.jira.com/wiki/display/PCPMPUL/Home"&gt;Perl::Critic::Policy::logicLAB::ProhibitUseLib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://logicLAB.jira.com/wiki/display/PCPMRVF/Home"&gt;Perl::Critic::Policy::logicLAB::RequireVersionFormat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are simple policies, but hopefully useful.&lt;/p&gt;
&lt;p&gt;All should be available on CPAN by now.&lt;/p&gt;
&lt;p&gt;jonasbn, Copenhagen&lt;/p&gt;
</content:encoded>
      <dcterms:modified>2010-09-08T14:05:35Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://logiclab.org/wordpress/2010/09/08/cpan-release-perlcriticlogiclab-0-01-and-policies/</guid>
    </item>
    <item>
      <author>nobody@example.com (Ovid)</author>
      <dc:creator>nobody@example.com (Ovid)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/S_CkRPQCLV4/an-unexpected-test-result.html</link>
      <description>I spent several hours debugging a catastrophic test suite failure today.
As our test classes take over an hour to run and the failure takes place
near the end of the test run, it was a very annoying issue to debug.
Unfortunately, the test class in question passed when run by itself, but
not when run in the entire suite. That usually means the global state had
been altered in an unexpected way, and boy had it! Seems the test was
failing because it was trying to run a method that a completely separate
test class had -- and those classes weren't related by inheritance. It
was very confusing until I finally realized that someone had mistyped a
package name at the top of the test class. A few minutes later I had a
new test which verified the package name ... and found ten other
misspelled package names (out of 325 packages).

You'll need to adjust this to taste (and it assumes that the first thing
which looks like package declaration is the package declaration).

#!/usr/bin/env perl

use Test::Most 'bail';
use File::Find;

sub expected_package_name($) {
  my $file = shift;
  $file =~ s{^t/lib/}{};
  $file =~ s{\.pm$}{};
  $file =~ s/\//::/g;
  return $file;
}

sub found_package_name($) {
  my $file = shift;

  # we assume first package name found is actual
  open my $fh, '&lt;', $file or die "Could not open $file for reading: $!";
  my $package;
  while ( my $line = &lt;$fh&gt; ) {
    next unless $line =~ /^\s*package\s+((?:\w+)(::\w+)*)/;
    return $1;
  }
}

my @files;
find(
  { no_chdir =&gt; 1,
    wanted   =&gt; sub {
      my $file = $File::Find::name;
      return if !-f $file || $file !~ /\.pm$/ || $file =~ /\.svn/;
      push @files =&gt;
        [ $file, found_package_name $file, expected_package_name $file];
    },
  },
  't/lib/Tests'
);
plan tests =&gt; scalar @files;
for my $file (@files) {
  my ( $file, $have, $want ) = @$file;
  is $have, $want, "Package name correct for $file";
}

[IMAGE]</description>
      <dc:date>2010-09-08T13:27:27Z</dc:date>
      <title>An Unexpected Test Result</title>
      <pubDate>Wed, 08 Sep 2010 13:27:27 -0000</pubDate>
      <content:encoded>&lt;p&gt;I spent several hours debugging a catastrophic test suite failure today.  As our test classes take over an hour to run and the failure takes place near the end of the test run, it was a very annoying issue to debug.  Unfortunately, the test class in question passed when run by itself, but not when run in the entire suite.  That usually means the global state had been altered in an unexpected way, and boy had it!  Seems the test was failing because it was trying to run a method that a completely separate test class had -- and those classes weren't related by inheritance.  It was very confusing until I finally realized that someone had mistyped a package name at the top of the test class.  A few minutes later I had a new test which verified the package name ... and found ten other misspelled package names (out of 325 packages).&lt;/p&gt;

        &lt;p&gt;You'll need to adjust this to taste (and it assumes that the first thing which looks like package declaration is &lt;strong&gt;the&lt;/strong&gt; package declaration).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env perl

use Test::Most 'bail';
use File::Find;

sub expected_package_name($) {
  my $file = shift;
  $file =~ s{^t/lib/}{};
  $file =~ s{\.pm$}{};
  $file =~ s/\//::/g;
  return $file;
}

sub found_package_name($) {
  my $file = shift;

  # we assume first package name found is actual
  open my $fh, '&amp;lt;', $file or die "Could not open $file for reading: $!";
  my $package;
  while ( my $line = &amp;lt;$fh&amp;gt; ) {
    next unless $line =~ /^\s*package\s+((?:\w+)(::\w+)*)/;
    return $1;
  }
}

my @files;
find(
  { no_chdir =&amp;gt; 1,
    wanted   =&amp;gt; sub {
      my $file = $File::Find::name;
      return if !-f $file || $file !~ /\.pm$/ || $file =~ /\.svn/;
      push @files =&amp;gt;
        [ $file, found_package_name $file, expected_package_name $file];
    },
  },
  't/lib/Tests'
);
plan tests =&amp;gt; scalar @files;
for my $file (@files) {
  my ( $file, $have, $want ) = @$file;
  is $have, $want, "Package name correct for $file";
}
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/S_CkRPQCLV4"&gt;</content:encoded>
      <dcterms:modified>2010-09-08T13:27:27Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/ovid//11.987</guid>
    </item>
    <item>
      <author>nobody@example.com (Ovid)</author>
      <dc:creator>nobody@example.com (Ovid)</dc:creator>
      <category>test::class testing tests</category>
      <link>http://blogs.perl.org/users/ovid/2010/09/an-unexpected-test-result.html</link>
      <description>I spent several hours debugging a catastrophic test suite failure today.
As our test classes take over an hour to run and the failure takes place
near the end of the test run, it was a very annoying issue to debug.
Unfortunately, the test class in question passed when run by itself, but
not when run in the entire suite. That usually means the global state had
been altered in an unexpected way, and boy had it! Seems the test was
failing because it was trying to run a method that a completely separate
test class had -- and those classes weren't related by inheritance. It
was very confusing until I finally realized that someone had mistyped a
package name at the top of the test class. A few minutes later I had a
new test which verified the package name ... and found ten other
misspelled package names (out of 325 packages).

You'll need to adjust this to taste (and it assumes that the first thing
which looks like package declaration is the package declaration).

  #!/usr/bin/env perl

use Test::Most 'bail';
use File::Find;

sub expected_package_name($) {
  my $file = shift;
  $file =~ s{^t/lib/}{};
  $file =~ s{\.pm$}{};
  $file =~ s/\//::/g;
  return $file;
}

sub found_package_name($) {
  my $file = shift;

  # we assume first package name found is actual
  open my $fh, '&lt;', $file or die "Could not open $file for reading: $!";
  my $package;
  while ( my $line = &lt;$fh&gt; ) {
    next unless $line =~ /^\s*package\s+((?:\w+)(::\w+)*)/;
    return $1;
  }
}

my @files;
find(
  { no_chdir =&gt; 1,
    wanted   =&gt; sub {
      my $file = $File::Find::name;
      return if !-f $file || $file !~ /\.pm$/ || $file =~ /\.svn/;
      push @files =&gt;
        [ $file, found_package_name $file, expected_package_name $file];
    },
  },
  't/lib/Tests'
);
plan tests =&gt; scalar @files;
for my $file (@files) {
  my ( $file, $have, $want ) = @$file;
  is $have, $want, "Package name correct for $file";
}</description>
      <dc:date>2010-09-08T13:18:01Z</dc:date>
      <dc:subject>test::class testing tests</dc:subject>
      <title>An Unexpected Test Result</title>
      <pubDate>Wed, 08 Sep 2010 13:18:01 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;I spent several hours debugging a catastrophic test suite failure today.  As our test classes take over an hour to run and the failure takes place near the end of the test run, it was a very annoying issue to debug.  Unfortunately, the test class in question passed when run by itself, but not when run in the entire suite.  That usually means the global state had been altered in an unexpected way, and boy had it!  Seems the test was failing because it was trying to run a method that a completely separate test class had -- and those classes weren't related by inheritance.  It was very confusing until I finally realized that someone had mistyped a package name at the top of the test class.  A few minutes later I had a new test which verified the package name ... and found ten other misspelled package names (out of 325 packages).&lt;/p&gt;

        &lt;p&gt;You'll need to adjust this to taste (and it assumes that the first thing which looks like package declaration is &lt;strong&gt;the&lt;/strong&gt; package declaration).&lt;/p&gt;

&lt;pre&gt;
  &lt;code&gt;#!/usr/bin/env perl

use Test::Most 'bail';
use File::Find;

sub expected_package_name($) {
  my $file = shift;
  $file =~ s{^t/lib/}{};
  $file =~ s{\.pm$}{};
  $file =~ s/\//::/g;
  return $file;
}

sub found_package_name($) {
  my $file = shift;

  # we assume first package name found is actual
  open my $fh, '&amp;lt;', $file or die "Could not open $file for reading: $!";
  my $package;
  while ( my $line = &amp;lt;$fh&amp;gt; ) {
    next unless $line =~ /^\s*package\s+((?:\w+)(::\w+)*)/;
    return $1;
  }
}

my @files;
find(
  { no_chdir =&amp;gt; 1,
    wanted   =&amp;gt; sub {
      my $file = $File::Find::name;
      return if !-f $file || $file !~ /\.pm$/ || $file =~ /\.svn/;
      push @files =&amp;gt;
        [ $file, found_package_name $file, expected_package_name $file];
    },
  },
  't/lib/Tests'
);
plan tests =&amp;gt; scalar @files;
for my $file (@files) {
  my ( $file, $have, $want ) = @$file;
  is $have, $want, "Package name correct for $file";
}
&lt;/code&gt;
&lt;/pre&gt;

    </content:encoded>
      <dcterms:modified>2010-09-08T13:18:01Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:blogs.perl.org,2010:/users/ovid//11.987</guid>
    </item>
    <item>
      <author>nobody@example.com (nobody)</author>
      <dc:creator>nobody@example.com (nobody)</dc:creator>
      <link>http://blog.kraih.com/actual-perl-marketing</link>
      <description>Here are two examples for how the Amelia Perl logo can be used in actual
marketing material. :)

[IMAGE]

The first one is a book cover for the free Perl 6 book included in the
Rakudo Star distribution. (download)

[IMAGE]

The second is a quick'n dirty (i had one hour) cover for a Mojolicious
flyer Marcus Ramberg will be handing out at JavaZone 2010.

P.S.: I'm looking for fun T-Shirt design ideas, leave a comment if you
have one!

Permalink | Leave a comment »</description>
      <dc:date>2010-09-08T11:04:22Z</dc:date>
      <title>Actual Perl Marketing</title>
      <pubDate>Wed, 08 Sep 2010 11:04:22 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;
	Here are two examples for how the Amelia Perl logo can be used in actual marketing material. :)&lt;p&gt;&lt;a href="http://posterous.com/getfile/files.posterous.com/kraih/73ihBUJGTgMXsSnVmcS3nTq1STAVt9eJybBOkUWHUhJ3HJgUcw8IdeGAfrOQ/usingperl6-sri.jpg"&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/kraih/0VO8tP8ysvcgG4NaqKEafiMIICMJdeNHTX8Q5LUlz9Cna4g4uiPtbe7Ssrix/usingperl6-sri.jpg.scaled.500.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;The first one is a book cover for the &lt;a href="http://github.com/perl6/book"&gt;free Perl 6 book&lt;/a&gt; included in the Rakudo Star distribution. (&lt;a href="http://github.com/downloads/perl6/book/2010.08.letter.pdf"&gt;download&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;a href="http://posterous.com/getfile/files.posterous.com/kraih/VK6eEW7wxNFsYWXj5z7NdnLqz0RYIAqWkeVoqgyJStTrAoupZpcZHEtUnGxp/mojolicious-brochure.jpeg"&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/kraih/r5zstzUNFJDvT5aIxBpI5VdmZANjW7uBk1OilyPI0zmgBPzRUtp7va075sAh/mojolicious-brochure.jpeg.scaled.500.jpg"&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;The second is a quick'n dirty (i had one hour) cover for a &lt;a href="http://mojolicio.us"&gt;Mojolicious&lt;/a&gt; flyer &lt;a href="http://marcus.nordaaker.com/"&gt;Marcus Ramberg&lt;/a&gt; will be handing out at &lt;a href="http://jz10.java.no/"&gt;JavaZone 2010&lt;/a&gt;. &lt;p /&gt; &lt;b&gt;P.S.: I'm looking for fun T-Shirt design ideas, leave a comment if you have one!&lt;/b&gt; &lt;br /&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.kraih.com/actual-perl-marketing"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://blog.kraih.com/actual-perl-marketing#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;
      </content:encoded>
      <dcterms:modified>2010-09-08T11:04:22Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://blog.kraih.com/actual-perl-marketing</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/KMjP47A6Mus/how-can-i-troubleshoot-my-perl-cgi-script.html</link>
      <description>Awhile ago I moved my How can I troubleshoot my Perl CGI script? to
StackOverflow. I'm just getting around to telling everyone about it
because it was pretty far down on my to do list.

I think this has almost pushed the old location on SourceForge out of the
googlebrain, but it wouldn't hurt for people to link to it in a blog
post, tweet, whatever to encourage Google to find this one. Someday
SourceForge will disappear and we won't have to worry about it anymore.
How is it even still alive? StackOverflow has pretty good googlejuice
though, maybe because Google likes StackOverflow.

Since it's on StackOverflow, this also means that I'm basically letting
go of it. StackOverflow encourages people to revise the questions and
answers of other to improve them, and I've given it wiki status to
encourage that even more. Take a look, see what I've left out (or left
in), what's new and exciting (or old and boring).

Even if you don't (or can't) edit it just yet, I'd appreciate any
comments on how to bring it up to date. Maybe another StackOverflow user
can make the changes if I'm too busy.

Also, sadly, the only thing keeping the bad Perl info out of
StackOverflow is a small band of knowledgeable Perlers patrolling the
answers (Sinan used my summer absences to pass me as the highest rated
Perl user there). If you're looking for a way promote Perl in a useful
way (and you actually know Perl), consider helping out. Providing good
answers, voting on good answers (and against bad answers), and refining
other answers helps the entire world.

[IMAGE]</description>
      <dc:date>2010-09-08T04:06:59Z</dc:date>
      <title>How can I troubleshoot my Perl CGI script?</title>
      <pubDate>Wed, 08 Sep 2010 04:06:59 -0000</pubDate>
      <content:encoded>&lt;p&gt;Awhile ago I moved my &lt;a href="http://stackoverflow.com/q/2165022/8817"&gt;How can I troubleshoot my Perl CGI script?&lt;/a&gt; to StackOverflow. I'm just getting around to telling everyone about it because it was pretty far down on my to do list. &lt;/p&gt;

&lt;p&gt;I think this has almost pushed the old location on SourceForge out of the googlebrain, but it wouldn't hurt for people to link to it in a blog post, tweet, whatever to encourage Google to find this one. Someday SourceForge will disappear and we won't have to worry about it anymore. How is it even still alive? StackOverflow has pretty good googlejuice though, maybe because Google likes StackOverflow.&lt;/p&gt;

&lt;p&gt;Since it's on StackOverflow, this also means that I'm basically letting go of it. StackOverflow encourages people to revise the questions and answers of other to improve them, and I've given it wiki status to encourage that even more.  &lt;a href="http://stackoverflow.com/q/2165022/8817"&gt;Take a look&lt;/a&gt;, see what I've left out (or left in), what's new and exciting (or old and boring).&lt;/p&gt;

&lt;p&gt;Even if you don't (or can't) edit it just yet, I'd appreciate any comments on how to bring it up to date. Maybe another StackOverflow user can make the changes if I'm too busy.&lt;/p&gt;

&lt;p&gt;Also, sadly, the only thing keeping the bad Perl info out of StackOverflow is a small band of knowledgeable Perlers patrolling the answers (Sinan used my summer absences to pass me as the highest rated Perl user there). If you're looking for a way promote Perl in a useful way (and you actually know Perl), consider helping out. Providing good answers, voting on good answers (and against bad answers), and refining other answers helps the entire world.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/KMjP47A6Mus"&gt;</content:encoded>
      <dcterms:modified>2010-09-08T04:06:59Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.985</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://blogs.perl.org/users/brian_d_foy/2010/09/how-can-i-troubleshoot-my-perl-cgi-script.html</link>
      <description>Awhile ago I moved my How can I troubleshoot my Perl CGI script? to
StackOverflow. I'm just getting around to telling everyone about it
because it was pretty far down on my to do list.

I think this has almost pushed the old location on SourceForge out of the
googlebrain, but it wouldn't hurt for people to link to it in a blog
post, tweet, whatever to encourage Google to find this one. Someday
SourceForge will disappear and we won't have to worry about it anymore.
How is it even still alive? StackOverflow has pretty good googlejuice
though, maybe because Google likes StackOverflow.

Since it's on StackOverflow, this also means that I'm basically letting
go of it. StackOverflow encourages people to revise the questions and
answers of other to improve them, and I've given it wiki status to
encourage that even more. Take a look, see what I've left out (or left
in), what's new and exciting (or old and boring).

Even if you don't (or can't) edit it just yet, I'd appreciate any
comments on how to bring it up to date. Maybe another StackOverflow user
can make the changes if I'm too busy.

Also, sadly, the only thing keeping the bad Perl info out of
StackOverflow is a small band of knowledgeable Perlers patrolling the
answers (Sinan used my summer absences to pass me as the highest rated
Perl user there). If you're looking for a way promote Perl in a useful
way (and you actually know Perl), consider helping out. Providing good
answers, voting on good answers (and against bad answers), and refining
other answers helps the entire world.</description>
      <dc:date>2010-09-07T20:41:31Z</dc:date>
      <title>How can I troubleshoot my Perl CGI script?</title>
      <pubDate>Tue, 07 Sep 2010 20:41:31 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;Awhile ago I moved my &lt;a href="http://stackoverflow.com/q/2165022/8817"&gt;How can I troubleshoot my Perl CGI script?&lt;/a&gt; to StackOverflow. I'm just getting around to telling everyone about it because it was pretty far down on my to do list. &lt;/p&gt;

&lt;p&gt;I think this has almost pushed the old location on SourceForge out of the googlebrain, but it wouldn't hurt for people to link to it in a blog post, tweet, whatever to encourage Google to find this one. Someday SourceForge will disappear and we won't have to worry about it anymore. How is it even still alive? StackOverflow has pretty good googlejuice though, maybe because Google likes StackOverflow.&lt;/p&gt;

&lt;p&gt;Since it's on StackOverflow, this also means that I'm basically letting go of it. StackOverflow encourages people to revise the questions and answers of other to improve them, and I've given it wiki status to encourage that even more.  &lt;a href="http://stackoverflow.com/q/2165022/8817"&gt;Take a look&lt;/a&gt;, see what I've left out (or left in), what's new and exciting (or old and boring).&lt;/p&gt;

&lt;p&gt;Even if you don't (or can't) edit it just yet, I'd appreciate any comments on how to bring it up to date. Maybe another StackOverflow user can make the changes if I'm too busy.&lt;/p&gt;

&lt;p&gt;Also, sadly, the only thing keeping the bad Perl info out of StackOverflow is a small band of knowledgeable Perlers patrolling the answers (Sinan used my summer absences to pass me as the highest rated Perl user there). If you're looking for a way promote Perl in a useful way (and you actually know Perl), consider helping out. Providing good answers, voting on good answers (and against bad answers), and refining other answers helps the entire world.&lt;/p&gt;

        

    </content:encoded>
      <dcterms:modified>2010-09-07T20:41:31Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.985</guid>
    </item>
    <item>
      <author>nobody@example.com (Robert)</author>
      <dc:creator>nobody@example.com (Robert)</dc:creator>
      <link>http://log.perl.org/2010/09/the-end-of-cpan-testers-10.html</link>
      <description>Thsi is reposted from the CPAN Testers blog:


The End of CPAN Testers 1.0
---------------------------

By CPAN Testers on September 6, 2010 1:28 PM

As of this weekend, the final switch to turn off the SMTP gateway for
CPAN Testers was flipped. You can no longer post anything to the old
cpan-testers mailing list, and any attempts now will result in a bounce
message.

Our thanks to Robert and Ask over at the Perl NOC for looking after us
all these years, and for being very patient with us while we got the HTTP
gateway up and running over the last 9 months.

As a consequence, anyone wishing to still be a part of the CPAN Testers
community, now needs to upgrade their test environments, to use the
latest smokers and associated libraries. In the main this will involve a
simple upgrade of your smoker client and the installation of 4 specific
modules (which in turn will install any additional prerequisites needed).
You will then need to acquire a metabase profile. For full details of the
steps necessary please see the Quick Start page on the CPAN Testers Wiki.

For those casual testers, the upgrade will initially involve some manual
intervention, although we hope to automate this as soon as we can. If you
do have any problems, or are confused by any of the instructions, please
post to the cpan-testers-discuss mailing list, where the developers and
other experienced testers can help you.

The end of an era.</description>
      <dc:date>2010-09-07T16:49:30Z</dc:date>
      <title>The End of CPAN Testers 1.0</title>
      <pubDate>Tue, 07 Sep 2010 16:49:30 -0000</pubDate>
      <content:encoded>&lt;p&gt;Thsi is reposted from the &lt;a href="http://blogs.perl.org/users/cpan_testers/" target="_self"&gt;CPAN Testers blog&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;
  &lt;a href="http://blogs.perl.org/users/cpan_testers/2010/09/the-end-of-cpan-testers-10.html" target="_blank"&gt;The End of CPAN Testers 1.0&lt;/a&gt;
&lt;/h2&gt;
&lt;div&gt;By &lt;a href="http://blogs.perl.org/users/cpan_testers/"&gt;CPAN Testers&lt;/a&gt; on September 6, 2010 1:28 PM&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;As of this weekend, the final switch to turn off the SMTP gateway for CPAN Testers was flipped. You can no longer post anything to the old cpan-testers mailing list, and any attempts now will result in a bounce message.&lt;/p&gt;
&lt;p&gt;Our thanks to &lt;em&gt;&lt;strong&gt;Robert&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Ask&lt;/strong&gt;&lt;/em&gt; over at the &lt;a href="http://log.perl.org/"&gt;Perl NOC&lt;/a&gt; for looking after us all these years, and for being very patient with us while we got the HTTP gateway up and running over the last 9 months.&lt;/p&gt;
&lt;p&gt;As a consequence, anyone wishing to still be a part of the CPAN Testers community, now needs to upgrade their test environments, to use the latest smokers and associated libraries. In the main this will involve a simple upgrade of your smoker client and the installation of 4 specific modules (which in turn will install any additional prerequisites needed). You will then need to acquire a metabase profile. For full details of the steps necessary please see the &lt;a href="http://wiki.cpantesters.org/wiki/QuickStart"&gt;Quick Start&lt;/a&gt; page on the &lt;a href="http://wiki.cpantesters.org/"&gt;CPAN Testers Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those casual testers, the upgrade will initially involve some manual intervention, although we hope to automate this as soon as we can. If you do have any problems, or are confused by any of the instructions, please post to the &lt;a href="http://lists.cpan.org/showlist.cgi?name=cpan-testers-discuss"&gt;cpan-testers-discuss&lt;/a&gt; mailing list, where the developers and other experienced testers can help you.&lt;/p&gt;
&lt;p&gt;The end of an era.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-09-07T16:49:30Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:typepad.com,2003:post-6a00d834203f6853ef0134871139da970c</guid>
    </item>
    <item>
      <author>nobody@example.com (Robert)</author>
      <dc:creator>nobody@example.com (Robert)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/Knexf2ZQA4k/the-end-of-cpan-testers-10.html</link>
      <description>Thsi is reposted from the CPAN Testers blog:


The End of CPAN Testers 1.0
---------------------------

By CPAN Testers on September 6, 2010 1:28 PM

As of this weekend, the final switch to turn off the SMTP gateway for
CPAN Testers was flipped. You can no longer post anything to the old
cpan-testers mailing list, and any attempts now will result in a bounce
message.

Our thanks to Robert and Ask over at the Perl NOC for looking after us
all these years, and for being very patient with us while we got the HTTP
gateway up and running over the last 9 months.

As a consequence, anyone wishing to still be a part of the CPAN Testers
community, now needs to upgrade their test environments, to use the
latest smokers and associated libraries. In the main this will involve a
simple upgrade of your smoker client and the installation of 4 specific
modules (which in turn will install any additional prerequisites needed).
You will then need to acquire a metabase profile. For full details of the
steps necessary please see the Quick Start page on the CPAN Testers Wiki.

For those casual testers, the upgrade will initially involve some manual
intervention, although we hope to automate this as soon as we can. If you
do have any problems, or are confused by any of the instructions, please
post to the cpan-testers-discuss mailing list, where the developers and
other experienced testers can help you.

The end of an era.

[IMAGE]</description>
      <dc:date>2010-09-07T16:49:30Z</dc:date>
      <title>The End of CPAN Testers 1.0</title>
      <pubDate>Tue, 07 Sep 2010 16:49:30 -0000</pubDate>
      <content:encoded>&lt;p&gt;Thsi is reposted from the &lt;a href="http://blogs.perl.org/users/cpan_testers/" target="_self"&gt;CPAN Testers blog&lt;/a&gt;:&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://blogs.perl.org/users/cpan_testers/2010/09/the-end-of-cpan-testers-10.html" target="_blank"&gt;The End of CPAN Testers 1.0&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;By &lt;a href="http://blogs.perl.org/users/cpan_testers/"&gt;CPAN Testers&lt;/a&gt; on September 6, 2010 1:28 PM&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;As of this weekend, the final switch to turn off the SMTP gateway for CPAN Testers was flipped. You can no longer post anything to the old cpan-testers mailing list, and any attempts now will result in a bounce message.&lt;/p&gt;
&lt;p&gt;Our thanks to &lt;em&gt;&lt;strong&gt;Robert&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Ask&lt;/strong&gt;&lt;/em&gt; over at the &lt;a href="http://log.perl.org/"&gt;Perl NOC&lt;/a&gt; for looking after us all these years, and for being very patient with us while we got the HTTP gateway up and running over the last 9 months.&lt;/p&gt;
&lt;p&gt;As a consequence, anyone wishing to still be a part of the CPAN Testers community, now needs to upgrade their test environments, to use the latest smokers and associated libraries. In the main this will involve a simple upgrade of your smoker client and the installation of 4 specific modules (which in turn will install any additional prerequisites needed). You will then need to acquire a metabase profile. For full details of the steps necessary please see the &lt;a href="http://wiki.cpantesters.org/wiki/QuickStart"&gt;Quick Start&lt;/a&gt; page on the &lt;a href="http://wiki.cpantesters.org/"&gt;CPAN Testers Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those casual testers, the upgrade will initially involve some manual intervention, although we hope to automate this as soon as we can. If you do have any problems, or are confused by any of the instructions, please post to the &lt;a href="http://lists.cpan.org/showlist.cgi?name=cpan-testers-discuss"&gt;cpan-testers-discuss&lt;/a&gt; mailing list, where the developers and other experienced testers can help you.&lt;/p&gt;
&lt;p&gt;The end of an era.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/Knexf2ZQA4k"&gt;</content:encoded>
      <dcterms:modified>2010-09-07T16:49:30Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://log.perl.org/2010/09/the-end-of-cpan-testers-10.html</guid>
    </item>
    <item>
      <author>nobody@example.com (CPAN Testers)</author>
      <dc:creator>nobody@example.com (CPAN Testers)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/32u3C-tIKf4/cpan-testers-summary---august-2010---mourning-sun.html</link>
      <description>It's the end of an era. After 11 years from the first official CPAN
Testers test report submission, the cpan-testers mailing list has finally
closed its doors. From now on, anyone sending a test report via SMTP,
will receive a bounce-back email. Most have already upgraded and
reconfigured their smoker clients to use HTTP/S. For those that haven't
or are new testers wanting to start afresh, please read the Quick Start
page on the CPAN Testers Wiki, and join the cpan-testers-discuss mailing
list to ask for help and advice.

For those wondering still wondering why we have moved from SMTP to HTTP
submissions, please see my talk from YAPC::Europe, entitled "CPAN Testers
2.0 - I love it when a plan comes together". It was a talk I tried to
give some background to for our reasons and motivations for the move.
However, the bottom line is that we want CPAN Testers to evolve and grow
further, with more diagnostics and analysis. With the old method of
reporting and submission, that just wasn't possible. We have lots of
ideas to expand the reporting, but first we need CT2.0 to settle in. We
need to make upgrading and installation for anyone, especially our casual
testers as easy as possible. There is still some fine tuning happening,
but we are moving forward.

While at YAPC::Europe this year in Pisa, the White Camel Awards were
announced. Despite being a reluctant recipient, I was awarded one for my
work here with CPAN Testers. While I might be the glue that keeps us
together, it really is all of the CPAN Testers Community that makes it
all worthwhile. Though I saw the value and worth of what we do several
years ago, and perhaps have had more time and motivation to promote what
we do, the award really is a big big thank you to all the testers and
developers who have been a part of CPAN Testers for the past 11 years. It
has been a pleasure meeting many of you at conferences and workshops over
the years, and hopefully I'll get to meet many more in the future. I
started my involvement in CPAN Testers because of a BOF Léon Brocard gave
at YAPC::Europe 2003 in Paris. In turn over the past few years I've
helped to encourage others to become involved. The CPAN Testers Community
has continually evolved and become a very respected community based
testing team, even outside of the echo-chamber. I look forward to what we
can achieve in the next 11 years.

In the final days of the SMTP submissions, I have been back mapping many
of the addresses to people. Last month I also sent out the request email,
for testers to help identify themselves. I had a great response, to which
I thank you all, and managed to update several entries. In addition,
several newer testers have followed my request and used their CPAN/PAUSE
email, or have identified themselves well enough for me to spot them. In
addition I took some time to work though mailing lists, whois entries,
HTML source, open source code and all manner of nooks and crannies around
the internet to identify many more. In all, over the last 2 months I've
mapped 167 addresses to real people, of which 106 are new mappings to
testers never previously identified. Many of these are brand new testers.

Because the new system of registering a profile is slightly different,
the new mechanism to map testers is now also being fed from the Metabase.
As such the new Administration system, that has been waiting in the wings
for over a year, needs a few updates to be able to use both the new and
old systems together. This shouldn't be a huge amount of change, but it
does mean that it will be a little while longer before we can launch it.

One final achievement that needs noting from last month is the fact that
we passed the 8 millionth accepted report submission. 11 years ago, I
wonder if those first testers ever thought that we would have amassed so
many reports. We were getting through roughly 1 million reports every 5-6
months back last year, but the throttling and switch over have reduced
the submissions for the first half of this year. We're starting to see
the numbers climb again, so I expect this time next year we should have
passed the 10 millionth report submission.

Onwards and Upwards....

Cross-posted from The CPAN Testers Blog

[IMAGE]</description>
      <dc:date>2010-09-07T12:39:18Z</dc:date>
      <title>CPAN Testers Summary - August 2010 - Mourning Sun</title>
      <pubDate>Tue, 07 Sep 2010 12:39:18 -0000</pubDate>
      <content:encoded>&lt;p&gt;It's the end of an era. After 11 years from the &lt;a href="http://www.cpantesters.org/cpan/report/6"&gt;first official CPAN Testers test report submission&lt;/a&gt;, the cpan-testers mailing list has &lt;a href="http://blog.cpantesters.org/diary/91"&gt;finally closed its doors&lt;/a&gt;. From now on, anyone sending a test report via SMTP, will receive a bounce-back email. Most have already upgraded and reconfigured their smoker clients to use HTTP/S. For those that haven't or are new testers wanting to start afresh, please read the &lt;a href="http://wiki.cpantesters.org/wiki/QuickStart"&gt;Quick Start&lt;/a&gt; page on the &lt;a href="http://wiki.cpantesters.org"&gt;CPAN Testers Wiki&lt;/a&gt;, and join the &lt;a href="http://lists.cpan.org/showlist.cgi?name=cpan-testers-discuss"&gt;cpan-testers-discuss&lt;/a&gt; mailing list to ask for help and advice.&lt;/p&gt;
&lt;p&gt;For those wondering still wondering why we have moved from SMTP to HTTP submissions, please see my talk from YAPC::Europe, entitled &lt;a href="http://birmingham.pm.org/talks/barbie/ct20"&gt;"CPAN Testers 2.0 - I love it when a plan comes together"&lt;/a&gt;. It was a talk I tried to give some background to for our reasons and motivations for the move. However, the bottom line is that we want CPAN Testers to evolve and grow further, with more diagnostics and analysis. With the old method of reporting and submission, that just wasn't possible. We have lots of ideas to expand the reporting, but first we need CT2.0 to settle in. We need to make upgrading and installation for anyone, especially our casual testers as easy as possible. There is still some fine tuning happening, but we are moving forward.&lt;/p&gt;
&lt;p&gt;While at YAPC::Europe this year in Pisa, the &lt;a href="http://blogs.perl.org/users/brian_d_foy/2010/08/the-2010-white-camel-awards.html"&gt;White Camel Awards&lt;/a&gt; were announced. Despite being a reluctant recipient, I was awarded one for my work here with CPAN Testers. While I might be the glue that keeps us together, it really is all of the CPAN Testers Community that makes it all worthwhile. Though I saw the value and worth of what we do several years ago, and perhaps have had more time and motivation to promote what we do, the award really is a big big thank you to all the testers and developers who have been a part of CPAN Testers for the past 11 years. It has been a pleasure meeting many of you at conferences and workshops over the years, and hopefully I'll get to meet many more in the future. I started my involvement in CPAN Testers because of a BOF &lt;a href="http://search.cpan.org/~lbrocard/"&gt;Léon Brocard&lt;/a&gt; gave at YAPC::Europe 2003 in Paris. In turn over the past few years I've helped to encourage others to become involved. The CPAN Testers Community has continually evolved and become a very respected community based testing team, even outside of the echo-chamber. I look forward to what we can achieve in the next 11 years.&lt;/p&gt;
&lt;p&gt;In the final days of the SMTP submissions, I have been back mapping many of the addresses to people. Last month I also sent out the request email, for testers to help identify themselves. I had a great response, to which I thank you all, and managed to update several entries. In addition, several newer testers have followed my request and used their CPAN/PAUSE email, or have identified themselves well enough for me to spot them. In addition I took some time to work though mailing lists, whois entries, HTML source, open source code and all manner of nooks and crannies around the internet to identify many more. In all, over the last 2 months I've mapped 167 addresses to real people, of which 106 are new mappings to testers never previously identified. Many of these are brand new testers.&lt;/p&gt;
&lt;p&gt;Because the new system of registering a profile is slightly different, the new mechanism to map testers is now also being fed from the Metabase. As such the new Administration system, that has been waiting in the wings for over a year, needs a few updates to be able to use both the new and old systems together. This shouldn't be a huge amount of change, but it does mean that it will be a little while longer before we can launch it.&lt;/p&gt;
&lt;p&gt;One final achievement that needs noting from last month is the fact that we passed the &lt;a href="http://blog.cpantesters.org/diary/89"&gt;8 millionth accepted report submission&lt;/a&gt;. 11 years ago, I wonder if those first testers ever thought that we would have amassed so many reports. We were getting through roughly 1 million reports every 5-6 months back last year, but the throttling and switch over have reduced the submissions for the first half of this year. We're starting to see the numbers climb again, so I expect this time next year we should have passed the 10 millionth report submission.&lt;/p&gt;
&lt;p&gt;Onwards and Upwards....&lt;/p&gt;
&lt;p&gt;Cross-posted from &lt;a href="http://blog.cpantesters.org/diary/92"&gt;The CPAN Testers Blog&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/32u3C-tIKf4"&gt;</content:encoded>
      <dcterms:modified>2010-09-07T12:39:18Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/cpan_testers//73.983</guid>
    </item>
    <item>
      <author>nobody@example.com (Sawyer X)</author>
      <dc:creator>nobody@example.com (Sawyer X)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/f_hUmE-d1qQ/awesome-perl-projects-pt-1.html</link>
      <description>I hope to showcase and talk about a great Perl project every once in a
while. Hope this lasts beyond one post. :)

We recently added emailing capabilities to an in-house application.
Unfortunately sending the emails adds roughly 1 minute to the runtime. I
decided to take a gander at swaks and see how it's being done there.

Swaks (SMTP transaction tester) is a great application for all systems
administrators. It takes the pain away from testing email setups. Instead
of echo msg | mailx -n -t ... and thinking of whether it's heirloom
mailx, mail, nail or which version of mail it is, or whether you're using
sendmail or exim or qmail or postfix (and in comes the headache...) - you
can just write swaks -t addr -f addr. You don't even need the from field,
but it's just as easy to add.

Swaks saves you the trouble of tailing logs and instead just shows you
everything that's going on in the transport. It's easy to work with and
it supports a lot of other options: it works with piping, unix sockets,
input/output files, attachments, TLS, authentication, supports 12 mail
protocols (from SMTP to LMTPSA), can work as a server(!) and much more!

Swaks is truly one of the most awesome Perl projects in any sysadmin
book. Let's look at the core.

The good parts:


  * It uses strict!


  * It's divides to subroutines (that make sense).


  * The code is documented.


  * The application is documented (in POD!).


  * Clear code, skimmable.


  * Relatively concise, compared to the amount of stuff it can do.


  * Well thought-out as an application.


  * I could not find a single bad thing about this program, only
    not-so-good stuff.


The not-so-good parts:


  * Old indirect style of creating objects.


  * No warnings.


  * I wish more modules would be used to remove a lot of the code
    handling cmd opts.


  (today using App::FatPacker this is no longer much of a problem)


Overall: This is an excellent project and something of which Perl should
be proud, IMHO.

[IMAGE]</description>
      <dc:date>2010-09-07T08:24:16Z</dc:date>
      <title>Awesome Perl projects PT. 1</title>
      <pubDate>Tue, 07 Sep 2010 08:24:16 -0000</pubDate>
      <content:encoded>&lt;p&gt;I hope to showcase and talk about a great Perl project every once in a while. Hope this lasts beyond one post. :)&lt;/p&gt;

&lt;p&gt;We recently added emailing capabilities to an in-house application. Unfortunately sending the emails adds roughly 1 minute to the runtime. I decided to take a gander at &lt;strong&gt;swaks&lt;/strong&gt; and see how it's being done there.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jetmore.org/john/code/swaks/"&gt;Swaks (SMTP transaction tester)&lt;/a&gt; is a great application for all systems administrators. It takes the pain away from testing email setups. Instead of &lt;em&gt;echo msg | mailx -n -t ...&lt;/em&gt; and thinking of whether it's heirloom mailx, mail, nail or which version of mail it is, or whether you're using sendmail or exim or qmail or postfix (and in comes the headache...) - you can just write &lt;em&gt;swaks -t addr -f addr&lt;/em&gt;. You don't even need the from field, but it's just as easy to add.&lt;/p&gt;

&lt;p&gt;Swaks saves you the trouble of tailing logs and instead just shows you everything that's going on in the transport. It's easy to work with and it supports &lt;strong&gt;a lot&lt;/strong&gt; of other options: it works with piping, unix sockets, input/output files, attachments, TLS, authentication, supports 12 mail protocols (from SMTP to LMTPSA), can work as a server(!) and much more!&lt;/p&gt;

&lt;p&gt;Swaks is truly one of the most awesome Perl projects in any sysadmin book. Let's look at the core.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;The good parts:&lt;/u&gt;&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;
	&lt;li&gt;It uses strict!&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;It's divides to subroutines (that make sense).&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;The code is documented.&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;The application is documented (in POD!).&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Clear code, skimmable.&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Relatively concise, compared to the amount of stuff it can do.&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Well thought-out as an application.&lt;/li&gt;&lt;br /&gt;
        &lt;li&gt;I could not find a single bad thing about this program, only not-so-good stuff.&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;The not-so-good parts:&lt;/u&gt;&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;
	&lt;li&gt;Old indirect style of creating objects.&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;No warnings.&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;I wish more modules would be used to remove a lot of the code handling cmd opts.&lt;/li&gt;&lt;br /&gt;
&lt;em&gt;(today using App::FatPacker this is no longer much of a problem)&lt;/em&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;
&lt;u&gt;Overall:&lt;/u&gt; This is an excellent project and something of which Perl should be proud, IMHO.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/f_hUmE-d1qQ"&gt;</content:encoded>
      <dcterms:modified>2010-09-07T08:24:16Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/sawyer_x//87.982</guid>
    </item>
    <item>
      <author>nobody@example.com (Sawyer X)</author>
      <dc:creator>nobody@example.com (Sawyer X)</dc:creator>
      <category>Perl</category>
      <link>http://blogs.perl.org/users/sawyer_x/2010/09/awesome-perl-projects-pt-1.html</link>
      <description>I hope to showcase and talk about a great Perl project every once in a
while. Hope this lasts beyond one post. :)

We recently added emailing capabilities to an in-house application.
Unfortunately sending the emails adds roughly 1 minute to the runtime. I
decided to take a gander at swaks and see how it's being done there.

Swaks (SMTP transaction tester) is a great application for all systems
administrators. It takes the pain away from testing email setups. Instead
of echo msg | mailx -n -t ... and thinking of whether it's heirloom
mailx, mail, nail or which version of mail it is, or whether you're using
sendmail or exim or qmail or postfix (and in comes the headache...) - you
can just write swaks -t addr -f addr. You don't even need the from field,
but it's just as easy to add.

Swaks saves you the trouble of tailing logs and instead just shows you
everything that's going on in the transport. It's easy to work with and
it supports a lot of other options: it works with piping, unix sockets,
input/output files, attachments, TLS, authentication, supports 12 mail
protocols (from SMTP to LMTPSA), can work as a server(!) and much more!

Swaks is truly one of the most awesome Perl projects in any sysadmin
book. Let's look at the core.

The good parts:


  * It uses strict!


  * It's divides to subroutines (that make sense).


  * The code is documented.


  * The application is documented (in POD!).


  * Clear code, skimmable.


  * Relatively concise, compared to the amount of stuff it can do.


  * Well thought-out as an application.


  * I could not find a single bad thing about this program, only
    not-so-good stuff.


The not-so-good parts:


  * Old indirect style of creating objects.


  * No warnings.


  * I wish more modules would be used to remove a lot of the code
    handling cmd opts.


  (today using App::FatPacker this is no longer much of a problem)


Overall: This is an excellent project and something of which Perl should
be proud, IMHO.</description>
      <dc:date>2010-09-07T06:58:57Z</dc:date>
      <dc:subject>Perl</dc:subject>
      <title>Awesome Perl projects PT. 1</title>
      <pubDate>Tue, 07 Sep 2010 06:58:57 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;I hope to showcase and talk about a great Perl project every once in a while. Hope this lasts beyond one post. :)&lt;/p&gt;

&lt;p&gt;We recently added emailing capabilities to an in-house application. Unfortunately sending the emails adds roughly 1 minute to the runtime. I decided to take a gander at &lt;strong&gt;swaks&lt;/strong&gt; and see how it's being done there.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://jetmore.org/john/code/swaks/"&gt;Swaks (SMTP transaction tester)&lt;/a&gt; is a great application for all systems administrators. It takes the pain away from testing email setups. Instead of &lt;em&gt;echo msg | mailx -n -t ...&lt;/em&gt; and thinking of whether it's heirloom mailx, mail, nail or which version of mail it is, or whether you're using sendmail or exim or qmail or postfix (and in comes the headache...) - you can just write &lt;em&gt;swaks -t addr -f addr&lt;/em&gt;. You don't even need the from field, but it's just as easy to add.&lt;/p&gt;

&lt;p&gt;Swaks saves you the trouble of tailing logs and instead just shows you everything that's going on in the transport. It's easy to work with and it supports &lt;strong&gt;a lot&lt;/strong&gt; of other options: it works with piping, unix sockets, input/output files, attachments, TLS, authentication, supports 12 mail protocols (from SMTP to LMTPSA), can work as a server(!) and much more!&lt;/p&gt;

&lt;p&gt;Swaks is truly one of the most awesome Perl projects in any sysadmin book. Let's look at the core.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;The good parts:&lt;/u&gt;&lt;br/&gt;
&lt;ul&gt;&lt;br/&gt;
	&lt;li&gt;It uses strict!&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;It's divides to subroutines (that make sense).&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;The code is documented.&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;The application is documented (in POD!).&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;Clear code, skimmable.&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;Relatively concise, compared to the amount of stuff it can do.&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;Well thought-out as an application.&lt;/li&gt;&lt;br/&gt;
        &lt;li&gt;I could not find a single bad thing about this program, only not-so-good stuff.&lt;/li&gt;&lt;br/&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;The not-so-good parts:&lt;/u&gt;&lt;br/&gt;
&lt;ul&gt;&lt;br/&gt;
	&lt;li&gt;Old indirect style of creating objects.&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;No warnings.&lt;/li&gt;&lt;br/&gt;
	&lt;li&gt;I wish more modules would be used to remove a lot of the code handling cmd opts.&lt;/li&gt;&lt;br/&gt;
&lt;em&gt;(today using App::FatPacker this is no longer much of a problem)&lt;/em&gt;&lt;br/&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;&lt;br/&gt;
&lt;u&gt;Overall:&lt;/u&gt; This is an excellent project and something of which Perl should be proud, IMHO.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-09-07T06:58:57Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:blogs.perl.org,2010:/users/sawyer_x//87.982</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/7DpRu9_7S2A/an-index-for-the-perl-journal-articles.html</link>
      <description>A couple of years ago I put together a list of The Perl Journal articles
I could find on the Dr. Dobbs website. They changed some of their URLs,
so I updated those to avoid all of the redirects and in the process found
several more articles. My TPJ index is on Perlmonks. You can see some of
the beginnings of popular projects, such as Moose, in some of the
articles.

[IMAGE]</description>
      <dc:date>2010-09-07T02:37:37Z</dc:date>
      <title>An index for The Perl Journal articles</title>
      <pubDate>Tue, 07 Sep 2010 02:37:37 -0000</pubDate>
      <content:encoded>&lt;p&gt;A couple of years ago I put together a list of &lt;i&gt;The Perl Journal&lt;/i&gt; articles I could find on the Dr. Dobbs website. They changed some of their URLs, so I updated those to avoid all of the redirects and in the process found several more articles. &lt;a href="http://www.perlmonks.org/index.pl?node_id=711609"&gt;My TPJ index is on Perlmonks&lt;/a&gt;. You can see some of the beginnings of popular projects, such as Moose, in some of the articles.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/7DpRu9_7S2A"&gt;</content:encoded>
      <dcterms:modified>2010-09-07T02:37:37Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.981</guid>
    </item>
    <item>
      <author>nobody@example.com (brian d foy)</author>
      <dc:creator>nobody@example.com (brian d foy)</dc:creator>
      <link>http://blogs.perl.org/users/brian_d_foy/2010/09/an-index-for-the-perl-journal-articles.html</link>
      <description>A couple of years ago I put together a list of The Perl Journal articles
I could find on the Dr. Dobbs website. They changed some of their URLs,
so I updated those to avoid all of the redirects and in the process found
several more articles. My TPJ index is on Perlmonks. You can see some of
the beginnings of popular projects, such as Moose, in some of the
articles.</description>
      <dc:date>2010-09-07T02:35:03Z</dc:date>
      <title>An index for The Perl Journal articles</title>
      <pubDate>Tue, 07 Sep 2010 02:35:03 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;A couple of years ago I put together a list of &lt;i&gt;The Perl Journal&lt;/i&gt; articles I could find on the Dr. Dobbs website. They changed some of their URLs, so I updated those to avoid all of the redirects and in the process found several more articles. &lt;a href="http://www.perlmonks.org/index.pl?node_id=711609"&gt;My TPJ index is on Perlmonks&lt;/a&gt;. You can see some of the beginnings of popular projects, such as Moose, in some of the articles.&lt;/p&gt;
        
    </content:encoded>
      <dcterms:modified>2010-09-07T02:35:03Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:tag:blogs.perl.org,2010:/users/brian_d_foy//178.981</guid>
    </item>
    <item>
      <author>nobody@example.com (chromatic)</author>
      <dc:creator>nobody@example.com (chromatic)</dc:creator>
      <category>modern perl perl perl 5 perl mongers portland talks</category>
      <link>http://www.modernperlbooks.com/mt/2010/09/essential-philosophy-for-perl-5-novices.html</link>
      <description>If you're in the Portland, Oregon area, come to the Portland Perl Mongers
September 2010 Meeting on Wednesday, September 8.

Not only will Schwern talk about Test::Builder 2 (Test::Builder is the
foundation of the Perl Testing Revolution), but I'll talk about what
novices must understand about Perl 5 before they can become adepts.

We're experimenting this month with a combination of novice-friendly
primers and deeper subjects. We'd love to attract more people interested
in Perl but not necessarily experts as well as people who've never
written much Perl at all. Tell your friends.

... and for a preview of my talk, I'll explain:

  * The two types of context in Perl 5

  * What context really means, and why you already understand it

  * What implicit variables really mean and why you already understand
    them

  * What concision means and why it's not as scary as you think

  * How to chunk Perl expressions into parts you already understand

  * How to navigate the Perl 5 documentation

If you can't make the meeting, I'm sure a podcast will eventually appear.
You could also read the draft of Modern Perl chapter 1 for an overview.</description>
      <dc:date>2010-09-06T19:49:54Z</dc:date>
      <dc:subject>modern perl perl perl 5 perl mongers portland talks</dc:subject>
      <title>Essential Philosophy for Perl 5 Novices</title>
      <pubDate>Mon, 06 Sep 2010 19:49:54 -0000</pubDate>
      <content:encoded>
        &lt;p&gt;If you're in the Portland, Oregon area, come to the &lt;a href="http://pdx.pm.org/kwiki/index.cgi?September2010Meeting"&gt;Portland Perl Mongers September 2010 Meeting&lt;/a&gt; on Wednesday, September 8.&lt;/p&gt;

&lt;p&gt;Not only will Schwern talk about Test::Builder 2 (&lt;a href="http://search.cpan.org/perldoc?Test::Builder"&gt;Test::Builder&lt;/a&gt; is the foundation of the &lt;a href="http://www.modernperlbooks.com/mt/2009/04/a-test-infected-culture.html"&gt;Perl Testing Revolution&lt;/a&gt;), but I'll talk about what novices must understand about Perl 5 before they can become adepts.&lt;/p&gt;

&lt;p&gt;We're experimenting this month with a combination of novice-friendly primers and deeper subjects.  We'd love to attract more people interested in Perl but not necessarily experts as well as people who've never written much Perl at all.  Tell your friends.&lt;/p&gt;

&lt;p&gt;... and for a preview of my talk, I'll explain:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;The two types of context in Perl 5&lt;/li&gt;
&lt;li&gt;What context really means, and why you already understand it&lt;/li&gt;
&lt;li&gt;What implicit variables really mean and why you already understand them&lt;/li&gt;
&lt;li&gt;What concision means and why it's not as scary as you think&lt;/li&gt;
&lt;li&gt;How to chunk Perl expressions into parts you already understand&lt;/li&gt;
&lt;li&gt;How to navigate the Perl 5 documentation&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If you can't make the meeting, I'm sure a podcast will eventually appear.  You could also read &lt;a href="http://www.modernperlbooks.com/drafts/modern_perl/chapter_01.html"&gt;the draft of Modern Perl chapter 1&lt;/a&gt; for an overview.&lt;/p&gt;

        
    </content:encoded>
      <dcterms:modified>2010-09-06T19:49:54Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:www.modernperlbooks.com,2010:/mt//1.225</guid>
    </item>
    <item>
      <author>nobody@example.com (CPAN Testers)</author>
      <dc:creator>nobody@example.com (CPAN Testers)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/y6-DXLMnxUE/the-end-of-cpan-testers-10.html</link>
      <description>As of this weekend, the final switch to turn off the SMTP gateway for
CPAN Testers was flipped. You can no longer post anything to the old
cpan-testers mailing list, and any attempts now will result in a bounce
message.

Our thanks to Robert and Ask over at the Perl NOC for looking after us
all these years, and for being very patient with us while we got the HTTP
gateway up and running over the last 9 months.

As a consequence, anyone wishing to still be a part of the CPAN Testers
community, now needs to upgrade their test environments, to use the
latest smokers and associated libraries. In the main this will involve a
simple upgrade of your smoker client and the installation of 4 specific
modules (which in turn will install any additional prerequisites needed).
You will then need to acquire a metabase profile. For full details of the
steps necessary please see the Quick Start page on the CPAN Testers Wiki.

For those casual testers, the upgrade will initially involve some manual
intervention, although we hope to automate this as soon as we can. If you
do have any problems, or are confused by any of the instructions, please
post to the cpan-testers-discuss mailing list, where the developers and
other experienced testers can help you.

The end of an era.

[IMAGE]</description>
      <dc:date>2010-09-06T12:29:10Z</dc:date>
      <title>The End of CPAN Testers 1.0</title>
      <pubDate>Mon, 06 Sep 2010 12:29:10 -0000</pubDate>
      <content:encoded>&lt;p&gt;As of this weekend, the final switch to turn off the SMTP gateway for CPAN Testers was flipped. You can no longer post anything to the old cpan-testers mailing list, and any attempts now will result in a bounce message.&lt;/p&gt;
&lt;p&gt;Our thanks to &lt;em&gt;&lt;strong&gt;Robert&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Ask&lt;/strong&gt;&lt;/em&gt; over at the &lt;a href="http://log.perl.org/"&gt;Perl NOC&lt;/a&gt; for looking after us all these years, and for being very patient with us while we got the HTTP gateway up and running over the last 9 months.&lt;/p&gt;
&lt;p&gt;As a consequence, anyone wishing to still be a part of the CPAN Testers community, now needs to upgrade their test environments, to use the latest smokers and associated libraries. In the main this will involve a simple upgrade of your smoker client and the installation of 4 specific modules (which in turn will install any additional prerequisites needed). You will then need to acquire a metabase profile. For full details of the steps necessary please see the &lt;a href="http://wiki.cpantesters.org/wiki/QuickStart"&gt;Quick Start&lt;/a&gt; page on the &lt;a href="http://wiki.cpantesters.org/"&gt;CPAN Testers Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those casual testers, the upgrade will initially involve some manual intervention, although we hope to automate this as soon as we can. If you do have any problems, or are confused by any of the instructions, please post to the &lt;a href="http://lists.cpan.org/showlist.cgi?name=cpan-testers-discuss"&gt;cpan-testers-discuss&lt;/a&gt; mailing list, where the developers and other experienced testers can help you.&lt;/p&gt;
&lt;p&gt;The end of an era.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/y6-DXLMnxUE"&gt;</content:encoded>
      <dcterms:modified>2010-09-06T12:29:10Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:blogs.perl.org,2010:/users/cpan_testers//73.974</guid>
    </item>
    <item>
      <author>nobody@example.com (masak)</author>
      <dc:creator>nobody@example.com (masak)</dc:creator>
      <category>perl6</category>
      <link>http://use.perl.org/~masak/journal/40524?from=rss</link>
      <description>This weekend marks the end of a quite astonishing era. The Pugs repo, that hosted all the amazing Perl 6 activity, is no more. At its height, this repository had 242 committers! I just checked.The Pugs repository has functioned as a common writing area for Perl 6-related things. First Pugs; then a lot of external modules and scripts written in Perl 6; what would eventually morph into the Perl 6 test suite; even the Perl 6 specification and the standard grammar. Commit bits (write access credentials) were handed out liberally, and newcomers were encouraged to help improve things they found amiss. The degree to which this system worked without a hitch has been quite astonishing. There have been no edit wars, no vandalism, no banning. Just the continuing flow of commits. Trust the anarchy.So why are we killing off the Pugs repository? Well, technologies come and go; not so much because they worsen by each year, but because our expectations rise in a sort of software inflation. The SVN repository became too high-maintenance, and a transition to git was the natural next step. The Pugs repository has been split up into the git repositories linked to in the previous paragraph. Those bits that don't belong in any of the standard bins remain in the Mu repository. (Its name is a reference to the most-general object type in Perl 6, what in other languages is commonly known as 'Object'.)I for one salute our new git-based overlords! May the commits keep flowing even under this new system. Also, moritz++ for carrying out the move.</description>
      <dc:date>2010-09-06T06:30:29Z</dc:date>
      <dc:subject>perl6</dc:subject>
      <title>The Pugs repository is dead; long live Mu! (2010.09.06  2:30)</title>
      <pubDate>Mon, 06 Sep 2010 06:30:29 -0000</pubDate>
      <content:encoded>This weekend marks the end of a quite astonishing era. The Pugs repo, that hosted all the amazing Perl 6 activity, is no more. At its height, this repository had 242 committers! I just checked.The Pugs repository has functioned as a common writing area for Perl 6-related things. First Pugs; then a lot of external modules and scripts written in Perl 6; what would eventually morph into the Perl 6 test suite; even the Perl 6 specification and the standard grammar. Commit bits (write access credentials) were handed out liberally, and newcomers were encouraged to help improve things they found amiss. The degree to which this system worked without a hitch has been quite astonishing. There have been no edit wars, no vandalism, no banning. Just the continuing flow of commits. Trust the anarchy.So why are we killing off the Pugs repository? Well, technologies come and go; not so much because they worsen by each year, but because our expectations rise in a sort of software inflation. The SVN repository became too high-maintenance, and a transition to git was the natural next step. The Pugs repository has been split up into the git repositories linked to in the previous paragraph. Those bits that don't belong in any of the standard bins remain in the Mu repository. (Its name is a reference to the most-general object type in Perl 6, what in other languages is commonly known as 'Object'.)I for one salute our new git-based overlords! May the commits keep flowing even under this new system. Also, moritz++ for carrying out the move.</content:encoded>
      <dcterms:modified>2010-09-06T06:30:29Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://use.perl.org/~masak/journal/40524?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Jared)</author>
      <dc:creator>nobody@example.com (Jared)</dc:creator>
      <category>Perl portability</category>
      <link>http://curiousprogrammer.wordpress.com/2010/09/06/disappearing-cpan-modules/</link>
      <description>Somewhere in my Super Programming Languages post, I asserted that in some
of my scripts, 95% of the work has already been done by third party
libraries. Such is the power of the CPAN! And other folks obviously use
Perl for similar reasons – there are libraries available that solve at
least part of their problem.

So, I’m surprised when people complain that libraries have been provided
that help them out.

Steve obviously had second thoughts over publishing this post (google
cache). Is blogpost necrophilia reasonable here? I’m afraid I’ve seen
other people make similar arguments, and I can’t remember the location of
their posts. Sorry Steve.

Ok, so from that, I can gather this: I’m screwed because I used perl for
a script, and now the module author has decided to completely abandon the
module, because it is based upon another module that doesn’t install
worth anything. Cool!

He used an extremely useful and mature scripting language and a module
that solves part of his problem. Because the module doesn’t work with a
later version of that excellent scripting language, he’s doomed, doomed,
DOOMED I tell you. And of course, it’s Perl’s fault.

The first thing is that he’s not doomed. He is simply going to have to
find an alternative module or implement the functionality provided by the
module himself. He’d have had to do that if the module wasn’t provided
anyway. So in no way was he disadvantaged by having the module (and Perl)
available.

The other thing is that this happens in every changing environment. Say
your C++ compiler upgrades and you were inadvertently depending on a
particular bug. Oops! (Don’t laugh – it happens). If your firm upgrades
Excel to version 2000007, maybe your macros aren’t going to run any more.
We’re moving to a 64-bit OS and I’m glad there’s a bunch of Perl that I
can be confident will more or less work. I’m not looking forward to
porting the C++ though.

To try and add a fair and balanced viewpoint, I should point out that
part of the argument does make sense. It is disappointing that
Daemon::Simpler has gone from Backpan. Having said that, sometimes it is
important to take some responsibility. Any module that I bring into our
production environment is archived as is the current version of perl
we’re using.


Filed under: Perl Tagged: portability</description>
      <dc:date>2010-09-06T04:30:18Z</dc:date>
      <dc:subject>Perl portability</dc:subject>
      <title>Disappearing CPAN Modules</title>
      <pubDate>Mon, 06 Sep 2010 04:30:18 -0000</pubDate>
      <content:encoded>&lt;p&gt;Somewhere in my &lt;a href="http://curiousprogrammer.wordpress.com/2010/05/31/super-programming-languages/"&gt;Super Programming Languages&lt;/a&gt; post, I asserted that in some of my scripts, 95% of the work has already been done by third party libraries.  Such is the power of the CPAN!  And other folks obviously use Perl for similar reasons &amp;#8211; there are libraries available that solve at least part of their problem.&lt;/p&gt;
&lt;p&gt;So, I&amp;#8217;m surprised when people complain that libraries have been provided that help them out.&lt;/p&gt;
&lt;p&gt;Steve obviously had second thoughts over publishing &lt;a href="http://webcache.googleusercontent.com/search?q=cache:PTRe_rO17Y4J:www.red-green.com/2010/09/why-perl-sucks-daemonsimpler/"&gt;this post&lt;/a&gt; (google cache).  Is blogpost necrophilia reasonable here?  I&amp;#8217;m afraid I&amp;#8217;ve seen other people make similar arguments, and I can&amp;#8217;t remember the location of their posts.  Sorry Steve.&lt;/p&gt;
&lt;div&gt;&lt;em&gt;Ok, so from that, I can gather this:  I&amp;#8217;m screwed because I used perl for a script, and now the module author has decided to completely abandon the module, because it is based upon another module that doesn&amp;#8217;t install worth anything.  Cool!&lt;/em&gt;&lt;/div&gt;
&lt;p&gt;He used an extremely useful and mature scripting language &lt;strong&gt;and&lt;/strong&gt; a module that solves part of his problem.  Because the module doesn&amp;#8217;t work with a later version of that excellent scripting language, he&amp;#8217;s doomed, doomed, DOOMED I tell you.  And of course, it&amp;#8217;s Perl&amp;#8217;s fault.&lt;/p&gt;
&lt;p&gt;The first thing is that he&amp;#8217;s not doomed.  He is simply going to have to find an alternative module or implement the functionality provided by the module himself.  He&amp;#8217;d have had to do that if the module wasn&amp;#8217;t provided anyway.  So in no way was he disadvantaged by having the module (and Perl) available.&lt;/p&gt;
&lt;p&gt;The other thing is that this happens in every changing environment.  Say your C++ compiler upgrades and you were inadvertently depending on a particular bug.  Oops!  (Don&amp;#8217;t laugh &amp;#8211; it happens).  If your firm upgrades Excel to version 2000007, maybe your macros aren&amp;#8217;t going to run any more.  We&amp;#8217;re moving to a 64-bit OS and I&amp;#8217;m glad there&amp;#8217;s a bunch of Perl that I can be confident will more or less work.  I&amp;#8217;m not looking forward to porting the C++ though.&lt;/p&gt;
&lt;p&gt;To try and add a fair and balanced viewpoint, I should point out that part of the argument does make sense.  It is disappointing that &lt;code&gt;Daemon::Simpler&lt;/code&gt; has gone from Backpan.  Having said that, sometimes it is important to take some responsibility.  Any module that I bring into our production environment is archived as is the current version of perl we&amp;#8217;re using.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href="http://curiousprogrammer.wordpress.com/category/programming/perl-programming/"&gt;Perl&lt;/a&gt; Tagged: &lt;a href="http://curiousprogrammer.wordpress.com/tag/portability/"&gt;portability&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/delicious/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/facebook/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/twitter/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/stumble/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/digg/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/curiousprogrammer.wordpress.com/1251/"&gt;&lt;img alt="" src="http://feeds.wordpress.com/1.0/reddit/curiousprogrammer.wordpress.com/1251/"&gt;&lt;/a&gt; &lt;img alt="" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&amp;amp;blog=367204&amp;amp;post=1251&amp;amp;subd=curiousprogrammer&amp;amp;ref=&amp;amp;feed=1"&gt;</content:encoded>
      <dcterms:modified>2010-09-06T04:30:18Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://curiousprogrammer.wordpress.com/?p=1251</guid>
    </item>
    <item>
      <author>nobody@example.com (Alias)</author>
      <dc:creator>nobody@example.com (Alias)</dc:creator>
      <category>journal</category>
      <link>http://use.perl.org/~Alias/journal/40523?from=rss</link>
      <description>Module::Install has been through a long period of gradual stability over
the last year, without any really dramatic improvements to the grammar or
APIs.

With the more urgent "it doesn't work with blah" stuff mostly solved now,
one of the big remaining issues is around error clarity and excessive
magic.

For example, some random author that is trying to checkout a Catalyst
project needs:

1. To have Module::Install installed.
2. To have Module::Install::Catalyst installed.

In the case of the former, you get the semi-cryptic but at least standard
"Can't find inc/Module/Install.pm in @INC" message, so the error is
resolvable.

But in the latter case, you're likely to get something like "Unknown
command 'catalyst_ignore'", with no real obvious resolution mechanism.

I think this idea of automatic plugin discovery is starting to hit it's
limits in terms of clarity.

And so I'd like to do something counter to my natural instincts here, and
make M:I more verbose.

I'm thinking of something like the following for explicitly declaring the
use of a non-core Module::Install extension.

  use inc::Module::Install qw{ Catalyst XSUtil };

This would both allow M:I to error with a much more meaningful error when
you don't have a plugin, and also prevent the loading of unused plugins
which should prevent accidental plugin collisions (some of which I've
seen occurring in the CPAN Testers machines).

Thoughts?</description>
      <dc:date>2010-09-06T02:26:06Z</dc:date>
      <dc:subject>journal</dc:subject>
      <title>Should Module::Install move to explicit plugin declaration? (2010.09.05 22:26)</title>
      <pubDate>Mon, 06 Sep 2010 02:26:06 -0000</pubDate>
      <content:encoded>&lt;p&gt;Module::Install has been through a long period of gradual stability over the last year, without any really dramatic improvements to the grammar or APIs.&lt;/p&gt;&lt;p&gt;With the more urgent "it doesn't work with blah" stuff mostly solved now, one of the big remaining issues is around error clarity and excessive magic.&lt;/p&gt;&lt;p&gt;For example, some random author that is trying to checkout a Catalyst project needs:&lt;/p&gt;&lt;p&gt;1. To have Module::Install installed.&lt;br&gt;2. To have Module::Install::Catalyst installed.&lt;/p&gt;&lt;p&gt;In the case of the former, you get the semi-cryptic but at least standard "Can't find inc/Module/Install.pm in @INC" message, so the error is resolvable.&lt;/p&gt;&lt;p&gt;But in the latter case, you're likely to get something like "Unknown command 'catalyst_ignore'", with no real obvious resolution mechanism.&lt;/p&gt;&lt;p&gt;I think this idea of automatic plugin discovery is starting to hit it's limits in terms of clarity.&lt;/p&gt;&lt;p&gt;And so I'd like to do something counter to my natural instincts here, and make M:I more verbose.&lt;/p&gt;&lt;p&gt;I'm thinking of something like the following for explicitly declaring the use of a non-core Module::Install extension.&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;use inc::Module::Install qw{ Catalyst XSUtil };&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;This would both allow M:I to error with a much more meaningful error when you don't have a plugin, and also prevent the loading of unused plugins which should prevent accidental plugin collisions (some of which I've seen occurring in the CPAN Testers machines).&lt;/p&gt;&lt;p&gt;Thoughts?&lt;/p&gt;</content:encoded>
      <dcterms:modified>2010-09-06T02:26:06Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://use.perl.org/~Alias/journal/40523?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Alias)</author>
      <dc:creator>nobody@example.com (Alias)</dc:creator>
      <link>http://feedproxy.google.com/~r/PlanetPerl/~3/oHJVzg-J8N4/40523</link>
      <description>Module::Install has been through a long period of gradual stability over
the last year, without any really dramatic improvements to the grammar or
APIs.

With the more urgent "it doesn't work with blah" stuff mostly solved now,
one of the big remaining issues is around error clarity and excessive
magic.

For example, some random author that is trying to checkout a Catalyst
project needs:

1. To have Module::Install installed.
2. To have Module::Install::Catalyst installed.

In the case of the former, you get the semi-cryptic but at least standard
"Can't find inc/Module/Install.pm in @INC" message, so the error is
resolvable.

But in the latter case, you're likely to get something like "Unknown
command 'catalyst_ignore'", with no real obvious resolution mechanism.

I think this idea of automatic plugin discovery is starting to hit it's
limits in terms of clarity.

And so I'd like to do something counter to my natural instincts here, and
make M:I more verbose.

I'm thinking of something like the following for explicitly declaring the
use of a non-core Module::Install extension.

  use inc::Module::Install qw{ Catalyst XSUtil };

This would both allow M:I to error with a much more meaningful error when
you don't have a plugin, and also prevent the loading of unused plugins
which should prevent accidental plugin collisions (some of which I've
seen occurring in the CPAN Testers machines).

Thoughts?

[IMAGE]</description>
      <dc:date>2010-09-06T02:26:06Z</dc:date>
      <title>Should Module::Install move to explicit plugin declaration?</title>
      <pubDate>Mon, 06 Sep 2010 02:26:06 -0000</pubDate>
      <content:encoded>&lt;p&gt;Module::Install has been through a long period of gradual stability over the last year, without any really dramatic improvements to the grammar or APIs.&lt;/p&gt;&lt;p&gt;With the more urgent "it doesn't work with blah" stuff mostly solved now, one of the big remaining issues is around error clarity and excessive magic.&lt;/p&gt;&lt;p&gt;For example, some random author that is trying to checkout a Catalyst project needs:&lt;/p&gt;&lt;p&gt;1. To have Module::Install installed.&lt;br /&gt;2. To have Module::Install::Catalyst installed.&lt;/p&gt;&lt;p&gt;In the case of the former, you get the semi-cryptic but at least standard "Can't find inc/Module/Install.pm in @INC" message, so the error is resolvable.&lt;/p&gt;&lt;p&gt;But in the latter case, you're likely to get something like "Unknown command 'catalyst_ignore'", with no real obvious resolution mechanism.&lt;/p&gt;&lt;p&gt;I think this idea of automatic plugin discovery is starting to hit it's limits in terms of clarity.&lt;/p&gt;&lt;p&gt;And so I'd like to do something counter to my natural instincts here, and make M:I more verbose.&lt;/p&gt;&lt;p&gt;I'm thinking of something like the following for explicitly declaring the use of a non-core Module::Install extension.&lt;/p&gt;&lt;blockquote&gt;&lt;div&gt;&lt;p&gt; &lt;tt&gt;use inc::Module::Install qw{ Catalyst XSUtil };&lt;/tt&gt;&lt;/p&gt;&lt;/div&gt; &lt;/blockquote&gt;&lt;p&gt;This would both allow M:I to error with a much more meaningful error when you don't have a plugin, and also prevent the loading of unused plugins which should prevent accidental plugin collisions (some of which I've seen occurring in the CPAN Testers machines).&lt;/p&gt;&lt;p&gt;Thoughts?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/PlanetPerl/~4/oHJVzg-J8N4"&gt;</content:encoded>
      <dcterms:modified>2010-09-06T02:26:06Z</dcterms:modified>
      <guid isPermaLink="false">tag:insel,2006:http://use.perl.org/~Alias/journal/40523?from=rss</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/not-zero-sum.html</link>
      <description>From Wikipedia, the free encyclopedia:

  In game theory and economic theory, zero-sum describes a situation in
  which a participant's gain or loss is exactly balanced by the losses
  or gains of the other participant(s). If the total gains of the
  participants are added up, and the total losses are subtracted, they
  will sum to zero.

Being advocate, implementor, tester and co-designer of a new programming
language, I often hear objections along the lines of you are killing
$other_programming_language, combined with a mixture of fear and
resentment. People are afraid that having a new player on the market will
decrease market share of their own, favorite programming language.

While I can understand these thinking patterns, there is no reason for
concern. The market for programming languages is not a zero-sum
situation. While I don't have hard data, I have the impression that the
programming job sector is growing, and the US government expects it to
grow further, too.

Certainly the growth of world population sets a rapidly increasing
baseline, and even if we assume a constant percentage of all people
related to programming in some way, the total number of programmers
rises, and will continue for quite some time.

(I'm pointing to some resources about programming jobs, and I fully
realize that it's not the same as number of overall programmers; but it's
easier to get data for jobs, and I do think that the general trend
statements are true for both).

So as long as the total number of programmers increases, a decrease in
relative market share doesn't automatically mean a loss. In fact the job
trends show an increase for "scripting" languages, and while Ruby is
certainly the winner in terms of growth, Python, Perl and PHP win too!

Non-job data shows for example a noisy but steady growth of uploads to
the Comprehensive Perl Archive Network (CPAN) -- data from a programming
language that is often perceived as a loser of ruby's and python's
success.

A recent Linux distribution trend analysis fell into the same trap: it
shows relative numbers of search terms, and talks about a decline for all
distributions except Ubuntu. Again I don't have hard numbers (the mirror
infrastructure of most Linux distributions makes it nearly impossible to
get accurate download counts), but I haven't seen any evidence that total
usage numbers of any of the Linux distributions actually decreased.</description>
      <title>Programming Languages Are Not Zero Sum</title>
      <content:encoded>

&lt;p&gt;From &lt;a href="http://en.wikipedia.org/wiki/Zero-sum"&gt;Wikipedia, the free
    encyclopedia&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;
    In game theory and economic theory, zero-sum describes a situation
    in which a participant's gain or loss is exactly balanced by the losses or
    gains of the other participant(s). If the total gains of the participants
    are added up, and the total losses are subtracted, they will sum to zero.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Being advocate, implementor, tester and co-designer of a &lt;a href="http://perl6.org/"&gt;new programming language&lt;/a&gt;, I often hear objections
along the lines of &lt;em&gt;you are killing &lt;a href="http://www.perl.org/"&gt;$other_programming_language&lt;/a&gt;&lt;/em&gt;, combined
with a mixture of fear and resentment. People are afraid that having a new
player on the market will decrease
market share of their own, favorite programming language.&lt;/p&gt;

&lt;p&gt;While I can understand these thinking patterns, there is no reason for
concern. The market for programming languages is not a zero-sum situation.
While I don't have hard data, I have the impression that the programming job
sector is growing, and &lt;a href="http://www.bls.gov/oco/ocos303.htm#projections_data"&gt;the US
government expects it to grow&lt;/a&gt; further, too.&lt;/p&gt;

&lt;p&gt;Certainly the &lt;a href="http://upload.wikimedia.org/wikipedia/commons/7/77/World-Population-1800-2100.png"&gt;growth
of world population&lt;/a&gt; sets a rapidly increasing baseline, and even if we
assume a constant percentage of all people related to programming in some way,
the total number of programmers rises, and will continue for quite some
time.&lt;/p&gt;

&lt;p&gt;(I'm pointing to some resources about programming jobs, and I fully realize that
it's not the same as number of overall programmers; but it's easier to get
data for jobs, and I do think that the general trend statements are true for
both).&lt;/p&gt;

&lt;p&gt;So as long as the total number of programmers increases, a decrease in
relative market share doesn't automatically mean a loss. In fact &lt;a href="http://duartes.org/gustavo/blog/post/programming-language-jobs-and-trends"&gt;the
job trends show an increase for "scripting" languages&lt;/a&gt;, and while Ruby is
certainly the winner in terms of growth, Python, Perl and PHP win too!&lt;/p&gt;

&lt;p&gt;Non-job data shows for example a &lt;a href="http://stats.cpantesters.org/graphs12.html"&gt;noisy but steady growth
of uploads to the Comprehensive Perl Archive Network (CPAN)&lt;/a&gt; -- data from a
programming language that is often perceived as a loser of ruby's and python's
success.&lt;/p&gt;

&lt;p&gt;A recent &lt;a href="http://linuxtrends.com/linux-distribution-popularity-trends/"&gt;Linux
distribution trend analysis&lt;/a&gt; fell into the same trap: it shows
&lt;strong&gt;relative&lt;/strong&gt; numbers of search terms, and talks about a decline
for all distributions except Ubuntu. Again I don't have hard numbers (the
mirror infrastructure of most Linux distributions makes it nearly impossible
to get accurate download counts), but I haven't seen any evidence that total
usage numbers of any of the Linux distributions actually decreased.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/not-zero-sum.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_bryar-security-hole</link>
      <description>Someone on IRC reported a bug in Bryar.  Namely that a Naughty Person can exploit the feature that notifies you of blog-spam by email to execute arbitrary code on your machine, as the user you run Bryar under.&lt;p&gt;A patched release is on the way to the CPAN, and you are strongly urged to upgrade.
</description>
      <title> Bryar security hole </title>
      <content:encoded>Someone on IRC reported a bug in Bryar.  Namely that a Naughty Person can exploit the feature that notifies you of blog-spam by email to execute arbitrary code on your machine, as the user you run Bryar under.&lt;p&gt;A patched release is on the way to the CPAN, and you are strongly urged to upgrade.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_bryar-security-hole</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_perl-isnt-dying</link>
      <description>Perl isn't dieing, but it tells me that it wishes it was.  Last night it went out on the piss with Python and Ruby (PHP was the designated driver) and it did rather too many cocktails.  It isn't quite sure what happened, but it woke up in the gutter in a puddle of its own fluids and its head hurts a &lt;em&gt;lot&lt;/em&gt;.&lt;p&gt;It asked me to ask you all to keep the volume down.
</description>
      <title> Perl isn't dieing </title>
      <content:encoded>Perl isn't dieing, but it tells me that it wishes it was.  Last night it went out on the piss with Python and Ruby (PHP was the designated driver) and it did rather too many cocktails.  It isn't quite sure what happened, but it woke up in the gutter in a puddle of its own fluids and its head hurts a &lt;em&gt;lot&lt;/em&gt;.&lt;p&gt;It asked me to ask you all to keep the volume down.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_perl-isnt-dying</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_thanks-yahoo</link>
      <description>[originally posted on Apr  3  2008]&lt;p&gt;I'd like to express my warm thanks to the lovely people at Yahoo and in particular to their bot-herders.  Until quite recently, their web-crawling bots had most irritatingly obeyed robot exclusion rules in the robots.txt file that I have on &lt;a href="http://cpandeps.cantrell.org.uk/"&gt;CPANdeps&lt;/a&gt;.  But in the last couple of weeks they've got rid of that niggling little exclusion so now they're indexing all of the CPAN's dependencies through my site!  And for the benefit of their important customers, they're doing it nice and quickly - a request every few seconds instead of the pedestrian once every few minutes that gentler bots use.&lt;p&gt;Unfortunately, because generating a dependency tree takes more time than they were allowing between requests, they were filling up my process table, and all my memory, and eating all the CPU, and the only way to get back into the machine was by power-cycling it.  So it is with the deepest of regrets that I have had to exclude them.&lt;p&gt;&lt;a href="http://www.yahoo.com/"&gt;Cunts&lt;/a&gt;.&lt;p&gt;[update]  For fuck's sake, they're doing it again from a different netblock!
</description>
      <title> Thanks, Yahoo! </title>
      <content:encoded>[originally posted on Apr  3  2008]&lt;p&gt;I'd like to express my warm thanks to the lovely people at Yahoo and in particular to their bot-herders.  Until quite recently, their web-crawling bots had most irritatingly obeyed robot exclusion rules in the robots.txt file that I have on &lt;a href="http://cpandeps.cantrell.org.uk/"&gt;CPANdeps&lt;/a&gt;.  But in the last couple of weeks they've got rid of that niggling little exclusion so now they're indexing all of the CPAN's dependencies through my site!  And for the benefit of their important customers, they're doing it nice and quickly - a request every few seconds instead of the pedestrian once every few minutes that gentler bots use.&lt;p&gt;Unfortunately, because generating a dependency tree takes more time than they were allowing between requests, they were filling up my process table, and all my memory, and eating all the CPU, and the only way to get back into the machine was by power-cycling it.  So it is with the deepest of regrets that I have had to exclude them.&lt;p&gt;&lt;a href="http://www.yahoo.com/"&gt;Cunts&lt;/a&gt;.&lt;p&gt;[update]  For fuck's sake, they're doing it again from a different netblock!
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_thanks-yahoo</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/cool.html</link>
      <description>In Perl, subroutine and operator names determine what happens, usually
not the type of the arguments. Instead the arguments are coerced to a
type on which the operation makes sense:

say uc 34;      # coerces 34 to a string, and upper-cases itsay 1 + "2";    # converts "2" to a number before adding

To make things more extensible, the uc function re-dispatches to the uc
method on its argument. So for the example above to work, we need an uc
function in Int. And in Array, so that @a.uc works. And so on.

The original approach was to stuff all these methods into Any, the base
class of the object hierarchy. Which kinda worked, but also meant that
all user-defined classes ended up having some few hundreds methods to
start with. Not good.

These days, the type Cool fills this niche: most built-in types (all that
are meant to be used in that polymorphic way) inherit from Cool, so the
uc method is actually defined in class Cool, coerces to string, and then
re-dispatches to the internal logic that actually does the upper-casing.

The name either stands for Convenient object oriented loopback, or just
expresses that that most built-ins are cool with an argument of that
type.

If users want to write a type that can be used like a built-in type now
just inherit from Cool, and define coercion methods to other built-in
types. If the types don't inherit from Cool, they are more light-weight,
and less magic. There's more than one way to do it.

Cool is a class (and not a role), because classes are mutable; so if you
want to inject behavior into nearly all built-in types, augmenting Cool
is an option (though usually considered evil, and should not be done
lightly).</description>
      <title>What is the "Cool" class in Perl 6?</title>
      <content:encoded>

&lt;p&gt;In Perl, subroutine and operator names determine what happens, usually not
the type of the arguments. Instead the arguments are coerced to a type on
which the operation makes sense:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synIdentifier"&gt;uc&lt;/span&gt; &lt;span class="synConstant"&gt;34&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;      &lt;span class="synComment"&gt;# coerces 34 to a string, and upper-cases it&lt;/span&gt;
&lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt; &lt;span class="synStatement"&gt;+&lt;/span&gt; &lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;2&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;    &lt;span class="synComment"&gt;# converts "2" to a number before adding&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;To make things more extensible, the &lt;code&gt;uc&lt;/code&gt; function re-dispatches
to the &lt;code&gt;uc&lt;/code&gt; method on its argument. So for the example above to
work, we need an &lt;code&gt;uc&lt;/code&gt; function in Int. And in Array, so that
&lt;code&gt;@a.uc&lt;/code&gt; works. And so on.&lt;/p&gt;

&lt;p&gt;The original approach was to stuff all these methods into &lt;code&gt;Any&lt;/code&gt;,
the base class of the object hierarchy. Which kinda worked, but also meant
that all user-defined classes ended up having some few hundreds methods to
start with. Not good.&lt;/p&gt;

&lt;p&gt;These days, the type &lt;code&gt;Cool&lt;/code&gt; fills this niche: most built-in types
(all that are meant to be used in that polymorphic way) inherit from Cool, so
the &lt;code&gt;uc&lt;/code&gt; method is actually defined in class &lt;code&gt;Cool&lt;/code&gt;,
coerces to string, and then re-dispatches to the internal logic that actually
does the upper-casing.&lt;/p&gt;

&lt;p&gt;The name either stands for &lt;em&gt;&lt;strong&gt;C&lt;/strong&gt;onvenient
    &lt;strong&gt;o&lt;/strong&gt;bject &lt;strong&gt;o&lt;/strong&gt;riented
    &lt;strong&gt;l&lt;/strong&gt;oopback&lt;/em&gt;, or just expresses that that most
built-ins are cool with an argument of that type.&lt;/p&gt;

&lt;p&gt;If users want to write a type that can be used like a built-in type now
just inherit from &lt;code&gt;Cool&lt;/code&gt;, and define coercion methods to other
built-in types. If the types don't inherit from &lt;code&gt;Cool&lt;/code&gt;, they are
more light-weight, and less magic. There's more than one way to do it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Cool&lt;/code&gt; is a class (and not a role), because classes are mutable;
so if you want to inject behavior into nearly all built-in types, augmenting
&lt;code&gt;Cool&lt;/code&gt; is an option (though usually considered evil, and should not
be done lightly).&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/cool.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps-release</link>
      <description>As a service to module authors, here is a tool to show a module's
pre-requisites and the test results from the CPAN testers. So before you
rely on something working as a pre-requisite for your code, have a look
to see how reliable it and its dependencies are.</description>
      <title> Module pre-requisites analyser </title>
      <content:encoded>As a service to module authors, &lt;a href="http://cpandeps.cantrell.org.uk/"&gt;here&lt;/a&gt; is a tool to show a module's pre-requisites and the test results from the CPAN testers.  So before you rely on something working as a pre-requisite for your code, have a look to see how reliable it and &lt;em&gt;its&lt;/em&gt; dependencies are.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps-release</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/pascal-triangle.html</link>
      <description>Today on IRC, Larry Wall showed this piece of Perl 6 code, which he wrote
for Rosetta Code:

sub pascal { [1], -&gt; @p { [0, @p Z+ @p, 0] } ... * };say pascal[^10].perl# output (reformatted for easy readbility):# ([1],#  [1, 1],#  [1, 2, 1],#  [1, 3, 3, 1],#  [1, 4, 6, 4, 1],#  [1, 5, 10, 10, 5, 1],#  [1, 6, 15, 20, 15, 6, 1],#  [1, 7, 21, 35, 35, 21, 7, 1],#  [1, 8, 28, 56, 70, 56, 28, 8, 1],#  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1])

That's Pascal's triangle, generated in one line of Perl 6.

The ... is the series operator, which generates lists by feeding the
previous value(s) (here always one array) to the generating block on its
left, until it reaches the goal on the right (in this case "whatever",
which means it returns a lazy, infinite list).

So for example if the previous item was the array [1, 2, 1], the code
block evaluates 0, 1, 2, 1 Z+ 1, 2, 1, 0.

Z is the zip operator, Z+ is pairwise addition (ie adding the pairs that
the zip operator produced). In our example that leads to 0+1, 1+2, 2+1,
1+0 or 1, 3, 3, 1.

It takes a while to get used to the meta operators and the series
operator, but once you've understood them, you can do pretty neat things
with them.</description>
      <title>Pascal's Triangle in Perl 6</title>
      <content:encoded>

&lt;p&gt;Today on IRC, Larry Wall showed this piece of Perl 6 code, which he wrote
for &lt;a href="http://rosettacode.org/wiki/Pascal%27s_triangle#Perl_6"&gt;Rosetta
Code&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;sub&lt;/span&gt; pascal { [&lt;span class="synConstant"&gt;1&lt;/span&gt;]&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="synIdentifier"&gt;@p&lt;/span&gt; { [&lt;span class="synConstant"&gt;0&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synIdentifier"&gt;@p&lt;/span&gt; &lt;span class="synStatement"&gt;Z+&lt;/span&gt; &lt;span class="synIdentifier"&gt;@p&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;0&lt;/span&gt;] } &lt;span class="synStatement"&gt;...&lt;/span&gt; &lt;span class="synStatement"&gt;*&lt;/span&gt; }&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synIdentifier"&gt;say&lt;/span&gt; pascal[&lt;span class="synStatement"&gt;^&lt;/span&gt;&lt;span class="synConstant"&gt;10&lt;/span&gt;]&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;perl&lt;/span&gt;
&lt;span class="synComment"&gt;# output (reformatted for easy readbility):&lt;/span&gt;
&lt;span class="synComment"&gt;# ([1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 2, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 3, 3, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 4, 6, 4, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 5, 10, 10, 5, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 6, 15, 20, 15, 6, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 7, 21, 35, 35, 21, 7, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 8, 28, 56, 70, 56, 28, 8, 1],&lt;/span&gt;
&lt;span class="synComment"&gt;#  [1, 9, 36, 84, 126, 126, 84, 36, 9, 1])&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;That's &lt;a href="http://en.wikipedia.org/wiki/Pascal%27s_triangle"&gt;Pascal's
triangle&lt;/a&gt;, generated in one line of Perl 6.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;...&lt;/code&gt; is the series operator, which generates lists by
feeding the previous value(s) (here always one array) to the generating
block on its left, until it reaches the goal on the right (in this case
"whatever", which means it returns a lazy, infinite list).&lt;/p&gt;

&lt;p&gt;So for example if the previous item was the array &lt;code&gt;[1, 2, 1]&lt;/code&gt;,
the code block evaluates &lt;code&gt;0, 1, 2, 1 Z+ 1, 2, 1, 0&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Z&lt;/code&gt; is the zip operator, &lt;code&gt;Z+&lt;/code&gt; is pairwise addition
(ie adding the pairs that the zip operator produced). In our example that
leads to &lt;code&gt;0+1, 1+2, 2+1, 1+0&lt;/code&gt; or &lt;code&gt;1, 3, 3, 1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It takes a while to get used to the meta operators and the series operator,
but once you've understood them, you can do pretty neat things with them.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/pascal-triangle.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-tips/what-is-modern-perl.html</link>
      <description>These days you often hear term Modern Perl, as something new(ish), and
much improved over the old ways.

But what is it exactly? Well, there's no proper definition, but here is
what that term means to me:

It's a set of tools, ideas and attitudes that help you to write better
Perl programs, and allows you to have more fun while writing them.

Here are some aspects of Modern Perl

  * Testing: Most modern Perl modules have extensive test suites, that
    make development sane and robust

  * Some built-ins now come with safer forms: the three-argument form of
    open() allows you to open files safely with arbitrary characters in
    them, without any extra precautions. Lexical file handles make things
    safer and easier too.

  * use strict; use warnings;

  * Proper OO: with Perl 6 and with Moose in Perl 5, we have good object
    systems, that require less low-level fiddling than the standard Perl
    5 object system

  * Following Best Practices

  * (For open source projects) Liberally handing out commit privileges.
    The source is stored in a version control system anyway, so
    low-quality changes or vandalism can simply be reverted (but that
    doesn't happen often in practice).

  * Caring about marketing: do tell people that you built something cool
    and useful

  * Small handy modules such as List::Util and Try::Tiny

  * Development tools such as Devel::Cover and Devel::NYTProf

  * (update) perlbrew and local::lib to help maintain your own perl
    installation and locally installed modules.

All of these techniques help to write scalable Perl programs by making
proper encapsulation much easier, or by avoiding common errors,
identifying performance bottlenecks etc.

Update: after watching some discussions about this post in various media,
I should add a few more tools that I forgot about earlier:

  * Devel::REPL, Read-Evaluation-Print Loop

  * Perl::Critic, a code quality and style tester

  * DDBIx::Class, a modern and very popular object relational mapper

  * Catalyst, a web framework based on the MVC pattern</description>
      <title>What is "Modern Perl"?</title>
      <content:encoded>

&lt;p&gt;These days you often hear term &lt;em&gt;Modern Perl&lt;/em&gt;, as something new(ish),
and much improved over the old ways.&lt;/p&gt;

&lt;p&gt;But what is it exactly? Well, there's no proper definition, but here is
what that term means to me:&lt;/p&gt;

&lt;p&gt;It's a set of tools, ideas and attitudes that help you to write better Perl
programs, and allows you to have more fun while writing them.&lt;/p&gt;

&lt;p&gt;Here are some aspects of Modern Perl&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Testing: Most modern Perl modules have extensive test suites, that
    make development sane and robust&lt;/li&gt;
    &lt;li&gt;Some built-ins now come with safer forms: the &lt;a href="http://perldoc.perl.org/functions/open.html"&gt;three-argument form
    of open()&lt;/a&gt; allows you to open files safely with arbitrary characters in
    them, without any extra precautions. Lexical file handles make things safer
    and easier too.&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;use &lt;a href="http://perldoc.perl.org/strict.html"&gt;strict&lt;/a&gt;; use &lt;a href="http://perldoc.perl.org/perllexwarn.html"&gt;warnings&lt;/a&gt;;&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;Proper OO: with Perl 6 and with &lt;a href="http://www.iinteractive.com/moose/"&gt;Moose&lt;/a&gt; in Perl 5, we have
    good object systems, that require less low-level fiddling than the
    standard Perl 5 object system&lt;/li&gt;
    &lt;li&gt;Following &lt;a href="http://www.linuxjournal.com/article/8567"&gt;Best
        Practices&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;(For open source projects) Liberally handing out commit privileges.
    The source is stored in a version control system anyway, so low-quality
    changes or vandalism can simply be reverted (but that doesn't happen often
    in practice).&lt;/li&gt;
    &lt;li&gt;Caring about marketing: do tell people that you built something cool
    and useful&lt;/li&gt;
    &lt;li&gt;Small handy modules such as &lt;a href="http://search.cpan.org/perldoc?List::Util"&gt;List::Util&lt;/a&gt; and &lt;a href="http://search.cpan.org/perldoc?Try::Tiny"&gt;Try::Tiny&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Development tools such as &lt;a href="http://search.cpan.org/perldoc?Devel::Cover"&gt;Devel::Cover&lt;/a&gt;
    and &lt;a href="http://search.cpan.org/perldoc?Devel::NYTProf"&gt;Devel::NYTProf&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;(update) &lt;a href="http://search.cpan.org/dist/App-perlbrew/"&gt;perlbrew&lt;/a&gt; and &lt;a href="search.cpan.org/perldoc/local::lib"&gt;local::lib&lt;/a&gt; to help
        maintain your own perl installation and locally installed
        modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these techniques help to write scalable Perl programs by making
proper encapsulation much easier, or by avoiding common errors, identifying
performance bottlenecks etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; after watching some discussions about this post in
various media, I should add a few more tools that I forgot about earlier:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Devel::REPL"&gt;Devel::REPL&lt;/a&gt;,
    Read-Evaluation-Print Loop&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Perl::Critic"&gt;Perl::Critic&lt;/a&gt;,
        a code quality and style tester&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DDBIx::Class&lt;/a&gt;,
        a modern and very popular object relational mapper&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://search.cpan.org/perldoc?Catalyst"&gt;Catalyst&lt;/a&gt;,
        a web framework based on the MVC pattern&lt;/li&gt;
&lt;/ul&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-tips/what-is-modern-perl.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/contribute-now-argfiles.html</link>
      <description>For this week's contribution to Perl 6 we ask you to implement the
$*ARGFILES special variable (and underlying object) for Rakudo.

(Introduction to this series of challenges)


Background
----------

In Perl 5, there is a "magic" way to iterate over input: while (my $line
= &lt;&gt;) { ... }. This reads from standard input if no command line
arguments were provided. If there are command line arguments, they are
taken as file names, and &lt;&gt; iterates over the contents of these files.

In Perl 6 this magic is performed with the $*ARGFILES special variable.
Please implement it!

To do that, you have to understand how file reading works in Perl 6. Once
you have a file handle, there are two ways to read lines: either by
calling $handle.get, which returns just one line, or by calling
$handle.lines, which returns a (lazy) list of all the remaining lines.

You can obtain the command line arguments from @*ARGS, open a file with
my $handle = open $filename; for reading; And finally you can use
lines('filename') to read all lines from a file.


What you can do
---------------

Implement a backend class for $*ARGFILES. You can do that in normal Perl
6 code, no need to change the actual compiler. Once that's done, we will
plug it into Rakudo. Your code might look like this:

class IO::ArgFiles {
    has @!filenames;    method get() { ... }
    method lines() { ... }
    method filename() {
        # return the current filename, or '-' if standard input        ...    }
}my $*ARGFILES = IO::ArgFiles.new(filenames =&gt; @*ARGS);.say for $*ARGFILES.lines();

(Of course this is only a rough skeleton, you might need to change some
details, or add some things).


Submission
----------

Please submit your source code to the perl6-compiler@perl.org mailing
list (and put moritz@faui2k3.org on CC, because the mailing list
sometimes lack quite a bit).

Update:: there have been two submissions, and a mixture of both has been
applied.</description>
      <title>This Week's Contribution to Perl 6 Week 8: Implement $*ARGFILES for Rakudo</title>
      <content:encoded>

&lt;p&gt;For this week's contribution to Perl 6 we ask you to implement the
&lt;code&gt;$*ARGFILES&lt;/code&gt; special variable (and underlying object) for
Rakudo.&lt;/p&gt;

&lt;p&gt;(&lt;a href="http://perlgeek.de/blog-en/perl-6/contribute-now-announce.html"&gt;Introduction
    to this series of challenges&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;In Perl 5, there is a "magic" way to iterate over input: &lt;code&gt;while (my
$line = &amp;lt;&amp;gt;) { ... }&lt;/code&gt;. This reads from standard input if no command
line arguments were provided. If there are command line arguments, they are
taken as file names, and &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; iterates over the contents of
these files.&lt;/p&gt;

&lt;p&gt;In Perl 6 this magic is performed with the &lt;code&gt;$*ARGFILES&lt;/code&gt; special
variable. Please implement it!&lt;/p&gt;

&lt;p&gt;To do that, you have to understand how file reading works in Perl 6. Once
you have a file handle, there are two ways to read lines: either by calling
&lt;code&gt;$handle.get&lt;/code&gt;, which returns just one line, or by calling
&lt;code&gt;$handle.lines&lt;/code&gt;, which returns a (lazy) list of all the remaining
lines.&lt;/p&gt;

&lt;p&gt;You can obtain the command line arguments from &lt;code&gt;@*ARGS&lt;/code&gt;, open a
file with &lt;code&gt;my $handle = open $filename;&lt;/code&gt; for reading; And finally
you can use &lt;code&gt;lines('filename')&lt;/code&gt; to read all lines from a file.&lt;/p&gt;


&lt;h2&gt;What you can do&lt;/h2&gt;

&lt;p&gt;Implement a backend class for &lt;code&gt;$*ARGFILES&lt;/code&gt;. You can do that in
normal Perl 6 code, no need to change the actual compiler. Once that's done,
we will plug it into Rakudo. Your code might look like this:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;class&lt;/span&gt; IO::ArgFiles {
    &lt;span class="synSpecial"&gt;has&lt;/span&gt; &lt;span class="synIdentifier"&gt;@&lt;/span&gt;&lt;span class="synSpecial"&gt;!&lt;/span&gt;&lt;span class="synIdentifier"&gt;filenames&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
    &lt;span class="synStatement"&gt;method&lt;/span&gt; get() { &lt;span class="synStatement"&gt;...&lt;/span&gt; }
    &lt;span class="synStatement"&gt;method&lt;/span&gt; &lt;span class="synIdentifier"&gt;lines&lt;/span&gt;() { &lt;span class="synStatement"&gt;...&lt;/span&gt; }
    &lt;span class="synStatement"&gt;method&lt;/span&gt; filename() {
        &lt;span class="synComment"&gt;# return the current filename, or '-' if standard input&lt;/span&gt;
        &lt;span class="synStatement"&gt;...&lt;/span&gt;
    }
}
&lt;span class="synSpecial"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$&lt;/span&gt;&lt;span class="synSpecial"&gt;*&lt;/span&gt;&lt;span class="synIdentifier"&gt;ARGFILES&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; IO::ArgFiles&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;new&lt;/span&gt;(&lt;span class="synConstant"&gt;filenames&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synIdentifier"&gt;@&lt;/span&gt;&lt;span class="synSpecial"&gt;*&lt;/span&gt;&lt;span class="synIdentifier"&gt;ARGS&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synIdentifier"&gt;$&lt;/span&gt;&lt;span class="synSpecial"&gt;*&lt;/span&gt;&lt;span class="synIdentifier"&gt;ARGFILES&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;lines&lt;/span&gt;()&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;(Of course this is only a rough skeleton, you might need to change some
details, or add some things).&lt;/p&gt;

&lt;h2&gt;Submission&lt;/h2&gt;

&lt;p&gt;Please submit your source code to the &lt;a href="mailto:perl6-compiler@perl.org"&gt;perl6-compiler@perl.org&lt;/a&gt; mailing
list (and put moritz@faui2k3.org on CC,
because the mailing list sometimes lack quite a bit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;: there have been two submissions, and a mixture of
both has been applied.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/contribute-now-argfiles.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_cp2000an</link>
      <description>My mad experiment in CPAN mirrors has grown a couple of new tentacles.  Previously it could be a perl-X.Y.Z-specific mirror, such as &lt;a href="http://cp5.6.2an.barnyard.co.uk"&gt;the CP5.6.2AN&lt;/a&gt;, or an OS-specific mirror such as &lt;a href="http://cpMSWin32an.barnyard.co.uk/"&gt;the cpMSWin32an&lt;/a&gt;.  Now it can combine the two such as in &lt;a href="http://cp5.8.8-irixan.barnyard.co.uk/"&gt;the CP5.8.8-irixAN&lt;/a&gt; and all of those can optionally be combined with a date/time to only include stuff that was already on the CPAN as at that time, such as at &lt;a href="http://cp2000an.barnyard.co.uk"&gt;the CP2000AN&lt;/a&gt;.&lt;p&gt;Why do this?  Let's assume that you have a large complex application which uses lots of stuff from the CPAN, and depends on Elk version 1.009 and ListOfDogs version 5.1, and will break with any later version of Elk (or of ListOfDogs).  You get a feature request from a user, and think "ah-ha, there's a module for that", and so you go to install Some::Module.  Unfortunately, the latest version of Some::Module depends on Some::Other::Module which in turn needs Another::Module which needs Elk 1.234, so your CPAN client merrily upgrades Elk, breaking everything.  Doom and Disaster.  Having a CPAN "mirror" nailed to the date of the last release of Elk and ListOfDogs that works for you will save you from pain, suffering, and the Dark Side.  Either you'll get older versions that Just Work, or you'll get nothing, and nothing is far better than breaking everything!
</description>
      <title> Travelling in time: the CP2000AN </title>
      <content:encoded>My mad experiment in CPAN mirrors has grown a couple of new tentacles.  Previously it could be a perl-X.Y.Z-specific mirror, such as &lt;a href="http://cp5.6.2an.barnyard.co.uk"&gt;the CP5.6.2AN&lt;/a&gt;, or an OS-specific mirror such as &lt;a href="http://cpMSWin32an.barnyard.co.uk/"&gt;the cpMSWin32an&lt;/a&gt;.  Now it can combine the two such as in &lt;a href="http://cp5.8.8-irixan.barnyard.co.uk/"&gt;the CP5.8.8-irixAN&lt;/a&gt; and all of those can optionally be combined with a date/time to only include stuff that was already on the CPAN as at that time, such as at &lt;a href="http://cp2000an.barnyard.co.uk"&gt;the CP2000AN&lt;/a&gt;.&lt;p&gt;Why do this?  Let's assume that you have a large complex application which uses lots of stuff from the CPAN, and depends on Elk version 1.009 and ListOfDogs version 5.1, and will break with any later version of Elk (or of ListOfDogs).  You get a feature request from a user, and think "ah-ha, there's a module for that", and so you go to install Some::Module.  Unfortunately, the latest version of Some::Module depends on Some::Other::Module which in turn needs Another::Module which needs Elk 1.234, so your CPAN client merrily upgrades Elk, breaking everything.  Doom and Disaster.  Having a CPAN "mirror" nailed to the date of the last release of Elk and ListOfDogs that works for you will save you from pain, suffering, and the Dark Side.  Either you'll get older versions that Just Work, or you'll get nothing, and nothing is far better than breaking everything!
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_cp2000an</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-5-to-6/27-common-idioms.html</link>
      <description>NAME

"Perl 5 to 6" Lesson 27 - Common Perl 6 data processing idioms


SYNOPSIS

  # create a hash from a list of keys and values:
  # solution 1: slices
  my %hash; %hash{@keys} = @values;
  # solution 2: meta operators
  my %hash = @keys Z=&gt; @values;

  # create a hash from an array, with
  # true value for each array item:
  my %exists = @keys Z=&gt; 1 xx *;

  # limit a value to a given range, here 0..10.
  my $x = -2;
  say 0 max $x min 10;

  # for debugging: dump the contents of a variable,
  # including its name, to STDERR
  note :$x.perl;

  # sort case-insensitively
  say @list.sort: *.lc;

  # mandatory attributes
  class Something {
      has $.required = die "Attribute 'required' is mandatory";
  }
  Something.new(required =&gt; 2); # no error
  Something.new()               # BOOM


DESCRIPTION

Learning the specification of a language is not enough to be productive
with it. Rather you need to know how to solve specific problems. Common
usage patterns, called idioms, helps you not having to re-invent the
wheel every time you're faced with a problem.

So here a some common Perl 6 idioms, dealing with data structures.

Hashes

  # create a hash from a list of keys and values:
  # solution 1: slices
  my %hash; %hash{@keys} = @values;
  # solution 2: meta operators
  my %hash = @keys Z=&gt; @values;

The first solution is the same you'd use in Perl 5: assignment to a
slice. The second solution uses the zip operator Z, which joins to list
like a zip fastener: 1, 2, 3 Z 10, 20, 30 is 1, 10, 2, 20, 3, 30. The Z=&gt;
is a meta operator, which combines zip with =&gt; (the Pair construction
operator). So 1, 2, 3 Z=&gt; 10, 20, 30 evaluates to 1 =&gt; 10, 2 =&gt; 20, 3 =&gt;
30. Assignment to a hash variable turns that into a Hash.

For existence checks, the values in a hash often doesn't matter, as long
as they all evaluate to True in boolean context. In that case, a nice way
to initialize the hash from a given array or list of keys is

  my %exists = @keys Z=&gt; 1 xx *;

which uses a lazy, infinite list of 1s on the right-hand side, and relies
on the fact that Z ends when the shorter list is exhausted.

Numbers

Sometimes you want to get a number from somewhere, but clip it into a
predefined range (for example so that it can act as an array index).

In Perl 5 you often end up with things like $a = $b &gt; $upper ? $upper :
$b, and another conditional for the lower limit. With the max and min
infix operators, that simplifies considerably to

  my $in-range = $lower max $x min $upper;

because $lower max $x returns the larger of the two numbers, and thus
clipping to the lower end of the range.

Since min and max are infix operators, you can also clip infix:

 $x max= 0;
 $x min= 10;

Debugging

Perl 5 has Data::Dumper, Perl 6 objects have the .perl method. Both
generate code that reproduces the original data structure as faithfully
as possible.

:$var generates a Pair ("colonpair"), using the variable name as key (but
with sigil stripped). So it's the same as var =&gt; $var. note() writes to
the standard error stream, appending a newline. So note :$var.perl is
quick way of obtaining the value of a variable for debugging; purposes,
along with its name.

Sorting

Like in Perl 5, the sort built-in can take a function that compares two
values, and then sorts according to that comparison. Unlike Perl 5, it's
a bit smarter, and automatically does a transformation for you if the
function takes only one argument.

In general, if you want to compare by a transformed value, in Perl 5 you
can do:

    # WARNING: Perl 5 code ahead
    my @sorted = sort { transform($a) cmp transform($b) } @values;

    # or the so-called Schwartzian Transform:
    my @sorted = map { $_-&gt;[1] }
                 sort { $a-&gt;[0] cmp $b-&gt;[0] }
                 map { [transform($_), $_] }
                 @values

The former solution requires repetitive typing of the transformation, and
executes it for each comparison. The second solution avoids that by
storing the transformed value along with the original value, but it's
quite a bit of code to write.

Perl 6 automates the second solution (and a bit more efficient than the
naiive Schwartzian transform, by avoiding an array for each value) when
the transformation function has arity one, ie accepts one argument only:

    my @sorted = sort &amp;transform, @values;

Mandatory Attributes

The typical way to enforce the presence of an attribute is to check its
presence in the constructor - or in all constructors, if there are many.

That works in Perl 6 too, but it's easier and safer to require the
presence at the level of each attribute:

    has $.attr = die "'attr' is mandatory";

This exploits the default value mechanism. When a value is supplied, the
code for generating the default value is never executed, and the die
never triggers. If any constructor fails to set it, an exception is
thrown.


MOTIVATION

N/A</description>
      <title>Common Perl 6 data processing idioms</title>
      <content:encoded>

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="NAME"&gt;NAME&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;"Perl 5 to 6" Lesson 27 - Common Perl 6 data processing idioms&lt;/p&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="SYNOPSIS"&gt;SYNOPSIS&lt;/a&gt;
&lt;/h3&gt;

&lt;pre&gt;  # create a hash from a list of keys and values:
  # solution 1: slices
  my %hash; %hash{@keys} = @values;
  # solution 2: meta operators
  my %hash = @keys Z=&amp;gt; @values;

  # create a hash from an array, with
  # true value for each array item:
  my %exists = @keys Z=&amp;gt; 1 xx *;

  # limit a value to a given range, here 0..10.
  my $x = -2;
  say 0 max $x min 10;

  # for debugging: dump the contents of a variable,
  # including its name, to STDERR
  note :$x.perl;

  # sort case-insensitively
  say @list.sort: *.lc;

  # mandatory attributes
  class Something {
      has $.required = die "Attribute 'required' is mandatory";
  }
  Something.new(required =&amp;gt; 2); # no error
  Something.new()               # BOOM&lt;/pre&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="DESCRIPTION"&gt;DESCRIPTION&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Learning the specification of a language is not enough to be productive with it. Rather you need to know how to solve specific problems. Common usage patterns, called &lt;i&gt;idioms&lt;/i&gt;, helps you not having to re-invent the wheel every time you're faced with a problem.&lt;/p&gt;

&lt;p&gt;So here a some common Perl 6 idioms, dealing with data structures.&lt;/p&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Hashes"&gt;Hashes&lt;/a&gt;
&lt;/h4&gt;

&lt;pre&gt;  # create a hash from a list of keys and values:
  # solution 1: slices
  my %hash; %hash{@keys} = @values;
  # solution 2: meta operators
  my %hash = @keys Z=&amp;gt; @values;&lt;/pre&gt;

&lt;p&gt;The first solution is the same you'd use in Perl 5: assignment to a slice. The second solution uses the zip operator &lt;code&gt;Z&lt;/code&gt;, which joins to list like a zip fastener: &lt;code&gt;1, 2, 3 Z 10, 20, 30&lt;/code&gt; is &lt;code&gt;1, 10, 2, 20, 3, 30&lt;/code&gt;. The &lt;code&gt;Z=&amp;gt;&lt;/code&gt; is a meta operator, which combines zip with &lt;code&gt;=&amp;gt;&lt;/code&gt; (the Pair construction operator). So &lt;code&gt;1, 2, 3 Z=&amp;gt; 10, 20, 30&lt;/code&gt; evaluates to &lt;code&gt;1 =&amp;gt; 10, 2 =&amp;gt; 20, 3 =&amp;gt; 30&lt;/code&gt;. Assignment to a hash variable turns that into a Hash.&lt;/p&gt;

&lt;p&gt;For existence checks, the values in a hash often doesn't matter, as long as they all evaluate to &lt;code&gt;True&lt;/code&gt; in boolean context. In that case, a nice way to initialize the hash from a given array or list of keys is&lt;/p&gt;

&lt;pre&gt;  my %exists = @keys Z=&amp;gt; 1 xx *;&lt;/pre&gt;

&lt;p&gt;which uses a lazy, infinite list of 1s on the right-hand side, and relies on the fact that &lt;code&gt;Z&lt;/code&gt; ends when the shorter list is exhausted.&lt;/p&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Numbers"&gt;Numbers&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Sometimes you want to get a number from somewhere, but clip it into a predefined range (for example so that it can act as an array index).&lt;/p&gt;

&lt;p&gt;In Perl 5 you often end up with things like &lt;code&gt;$a = $b &amp;gt; $upper ? $upper : $b&lt;/code&gt;, and another conditional for the lower limit. With the &lt;code&gt;max&lt;/code&gt; and &lt;code&gt;min&lt;/code&gt; infix operators, that simplifies considerably to&lt;/p&gt;

&lt;pre&gt;  my $in-range = $lower max $x min $upper;&lt;/pre&gt;

&lt;p&gt;because &lt;code&gt;$lower max $x&lt;/code&gt; returns the larger of the two numbers, and thus clipping to the lower end of the range.&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;min&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; are infix operators, you can also clip infix:&lt;/p&gt;

&lt;pre&gt; $x max= 0;
 $x min= 10;&lt;/pre&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Debugging"&gt;Debugging&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Perl 5 has Data::Dumper, Perl 6 objects have the &lt;code&gt;.perl&lt;/code&gt; method. Both generate code that reproduces the original data structure as faithfully as possible.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:$var&lt;/code&gt; generates a Pair ("colonpair"), using the variable name as key (but with sigil stripped). So it's the same as &lt;code&gt;var =&amp;gt; $var&lt;/code&gt;. &lt;code&gt;note()&lt;/code&gt; writes to the standard error stream, appending a newline. So &lt;code&gt;note :$var.perl&lt;/code&gt; is quick way of obtaining the value of a variable for debugging; purposes, along with its name.&lt;/p&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Sorting"&gt;Sorting&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Like in Perl 5, the &lt;code&gt;sort&lt;/code&gt; built-in can take a function that compares two values, and then sorts according to that comparison. Unlike Perl 5, it's a bit smarter, and automatically does a transformation for you if the function takes only one argument.&lt;/p&gt;

&lt;p&gt;In general, if you want to compare by a transformed value, in Perl 5 you can do:&lt;/p&gt;

&lt;pre&gt;    # WARNING: Perl 5 code ahead
    my @sorted = sort { transform($a) cmp transform($b) } @values;

    # or the so-called Schwartzian Transform:
    my @sorted = map { $_-&amp;gt;[1] }
                 sort { $a-&amp;gt;[0] cmp $b-&amp;gt;[0] }
                 map { [transform($_), $_] }
                 @values&lt;/pre&gt;

&lt;p&gt;The former solution requires repetitive typing of the transformation, and executes it for each comparison. The second solution avoids that by storing the transformed value along with the original value, but it's quite a bit of code to write.&lt;/p&gt;

&lt;p&gt;Perl 6 automates the second solution (and a bit more efficient than the naiive Schwartzian transform, by avoiding an array for each value) when the transformation function has arity one, ie accepts one argument only:&lt;/p&gt;

&lt;pre&gt;    my @sorted = sort &amp;amp;transform, @values;&lt;/pre&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Mandatory_Attributes"&gt;Mandatory Attributes&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;The typical way to enforce the presence of an attribute is to check its presence in the constructor - or in all constructors, if there are many.&lt;/p&gt;

&lt;p&gt;That works in Perl 6 too, but it's easier and safer to require the presence at the level of each attribute:&lt;/p&gt;

&lt;pre&gt;    has $.attr = die "'attr' is mandatory";&lt;/pre&gt;

&lt;p&gt;This exploits the default value mechanism. When a value is supplied, the code for generating the default value is never executed, and the &lt;code&gt;die&lt;/code&gt; never triggers. If any constructor fails to set it, an exception is thrown.&lt;/p&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="MOTIVATION"&gt;MOTIVATION&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;N/A&lt;/p&gt;

 </content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-5-to-6/27-common-idioms.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_cgit-syntax-highlighting</link>
      <description>For the last few months I've been using &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; for my version control system.  It's better than CVS because it can handle offline commits.  So if I'm using my laptop on a train, I can still use version control without having to have a notwork connection.&lt;p&gt;And to give a pretty web front-end to it for other people to &lt;a href="http://www.cantrell.org.uk/cgit/"&gt;read code&lt;/a&gt; without having to check it out of the repository, I use &lt;a href="http://hjemli.net/git/cgit/"&gt;cgit&lt;/a&gt;, which I mostly chose because it's a dead simple CGI and not a huge fancy application.&lt;p&gt;One problem with cgit is that by default it doesn't do code highlighting.  But it has the ability to run blobs of code through any filter you care to name before displaying them, so to get something nice like &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/perlmodules/tree/Sub-WrapPackages/lib/Sub/WrapPackages.pm?id=db12893c451365b8f546b9f253735be1c542b6c0"&gt;this&lt;/a&gt; all you need to do is write a highlighter and add a single line to your cgitrc:&lt;p&gt;&lt;code&gt;source-filter=/web/www.cantrell.org.uk/cgit/highlighter&lt;/code&gt;&lt;p&gt;My highlighter program is this:&lt;p&gt;&lt;pre&gt;
   1 #!/usr/local/bin/perl
   2 
   3 &lt;b&gt;&lt;font color="#8B008B"&gt;use&lt;/font&gt;&lt;/b&gt; warnings;
   4 &lt;b&gt;&lt;font color="#8B008B"&gt;use&lt;/font&gt;&lt;/b&gt; strict;
   5 
   6 &lt;b&gt;&lt;font color="#8B008B"&gt;my&lt;/font&gt;&lt;/b&gt; &lt;font color="#00688B"&gt;$file&lt;/font&gt; = &lt;b&gt;&lt;font color="#8B008B"&gt;shift&lt;/font&gt;&lt;/b&gt;;
   7 
   8 &lt;b&gt;&lt;font color="#8B008B"&gt;if&lt;/font&gt;&lt;/b&gt;(&lt;font color="#00688B"&gt;$file&lt;/font&gt; =~ &lt;font color="#CD5555"&gt;/\.(p[ml]|t)$/i&lt;/font&gt;) {
   9     &lt;b&gt;&lt;font color="#8B008B"&gt;system&lt;/font&gt;&lt;/b&gt; &lt;font color="#CD5555"&gt;&amp;quot;/usr/local/bin/perltidy -html -st -ntoc -npod -pre -nss -nnn&amp;quot;&lt;/font&gt;
  10 } &lt;b&gt;&lt;font color="#8B008B"&gt;else&lt;/font&gt;&lt;/b&gt; {
  11     &lt;b&gt;&lt;font color="#8B008B"&gt;system&lt;/font&gt;&lt;/b&gt; &lt;font color="#CD5555"&gt;&amp;quot;cat -n&amp;quot;&lt;/font&gt;;
  12 }
&lt;/pre&gt;&lt;p&gt;</description>
      <title> cgit syntax highlighting </title>
      <content:encoded>For the last few months I've been using &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt; for my version control system.  It's better than CVS because it can handle offline commits.  So if I'm using my laptop on a train, I can still use version control without having to have a notwork connection.&lt;p&gt;And to give a pretty web front-end to it for other people to &lt;a href="http://www.cantrell.org.uk/cgit/"&gt;read code&lt;/a&gt; without having to check it out of the repository, I use &lt;a href="http://hjemli.net/git/cgit/"&gt;cgit&lt;/a&gt;, which I mostly chose because it's a dead simple CGI and not a huge fancy application.&lt;p&gt;One problem with cgit is that by default it doesn't do code highlighting.  But it has the ability to run blobs of code through any filter you care to name before displaying them, so to get something nice like &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/perlmodules/tree/Sub-WrapPackages/lib/Sub/WrapPackages.pm?id=db12893c451365b8f546b9f253735be1c542b6c0"&gt;this&lt;/a&gt; all you need to do is write a highlighter and add a single line to your cgitrc:&lt;p&gt;&lt;code&gt;source-filter=/web/www.cantrell.org.uk/cgit/highlighter&lt;/code&gt;&lt;p&gt;My highlighter program is this:&lt;p&gt;&lt;pre&gt;
   1 #!/usr/local/bin/perl
   2 
   3 &lt;b&gt;&lt;font color="#8B008B"&gt;use&lt;/font&gt;&lt;/b&gt; warnings;
   4 &lt;b&gt;&lt;font color="#8B008B"&gt;use&lt;/font&gt;&lt;/b&gt; strict;
   5 
   6 &lt;b&gt;&lt;font color="#8B008B"&gt;my&lt;/font&gt;&lt;/b&gt; &lt;font color="#00688B"&gt;$file&lt;/font&gt; = &lt;b&gt;&lt;font color="#8B008B"&gt;shift&lt;/font&gt;&lt;/b&gt;;
   7 
   8 &lt;b&gt;&lt;font color="#8B008B"&gt;if&lt;/font&gt;&lt;/b&gt;(&lt;font color="#00688B"&gt;$file&lt;/font&gt; =~ &lt;font color="#CD5555"&gt;/\.(p[ml]|t)$/i&lt;/font&gt;) {
   9     &lt;b&gt;&lt;font color="#8B008B"&gt;system&lt;/font&gt;&lt;/b&gt; &lt;font color="#CD5555"&gt;&amp;quot;/usr/local/bin/perltidy -html -st -ntoc -npod -pre -nss -nnn&amp;quot;&lt;/font&gt;
  10 } &lt;b&gt;&lt;font color="#8B008B"&gt;else&lt;/font&gt;&lt;/b&gt; {
  11     &lt;b&gt;&lt;font color="#8B008B"&gt;system&lt;/font&gt;&lt;/b&gt; &lt;font color="#CD5555"&gt;&amp;quot;cat -n&amp;quot;&lt;/font&gt;;
  12 }
&lt;/pre&gt;&lt;p&gt;</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_cgit-syntax-highlighting</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/gabor-keep-going.html</link>
      <description>After reading this blog post, I just want to say: keep going.

Gabor does really awesome things for Perl (and especially for Perl 6,
which I tend to notice more): beginner's tutorials, screencasts, training
courses, writes an IDE and so on. If his primary interest was his own
success, his priorities would be quite different.

I hope that Gabor doesn't pay too much attention to the hostilities from
parts of the Perl community, and I wish him and us all the best for his
current project.</description>
      <title>Gabor: Keep going</title>
      <content:encoded>

&lt;p&gt;After reading &lt;a href="http://blogs.perl.org/users/gabor_szabo/2010/07/promoting-perl-is-fun.html"&gt;this
blog post&lt;/a&gt;, I just want to say: keep going.&lt;/p&gt;

&lt;p&gt;Gabor does really awesome things for Perl (and especially for Perl 6, which
I tend to notice more): beginner's tutorials, screencasts, training courses,
writes an IDE and so on. If his primary interest was his own success, his
priorities would be quite different.&lt;/p&gt;

&lt;p&gt;I hope that Gabor doesn't pay too much attention to the hostilities from
parts of the Perl community, and I wish him and us all the best for his &lt;a href="http://news.perlfoundation.org/2010/06/hague-grant-application-perl-e.html"&gt;current
project&lt;/a&gt;.&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/gabor-keep-going.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_ill</link>
      <description>I am ill.  I've been ill since Thursday, with a cold.  You're meant to be able to cure a cold with [insert old wives tale remedy here] in 5 days, or if you don't, it'll clear itself up in just under a week.  So hopefully today is the last day.&lt;p&gt;So what have I done while ill?&lt;p&gt;On Friday I became old (see previous post), and went to the &lt;a href="http://www.royalacademy.org.uk/exhibitions/byzantium/"&gt;Byzantium&lt;/a&gt; exhibition at the Royal Academy.  It was good.  You should go.&lt;p&gt;Saturday was the &lt;a href="http://conferences.yapceurope.org/lpw2008/"&gt;London Perl Workshop&lt;/a&gt;.  My talk on closures went down well, and people seemed to understand what I was talking about.  Hurrah!  I decided that rather than hang around nattering and going to a few talks, I'd rather hide under my duvet for the rest of the day.&lt;p&gt;I mostly hid on Sunday too, and spent most of the day asleep.  In a brief moment of productivity, I got my laptop and my phone to talk to each other using magic interwebnet bluetooth stuff.  I'd tried previously without success, but that was with the previous release of OS X.  With version X.5 it seems to Just Work, so no Evil Hacks were necessary.&lt;p&gt;The cold means that I can't taste a damned thing, not even bacon.  So now I know what it's like to be Jewish.  Being Jewish &lt;em&gt;sucks&lt;/em&gt;.&lt;p&gt;And today, I am still coughing up occasional lumps of lung and making odd bubbling noises in my chest, although my nasal demons seem to be Snotting less than they were, so hopefully I'll be back to normal tomorrow.  
</description>
      <title> Ill </title>
      <content:encoded>I am ill.  I've been ill since Thursday, with a cold.  You're meant to be able to cure a cold with [insert old wives tale remedy here] in 5 days, or if you don't, it'll clear itself up in just under a week.  So hopefully today is the last day.&lt;p&gt;So what have I done while ill?&lt;p&gt;On Friday I became old (see previous post), and went to the &lt;a href="http://www.royalacademy.org.uk/exhibitions/byzantium/"&gt;Byzantium&lt;/a&gt; exhibition at the Royal Academy.  It was good.  You should go.&lt;p&gt;Saturday was the &lt;a href="http://conferences.yapceurope.org/lpw2008/"&gt;London Perl Workshop&lt;/a&gt;.  My talk on closures went down well, and people seemed to understand what I was talking about.  Hurrah!  I decided that rather than hang around nattering and going to a few talks, I'd rather hide under my duvet for the rest of the day.&lt;p&gt;I mostly hid on Sunday too, and spent most of the day asleep.  In a brief moment of productivity, I got my laptop and my phone to talk to each other using magic interwebnet bluetooth stuff.  I'd tried previously without success, but that was with the previous release of OS X.  With version X.5 it seems to Just Work, so no Evil Hacks were necessary.&lt;p&gt;The cold means that I can't taste a damned thing, not even bacon.  So now I know what it's like to be Jewish.  Being Jewish &lt;em&gt;sucks&lt;/em&gt;.&lt;p&gt;And today, I am still coughing up occasional lumps of lung and making odd bubbling noises in my chest, although my nasal demons seem to be Snotting less than they were, so hopefully I'll be back to normal tomorrow.  
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_ill</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_Devel-CheckLib-functions</link>
      <description>Devel::CheckLib has grown a new feature. As well as checking that
libraries and headers exist, it can now also check that particular
functions exist in a library and check their return values. This will be
particularly useful if you need to check that a particular version of a
library is available.

It works if you have a Unixish toolchain. I need to wait for the
CPAN-testers reports to see if I managed not to break anything on
Windows. Unfortunately, even though the lovely Mr. Alias has worked hard
to make Windows machines available to developers, I found it to be just
too hard to use. Even downloading my code to the Windows machine was
hard, as Windows seemed to think it knew better and shouldn't download
the file I told it to download. Then once I had downloaded it, Windows
decided to hide it somewhere that I couldn't get to using the command
line. So I gave up.

I might try again once there are some decent tools on the machines: wget,
tar, and gzip at minimum, as given those I can quickly bootstrap anything
else. Software development isn't just about having compilers available.</description>
      <title> Devel::CheckLib can now check libraries' contents </title>
      <content:encoded>&lt;a href="http://search.cpan.org/search?query=Devel%3A%3ACheckLib&amp;amp;mode=all"&gt;Devel::CheckLib&lt;/a&gt; has grown a new feature.  As well as checking that libraries and headers exist, it can now also check that particular functions exist in a library and check their return values.  This will be particularly useful if you need to check that a particular &lt;em&gt;version&lt;/em&gt; of a library is available.&lt;p&gt;It works if you have a Unixish toolchain.  I need to wait for the CPAN-testers reports to see if I managed not to break anything on Windows.  Unfortunately, even though the lovely Mr. Alias has worked hard to make &lt;a href="http://use.perl.org/~Alias/journal/39318"&gt;Windows machines available to developers&lt;/a&gt;, I found it to be just too hard to use.  Even downloading my code to the Windows machine was hard, as Windows seemed to think it knew better and shouldn't download the file I told it to download.  Then once I had downloaded it, Windows decided to hide it somewhere that I couldn't get to using the command line.  So I gave up.&lt;p&gt;I might try again once there are some decent tools on the machines: wget, tar, and gzip at minimum, as given those I can quickly bootstrap anything else.  Software development isn't just about having compilers available.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_Devel-CheckLib-functions</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/want-to-write-shiny-graphics.html</link>
      <description>First let my apologize for waiting so long to come up with a new "weekly"
Perl 6 challenge - I'm running out of ideas, and the one I have left
needs more time to prepare.

Instead I want to motivate you to help porting the ruby scruffy charting
library to Perl 6. It can generate shiny SVG graphics (they are currently
broken on their main website, hence the waybackmachine link).

There's already an initial version Perl 6 port called "tufte", but it's
not running yet. It needs your help. If you know a little ruby, and want
to learn some more Perl 6, join #perl6, ask for a commit bit, and
translate some ruby code into Perl 6. And in the end you'll be rewarded
with nice SVG charts :-).</description>
      <title>Want to write shiny SVG graphics with Perl 6? Port Scruffy!</title>
      <content:encoded>

&lt;p&gt;First let my apologize for waiting so long to come up with a new 
&lt;a href="http://perlgeek.de/blog-en/perl-6/contribute-now-announce.html"&gt;"weekly"
    Perl 6 challenge&lt;/a&gt; - I'm running out of ideas, and the one I have left needs
more time to prepare.&lt;/p&gt;

&lt;p&gt;Instead I want to motivate you to help porting the ruby &lt;a href="http://scruffy.rubyforge.org/"&gt;scruffy charting library&lt;/a&gt; to Perl 6.
It can generate &lt;a href="http://replay.waybackmachine.org/20080625015853/http://scruffy.rubyforge.org/"&gt;shiny
SVG graphics&lt;/a&gt; (they are currently broken on their main website, hence the
waybackmachine link).&lt;/p&gt;


&lt;p&gt;There's already an &lt;a href="http://github.com/moritz/tufte/"&gt;initial
version Perl 6 port called "tufte"&lt;/a&gt;, but it's not running yet. It needs your
help. If you know a little ruby, and want to learn some more Perl 6, join
#perl6, ask for a commit bit, and translate some ruby code into Perl 6. And in
the end you'll be rewarded with nice SVG charts :-).&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/want-to-write-shiny-graphics.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_pod-includes</link>
      <description>One of my CPAN distributions is &lt;a href="http://search.cpan.org/search?query=CPAN-FindDependencies"&gt;CPAN-FindDependencies&lt;/a&gt;.  It contains a module CPAN::FindDependencies, and a simple script that wraps around it so you can view dependencies easily from the command line.  That script, naturally, has a man page.  However, that manpage basically says "if you want to know what arguments this program takes, see the CPAN::FindDependencies docs".  This is Bad from a usability point of view, good from a not-duplicating-stuff point of view, and good from a laziness point of view.  Which means that it's Bad.&lt;p&gt;So, the solution.&lt;p&gt;&lt;blockquote&gt;&lt;tt&gt;
=over&lt;p&gt;#include shared/parameters&lt;p&gt;=back
&lt;/tt&gt;&lt;/blockquote&gt;&lt;p&gt;and some &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/perlmodules/tree/CPAN-FindDependencies/Makefile.PL?id=b643a4d95f300552b9af9e7edd1fef9ae96543b3"&gt;Magic&lt;/a&gt; that does the &lt;a href="http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/"&gt;cpp-stylee&lt;/a&gt; substitution at &lt;code&gt;make dist&lt;/code&gt; time.  Note the 'dist' section in my call to &lt;code&gt;WriteMakefile&lt;/code&gt;.&lt;p&gt;This is, of course, crying out to be made less horribly hacky, but it works for now, so I'm happy.&lt;p&gt;My original idea was to write some crazy shit that would do the #include at install-time, when the user was installing my code.  But that has the disadvantage that tools like &lt;a href="http://search.cpan.org/"&gt;search.cpan&lt;/a&gt; wouldn't show it properly, as they simply look at the files in the distribution.  So this does the #includes at the last moment just before I package up the code and upload to the PAUSE.  You lovely people get the right documentation in all the right places, I only have to maintain it in one place so it stays in sync, and (in the interests of Laziness) I don't have to remember to run any extra scripts before releasing, &lt;code&gt;make dist&lt;/code&gt; just Does The Right Thing.
</description>
      <title> POD includes </title>
      <content:encoded>One of my CPAN distributions is &lt;a href="http://search.cpan.org/search?query=CPAN-FindDependencies"&gt;CPAN-FindDependencies&lt;/a&gt;.  It contains a module CPAN::FindDependencies, and a simple script that wraps around it so you can view dependencies easily from the command line.  That script, naturally, has a man page.  However, that manpage basically says "if you want to know what arguments this program takes, see the CPAN::FindDependencies docs".  This is Bad from a usability point of view, good from a not-duplicating-stuff point of view, and good from a laziness point of view.  Which means that it's Bad.&lt;p&gt;So, the solution.&lt;p&gt;&lt;blockquote&gt;&lt;tt&gt;
=over&lt;p&gt;#include shared/parameters&lt;p&gt;=back
&lt;/tt&gt;&lt;/blockquote&gt;&lt;p&gt;and some &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/perlmodules/tree/CPAN-FindDependencies/Makefile.PL?id=b643a4d95f300552b9af9e7edd1fef9ae96543b3"&gt;Magic&lt;/a&gt; that does the &lt;a href="http://gcc.gnu.org/onlinedocs/gcc-4.3.3/cpp/"&gt;cpp-stylee&lt;/a&gt; substitution at &lt;code&gt;make dist&lt;/code&gt; time.  Note the 'dist' section in my call to &lt;code&gt;WriteMakefile&lt;/code&gt;.&lt;p&gt;This is, of course, crying out to be made less horribly hacky, but it works for now, so I'm happy.&lt;p&gt;My original idea was to write some crazy shit that would do the #include at install-time, when the user was installing my code.  But that has the disadvantage that tools like &lt;a href="http://search.cpan.org/"&gt;search.cpan&lt;/a&gt; wouldn't show it properly, as they simply look at the files in the distribution.  So this does the #includes at the last moment just before I package up the code and upload to the PAUSE.  You lovely people get the right documentation in all the right places, I only have to maintain it in one place so it stays in sync, and (in the interests of Laziness) I don't have to remember to run any extra scripts before releasing, &lt;code&gt;make dist&lt;/code&gt; just Does The Right Thing.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_pod-includes</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/perlmonks-questions.html</link>
      <description>Since the Rakudo Star release, there has been a noticeable increase in
Perl 6 questions on perlmonks - a good sign, because it means people are
using it.

  * Array interpolation in Rakudo

  * Rakudo build problems

  * Perl6, latest Rakudo bug or error on my part? (parsing issue related
    to missing whitespace).

  * Perl6, modifying @*INC (another ws parsing issue)

  * Perl6's LWP::Simple -- seemingly an installation issue

  * Perl 6, defining a hash with interpolated string

I've assembled this list by looking through the 100 newest nodes in
Seekers of Perl Wisdom, which makes it 6% of the questions asked, or on
average 1 per day (used to be around 1 per week).

Most of the questions are related to environmental issues
(building/installing stuff), or beginner's questions related to syntax.

It's good to see the questions flowing in, and I hope that we'll soon see
more questions where I can show off cool Perl 6 features in the answers
:-).</description>
      <title>Perl 6 Questions on Perlmonks</title>
      <content:encoded>
&lt;p&gt;Since the Rakudo Star release, there has been a noticeable increase in Perl
6 questions on perlmonks - a good sign, because it means people are using
it.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=853975"&gt;Array interpolation
        in Rakudo&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=853727"&gt;Rakudo build
        problems&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=853573"&gt;Perl6, latest
        Rakudo bug or error on my part?&lt;/a&gt; (parsing issue related to missing
        whitespace).&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=853149"&gt;Perl6, modifying
        @*INC&lt;/a&gt; (another ws parsing issue)&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=853113"&gt;Perl6's
        LWP::Simple&lt;/a&gt; -- seemingly an installation issue&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.perlmonks.org/?node_id=852900"&gt;Perl 6, defining a
        hash with interpolated string&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've assembled this list by looking through the 100 newest nodes in &lt;a href="http://www.perlmonks.org/?node=Seekers%20of%20Perl%20Wisdom"&gt;Seekers of
Perl Wisdom&lt;/a&gt;, which makes it 6% of the questions asked, or on average 1 per
day (used to be around 1 per week).&lt;/p&gt;

&lt;p&gt;Most of the questions are related to environmental issues
(building/installing stuff), or beginner's questions related to syntax.&lt;/p&gt;

&lt;p&gt;It's good to see the questions flowing in, and I hope that we'll soon see
more questions where I can show off cool Perl 6 features in the answers
:-).&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/perlmonks-questions.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-1</link>
      <description>As is becoming normal, I used the times between talks to bugfix some of my modules - this time &lt;a href="http://search.cpan.org/~dcantrell/Tie-STDOUT-1.03/"&gt;Tie::STDOUT&lt;/a&gt; and &lt;a href="http://search.cpan.org/~dcantrell/Data-Transactional-1.0/"&gt;Data::Transactional&lt;/a&gt;.  The former was failing on perl 5.6, the latter on 5.9.5.  The former was a bug in perl (you can't localise tied filehandles and expect the tieing to go away in 5.6, so it now declares a dependency on 5.8), the latter was a bug in my code.&lt;p&gt;Philippe Bruhat's talk on &lt;a href="http://search.cpan.org/~book/Net-Proxy-0.08/"&gt;Net::Proxy&lt;/a&gt; was great - you can tell it's great because I came away with ideas for at least four things that I &lt;em&gt;need&lt;/em&gt; to write.  First up will be a plugin for it to allow the user to specify minimum and maximum permitted data rates for proxied connections.  This will permit bandwidth limits for maximum permitted rates, but will also help to defeat IDSes doing traffic analysis if you specify a minimum permitted data rate.&lt;p&gt;This will protect (eg) ssh sessions from being identified based on their very bursty traffic pattern, by "filling in the blanks" with junk data.&lt;p&gt;In the evening, the CPAN-testers BOF was productive.
</description>
      <title> YAPC::Europe 2007 report: day 1 </title>
      <content:encoded>As is becoming normal, I used the times between talks to bugfix some of my modules - this time &lt;a href="http://search.cpan.org/~dcantrell/Tie-STDOUT-1.03/"&gt;Tie::STDOUT&lt;/a&gt; and &lt;a href="http://search.cpan.org/~dcantrell/Data-Transactional-1.0/"&gt;Data::Transactional&lt;/a&gt;.  The former was failing on perl 5.6, the latter on 5.9.5.  The former was a bug in perl (you can't localise tied filehandles and expect the tieing to go away in 5.6, so it now declares a dependency on 5.8), the latter was a bug in my code.&lt;p&gt;Philippe Bruhat's talk on &lt;a href="http://search.cpan.org/~book/Net-Proxy-0.08/"&gt;Net::Proxy&lt;/a&gt; was great - you can tell it's great because I came away with ideas for at least four things that I &lt;em&gt;need&lt;/em&gt; to write.  First up will be a plugin for it to allow the user to specify minimum and maximum permitted data rates for proxied connections.  This will permit bandwidth limits for maximum permitted rates, but will also help to defeat IDSes doing traffic analysis if you specify a minimum permitted data rate.&lt;p&gt;This will protect (eg) ssh sessions from being identified based on their very bursty traffic pattern, by "filling in the blanks" with junk data.&lt;p&gt;In the evening, the CPAN-testers BOF was productive.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-1</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_palm-treophonecalldb-first-release</link>
      <description>To make up for a disappointing gap in Palm's software for the Treo smartphone, I wrote a &lt;a href=http://www.cantrell.org.uk/david/tech/treo/call-dumper/&gt;small perl script&lt;/a&gt; to parse the database that stores my call history.  I then re-wrote it as &lt;a href=http://search.cpan.org/search?query=Palm%3A%3ATreoPhoneCallDB&gt;a re-useable module&lt;/a&gt; which also figgers out whether the call was incoming or outgoing.
</description>
      <title> Palm Treo call db module </title>
      <content:encoded>To make up for a disappointing gap in Palm's software for the Treo smartphone, I wrote a &lt;a href=http://www.cantrell.org.uk/david/tech/treo/call-dumper/&gt;small perl script&lt;/a&gt; to parse the database that stores my call history.  I then re-wrote it as &lt;a href=http://search.cpan.org/search?query=Palm%3A%3ATreoPhoneCallDB&gt;a re-useable module&lt;/a&gt; which also figgers out whether the call was incoming or outgoing.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_palm-treophonecalldb-first-release</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/contribute-now-hash-pick.html</link>
      <description>For this week's contribution to Perl 6 we ask you to implement the
Hash.pick method (which does a weighted random selection) for Rakudo.

(Introduction to this series of challenges)


Background
----------

In Perl 6 the List class has a method called pick, which randomly selects
one item from a list. It has a few more options too:

&lt;a b c&gt;.pick;       # pick one random element&lt;a b c&gt;.pick(2);    # pick two distinct, random elements&lt;a b c&gt;.pick(2, :replace); # pick two random elements, it's ok                           # if they are the same&lt;a b c&gt;.pick(*);    # return a random permutation of the elements&lt;a b c&gt;.pick(*, :replace); # infinite, random stream of elements

This is already implemented through several multi methods in Rakudo.

Now the specification describes such a method for hashes too (actually it
talks about Bags, but Rakudo doesn't have Bags yet. Pretend it says
"Hash" instead). It assumes that each value in the hash is numeric, and
that the value is a weight that determines the probability of picking one
value. For example

{a =&gt; 1, b =&gt; 2}.pick;  # returns 'a' with probability 1/3                        # and 'b' with probability 2/3
{a =&gt; 1, b =&gt; 2}.pick(*);  # &lt;a b b&gt; with probability 1/3                           # &lt;b a b&gt; with probability 1/3                           # &lt;b b a&gt; with probability 1/3{a =&gt; 1, b =&gt; 0.5}.pick(*) # dies, because the weights aren't all integers{a =&gt; 1, b =&gt; 0.5}.pick(*, :replace)  # ok 


What you can do
---------------

Implement Hash.pick. It's ok if your patch doesn't cover all cases. It
would be nice if it supported non-integer weights.

Hint: this could be done by storing a list of accumulated weights, and a
list of keys.

{a =&gt; 1, b =&gt; 2.5, c =&gt; 1}
# could translate to my @keys = ('a', 'b', 'c');my @accumulated_weights = (1, 3.5, 4.5);# now pick a random number between 0 and 4.5,# find the next-highest index in @accumulated_weights# with a binary search, and then use that to obtain the key.

Of course other schemes are fine too.

Second hint: because it takes quite some time to recompile Rakudo, it is
probably easier to implement the actual logic in a function in a normal
source file first, and only later move it into src/core/Hash.pm.


Submission
----------

Please submit your source code to the perl6-compiler@perl.org mailing
list (and put moritz@faui2k3.org on CC, because the mailing list
sometimes lack quite a bit).

Update: there's one submission on the perl6-compiler mailing list
already, which looks pretty good.</description>
      <title>This Week's Contribution to Perl 6 Week 9: Implement Hash.pick for Rakudo</title>
      <content:encoded>

&lt;p&gt;For this week's contribution to Perl 6 we ask you to implement the
&lt;code&gt;Hash.pick&lt;/code&gt; method (which does a weighted random selection) for
Rakudo.&lt;/p&gt;

&lt;p&gt;(&lt;a href="http://perlgeek.de/blog-en/perl-6/contribute-now-announce.html"&gt;Introduction
    to this series of challenges&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;In Perl 6 the &lt;code&gt;List&lt;/code&gt; class has a method called &lt;code&gt;pick&lt;/code&gt;,
which randomly selects one item from a list. It has a few more options
too:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synSpecial"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;a b c&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;       &lt;span class="synComment"&gt;# pick one random element&lt;/span&gt;
&lt;span class="synSpecial"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;a b c&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synConstant"&gt;2&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;    &lt;span class="synComment"&gt;# pick two distinct, random elements&lt;/span&gt;
&lt;span class="synSpecial"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;a b c&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synConstant"&gt;2&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synStatement"&gt;:&lt;/span&gt;&lt;span class="synConstant"&gt;replace&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt; &lt;span class="synComment"&gt;# pick two random elements, it's ok&lt;/span&gt;
                           &lt;span class="synComment"&gt;# if they are the same&lt;/span&gt;
&lt;span class="synSpecial"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;a b c&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synStatement"&gt;*&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;    &lt;span class="synComment"&gt;# return a random permutation of the elements&lt;/span&gt;
&lt;span class="synSpecial"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synConstant"&gt;a b c&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synStatement"&gt;*,&lt;/span&gt; &lt;span class="synStatement"&gt;:&lt;/span&gt;&lt;span class="synConstant"&gt;replace&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt; &lt;span class="synComment"&gt;# infinite, random stream of elements&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;This is already &lt;a href="http://github.com/rakudo/rakudo/blob/master/src/core/Any-list.pm#L165"&gt;implemented
through several multi methods in Rakudo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now the specification &lt;a href="http://perlcabal.org/syn/S32/Containers.html#Bag"&gt;describes such a
method for hashes too&lt;/a&gt; (actually it talks about Bags, but Rakudo doesn't
have Bags yet. Pretend it says "Hash" instead). It assumes that each value in
the hash is numeric, and that the value is a weight that determines the
probability of picking one value. For example&lt;/p&gt;

&lt;pre&gt;
{&lt;span class="synConstant"&gt;a&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;b&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;2&lt;/span&gt;}&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;  &lt;span class="synComment"&gt;# returns 'a' with probability 1/3&lt;/span&gt;
                        &lt;span class="synComment"&gt;# and 'b' with probability 2/3&lt;/span&gt;

{&lt;span class="synConstant"&gt;a&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;b&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;2&lt;/span&gt;}&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synStatement"&gt;*&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;  &lt;span class="synComment"&gt;# &amp;lt;a b b&amp;gt; with probability 1/3&lt;/span&gt;
                           &lt;span class="synComment"&gt;# &amp;lt;b a b&amp;gt; with probability 1/3&lt;/span&gt;
                           &lt;span class="synComment"&gt;# &amp;lt;b b a&amp;gt; with probability 1/3&lt;/span&gt;
{&lt;span class="synConstant"&gt;a&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;b&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;0.5&lt;/span&gt;}&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synStatement"&gt;*&lt;/span&gt;) &lt;span class="synComment"&gt;# dies, because the weights aren't all integers&lt;/span&gt;
{&lt;span class="synConstant"&gt;a&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;b&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;0.5&lt;/span&gt;}&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;pick&lt;/span&gt;(&lt;span class="synStatement"&gt;*,&lt;/span&gt; &lt;span class="synStatement"&gt;:&lt;/span&gt;&lt;span class="synConstant"&gt;replace&lt;/span&gt;)  &lt;span class="synComment"&gt;# ok &lt;/span&gt;
&lt;/pre&gt;



&lt;h2&gt;What you can do&lt;/h2&gt;

&lt;p&gt;Implement Hash.pick. It's ok if your patch doesn't cover all cases. It
would be nice if it supported non-integer weights.&lt;/p&gt;

&lt;p&gt;Hint: this could be done by storing a list of accumulated weights, and a
list of keys.&lt;/p&gt;

&lt;pre&gt;
{&lt;span class="synConstant"&gt;a&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;b&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;2.5&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;c&lt;/span&gt; &lt;span class="synStatement"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;}

&lt;span class="synComment"&gt;# could translate to &lt;/span&gt;
&lt;span class="synSpecial"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@keys&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; (&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;a&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;b&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;c&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synSpecial"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@accumulated_weights&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; (&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;3.5&lt;/span&gt;&lt;span class="synStatement"&gt;,&lt;/span&gt; &lt;span class="synConstant"&gt;4.5&lt;/span&gt;)&lt;span class="synStatement"&gt;;&lt;/span&gt;

&lt;span class="synComment"&gt;# now pick a random number between 0 and 4.5,&lt;/span&gt;
&lt;span class="synComment"&gt;# find the next-highest index in @accumulated_weights&lt;/span&gt;
&lt;span class="synComment"&gt;# with a binary search, and then use that to obtain the key.&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Of course other schemes are fine too.&lt;/p&gt;

&lt;p&gt;Second hint: because it takes quite some time to recompile Rakudo, it is 
probably easier to implement the actual logic in a function
in a normal source file first, and only later move it into src/core/Hash.pm.&lt;/p&gt;

&lt;h2&gt;Submission&lt;/h2&gt;

&lt;p&gt;Please submit your source code to the &lt;a href="mailto:perl6-compiler@perl.org"&gt;perl6-compiler@perl.org&lt;/a&gt; mailing
list (and put moritz@faui2k3.org on CC,
because the mailing list sometimes lack quite a bit).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; there's one submission on the perl6-compiler
mailing list already, which looks pretty good.&lt;/p&gt;



</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/contribute-now-hash-pick.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/state-of-regex-modifiers.html</link>
      <description>During the last one and a half month, I've been working on making regex
modifiers easily available in Rakudo.

The regex compiler itself has to support only a few of the adverbs that
can be applied to regexes; those include :ignorecase, :sigspace,
:ignoremark and :continue/:pos. NQP-rx, the regex engine that Rakudo uses
under the hood, supports those (except :ignoremark), so previously you
could write

if 'ABC' ~~ /:i abc/ {
    say "case insensitive match";}

But not

if 'ABC' ~~ rx:i/abc/ {
    say "case insensitive match";}

nor m:i/abc/, for that matter.

I've patched Rakudo to actually recognize those adverbs outside of the
regex, and also for s/// substitutions.

Another category of adverbs are those that apply to regex calls, not to
the compilation of a regex. Among those are :global/:g, :overlap/:ov,
:nth($n), :x. I've implemented those for substitutions, but implementing
them for m// turns out to be quite a bit harder.

The reason is the return value: each regex match returns a Match object,
which can store positional and named parts. S05 says that regex matches
with multiple results should return a single match object, with all
results as positional parts. It can be distinguished from a normal match
object by evaluating it in slice context... which Rakudo doesn't support
yet.

Now the subst method and thus s/// are implemented by calling
.match(:global, ...), and without slice context, it can't distinguish
between multiple matches, and a single match with subcaptures. And so my
changes to the global match broke the substitution, and I see no easy way
to fix it.

Anyway, here are a few examples of what works today:

$_ = 'ab12fg34';s:g/\d/X/;.say; # output: abXXfgXX
$_ = 'Hello, World';# :ii is the same as :samecases:ii/world/perl/;.say; # output: Hello, Perl$_ = 'I did not know that that work together';s:2nd/that/they/;.say; # output: I did not know that they work together</description>
      <title>The State of Regex Modifiers in Rakudo</title>
      <content:encoded>

&lt;p&gt;During the last one and a half month, I've been working on making regex
modifiers easily available in Rakudo.&lt;/p&gt;

&lt;p&gt;The regex compiler itself has to support only a few of the adverbs that can
be applied to regexes; those include :ignorecase, :sigspace, :ignoremark and
:continue/:pos. NQP-rx, the regex engine that Rakudo uses under the hood,
supports those (except :ignoremark), so previously you could write&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;if&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;ABC&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synStatement"&gt;~~&lt;/span&gt; &lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synStatement"&gt;:&lt;/span&gt;&lt;span class="synConstant"&gt;i abc&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt; {
    &lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;case insensitive match&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;


&lt;p&gt;But not&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synStatement"&gt;if&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;ABC&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synStatement"&gt;~~&lt;/span&gt; &lt;span class="synStatement"&gt;rx:&lt;/span&gt;&lt;span class="synConstant"&gt;i&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;abc&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt; {
    &lt;span class="synIdentifier"&gt;say&lt;/span&gt; &lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;case insensitive match&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
}
&lt;/pre&gt;

&lt;p&gt;nor &lt;code&gt;m:i/abc/&lt;/code&gt;, for that matter.&lt;/p&gt;

&lt;p&gt;I've patched Rakudo to actually recognize those adverbs outside of the
regex, and also for &lt;code&gt;s///&lt;/code&gt; substitutions.&lt;/p&gt;

&lt;p&gt;Another category of adverbs are those that apply to regex calls, not to the
compilation of a regex. Among those are :global/:g, :overlap/:ov, :nth($n),
:x. I've implemented those for substitutions, but implementing them for
&lt;code&gt;m//&lt;/code&gt; turns  out to be quite a bit harder.&lt;/p&gt;

&lt;p&gt;The reason is the return value: each regex match returns a Match object,
which can store positional and named parts. &lt;a href="http://pugscode.org/syn/S05.html"&gt;S05&lt;/a&gt; says that regex matches
with multiple results should return a single match object, with all results as
positional parts. It can be distinguished from a normal match object by
evaluating it in slice context... which Rakudo doesn't support yet.&lt;/p&gt;

&lt;p&gt;Now the &lt;code&gt;subst&lt;/code&gt; method and thus &lt;code&gt;s///&lt;/code&gt; are
implemented by calling &lt;code&gt;.match(:global, ...)&lt;/code&gt;, and without slice
context, it can't distinguish between multiple matches, and a single match
with subcaptures. And so my changes to the global match broke the
substitution, and I see no easy way to fix it.&lt;/p&gt;

&lt;p&gt;Anyway, here are a few examples of what works today:&lt;/p&gt;

&lt;pre&gt;
&lt;span class="synIdentifier"&gt;$_&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;ab12fg34&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;s:&lt;/span&gt;&lt;span class="synConstant"&gt;g&lt;/span&gt;&lt;span class="synSpecial"&gt;/\d/&lt;/span&gt;&lt;span class="synConstant"&gt;X&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt; &lt;span class="synComment"&gt;# output: abXXfgXX&lt;/span&gt;


&lt;span class="synIdentifier"&gt;$_&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Hello, World&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synComment"&gt;# :ii is the same as :samecase&lt;/span&gt;
&lt;span class="synStatement"&gt;s:&lt;/span&gt;&lt;span class="synConstant"&gt;ii&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;world&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;perl&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt; &lt;span class="synComment"&gt;# output: Hello, Perl&lt;/span&gt;

&lt;span class="synIdentifier"&gt;$_&lt;/span&gt; &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;I did not know that that work together&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;s:&lt;/span&gt;&lt;span class="synConstant"&gt;2nd&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;that&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;they&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt;
&lt;span class="synStatement"&gt;.&lt;/span&gt;&lt;span class="synIdentifier"&gt;say&lt;/span&gt;&lt;span class="synStatement"&gt;;&lt;/span&gt; &lt;span class="synComment"&gt;# output: I did not know that they work together&lt;/span&gt;
&lt;/pre&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/state-of-regex-modifiers.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_number-phone-release</link>
      <description>There's a new release, &lt;a href=http://www.cantrell.org.uk/david/tech/perl-modules/Number-Phone-1.58.tar.gz&gt;version 1.58&lt;/a&gt;, of Number::Phone, my set of perl modules for picking information out of phone numbers.  Changes from the previous release are that Mayotte, Reunion and Comoros can't decide which country is which, and there's the usual updates to the database of UK numbers, mostly to support the &lt;a href=http://www.ofcom.org.uk/media/news/2007/02/nr_20070213b&gt;new 03 numbers&lt;/a&gt;.
</description>
      <title> Number::Phone release </title>
      <content:encoded>There's a new release, &lt;a href=http://www.cantrell.org.uk/david/tech/perl-modules/Number-Phone-1.58.tar.gz&gt;version 1.58&lt;/a&gt;, of Number::Phone, my set of perl modules for picking information out of phone numbers.  Changes from the previous release are that Mayotte, Reunion and Comoros can't decide which country is which, and there's the usual updates to the database of UK numbers, mostly to support the &lt;a href=http://www.ofcom.org.uk/media/news/2007/02/nr_20070213b&gt;new 03 numbers&lt;/a&gt;.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_number-phone-release</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_wikipedia-proxy</link>
      <description>I got irritated at how hard it was to use &lt;a href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; on my Treo.  There's so much rubbish splattered around their pages that it Just Doesn't Work on such a small screen.  Given that no alternatives seemed to be available - at least, Google couldn't find any - I decided to write my own &lt;a href="http://wikiproxy.cantrell.org.uk/"&gt;Wikipedia handheld proxy&lt;/a&gt;.&lt;p&gt;It strips away all the useless rubbish that normally surrounds Wikipedia pages, as well as things like the editing functions which are also hard to use on portable devices.  Internally, it's implemented using &lt;a href="http://www.perl.org/"&gt;perl&lt;/a&gt;, &lt;a href="http://search.cpan.org/~gaas/libwww-perl-5.806/"&gt;LWP&lt;/a&gt;, and &lt;a href="http://search.cpan.org/~pgollucci/mod_perl-2.0.3/"&gt;mod_perl&lt;/a&gt;, and is hosted by &lt;a href="http://www.keyweb.de/vrsrds/index.shtml"&gt;Keyweb.de&lt;/a&gt;.
</description>
      <title> Wikipedia handheld proxy </title>
      <content:encoded>I got irritated at how hard it was to use &lt;a href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; on my Treo.  There's so much rubbish splattered around their pages that it Just Doesn't Work on such a small screen.  Given that no alternatives seemed to be available - at least, Google couldn't find any - I decided to write my own &lt;a href="http://wikiproxy.cantrell.org.uk/"&gt;Wikipedia handheld proxy&lt;/a&gt;.&lt;p&gt;It strips away all the useless rubbish that normally surrounds Wikipedia pages, as well as things like the editing functions which are also hard to use on portable devices.  Internally, it's implemented using &lt;a href="http://www.perl.org/"&gt;perl&lt;/a&gt;, &lt;a href="http://search.cpan.org/~gaas/libwww-perl-5.806/"&gt;LWP&lt;/a&gt;, and &lt;a href="http://search.cpan.org/~pgollucci/mod_perl-2.0.3/"&gt;mod_perl&lt;/a&gt;, and is hosted by &lt;a href="http://www.keyweb.de/vrsrds/index.shtml"&gt;Keyweb.de&lt;/a&gt;.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_wikipedia-proxy</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps-upgraded-to-mysql</link>
      <description>While you won't notice any changes, there have been biiiig upgrades at &lt;a href="http://deps.cpantesters.org"&gt;CPANdeps&lt;/a&gt;.  &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/cpandeps/diff/?id=2fa3ffb8d3b0597afb7a35f473086c82b8a07335&amp;amp;id2=8df033031c2fcd9243152d35e5d8336d60264ecc"&gt;Here's the diff&lt;/a&gt;.&lt;p&gt;Until now, it's used a SQLite database of test results that I downloaded every day and then mangled a bit to do things like add some necessary indices, figure out which reports are from dev versions of perl, and so on.  That worked really well back in the summer of 2007, when there were only half a million reports in the database.  I started worrying a bit at the beginning of 2009 when we hit 3 million, but the update happened overnight so I didn't care.  But now that we've got over 6 million reports, the update would take anywhere between 8 and 14 hours.  Not only is that not sustainable given the current growth rate, it also hurts the other users on that machine, because almost all of that time is spent waiting for disk I/O - which means that they're also waiting for the disk.  On top of that, when you have big databases, a SQLite CGI ain't a great idea because indices have to be fetched from disk every time, so reads pound the disk too.  Doubleplusungood!&lt;p&gt;Fun fact: SQLite is great for prototyping, but it doesn't scale :-)&lt;p&gt;So now it uses MySQL.  Having a database daemon running all the time means that there's now some caching, so reads are quicker.  In addition, given that I can't just simply fiddle with the structure of the database that I download to produce what I want, and instead have to import the data into MySQL, it now only imports new records, so the daily update takes only a few seconds.&lt;p&gt;I also re-jigged the structure of how it caches test results.  Instead of being all in one directory with hundreds of thousands of files, they're split into a hierarchy.  This probably won't have any significant effect on normal operations, but it will certainly make it faster for me to navigate around and see what's going on when people submit bug reports!
</description>
      <title> CPANdeps upgrade </title>
      <content:encoded>While you won't notice any changes, there have been biiiig upgrades at &lt;a href="http://deps.cpantesters.org"&gt;CPANdeps&lt;/a&gt;.  &lt;a href="http://www.cantrell.org.uk/cgit/cgit.cgi/cpandeps/diff/?id=2fa3ffb8d3b0597afb7a35f473086c82b8a07335&amp;amp;id2=8df033031c2fcd9243152d35e5d8336d60264ecc"&gt;Here's the diff&lt;/a&gt;.&lt;p&gt;Until now, it's used a SQLite database of test results that I downloaded every day and then mangled a bit to do things like add some necessary indices, figure out which reports are from dev versions of perl, and so on.  That worked really well back in the summer of 2007, when there were only half a million reports in the database.  I started worrying a bit at the beginning of 2009 when we hit 3 million, but the update happened overnight so I didn't care.  But now that we've got over 6 million reports, the update would take anywhere between 8 and 14 hours.  Not only is that not sustainable given the current growth rate, it also hurts the other users on that machine, because almost all of that time is spent waiting for disk I/O - which means that they're also waiting for the disk.  On top of that, when you have big databases, a SQLite CGI ain't a great idea because indices have to be fetched from disk every time, so reads pound the disk too.  Doubleplusungood!&lt;p&gt;Fun fact: SQLite is great for prototyping, but it doesn't scale :-)&lt;p&gt;So now it uses MySQL.  Having a database daemon running all the time means that there's now some caching, so reads are quicker.  In addition, given that I can't just simply fiddle with the structure of the database that I download to produce what I want, and instead have to import the data into MySQL, it now only imports new records, so the daily update takes only a few seconds.&lt;p&gt;I also re-jigged the structure of how it caches test results.  Instead of being all in one directory with hundreds of thousands of files, they're split into a hierarchy.  This probably won't have any significant effect on normal operations, but it will certainly make it faster for me to navigate around and see what's going on when people submit bug reports!
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps-upgraded-to-mysql</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/notes-from-yapc-hackathon.html</link>
      <description>At YAPC::EU 2010 we had a long discussion about Perl 6, Rakudo and
related matters. Here are some (very incomplete) notes of the ongoing
discussions and results.


Attendees
---------

Patrick Michaud, Jonathan Worthington, Carl Mäsak, Moritz Lenz, Gabor
Szabo, and a fluctuation of other Perl 6 hackers.


Speed
-----

What can we do to improve Rakudo's performance?

jnthn's grant proposal for a low-level meta object protocol

      See
      http://news.perlfoundation.org/2010/07/hague-grant-application-meta-m.html.
      Will probably bring the biggest speed improvement of all options we
      have under our control

Rakudo built-in optimizations

      Most Rakudo built-ins are written for correctness first, and
      without a good feeling for what constructs are fast and what
      aren't. A thorough review (and preferably profiling) could bring
      decent speed improvements, as the case of int ranges showed.

Garbage collector

      Parrot's GC is... suboptimal. To be gentle.

Optimization framework

      We will try to convince people that Tyler Curtis' optimization
      framework for PAST and POST should be shipped with parrot (probably
      compile PIRs in ext/, just like NQP-rx does it now). Using that, we
      can do constant folding

Moving stuff to compile time

      Number parsing needs to be moved to compile time.


What do we need to keep hacking?
--------------------------------

Brought up by Gabor

Money 

      We do much volunteer work, but when we get funding, we can devote
      more time to hacking

Travel/Conferences

      We'd like to get together a few times (2? 3? 4?) a year, in real
      life.

      Funding and organization would be very welcome

Short-time funding

      It would be nice to have a way to have funding available much more
      quickly than through the usual grant process, which tends to be
      longish.


Rakudo Star feedback
--------------------

Good: It worked. It did what we wanted it to.

Bad:

  * 

    It lacked a module installer (It shipped proto, but didn't install
    it).

  * 

    Compilation takes too much memory. pmichaud will try a hack to split
    the setting, which would solve that problem.

  * 

    There was some discussion about the roles + outer scopes bugs, which
    was way over my head. It seems to be related to the fact that parrot
    has two outer chains for nested blocks: one at compile time, one at
    runtime. Since role methods are flattened into classes, there compile
    time outer block is actually different than where it runs, and that
    screws up ... forget it, somebody else must describe it.

  * 

    Lack of modules - doesn't seem to bee a big problem

  * 

    Lack of features: not a big problem.

    Biggest complaints: missing perl6doc. Missing non-blocking IO, binary
    file support.

  * 

    Prefix paths with spaces are not supported :(

    jnthn: "I actually tried to write a C program that binary patches the
    perl6 executable to allow spaces in path names. It almost worked."

  * 

    We will try to advocate compilation to PBC, not PIR - once that's
    supported.


Proto/Pls
---------

Proto needs to be end-of-life'd.

It confuses people that there are two different project lists, and the
lists diverge.

We would like to decentralize the module list somehow. Still open how.

People don't release Perl 6 modules, because there's no need so far, and
it's tedious to add the version name in each .pm/.pm6 file. We might need
to come up with a clever idea for that.


Backend diversity
-----------------

Additionally to the parrot backend, we want to run Perl 6 code on other
virtual machines.

jnthn will work on a .NET/CLR port. He wants to prototype the new
low-level class composition code in .NET anyway, which will provide the
basic foundations for running NQP.

pmichaud wants to explore javascript on V8 as a possible backend. "I
managed PIR, I'll certainly manage javascript" :-)

  * 

    Huge time sink, but still worth doing it

  * 

    Apache runtime library might be worth looking into

  * 

    risks: stalled refactors are dangerous (see: PHP 6, cardinal (the
    ruby-on-parrot compiler))

    We want to avoid fragmentation into many subprojects

  * 

    We want to increase the number of possible contributors to rakudo by
    enabling non-parrot people to contribute.

  * 

    Code for different backends will be maintained as directories in
    Rakudo and NQP, not as branches.

  * 

    pir:: things will be hidden behind an nqp:: abstraction layer


Attracting contributors
-----------------------

Moritz wants to continue with the "weekly" challenges, but runs out of
ideas. Add ideas to http://svn.pugscode.org/pugs/misc/helpnow/README.

We will try to apply patches faster, thus encouraging people who already
did the first step.


Documentation
-------------

  * 

    in p5 pod for now, so that people can contribute easily

  * 

    masak and szabgab expressed interest in working on pod6 tools</description>
      <title>Notes from the YAPC::EU 2010 Rakudo hackathon</title>
      <content:encoded>

&lt;p&gt;At YAPC::EU 2010 we had a long discussion about Perl 6, Rakudo and related
matters. Here are some (very incomplete) notes of the ongoing discussions and
results.&lt;/p&gt;

&lt;h2 id="attendees"&gt;Attendees&lt;/h2&gt;

&lt;p&gt;Patrick Michaud, Jonathan Worthington, Carl Mäsak, Moritz Lenz, Gabor
Szabo, and a fluctuation of other Perl 6 hackers.&lt;/p&gt;

&lt;h2 id="speed"&gt;Speed&lt;/h2&gt;
&lt;p&gt;What can we do to improve Rakudo's performance?&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="jnthn_s_grant_proposal_for_a_low_level_meta_object_protocol" class="item"&gt;jnthn's grant proposal for a low-level meta object protocol&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;See
&lt;a href="http://news.perlfoundation.org/2010/07/hague-grant-application-meta-m.html"&gt;http://news.perlfoundation.org/2010/07/hague-grant-application-meta-m.html&lt;/a&gt;.
Will probably bring the biggest speed improvement of all options we have under
our control&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="rakudo_built_in_optimizations" class="item"&gt;Rakudo built-in optimizations&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;Most Rakudo built-ins are written for correctness first, and without a good
feeling for what constructs are fast and what aren't. A thorough review (and
preferably profiling) could bring decent speed improvements, as the case of
int ranges showed.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="garbage_collector" class="item"&gt;Garbage collector&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;Parrot's GC is... suboptimal. To be gentle.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="optimization_framework" class="item"&gt;Optimization framework&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;We will try to convince people that Tyler Curtis' optimization framework for
PAST and POST should be shipped with parrot (probably compile PIRs in &lt;code&gt;ext/&lt;/code&gt;,
just like NQP-rx does it now). Using that, we can do constant folding&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="moving_stuff_to_compile_time" class="item"&gt;Moving stuff to compile time&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;Number parsing needs to be moved to compile time.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2 id="what_do_we_need_to_keep_hacking"&gt;What do we need to keep hacking?&lt;/h2&gt;
&lt;p&gt;Brought up by Gabor&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="money" class="item"&gt;Money&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;We do much volunteer work, but when we get funding, we can devote more time to
hacking&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="travel_conferences" class="item"&gt;Travel/Conferences&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;We'd like to get together a few times (2? 3? 4?) a year, in real life.&lt;/p&gt;
&lt;p&gt;Funding and organization would be very welcome&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;a name="short_time_funding" class="item"&gt;Short-time funding&lt;/a&gt;&lt;/strong&gt;&lt;/dt&gt;

&lt;dd&gt;
&lt;p&gt;It would be nice to have a way to have funding available much more quickly
than through the usual grant process, which tends to be longish.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2 id="rakudo_star_feedback"&gt;Rakudo Star feedback&lt;/h2&gt;
&lt;p&gt;Good: It worked. It did what we wanted it to.&lt;/p&gt;
&lt;p&gt;Bad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It lacked a module installer (It shipped proto, but didn't install it).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compilation takes too much memory. pmichaud will try a hack to split the
setting, which would solve that problem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was some discussion about the roles + outer scopes bugs, which was way
over my head. It seems to be related to the fact that parrot has two outer
chains for nested blocks: one at compile time, one at runtime. Since role
methods are flattened into classes, there compile time outer block is actually
different than where it runs, and that  screws up ... forget it, somebody else must describe it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lack of modules - doesn't seem to bee a big problem&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lack of features: not a big problem.&lt;/p&gt;
&lt;p&gt;Biggest complaints: missing perl6doc. Missing non-blocking IO, binary file
support.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prefix paths with spaces are not supported :(&lt;/p&gt;
&lt;p&gt;jnthn: "I actually tried to write a C program that binary patches the perl6
executable to allow spaces in path names. It almost worked."&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We will try to advocate compilation to PBC, not PIR - once that's supported.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="proto_pls"&gt;Proto/Pls&lt;/h2&gt;
&lt;p&gt;Proto needs to be end-of-life'd.&lt;/p&gt;
&lt;p&gt;It confuses people that there are two different project lists, and the lists
diverge.&lt;/p&gt;
&lt;p&gt;We would like to decentralize the module list somehow. Still open how.&lt;/p&gt;

&lt;p&gt;People don't release Perl 6 modules, because there's no need so far, and
it's tedious to add the version name in each .pm/.pm6 file. We might need to
come up with a clever idea for that.&lt;/p&gt;

&lt;h2 id="backend_diversity"&gt;Backend diversity&lt;/h2&gt;
&lt;p&gt;Additionally to the parrot backend, we want to run Perl 6 code on other
virtual machines.&lt;/p&gt;
&lt;p&gt;jnthn will work on a .NET/CLR port. He wants to prototype the new low-level
class composition code in .NET anyway, which will provide the basic
foundations for running NQP.&lt;/p&gt;
&lt;p&gt;pmichaud wants to explore javascript on V8 as a possible backend. "I managed
PIR, I'll certainly manage javascript" :-)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Huge time sink, but still worth doing it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apache runtime library might be worth looking into&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;risks: stalled refactors are dangerous (see: PHP 6, cardinal (the
ruby-on-parrot compiler))&lt;/p&gt;
&lt;p&gt;We want to avoid fragmentation into many subprojects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We want to increase the number of possible contributors to rakudo by
enabling non-parrot people to contribute.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code for different backends will be maintained as directories in Rakudo and
NQP, not as branches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pir:: things will be hidden behind an nqp:: abstraction layer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="attracting_contributors"&gt;Attracting contributors&lt;/h2&gt;
&lt;p&gt;Moritz wants to continue with the "weekly" challenges, but runs out of ideas.
Add ideas to &lt;a href="http://svn.pugscode.org/pugs/misc/helpnow/README"&gt;http://svn.pugscode.org/pugs/misc/helpnow/README&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We will try to apply patches faster, thus encouraging people who already did
the first step.&lt;/p&gt;

&lt;h2 id="documentation"&gt;Documentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;in p5 pod for now, so that people can contribute easily&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;masak and szabgab expressed interest in working on pod6 tools&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/notes-from-yapc-hackathon.html</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps</link>
      <description>&lt;a href="http://cpandeps.cantrell.org.uk/"&gt;CPANdeps&lt;/a&gt; now lets you filter test results by perl version number, and also knows what modules were in core in which versions of perl.  Hurrah!
</description>
      <title> CPANdeps </title>
      <content:encoded>&lt;a href="http://cpandeps.cantrell.org.uk/"&gt;CPANdeps&lt;/a&gt; now lets you filter test results by perl version number, and also knows what modules were in core in which versions of perl.  Hurrah!
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_cpandeps</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-2</link>
      <description>A day of not many talks, but lots of cool stuff.  Damian was his usual crazy self, and MJD's talk on building parsers was really good.  Although I probably won't use those techniques at work as functional programming seems to scare people.&lt;p&gt;The conference dinner at a &lt;a href="http://wikiproxy.cantrell.org.uk/Heuriger"&gt;Heuriger&lt;/a&gt; on the outskirts of Vienna was great.  The orga-punks had hired a small fleet of buses to get us there and back, and one of the sponsors laid on a great buffet.  The local wine was pretty damned fine too, and then the evening de-generated into Schnapps, with toasts to Her Majesty, to her splendid navy, and to The Village People.&lt;p&gt;It wasn't all debauchery in the evening though - on the bus, I had a very useful chat with &lt;a href="http://www.bruhat.net/"&gt;Philippe&lt;/a&gt; about &lt;a href="http://search.cpan.org/~book/Net-Proxy-0.08/"&gt;Net::Proxy&lt;/a&gt;, and re-designing it to make it easier to create new connectors for it.
</description>
      <title> YAPC::Europe 2007 report: day 2 </title>
      <content:encoded>A day of not many talks, but lots of cool stuff.  Damian was his usual crazy self, and MJD's talk on building parsers was really good.  Although I probably won't use those techniques at work as functional programming seems to scare people.&lt;p&gt;The conference dinner at a &lt;a href="http://wikiproxy.cantrell.org.uk/Heuriger"&gt;Heuriger&lt;/a&gt; on the outskirts of Vienna was great.  The orga-punks had hired a small fleet of buses to get us there and back, and one of the sponsors laid on a great buffet.  The local wine was pretty damned fine too, and then the evening de-generated into Schnapps, with toasts to Her Majesty, to her splendid navy, and to The Village People.&lt;p&gt;It wasn't all debauchery in the evening though - on the bus, I had a very useful chat with &lt;a href="http://www.bruhat.net/"&gt;Philippe&lt;/a&gt; about &lt;a href="http://search.cpan.org/~book/Net-Proxy-0.08/"&gt;Net::Proxy&lt;/a&gt;, and re-designing it to make it easier to create new connectors for it.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-2</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2006-day-3</link>
      <description>There were quite a few interesting talks in the morning, especially Ivor's one on packaging perl applications.  Oh, and mine about rsnapshot, of course, in which people laughed at the right places and I judged the length of it just right, finishing with a couple of minutes left for questions.&lt;p&gt;At the traditional end-of-YAPC auction, I avoided spending my usual stupid amounts of money on stupid things, which was nice.  Obviously the hundred quid I put in to buying the hair style of next year's organisers wasn't stupid.  Oh no.  Definitely not.&lt;p&gt;An orange mohican will suit &lt;a href="http://static.flickr.com/9/11370395_031596292a_m.jpg"&gt;Domm&lt;/a&gt; beautifully.
</description>
      <title> YAPC::Europe 2006 report: day 3 </title>
      <content:encoded>There were quite a few interesting talks in the morning, especially Ivor's one on packaging perl applications.  Oh, and mine about rsnapshot, of course, in which people laughed at the right places and I judged the length of it just right, finishing with a couple of minutes left for questions.&lt;p&gt;At the traditional end-of-YAPC auction, I avoided spending my usual stupid amounts of money on stupid things, which was nice.  Obviously the hundred quid I put in to buying the hair style of next year's organisers wasn't stupid.  Oh no.  Definitely not.&lt;p&gt;An orange mohican will suit &lt;a href="http://static.flickr.com/9/11370395_031596292a_m.jpg"&gt;Domm&lt;/a&gt; beautifully.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2006-day-3</guid>
    </item>
    <item>
      <author>nobody@example.com ( david )</author>
      <dc:creator>nobody@example.com ( david )</dc:creator>
      <link> http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-3</link>
      <description>My &lt;a href="http://www.justanotherperlhacker.org/lightning/index.shtml"&gt;Lightning Talk&lt;/a&gt; on &lt;a href="http://cpandeps.cantrell.org.uk/"&gt;cpandeps&lt;/a&gt; went down really well, although as Jos&amp;eacute; pointed out, I need to fix it to take account of &lt;a href="http://cpandeps.cantrell.org.uk/?module=File%3A%3ACopy"&gt;File::Copy&lt;/a&gt; being &lt;a href="http://abigail1.hates-software.com/2005/09/21/0692681a.html"&gt;broken&lt;/a&gt;.  I also need to talk to Domm after the conference is over to see if I can get dependency information from CPANTS as well as from META.yml files.&lt;p&gt;There were lots of other good lightning talks.  Dmitri Karasik's regexes for doing OCR, Juerd Waalboer's &lt;a href="http://search.cpan.org/~juerd/Unicode-Semantics-1.00/"&gt;Unicode::Semantics&lt;/a&gt;, and Ren&amp;eacute;e B&amp;auml;cker's &lt;a href="http://search.cpan.org/~ctrondlp/Win32-GuiTest-1_50.5/"&gt;Win32::GuiTest&lt;/a&gt; were especially noteworthy.&lt;p&gt;Richard Foley's brief intro to the perl debugger was also useful.  Unfortunately Hakim Cassimally's talk was about debugging &lt;em&gt;web&lt;/em&gt; applications, which I'd not noticed on the schedule, so I didn't stay for that.&lt;p&gt;And finally, Mark Fowler's grumble about why perl sucks (and what to do about it) had a few interesting little things in it.  I am having vaguely sick ideas about mixing some of that up with an MJD-stylee parser.&lt;p&gt;At the auction I paid &amp;euro;250 to have the Danish organisers of next year's YAPC::Europe wear the Swedish flag on their foreheads.  This, I should point out, was &lt;a href="http://drinkbroken.typepad.com/"&gt;Greg&lt;/a&gt;'s idea.  I would never be so evil on my own.
</description>
      <title> YAPC::Europe 2007 report: day 3 </title>
      <content:encoded>My &lt;a href="http://www.justanotherperlhacker.org/lightning/index.shtml"&gt;Lightning Talk&lt;/a&gt; on &lt;a href="http://cpandeps.cantrell.org.uk/"&gt;cpandeps&lt;/a&gt; went down really well, although as Jos&amp;eacute; pointed out, I need to fix it to take account of &lt;a href="http://cpandeps.cantrell.org.uk/?module=File%3A%3ACopy"&gt;File::Copy&lt;/a&gt; being &lt;a href="http://abigail1.hates-software.com/2005/09/21/0692681a.html"&gt;broken&lt;/a&gt;.  I also need to talk to Domm after the conference is over to see if I can get dependency information from CPANTS as well as from META.yml files.&lt;p&gt;There were lots of other good lightning talks.  Dmitri Karasik's regexes for doing OCR, Juerd Waalboer's &lt;a href="http://search.cpan.org/~juerd/Unicode-Semantics-1.00/"&gt;Unicode::Semantics&lt;/a&gt;, and Ren&amp;eacute;e B&amp;auml;cker's &lt;a href="http://search.cpan.org/~ctrondlp/Win32-GuiTest-1_50.5/"&gt;Win32::GuiTest&lt;/a&gt; were especially noteworthy.&lt;p&gt;Richard Foley's brief intro to the perl debugger was also useful.  Unfortunately Hakim Cassimally's talk was about debugging &lt;em&gt;web&lt;/em&gt; applications, which I'd not noticed on the schedule, so I didn't stay for that.&lt;p&gt;And finally, Mark Fowler's grumble about why perl sucks (and what to do about it) had a few interesting little things in it.  I am having vaguely sick ideas about mixing some of that up with an MJD-stylee parser.&lt;p&gt;At the auction I paid &amp;euro;250 to have the Danish organisers of next year's YAPC::Europe wear the Swedish flag on their foreheads.  This, I should point out, was &lt;a href="http://drinkbroken.typepad.com/"&gt;Greg&lt;/a&gt;'s idea.  I would never be so evil on my own.
</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006: http://www.cantrell.org.uk/david/journal/index.pl/id_yapc-europe-2007-day-3</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-5-to-6/28-currying.html</link>
      <description>NAME

"Perl 5 to 6" Lesson 28 - Currying


SYNOPSIS

  use v6;
  
  my &amp;f := &amp;substr.assuming('Hello, World');
  say f(0, 2);                # He
  say f(3, 2);                # lo
  say f(7);                   # World
  
  say &lt;a b c&gt;.map: * x 2;     # aabbcc
  say &lt;a b c&gt;.map: *.uc;      # ABC
  for ^10 {
      print &lt;R G B&gt;.[$_ % *]; # RGBRGBRGBR
  }


DESCRIPTION

Currying or partial application is the process of generating a function
from another function or method by providing only some of the arguments.
This is useful for saving typing, and when you want to pass a callback to
another function.

Suppose you want a function that lets you extract substrings from "Hello,
World" easily. The classical way of doing that is writing your own
function:

  sub f(*@a) {
      substr('Hello, World', |@a)
  }

Currying with assuming

Perl 6 provides a method assuming on code objects, which applies the
arguments passed to it to the invocant, and returns the partially applied
function.

  my &amp;f := &amp;substr.assuming('Hello, World');

Now f(1, 2) is the same as substr('Hello, World', 1, 2).

assuming also works on operators, because operators are just subroutines
with weird names. To get a subroutine that adds 2 to whatever number gets
passed to it, you could write

  my &amp;add_two := &amp;infix:&lt;+&gt;.assuming(2);

But that's tedious to write, so there's another option.

Currying with the Whatever-Star

  my &amp;add_two := * + 2;
  say add_two(4);         # 6

The asterisk, called Whatever, is a placeholder for an argument, so the
whole expression returns a closure. Multiple Whatevers are allowed in a
single expression, and create a closure that expects more arguments, by
replacing each term * by a formal parameter. So * * 5 + * is equivalent
to -&gt; $a, $b { $a * 5 + $b }.

  my $c = * * 5 + *;
  say $c(10, 2);                # 52

Note that the second * is an infix operator, not a term, so it is not
subject to Whatever-currying.

The process of lifting an expression with Whatever stars into a closure
is driven by syntax, and done at compile time. This means that

  my $star = *;
  my $code = $star + 2

does not construct a closure, but instead dies with a message like

  Can't take numeric value for object of type Whatever

Whatever currying is more versatile than .assuming, because it allows to
curry something else than the first argument very easily:

  say  ~(1, 3).map: 'hi' x *    # hi hihihi

This curries the second argument of the string repetition operator infix
x, so it returns a closure that, when called with a numeric argument,
produces the string hi as often as that argument specifies.

The invocant of a method call can also be Whatever star, so

  say &lt;a b c&gt;.map: *.uc;      # ABC

involves a closure that calls the uc method on its argument.


MOTIVATION

Perl 5 could be used for functional programming, which has been
demonstrated in Mark Jason Dominus' book Higher Order Perl.

Perl 6 strives to make it even easier, and thus provides tools to make
typical constructs in functional programming easily available. Currying
and easy construction of closures is a key to functional programming, and
makes it very easy to write transformation for your data, for example
together with map or grep.


SEE ALSO

http://perlcabal.org/syn/S02.html#Built-In_Data_Types

http://hop.perl.plover.com/

http://en.wikipedia.org/wiki/Currying</description>
      <title>Currying</title>
      <content:encoded>

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="NAME"&gt;NAME&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;"Perl 5 to 6" Lesson 28 - Currying&lt;/p&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="SYNOPSIS"&gt;SYNOPSIS&lt;/a&gt;
&lt;/h3&gt;

&lt;pre&gt;  use v6;
  
  my &amp;amp;f := &amp;amp;substr.assuming('Hello, World');
  say f(0, 2);                # He
  say f(3, 2);                # lo
  say f(7);                   # World
  
  say &amp;lt;a b c&amp;gt;.map: * x 2;     # aabbcc
  say &amp;lt;a b c&amp;gt;.map: *.uc;      # ABC
  for ^10 {
      print &amp;lt;R G B&amp;gt;.[$_ % *]; # RGBRGBRGBR
  }&lt;/pre&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="DESCRIPTION"&gt;DESCRIPTION&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;i&gt;Currying&lt;/i&gt; or &lt;i&gt;partial application&lt;/i&gt; is the process of generating a function from another function or method by providing only some of the arguments. This is useful for saving typing, and when you want to pass a callback to another function.&lt;/p&gt;

&lt;p&gt;Suppose you want a function that lets you extract substrings from &lt;code&gt;"Hello, World"&lt;/code&gt; easily. The classical way of doing that is writing your own function:&lt;/p&gt;

&lt;pre&gt;  sub f(*@a) {
      substr('Hello, World', |@a)
  }&lt;/pre&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Currying_with_assuming"&gt;Currying with &lt;code&gt;assuming&lt;/code&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Perl 6 provides a method &lt;code&gt;assuming&lt;/code&gt; on code objects, which applies the arguments passed to it to the invocant, and returns the partially applied function.&lt;/p&gt;

&lt;pre&gt;  my &amp;amp;f := &amp;amp;substr.assuming('Hello, World');&lt;/pre&gt;

&lt;p&gt;Now &lt;code&gt;f(1, 2)&lt;/code&gt; is the same as &lt;code&gt;substr('Hello, World', 1, 2)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;assuming&lt;/code&gt; also works on operators, because operators are just subroutines with weird names. To get a subroutine that adds 2 to whatever number gets passed to it, you could write&lt;/p&gt;

&lt;pre&gt;  my &amp;amp;add_two := &amp;amp;infix:&amp;lt;+&amp;gt;.assuming(2);&lt;/pre&gt;

&lt;p&gt;But that's tedious to write, so there's another option.&lt;/p&gt;

&lt;h4&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="Currying_with_the_Whatever-Star"&gt;Currying with the Whatever-Star&lt;/a&gt;
&lt;/h4&gt;

&lt;pre&gt;  my &amp;amp;add_two := * + 2;
  say add_two(4);         # 6&lt;/pre&gt;

&lt;p&gt;The asterisk, called &lt;i&gt;Whatever&lt;/i&gt;, is a placeholder for an argument, so the whole expression returns a closure. Multiple Whatevers are allowed in a single expression, and create a closure that expects more arguments, by replacing each term &lt;code&gt;*&lt;/code&gt; by a formal parameter. So &lt;code&gt;* * 5 + *&lt;/code&gt; is equivalent to &lt;code&gt;-&amp;gt; $a, $b { $a * 5 + $b }&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;  my $c = * * 5 + *;
  say $c(10, 2);                # 52&lt;/pre&gt;

&lt;p&gt;Note that the second &lt;code&gt;*&lt;/code&gt; is an infix operator, not a term, so it is not subject to Whatever-currying.&lt;/p&gt;

&lt;p&gt;The process of lifting an expression with Whatever stars into a closure is driven by syntax, and done at compile time. This means that&lt;/p&gt;

&lt;pre&gt;  my $star = *;
  my $code = $star + 2&lt;/pre&gt;

&lt;p&gt;does not construct a closure, but instead dies with a message like&lt;/p&gt;

&lt;pre&gt;  Can't take numeric value for object of type Whatever&lt;/pre&gt;

&lt;p&gt;Whatever currying is more versatile than &lt;code&gt;.assuming&lt;/code&gt;, because it allows to curry something else than the first argument very easily:&lt;/p&gt;

&lt;pre&gt;  say  ~(1, 3).map: 'hi' x *    # hi hihihi&lt;/pre&gt;

&lt;p&gt;This curries the second argument of the string repetition operator infix &lt;code&gt;x&lt;/code&gt;, so it returns a closure that, when called with a numeric argument, produces the string &lt;code&gt;hi&lt;/code&gt; as often as that argument specifies.&lt;/p&gt;

&lt;p&gt;The invocant of a method call can also be Whatever star, so&lt;/p&gt;

&lt;pre&gt;  say &amp;lt;a b c&amp;gt;.map: *.uc;      # ABC&lt;/pre&gt;

&lt;p&gt;involves a closure that calls the &lt;code&gt;uc&lt;/code&gt; method on its argument.&lt;/p&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="MOTIVATION"&gt;MOTIVATION&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Perl 5 could be used for functional programming, which has been demonstrated in Mark Jason Dominus' book &lt;i&gt;Higher Order Perl&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Perl 6 strives to make it even easier, and thus provides tools to make typical constructs in functional programming easily available. Currying and easy construction of closures is a key to functional programming, and makes it very easy to write transformation for your data, for example together with &lt;code&gt;map&lt;/code&gt; or &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  &lt;a class="u" href="#___top" title="click to go to top of document" name="SEE_ALSO"&gt;SEE ALSO&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="http://perlcabal.org/syn/S02.html#Built-In_Data_Types" class="podlinkurl"&gt;http://perlcabal.org/syn/S02.html#Built-In_Data_Types&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://hop.perl.plover.com/" class="podlinkurl"&gt;http://hop.perl.plover.com/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="http://en.wikipedia.org/wiki/Currying" class="podlinkurl"&gt;http://en.wikipedia.org/wiki/Currying&lt;/a&gt;
&lt;/p&gt;

 </content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-5-to-6/28-currying.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Moritz Lenz)</author>
      <dc:creator>nobody@example.com (Moritz Lenz)</dc:creator>
      <link>http://perlgeek.de/blog-en/perl-6/my-first-yapc.html</link>
      <description>This week I attended my first international Perl conference, the YAPC::EU
2010 in Pisa, Italy. I very much enjoyed it.

I arrived a few days earlier, and spent the time visiting Pisa, talking
with old and new friends, and did some collaborative hacking. I
especially enjoyed meeting people with whom I had had only contact via
Internet so far, and found all of them to be very nice in meat space.

On Tuesday, the day before the conference started officially, a group of
Perl 6 hackers met and discussed topics around Perl 6 and Rakudo. I
recall talking with Patrick Michaud, Jonathan Worthington, Carl Mäsak,
Paweł Murias, Gabor Szabo, smash (I can't spell his full name correctly
from memory, sorry for that), and we have a very productive discussion
(about 5 hours or so). Notes from the discussion will be published later.

On Wednesday the actual conference started, and there were plenty of very
interesting talks, and very amusing lightning talks. I generally like the
humor that is widespread in the Perl community.

On Thursday I continued to attend nice and informative talks, and also
gave a talk on my own. It was about physical modelling with Perl 6, and
in general the feedback was very positive, and somebody even commented
that while he didn't understand everything I wrote, it reminded him that
it was important to learn Perl 6 now. Win \o/. (There was also some
criticism, but from somebody who apparently hasn't read the abstract; the
"write-only" meme seems to apply to perl bloggers, not code). You can
find the slides to my talk here.

Firday was the day of my departure too - sadly I had to leave after the
first talk, and missed the rest of the day, including the closing keynote
by mst (I did attend a talk of his) and the traditional auction.

I especially enjoyed...

  * meeting Patrick, Larry, Gloria, Aaron, Gabor and many others for the
    first time in real-life

  * a thorough, high-bandwith discussion with Larry, Jonathan, Patrick
    and Carl about p6 spec questions, and the Perl 6 discussions
    mentioned earlier

  * a lightning talk imagine you're in a data center with no connection
    to the outside, and you accidentally executed chmod -x chmod. What
    would you do?

  * good Italian Pizzas (although I had to wait 50 minutes for one of
    them)

  * A talk by Tim Bunce, where he demonstrated database access in Perl 6
    both with libraries that do native calls, and through the Blizkost
    project using the Perl 5 DBI/DBD::SQLite modules

  * the general relaxed attitude in the Perl community, where people help
    each other, and don't seem to be easily offended (at least in meat
    space :)

  * being surrounded by many other geeks

  * realizing that several Perl hackers brought their family to the
    conference

It was an overwhelming experience, and I look forward to my next YAPC!</description>
      <title>My first YAPC - YAPC::EU 2010 in Pisa</title>
      <content:encoded>

&lt;p&gt;This week I attended my first international Perl conference, the &lt;a href="http://conferences.yapceurope.org/ye2010/index.html"&gt;YAPC::EU 2010 in
Pisa, Italy&lt;/a&gt;. I very much enjoyed it.&lt;/p&gt;

&lt;p&gt;I arrived a few days earlier, and spent the time visiting Pisa, talking
with old and new friends, and did some collaborative hacking. I especially
enjoyed meeting people with whom I had had only contact via Internet so far,
and found all of them to be very nice in meat space.&lt;/p&gt;

&lt;p&gt;On Tuesday, the day before the conference started officially, a group of
Perl 6 hackers met and discussed topics around Perl 6 and Rakudo. I recall
talking with Patrick Michaud, Jonathan Worthington, Carl Mäsak, Paweł
Murias, Gabor Szabo, smash (I can't spell his full name correctly from memory,
sorry for that), and we have a very productive discussion (about 5 hours or
so). Notes from the discussion will be published later.&lt;/p&gt;

&lt;p&gt;On Wednesday the actual conference started, and there were plenty of very
interesting talks, and very amusing lightning talks. I generally like the
humor that is widespread in the Perl community.&lt;/p&gt;

&lt;p&gt;On Thursday I continued to attend nice and informative talks, and also gave
a talk on my own. It was about physical modelling with Perl 6, and in general
the feedback was very positive, and somebody even commented that while he
didn't understand everything I wrote, it reminded him that it was important to
learn Perl 6 now. Win \o/. (There was also some criticism, but from somebody
who apparently hasn't read &lt;a href="http://conferences.yapceurope.org/ye2010/talk/2949"&gt;the abstract&lt;/a&gt;;
the "write-only" meme seems to apply to perl bloggers, not code). You can find
&lt;a href="http://perlgeek.de/talks/2010/yapceu-p6-realworld/"&gt;the slides
to my talk here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Firday was the day of my departure too - sadly I had to leave after the
first talk, and missed the rest of the day, including the closing keynote by
mst (I did attend a talk of his) and the traditional auction.&lt;/p&gt;

&lt;p&gt;I especially enjoyed...&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;meeting Patrick, Larry, Gloria, Aaron, Gabor and many others for the
    first time in real-life&lt;/li&gt;
    &lt;li&gt;a thorough, high-bandwith discussion with Larry, Jonathan, Patrick and
    Carl about p6 spec questions, and the Perl 6 discussions mentioned
    earlier&lt;/li&gt;
    &lt;li&gt;a lightning talk &lt;em&gt;imagine you're in a data center with no
    connection to the outside, and you accidentally executed &lt;code&gt;chmod -x
    chmod&lt;/code&gt;. What would you do?&lt;/em&gt;&lt;/li&gt;
    &lt;li&gt;good Italian Pizzas (although I had to wait 50 minutes for one of
    them)&lt;/li&gt;

    &lt;li&gt;A talk by Tim Bunce, where he demonstrated database access in Perl 6
    both with libraries that do native calls, and through the Blizkost project
    using the Perl 5 DBI/DBD::SQLite modules&lt;/li&gt;
    &lt;li&gt;the general relaxed attitude in the Perl community, where people help
    each other, and don't seem to be easily offended (at least in meat space
    :)&lt;/li&gt;
    &lt;li&gt;being surrounded by many other geeks&lt;/li&gt;
    &lt;li&gt;realizing that several Perl hackers brought their family to the
    conference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was an overwhelming experience, and I look forward to my next YAPC!&lt;/p&gt;


</content:encoded>
      <guid isPermaLink="false">tag:insel,2006:tag:perlsphere.net,2006:http://perlgeek.de/blog-en/perl-6/my-first-yapc.html</guid>
    </item>
  </channel>
</rss>
