<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>A Curious Programmer</title>
	<atom:link href="http://curiousprogrammer.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://curiousprogrammer.wordpress.com</link>
	<description>Leveraging Perl and Emacs</description>
	<lastBuildDate>Tue, 07 May 2013 11:25:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='curiousprogrammer.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>A Curious Programmer</title>
		<link>http://curiousprogrammer.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://curiousprogrammer.wordpress.com/osd.xml" title="A Curious Programmer" />
	<atom:link rel='hub' href='http://curiousprogrammer.wordpress.com/?pushpress=hub'/>
		<item>
		<title>You needed to be smarter to work with Python</title>
		<link>http://curiousprogrammer.wordpress.com/2011/08/16/you-needed-to-be-smarter-to-work-with-python/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/08/16/you-needed-to-be-smarter-to-work-with-python/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 04:30:12 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1607</guid>
		<description><![CDATA[Giorgio Salluzzo points out that harder code maintenance and poorer tooling weakened the case for choosing Python over Perl still further. Filed under: Perl<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1607&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Giorgio Salluzzo <a href="http://curiousprogrammer.wordpress.com/2011/01/31/why-did-google-choose-python/#comment-9075">points out</a> that harder code maintenance and poorer tooling weakened the case for choosing Python over Perl still further.</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1607/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1607/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1607&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/08/16/you-needed-to-be-smarter-to-work-with-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Parallel::Iterator</title>
		<link>http://curiousprogrammer.wordpress.com/2011/07/11/parallel-iterator/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/07/11/parallel-iterator/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 04:30:41 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[cpanmodules]]></category>
		<category><![CDATA[fork]]></category>
		<category><![CDATA[multiprocess]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1604</guid>
		<description><![CDATA[While looking at the Job Manager script from last week, I omitted the section where each job section of the batch returns the result to the manager. The job serialises a hash containing the results to disk using Storable. When the jobs have all finished, the manager retrieves the data using the identifier. my $results [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1604&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>While looking at the Job Manager script from last week, I omitted the section where each job section of the batch returns the result to the manager.</p>
<p>The job serialises a hash containing the results to disk using Storable.  When the jobs have all finished, the manager retrieves the data using the identifier.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$results</span> = {};
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$id</span> = $manager-&gt;identifier();
<span style="color:#a020f0;">foreach</span> (&gt;/tmp/*_$id.result&lt;) {
    <span style="color:#a020f0;">if</span> (! <span style="color:#66cd00;">m</span>{^/tmp/(\d+)_}) {
        say <span style="color:#bc8f8f;">"Error: unable to retrieve id from $_"</span>;
        <span style="color:#a020f0;">next</span>;
    }
    $results-&gt;{$1} = retrieve($_);
}

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Data::Dumper</span>;
<span style="color:#66cd00;">print</span> Dumper($results);
</pre>
<p>Now it turns out, there is yet another handy cpan module called <a href="http://search.cpan.org/~andya/Parallel-Iterator-1.00/lib/Parallel/Iterator.pm">parallel::iterator</a>, which can return the output of each job in an output list.  (Under the covers, it has pipes between the processes and serialises the data between them using Storable).</p>
<p>And I was going to say, it would be nice if folks on Ironman talked about useful modules they came across from time to time.</p>
<p>Except they do already.  dagolden already spoke about parallel::iterator <a href="http://www.dagolden.com/index.php/935/parallel-map-with-paralleliterator/">here</a>.</p>
<p>Wouldn&#8217;t it be handy if you could tag your ironman posts with a hashtag, like #cpanmodules and clicking on the hashtag would return the results?</p>
<p>Ironman: #cpanmodules #fork</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/cpanmodules/'>cpanmodules</a>, <a href='http://curiousprogrammer.wordpress.com/tag/fork/'>fork</a>, <a href='http://curiousprogrammer.wordpress.com/tag/multiprocess/'>multiprocess</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1604/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1604/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1604&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/07/11/parallel-iterator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Wanted: A guide to CPAN</title>
		<link>http://curiousprogrammer.wordpress.com/2011/07/04/wanted-a-guide-to-cpan/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/07/04/wanted-a-guide-to-cpan/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 05:00:18 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1600</guid>
		<description><![CDATA[The other day I was looking at a script that ran a bunch of more or less independent jobs in batches of four. I&#8217;ve reproduced the core of the script as best as I can remember it. Job It has a class to represent the jobs themselves. package Job; use Moose; has identifier =&#62; ( [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1600&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The other day I was looking at a script that ran a bunch of more or less independent jobs in batches of four.</p>
<p>I&#8217;ve reproduced the core of the script as best as I can remember it.</p>
<h3>Job</h3>
<p class="first">It has a class to represent the jobs themselves.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">package</span> <span style="color:#0000ff;">Job</span>;

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Moose</span>;

has <span style="color:#bc8f8f;">identifier</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">required</span> =&gt; 1,
);

has <span style="color:#bc8f8f;">cmd</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">required</span> =&gt; 1,
);

<span style="color:#66cd00;">no</span> <span style="color:#0000ff;">Moose</span>;
<span style="color:#228b22;">__PACKAGE__</span>-&gt;meta-&gt;make_immutable;
</pre>
<h3>Job Manager</h3>
<p class="first">and a class that tries to ensure that 4 jobs are running in parallel wherever possible.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">package</span> <span style="color:#0000ff;">JobManager</span>;

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Moose</span>;

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">POSIX</span> <span style="color:#bc8f8f;">'strftime'</span>;

has <span style="color:#bc8f8f;">identifier</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; <span style="color:#a020f0;">sub</span> { strftime(<span style="color:#bc8f8f;">'</span><span style="color:#ff0000;background-color:#eeeed1;font-weight:bold;font-style:italic;">%H%M%S</span><span style="color:#bc8f8f;">'</span>, <span style="color:#228b22;">localtime</span>(<span style="color:#228b22;">time</span>())); },
);

has <span style="color:#bc8f8f;">max_processes</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; 4,
);

has <span style="color:#bc8f8f;">_job_id</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">writer</span> =&gt; <span style="color:#bc8f8f;">'_set_job_id'</span>,
    <span style="color:#bc8f8f;">init_arg</span> =&gt; <span style="color:#66cd00;">undef</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; 1,
);

has <span style="color:#bc8f8f;">queued_jobs</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">traits</span> =&gt; [<span style="color:#bc8f8f;">'Array'</span>],
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'ArrayRef[Job]'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; <span style="color:#a020f0;">sub</span> { [] },
    <span style="color:#bc8f8f;">handles</span> =&gt; {
        <span style="color:#bc8f8f;">enqueue_job</span> =&gt; <span style="color:#bc8f8f;">'push'</span>,
        <span style="color:#bc8f8f;">dequeue_job</span> =&gt; <span style="color:#bc8f8f;">'shift'</span>,
        <span style="color:#bc8f8f;">exist_queued_jobs</span> =&gt; <span style="color:#bc8f8f;">'count'</span>,
    },
);

has <span style="color:#bc8f8f;">running_jobs</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">traits</span> =&gt; [<span style="color:#bc8f8f;">'Hash'</span>],
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'HashRef[Job]'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; <span style="color:#a020f0;">sub</span> { {} },
    <span style="color:#bc8f8f;">handles</span> =&gt; {
        <span style="color:#bc8f8f;">add_running_job</span> =&gt; <span style="color:#bc8f8f;">'set'</span>,
        <span style="color:#bc8f8f;">delete_running_job</span> =&gt; <span style="color:#bc8f8f;">'delete'</span>,
        <span style="color:#bc8f8f;">num_jobs</span> =&gt; <span style="color:#bc8f8f;">'count'</span>,
    },
);

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">next_job_id</span>
{
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$self</span> = <span style="color:#66cd00;">shift</span>;
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$job_id</span> = $self-&gt;_job_id();
    $self-&gt;_set_job_id($job_id + 1);
    <span style="color:#a020f0;">return</span> <span style="color:#228b22;">sprintf</span> <span style="color:#bc8f8f;">"%02d"</span>, $job_id;
}

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">run_job</span>
{
    <span style="color:#a020f0;">my</span> (<span style="color:#b8860b;">$self</span>, <span style="color:#b8860b;">$job</span>) = <span style="color:#0000ff;background-color:#eeeed1;font-weight:bold;">@_</span>;

    <span style="color:#a020f0;">my</span> (<span style="color:#b8860b;">$identifier</span>, <span style="color:#b8860b;">$cmd</span>) = ($job-&gt;identifier(), $job-&gt;cmd());
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$pid</span> = <span style="color:#228b22;">fork</span>();
    <span style="color:#a020f0;">if</span> (! <span style="color:#66cd00;">defined</span>($pid)) {
        say <span style="color:#bc8f8f;">"Failed to run job $identifier"</span>;
    } <span style="color:#a020f0;">elsif</span> ($pid) {
        say <span style="color:#bc8f8f;">"Running job $identifier ($pid)"</span>;
        $self-&gt;add_running_job($pid, $job);
    } <span style="color:#a020f0;">else</span> {
        <span style="color:#228b22;">system</span>(<span style="color:#bc8f8f;">"$cmd &gt; /tmp/$identifier.output 2&gt;&amp;1"</span>);
        <span style="color:#a020f0;">exit</span>;
    }
}

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">add_job</span>
{
    <span style="color:#a020f0;">my</span> (<span style="color:#b8860b;">$self</span>, <span style="color:#b8860b;">$name</span>, <span style="color:#b8860b;">$cmd</span>) = <span style="color:#0000ff;background-color:#eeeed1;font-weight:bold;">@_</span>;

    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$job</span> = Job-&gt;new(
        <span style="color:#bc8f8f;">identifier</span> =&gt; (<span style="color:#228b22;">sprintf</span> <span style="color:#bc8f8f;">"</span><span style="color:#ff0000;background-color:#eeeed1;font-weight:bold;font-style:italic;">%s_</span><span style="color:#bc8f8f;">${name}_</span><span style="color:#ff0000;background-color:#eeeed1;font-weight:bold;font-style:italic;">%s</span><span style="color:#bc8f8f;">"</span>,
                               $self-&gt;next_job_id(), $self-&gt;identifier()),
        <span style="color:#bc8f8f;">cmd</span> =&gt; $cmd);

    <span style="color:#a020f0;">if</span> ($self-&gt;num_jobs() &gt; $self-&gt;max_processes()) {
        $self-&gt;enqueue_job($job);
    } <span style="color:#a020f0;">else</span> {
        $self-&gt;run_job($job);
    }
}

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">main_loop</span>
{
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$self</span> = <span style="color:#66cd00;">shift</span>;

    <span style="color:#a020f0;">while</span> (1) {
        <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$pid</span> = <span style="color:#228b22;">wait</span>();
        <span style="color:#a020f0;">last</span> <span style="color:#a020f0;">if</span> ($pid &lt; 0);
        say <span style="color:#bc8f8f;">"Child $pid has exited"</span>;

        $self-&gt;delete_running_job($pid);
        <span style="color:#a020f0;">while</span> ($self-&gt;num_jobs() &lt; $self-&gt;max_processes()) {
            <span style="color:#a020f0;">last</span> <span style="color:#a020f0;">unless</span> $self-&gt;exist_queued_jobs();
            $self-&gt;run_job($self-&gt;dequeue_job());
        }
    }
}

<span style="color:#66cd00;">no</span> <span style="color:#0000ff;">Moose</span>;
<span style="color:#228b22;">__PACKAGE__</span>-&gt;meta-&gt;make_immutable;
</pre>
<h3>Test Code</h3>
<p class="first">My test code to check if I got the code more or less correct.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$manager</span> = JobManager-&gt;new();

$manager-&gt;add_job(<span style="color:#bc8f8f;">'echo'</span>, <span style="color:#bc8f8f;">'sleep 10 ; echo hello'</span>);
<span style="color:#a020f0;">for</span> (1..9) {
    $manager-&gt;add_job(<span style="color:#bc8f8f;">'echo'</span>, <span style="color:#bc8f8f;">'sleep 2 ; echo hello'</span>);
}

$manager-&gt;main_loop();
</pre>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
jared@localhost $ ls -ltr /tmp/*echo*
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/05_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/04_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/03_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/02_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/08_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/07_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/06_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/10_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/09_echo_193228.output
-rw-r--r-- 1 jared jared 6 2011-07-03 19:32 /tmp/01_echo_193228.output
</pre>
<h3>Conclusion</h3>
<p class="first">I took two lessons away.</p>
<p><a name="1" id="1"></a><br />
<a href="http://cpansearch.perl.org/src/LEMBARK/Parallel-Queue-2.02/lib/Parallel/Queue.pm">Parallel::Queue</a> would have greatly simplified the core of this script.  How many CPAN modules could my code benefit from equally if only I knew about them?</p>
<p><a name="2" id="2"></a><br />
<code style="font-size:130%;background:#eee;padding:3px;">fork()</code> is nice and easy to deal with.  The code to manage the processes isn&#8217;t hugely complicated and seems pretty robust (careful, I may not have duplicated the robustness here).</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1600/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1600/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1600&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/07/04/wanted-a-guide-to-cpan/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Perl 6</title>
		<link>http://curiousprogrammer.wordpress.com/2011/06/27/perl-6/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/06/27/perl-6/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 05:00:06 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1594</guid>
		<description><![CDATA[The latest from chromatic (emphasis mine): &#34;If you think people don&#8217;t like Perl because the Perl 6 project started almost ten years ago, you haven&#8217;t been paying attention. (Think Python has better marketing? Guido announced Python 3000 before Larry announced Perl 6, and it still took the better part of eight years for the Python [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1594&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://www.modernperlbooks.com/mt/2011/06/iridescent-bivalve-secretions-are-from-new-jersey-nacre-is-from-mit.html">latest from chromatic</a> (<strong>emphasis mine</strong>):</p>
<div style="margin:20px;"><em>&quot;If you think people don&#8217;t like Perl because the Perl 6 project started almost ten years ago, you haven&#8217;t been paying attention.</p>
<p>(Think Python has better marketing? Guido announced Python 3000 before Larry announced Perl 6, and it still took the better part of eight years for the Python developers to produce Python 3, <strong>and people are still upset that Python 3 is a wholesale replacement for Python 2</strong>, and there&#8217;s still a debate over when &#8211; and in some cases, if &#8211; major projects using Python will embrace Python 3 and abandon Python 2. Think about that.)&quot;</em></div>
<p>Okay, I didn&#8217;t see any regret for shafting Perl 5 for the last 10 years, but <em>great! I&#8217;m so happy that the opposition made the same stupid mistake that we did. &lt;/sarcasm&gt;</em></p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1594/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1594/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1594&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/06/27/perl-6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Easy Unicode in Perl</title>
		<link>http://curiousprogrammer.wordpress.com/2011/06/14/easy-unicode-inperl/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/06/14/easy-unicode-inperl/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 04:30:43 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[remindme]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1590</guid>
		<description><![CDATA[Lots of discussion on Unicode in Perl recently. (I didn&#8217;t see any retraction from Nelson, respectful or otherwise, though) I can&#8217;t see what is wrong with the (brand newish) utf8 pragma approach especially when all the issues are ironed out. You don&#8217;t want to break backwards compatibility and give folks any more reason not to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1590&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a href="http://blogs.perl.org/users/aristotle/2011/06/antiperlconfirmationbias.html">Lots</a> of <a href="http://www.modernperlbooks.com/mt/2011/06/perl-5s-unicode-flag-day.html">discussion</a> on <a href="http://stackoverflow.com/questions/6162484/why-does-modern-perl-avoid-utf-8-by-default/6169757#6169757">Unicode in Perl</a> recently.</p>
<p>(I didn&#8217;t see any retraction from Nelson, respectful or otherwise, though)</p>
<p>I can&#8217;t see what is wrong with the (brand newish) <a href="http://p3rl.org/utf8::all">utf8 pragma approach</a> especially when all the issues are ironed out.  You don&#8217;t want to break backwards compatibility and give folks any more reason not to upgrade to later versions of Perl.</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/remindme/'>remindme</a>, <a href='http://curiousprogrammer.wordpress.com/tag/unicode/'>unicode</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1590/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1590/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1590&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/06/14/easy-unicode-inperl/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Does Perl need a JIT?</title>
		<link>http://curiousprogrammer.wordpress.com/2011/06/06/does-perl-need-a-jit/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/06/06/does-perl-need-a-jit/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 04:30:37 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1583</guid>
		<description><![CDATA[Casey Randberger dropped by to point out that Squeak Smalltalk now has a JIT. I don&#8217;t care about Squeak1, but very occasionally I think it would be nice if Perl got a JIT. However, I don&#8217;t think it would make sense to develop a JIT for Perl. People don&#8217;t choose Perl for its speed The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1583&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Casey Randberger dropped by to point out that <a href="http://curiousprogrammer.wordpress.com/2007/04/11/is-squeak-smalltalk-slow/#comment-8978">Squeak Smalltalk now has a JIT</a>.</p>
<p>I don&#8217;t care about Squeak<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>, but very occasionally I think it would be nice if Perl got a JIT.</p>
<p>However, I don&#8217;t think it would make sense to develop a JIT for Perl.</p>
<ul>
<li>People don&#8217;t choose Perl for its speed</li>
<li>The reason folks switch from Perl to a competitor<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup> is not because the competitor is faster (because it isn&#8217;t)</li>
<li>Even for Python, everyone uses CPython rather than speedy implementation</li>
</ul>
<p>There&#8217;s a lot of reasons I choose Perl, but a JIT would not increase the number of projects where I reach for Perl over C++.</p>
<hr />
<p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> It&#8217;s not pragmatic enough for me &#8211; who would employ me to write Squeak for example</p>
<p class="footnote"><a class="footnum" name="fn.2" href="#fnr.2">2.</a> Python and Ruby</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1583/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1583/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1583&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/06/06/does-perl-need-a-jit/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Streaming Plack</title>
		<link>http://curiousprogrammer.wordpress.com/2011/05/31/streaming-plack/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/05/31/streaming-plack/#comments</comments>
		<pubDate>Tue, 31 May 2011 04:30:59 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[plack]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1577</guid>
		<description><![CDATA[Thanks to Douglas and Jakub for pointing me at the appropriate part of the PSGI spec for streaming. Miyagawa mentions that plack streaming can be blocking, and running this with Starman demonstrates that nicely. my $app = sub { my $env = shift; return sub { my $respond = shift; my $writer = $respond-&#62;([200, ['Content-Type', [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1577&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Thanks to Douglas and Jakub for pointing me at the appropriate part of the PSGI spec <a href="http://search.cpan.org/~miyagawa/PSGI-1.03/PSGI.pod#Delayed_Reponse_and_Streaming_Body">for streaming</a>.</p>
<p>Miyagawa mentions that <a href="http://bulknews.typepad.com/blog/2010/01/plack-streaming-can-be-blocking-hell-yes.html">plack streaming can be blocking</a>, and running this with Starman demonstrates that nicely.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$app</span> = <span style="color:#a020f0;">sub</span> {
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$env</span> = <span style="color:#66cd00;">shift</span>;

    <span style="color:#a020f0;">return</span> <span style="color:#a020f0;">sub</span> {
        <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$respond</span> = <span style="color:#66cd00;">shift</span>;
        <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$writer</span> = $respond-&gt;([200, [<span style="color:#bc8f8f;">'Content-Type'</span>, <span style="color:#bc8f8f;">'text/html'</span>]]);

        <span style="color:#a020f0;">for</span> (1..5) {
            <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$dt</span> = <span style="color:#228b22;">localtime</span>;
            $writer-&gt;<span style="color:#228b22;">write</span>(<span style="color:#bc8f8f;">"[ $dt ]<br />\n"</span>);
            <span style="color:#228b22;">sleep</span> 2;
        }

        $writer-&gt;<span style="color:#228b22;">close</span>();
    };
};
</pre>
<p>Starman attributes include:</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
'psgi.streaming' =&gt; 1,
'psgi.nonblocking' =&gt; ''
</pre>
<p>Firing off two requests at the same time, the second doesn&#8217;t start until the first completes.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
[ Mon May 30 18:56:16 2011 ]
[ Mon May 30 18:56:18 2011 ]
[ Mon May 30 18:56:20 2011 ]
[ Mon May 30 18:56:22 2011 ]
[ Mon May 30 18:56:24 2011 ]
</pre>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
[ Mon May 30 18:56:26 2011 ]
[ Mon May 30 18:56:28 2011 ]
[ Mon May 30 18:56:30 2011 ]
[ Mon May 30 18:56:32 2011 ]
[ Mon May 30 18:56:34 2011 ]
</pre>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/plack/'>plack</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1577/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1577/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1577&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/05/31/streaming-plack/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Moose and Typeful Programming</title>
		<link>http://curiousprogrammer.wordpress.com/2011/05/23/moose-and-typeful-programming/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/05/23/moose-and-typeful-programming/#comments</comments>
		<pubDate>Mon, 23 May 2011 04:30:55 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[moose]]></category>
		<category><![CDATA[typeful programming]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1570</guid>
		<description><![CDATA[Even for a curmudgeon like me who doesn&#8217;t make much use of object orientation, Moose offers something which supports my programming with types style: a degree of run-time type checking and the ability to create a range of convenience functions with very little code. Say I have a person who makes a bunch of orders [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1570&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Even for a curmudgeon like me who <a href="http://curiousprogrammer.wordpress.com/2010/05/25/object-based-programming/">doesn&#8217;t make much use of object orientation</a>, Moose offers something which supports my <a href="http://curiousprogrammer.wordpress.com/2010/05/01/programming-with-types/">programming with types</a> style: a degree of run-time type checking and the ability to create a range of convenience functions with very little code.</p>
<p>Say I have a person who makes a bunch of orders consisting of a bunch of items.  My hashref might look something like this:</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$data</span> = {
    <span style="color:#bc8f8f;">fred</span> =&gt; {
        <span style="color:#bc8f8f;">orders</span> =&gt; [
            {
            <span style="color:#bc8f8f;">order_id</span> =&gt; <span style="color:#bc8f8f;">'fred1'</span>,
            <span style="color:#bc8f8f;">items</span> =&gt; [
                { <span style="color:#bc8f8f;">description</span> =&gt; <span style="color:#bc8f8f;">'roses'</span> },
            ],
        },
            {
            <span style="color:#bc8f8f;">order_id</span> =&gt; <span style="color:#bc8f8f;">'fred1'</span>,
            <span style="color:#bc8f8f;">items</span> =&gt; [
                { <span style="color:#bc8f8f;">description</span> =&gt; <span style="color:#bc8f8f;">'one true ring'</span> },
            ],

        },
        ],
    },
};
</pre>
<p>Then I&#8217;ll probably need a bunch of convenience functions to make sure I&#8217;m adding items to orders rather than people.</p>
<p>In Moose, including the type checking, that looks like:</p>
<h3>Item</h3>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">package</span> <span style="color:#0000ff;">Item</span>;
<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Moose</span>;

has <span style="color:#bc8f8f;">description</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'Str'</span>,
);

<span style="color:#66cd00;">no</span> <span style="color:#0000ff;">Moose</span>;
<span style="color:#228b22;">__PACKAGE__</span>-&gt;meta-&gt;make_immutable;
</pre>
<h3>Order</h3>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">package</span> <span style="color:#0000ff;">Order</span>;
<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Moose</span>;

has <span style="color:#bc8f8f;">order_id</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'Str'</span>,
    <span style="color:#bc8f8f;">required</span> =&gt; 1,
);

has <span style="color:#bc8f8f;">items</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'rw'</span>,
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'ArrayRef[Item]'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; <span style="color:#a020f0;">sub</span> { [] },
    <span style="color:#bc8f8f;">traits</span>  =&gt; [<span style="color:#bc8f8f;">'Array'</span>],
    <span style="color:#bc8f8f;">handles</span> =&gt; {
        <span style="color:#bc8f8f;">add_item</span>  =&gt; <span style="color:#bc8f8f;">'push'</span>,
        <span style="color:#bc8f8f;">get_items</span> =&gt; <span style="color:#bc8f8f;">'elements'</span>,
    },
);

<span style="color:#66cd00;">no</span> <span style="color:#0000ff;">Moose</span>;
<span style="color:#228b22;">__PACKAGE__</span>-&gt;meta-&gt;make_immutable;
</pre>
<h3>Person</h3>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">package</span> <span style="color:#0000ff;">Person</span>;
<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Moose</span>;

has <span style="color:#bc8f8f;">name</span> =&gt; (
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'ro'</span>,
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'Str'</span>,
    <span style="color:#bc8f8f;">required</span> =&gt; 1,
);

has <span style="color:#bc8f8f;">orders</span> =&gt;
    <span style="color:#bc8f8f;">is</span> =&gt; <span style="color:#bc8f8f;">'rw'</span>,
    <span style="color:#bc8f8f;">isa</span> =&gt; <span style="color:#bc8f8f;">'ArrayRef[Order]'</span>,
    <span style="color:#bc8f8f;">default</span> =&gt; <span style="color:#a020f0;">sub</span> { [] },
    <span style="color:#bc8f8f;">traits</span>  =&gt; [<span style="color:#bc8f8f;">'Array'</span>],
    <span style="color:#bc8f8f;">handles</span> =&gt; {
        <span style="color:#bc8f8f;">add_order</span>  =&gt; <span style="color:#bc8f8f;">'push'</span>,
        <span style="color:#bc8f8f;">get_orders</span> =&gt; <span style="color:#bc8f8f;">'elements'</span>,
    },


<span style="color:#66cd00;">no</span> <span style="color:#0000ff;">Moose</span>;
<span style="color:#228b22;">__PACKAGE__</span>-&gt;meta-&gt;make_immutable;
</pre>
<p>Adding an item as an order gives a nice error message:</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$fred</span> = Person-&gt;new(<span style="color:#bc8f8f;">name</span> =&gt; <span style="color:#bc8f8f;">'fred'</span>);
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$item</span> = Item-&gt;new(<span style="color:#bc8f8f;">description</span> =&gt; <span style="color:#bc8f8f;">'One true ring'</span>);
$fred-&gt;add_order($item);
</pre>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
$ perl moose-arrays.pl
A new member value for orders does not pass its type constraint because:<br /> Validation failed for 'Order' with value Item=HASH(0x9ad3ec8)<br /> (not isa Order) at moose-arrays.pl line 63
</pre>
<p>Moose ensures you pass an order to add_order(&#8230;).</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$order1</span> = Order-&gt;new(<span style="color:#bc8f8f;">order_id</span> =&gt; <span style="color:#bc8f8f;">'fred1'</span>);
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$item</span> = Item-&gt;new(<span style="color:#bc8f8f;">description</span> =&gt; <span style="color:#bc8f8f;">'One true ring'</span>);
$order1-&gt;add_item($item);
$fred-&gt;add_order($order1);

<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$order2</span> = Order-&gt;new(<span style="color:#bc8f8f;">order_id</span> =&gt; <span style="color:#bc8f8f;">'fred2'</span>);
$fred-&gt;add_order($order2);

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Data::Dumper</span>;
<span style="color:#66cd00;">print</span> Dumper($fred);
</pre>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
$VAR1 = <span style="color:#228b22;">bless</span>( {
                 <span style="color:#bc8f8f;">'orders'</span> =&gt; [
                               <span style="color:#228b22;">bless</span>( {
                                        <span style="color:#bc8f8f;">'order_id'</span> =&gt; <span style="color:#bc8f8f;">'fred1'</span>,
                                        <span style="color:#bc8f8f;">'items'</span> =&gt; [
                                                     <span style="color:#228b22;">bless</span>( {
                                                              <span style="color:#bc8f8f;">'description'</span> =&gt; <span style="color:#bc8f8f;">'One true ring'</span>
                                                            }, <span style="color:#bc8f8f;">'Item'</span> )
                                                   ]
                                      }, <span style="color:#bc8f8f;">'Order'</span> ),
                               <span style="color:#228b22;">bless</span>( {
                                        <span style="color:#bc8f8f;">'order_id'</span> =&gt; <span style="color:#bc8f8f;">'fred2'</span>,
                                        <span style="color:#bc8f8f;">'items'</span> =&gt; []
                                      }, <span style="color:#bc8f8f;">'Order'</span> )
                             ],
                 <span style="color:#bc8f8f;">'name'</span> =&gt; <span style="color:#bc8f8f;">'fred'</span>
               }, <span style="color:#bc8f8f;">'Person'</span> );
</pre>
<p>I like it when someone else has already written the code I would otherwise need to write myself.</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/moose/'>moose</a>, <a href='http://curiousprogrammer.wordpress.com/tag/typeful-programming/'>typeful programming</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1570/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1570/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1570&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/05/23/moose-and-typeful-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Plack Vs FastCGI</title>
		<link>http://curiousprogrammer.wordpress.com/2011/05/16/plack-vs-fastcgi/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/05/16/plack-vs-fastcgi/#comments</comments>
		<pubDate>Mon, 16 May 2011 04:30:54 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[plack]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1561</guid>
		<description><![CDATA[I&#8217;ve been sold on Plack for a while. This clarifies a part of the reason nicely1. If you design a fibonacci() function, would you make it print the result to STDOUT, or return the result as a return value? (It&#8217;s referring to the PSGI spec rather than Plack, but I figure the latter needs press [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1561&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been sold on <a href="http://plackperl.org/">Plack</a> for a while.  <a href="http://www.hackerne.ws/item?id=2505303">This</a> clarifies a part of the reason nicely<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>.</p>
<div style="margin:20px;"><em>If you design a fibonacci() function, would you make it print the result to STDOUT, or return the result as a return value?</em></div>
<p>(It&#8217;s referring to the PSGI spec rather than Plack, but I figure the latter needs press a bit more)</p>
<p>Quick thought though &#8211; if a page takes a long time to generate, the stdout technique can deliver a bit at a time.  Is there a plack plugin for that, or is the answer to go for ajax these day and deliver the page outline asap?</p>
<hr />
<p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> Namely that printing to stdout always seemed like a horrible and inefficient hack.</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/plack/'>plack</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1561/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1561/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1561&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/05/16/plack-vs-fastcgi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
		<item>
		<title>Faking Image Based Programming in Perl</title>
		<link>http://curiousprogrammer.wordpress.com/2011/05/11/faking-image-based-programming-in-perl/</link>
		<comments>http://curiousprogrammer.wordpress.com/2011/05/11/faking-image-based-programming-in-perl/#comments</comments>
		<pubDate>Wed, 11 May 2011 04:30:12 +0000</pubDate>
		<dc:creator>Jared</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[exploratory programming]]></category>
		<category><![CDATA[image based programming]]></category>
		<category><![CDATA[quick hack]]></category>
		<category><![CDATA[storable]]></category>

		<guid isPermaLink="false">http://curiousprogrammer.wordpress.com/?p=1553</guid>
		<description><![CDATA[One thing I like about developing the emacs environment (i.e. writing emacs lisp) is programming in the image. In contrast when I run a perl script, any data loaded into the script vanishes when the script exits. my $image = {}; populate_particular_set_of_people($image); populate_particular_set_of_orders($image); # ... more populate functions ... produce_report($image); If the populate functions take [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1553&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>One thing I like about developing the emacs environment (i.e. writing emacs lisp) is programming in the image.  In contrast when I run a perl script, any data loaded into the script vanishes when the script exits.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$image</span> = {};
populate_particular_set_of_people($image);
populate_particular_set_of_orders($image);
<span style="color:#b22222;"># </span><span style="color:#b22222;">... more populate functions ...
</span>produce_report($image);
</pre>
<p>If the populate functions take a long time to run and there is a syntax error in one of them, I might waste a lot of time waiting for data to be loaded over and over and potentially annoy my DBA.</p>
<p>Hence my <a href="http://curiousprogrammer.wordpress.com/2011/01/13/the-problem-with-scripting-language-repls/">thinking about REPLs</a> earlier in the year.</p>
<p>Instead, I can mitigate this problem and support exploratory programming by serialising my data structure to disk after each section has been loaded.</p>
<pre style="font-size:130%;border:1px solid #bbb;background:#eee;overflow:auto;margin:15px 5px;padding:5px;">
<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">Storable</span>;

<span style="color:#a020f0;">use</span> <span style="color:#0000ff;">constant</span> <span style="color:#bc8f8f;">IMAGE_FILE</span> =&gt; <span style="color:#bc8f8f;">'/tmp/.jareds-image-RANDOMTEXT'</span>;

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">populate_particular_set_of_people</span>
{
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$image</span> = <span style="color:#66cd00;">shift</span>;

    <span style="color:#a020f0;">return</span> <span style="color:#a020f0;">if</span> (<span style="color:#66cd00;">exists</span> $image-&gt;{<span style="color:#bc8f8f;">'store'</span>}{<span style="color:#bc8f8f;">'people'</span>});

    <span style="color:#b22222;"># </span><span style="color:#b22222;">Get the set of people
</span>
    store $image-&gt;{<span style="color:#bc8f8f;">'store'</span>}, IMAGE_FILE;
}

<span style="color:#a020f0;">sub</span> <span style="color:#0000ff;">populate_particular_set_of_orders</span>
{
    <span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$image</span> = <span style="color:#66cd00;">shift</span>;

    <span style="color:#a020f0;">return</span> <span style="color:#a020f0;">if</span> (<span style="color:#66cd00;">exists</span> $image-&gt;{<span style="color:#bc8f8f;">'store'</span>}{<span style="color:#bc8f8f;">'orders'</span>});

    <span style="color:#b22222;"># </span><span style="color:#b22222;">Get the set of orders
</span>
    store $image-&gt;{<span style="color:#bc8f8f;">'store'</span>}, IMAGE_FILE;
}

<span style="color:#a020f0;">my</span> <span style="color:#b8860b;">$image</span> = {};
$image = retrieve(IMAGE_FILE) <span style="color:#a020f0;">if</span> <span style="color:#0000ff;">-f</span> IMAGE_FILE;

populate_particular_set_of_people($image);
populate_particular_set_of_orders($image);
<span style="color:#b22222;"># </span><span style="color:#b22222;">more populate functions
</span>produce_report($image);
</pre>
<p>Error handling has been elided.
<p>I&#8217;m only storing part of the hashref, <code style="font-size:130%;background:#eee;padding:3px;">$image-&gt;{'store'}</code> in this example.  This is fairly typical of my standard use case for this technique &#8211; quick one off reports.  Some of the data is slow to load in from the database so I persist it to disk.  The rest is calculated based on the loaded data so I don&#8217;t persist it.  I keep all of the data together so I can pass it to each subroutine as a single parameter.</p>
<p>Of course, I wouldn&#8217;t recommend this technique for a production system.</p>
<br />Filed under: <a href='http://curiousprogrammer.wordpress.com/category/programming/perl-programming/'>Perl</a> Tagged: <a href='http://curiousprogrammer.wordpress.com/tag/exploratory-programming/'>exploratory programming</a>, <a href='http://curiousprogrammer.wordpress.com/tag/image-based-programming/'>image based programming</a>, <a href='http://curiousprogrammer.wordpress.com/tag/quick-hack/'>quick hack</a>, <a href='http://curiousprogrammer.wordpress.com/tag/storable/'>storable</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/curiousprogrammer.wordpress.com/1553/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/curiousprogrammer.wordpress.com/1553/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=curiousprogrammer.wordpress.com&#038;blog=367204&#038;post=1553&#038;subd=curiousprogrammer&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://curiousprogrammer.wordpress.com/2011/05/11/faking-image-based-programming-in-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://2.gravatar.com/avatar/b5f74091ba22c3b3205a72d70b42abfa?s=96&#38;d=http%3A%2F%2F2.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">Jared</media:title>
		</media:content>
	</item>
	</channel>
</rss>
