<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blogs.perl.org</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/atom.xml" />
    <id>tag:blogs.perl.org,2009-10-07://1</id>
    <updated></updated>
    <subtitle>There&apos;s more than one way to blog it.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>How to list BitBucket repositories with sparrow</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/melezhik/2017/01/listing-bitbucket-repositories-with-sparrow.html" />
    <id>tag:blogs.perl.org,2017:/users/melezhik//1336.7904</id>

    <published>2017-01-27T11:04:16Z</published>
    <updated>2017-01-27T11:48:04Z</updated>

    <summary>Listing BitBucket repositories could be annoying task even though BitBucket exposes a Rest API for this, and the reason for it is pagination - BitBucket sends result back spited by pages, so you need to request a next page till...</summary>
    <author>
        <name>melezhik</name>
        <uri>https://sparrowhub.org</uri>
    </author>
    
    <category term="automation" label="automation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bitbucket" label="bitbucket" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrow" label="sparrow" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/melezhik/">
        <![CDATA[<p>Listing BitBucket repositories could be <em>annoying task</em> even though BitBucket exposes a <a href="https://developer.atlassian.com/bitbucket/api/2/reference/resource/teams/%7Bowner%7D/projects/%7Bproject_key%7D">Rest API for this</a>, and the reason for it is <a href="https://developer.atlassian.com/bitbucket/api/2/reference/meta/pagination">pagination</a> - BitBucket sends result back spited by pages, so you need to request a next page <em>till the end</em>. This is hard to automate and prevent me form using BitBucket API directly.</p>

<p>Well, I have dropped a <a href="https://sparrowhub.org/info/bitbucket-repo-list">small sparrow plugin</a> to handle with this task. At least it works for me. It lists ( in plain text format ) all the repositories for given project and team.  There a lot of option of plugin you will find at documentation but the usual workflow is:</p>

<h1>install plugin</h1>

<pre><code>$ sparrow plg install bitbucket-repo-list
</code></pre>

<h1>run plugin</h1>

<p>Here you lists repositories for given project and team. You should supply your Bitbucket  credentials to request team/project information:</p>

<pre><code>$ sparrow plg run bitbucket-repo-list \
--param login=superuser --param password=keep-it-secret \
--param team=heroes \
--param project=humans
</code></pre>

<p>That is it. Hopefully will be useful for someone deal with BitBucket repositories.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Three Sort Functions</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/morandimus/2017/01/three-sort-functions.html" />
    <id>tag:blogs.perl.org,2017:/users/morandimus//2921.7905</id>

    <published>2017-01-27T19:40:32Z</published>
    <updated>2017-01-27T19:49:33Z</updated>

    <summary><![CDATA[Everyone (I’d have to assume) has written the two basic sort functions &nbsp; # sort strings case-insensitively &nbsp; sub insensitive { &nbsp;&nbsp;&nbsp; return uc $a cmp uc $b || $a cmp $b; &nbsp; } and &nbsp; # sort values numerically...]]></summary>
    <author>
        <name>morandimus</name>
        
    </author>
    
        <category term="useful?" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="sort" label="sort" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="useful" label="useful" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/morandimus/">
        <![CDATA[<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Everyone (I’d
have to assume) has written the two basic sort functions<br />
<br />
</span><b><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">&nbsp; # sort strings
case-insensitively<br />
&nbsp; sub insensitive {<br />
&nbsp;&nbsp;&nbsp; return uc $a cmp uc $b || $a cmp $b;<br />
&nbsp; }</span></b><span style="font-size:
12.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"><br />
<br />
and<br />
<br />
</span><b><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">&nbsp; # sort values
numerically<br />
&nbsp; sub numeric {<br />
&nbsp;&nbsp;&nbsp; return $a &lt;=&gt; $b;<br />
&nbsp; }<o:p></o:p></span></b></p><p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Here are three
fun—and hopefully useful—</span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">sort</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"> functions.<o:p></o:p></span></p><p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">This first one
sorts</span> <span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">strings with
numeric suffixes (such as room numbers like “White 102”) first by the string
part, then numerically by the suffix. The function assumes the data has been vetted;
i.e. matches </span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">$rgx_strnum</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">. Obviously
you may need to tweak </span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">$rgx_strnum</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"> to meet your specific
needs; you can also add calls to </span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">uc</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"> to sort the
string part case-insensitively.<o:p></o:p></span></p><p class="MsoNormal"><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">&nbsp; our $rgx_strnum = qr/^([A-Za-z]+)\s*(\d+)$/;<br />
&nbsp; sub strnum {<br />
&nbsp; &nbsp;&nbsp;my ($aS, $aN) = $a =~ $rgx_strnum;<br />
&nbsp; &nbsp;&nbsp;my ($bS, $bN) = $b =~ $rgx_strnum;<br />
&nbsp; &nbsp;&nbsp;return $aS cmp $bS || $aN &lt;=&gt; $bN;<br />
&nbsp; }<o:p></o:p></span></b></p><p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">This function sort
strings ASCIIbetically except blank strings sort to the end—I am always
surprised how often this comes up. As above, you can add calls to </span><b><span style="font-size:12.0pt;line-height:
107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">uc</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"> for a case-insensitive blanks-last sort.<o:p></o:p></span></p><p class="MsoNormal"><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">&nbsp; sub blanks_last {<br />
&nbsp; &nbsp;&nbsp;return [[$a cmp $b, -1], [1, 0]]-&gt;[$a eq
""][$b eq ""];<br />
&nbsp; }<o:p></o:p></span></b></p><p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Finally, this
function sorts strings that consist of dot-delimited numbers (like IP addresses
or RCS version numbers). Again, the function assumes the data has been vetted
and all values have the same number of fields (i.e. don’t try to sort data that
includes both IP addresses <u>and</u> RCS version numbers).</span><b><span style="font-size:12.0pt;line-height:
107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><o:p></o:p></span></b></p><p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal">













<b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA">&nbsp; sub
dotted_nums {<br />
&nbsp; &nbsp;&nbsp;my @bits = split m/\./, "$a.$b";<br />
&nbsp; &nbsp;&nbsp;return (map { $bits[$_] &lt;=&gt; $bits[$_ +
@bits/2] || () }<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0 .. @bits/2-1))[0] || 0;<br />
&nbsp; }<br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--></span></b></p><p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><o:p></o:p></span></p>]]>
        
    </content>
</entry>

<entry>
    <title>Send in a Perl aref to C, get back a Perl array (and using the generated XS)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/steve_bertrand/2017/01/send-in-a-perl-aref-to-c-get-back-a-perl-array-and-using-the-generated-xs.html" />
    <id>tag:blogs.perl.org,2017:/users/steve_bertrand//2771.7903</id>

    <published>2017-01-27T05:17:00Z</published>
    <updated>2017-01-27T20:49:44Z</updated>

    <summary>This is a tutorial as much as it is a request for guidance from experienced XS/C/perlguts folks, as TIMTOWTDI, and in this case, likely, a better way. This will show you how to pass a Perl array reference (aref) into...</summary>
    <author>
        <name>Steve Bertrand</name>
        <uri>stevebhttp://blogs.perl.org/users/steve_bertrand/</uri>
    </author>
    
    <category term="aref" label="aref" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="array" label="array" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="arrayreference" label="array reference" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="c" label="C" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="distribution" label="distribution" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="module" label="module" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xs" label="XS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/steve_bertrand/">
        <![CDATA[<p>This is a tutorial as much as it is a request for guidance from experienced
XS/C/perlguts folks, as TIMTOWTDI, and in this case, likely, a better way.</p>

<p>This will show you how to pass a Perl array reference (aref) into a C function,
convert the aref into a C array, work on it, then push it back onto the stack
so the C function returns it as a Perl array. </p>

<p>It'll also show that although we bite off of 
<a href="https://metacpan.org/pod/distribution/Inline-C/lib/Inline/C.pod">Inline::C</a>,
  the XS code it generates can be used in your distribution, even without the end-user needing <code>Inline</code> installed.</p>

<p>First, straight to the code. Comments inline for what's happening (or, at
least, what I think is happening... feedback welcomed):</p>

<pre><code>use warnings;
use strict;
use feature 'say';

use Inline 'Noclean';
use Inline 'C';

my $aref = [qw(1 2 3 4 5)];

# overwrite the existing aref to
# minimize memory usage

@$aref = aref_to_array($aref);

say $_ for @$aref;


__END__
__C__

void aref_to_array(SV* aref){

    // check if the param is an array reference...
    // die() if not

    if (! SvROK(aref) || SvTYPE(SvRV(aref)) != SVt_PVAV){
        croak("not an aref\n");
    }

    // convert the array reference into a Perl array

    AV* chars = (AV*)SvRV(aref);

    // allocate for a C array, with the same number of
    // elements the Perl array has

    unsigned char buf[av_len(chars)+1];

    // convert the Perl array to a C array

    int i;

    for (i=0; i&lt;sizeof(buf); i++){
        SV** elem = av_fetch(chars, i, 0);
        buf[i] = (unsigned char)SvNV(*elem);
    }

    // prepare the stack

    inline_stack_vars;
    inline_stack_reset;

    int x;

    for (x=0; x&lt;sizeof(buf); x++){

        // extract elem, do stuff with it, 
        // then push to stack

        char* elem = buf[x];
        elem++;        

        inline_stack_push(sv_2mortal(newSViv(elem)));
    }

    // done!

    inline_stack_done;
}
</code></pre>

<p>We now
get an <code>_Inline</code> directory created within the current working directory, which
has a <code>build/</code> dir and then a sub directory (or multiple, just look at the one with the most recent timestamp). Peek in there, and you'll see a
file with an <code>.xs</code> extention. This is the file you want if you want to include
your work into a real Perl distribution. This essentially allows one to utilize my favourite feature of <code>Inline::C</code>, which is to build
XS code for us, without having to know any XS (or little XS) at all.</p>

<p>After I run the above example, I get this in the XS file (my comments removed):</p>

<pre><code>#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "INLINE.h"

void aref_to_array(SV* aref){

    if (! SvROK(aref) || SvTYPE(SvRV(aref)) != SVt_PVAV){
        croak("not an aref\n");
    }

    AV* chars = (AV*)SvRV(aref);

    unsigned char buf[av_len(chars)+1];

    int i;

    for (i=0; i&lt;sizeof(buf); i++){
        SV** elem = av_fetch(chars, i, 0);
        buf[i] = (unsigned char)SvNV(*elem);
    }

    inline_stack_vars;
    inline_stack_reset;

    int x;

    for (x=0; x&lt;sizeof(buf); x++){

        char* elem = buf[x];
        elem++;        

        inline_stack_push(sv_2mortal(newSViv(elem)));
    }

    inline_stack_done;
}

MODULE = c_and_back_pl_f8ff  PACKAGE = main  

PROTOTYPES: DISABLE


void
aref_to_array (aref)
    SV *    aref
        PREINIT:
        I32* temp;
        PPCODE:
        temp = PL_markstack_ptr++;
        aref_to_array(aref);
        if (PL_markstack_ptr != temp) {
          /* truly void, because dXSARGS not invoked */
          PL_markstack_ptr = temp;
          XSRETURN_EMPTY; /* return empty stack */
        }
        /* must have used dXSARGS; list context implied */
        return; /* assume stack size is correct */
</code></pre>

<p>To note is the following line:</p>

<pre><code>MODULE = c_and_back_pl_f8ff  PACKAGE = main
</code></pre>

<p>That dictates the name of the module you're creating the XS for. You'll want to
change it to something like:</p>

<pre><code>MODULE = My::Module  PACKAGE = My::Module
</code></pre>

<p>...then put that file in the root of your distribution, and add, into your
distributions primary <code>.pm</code> module file:</p>

<pre><code>require XSLoader;
XSLoader::load('My::Module', $VERSION);
</code></pre>

<p>Normally, the <code>INLINE.h</code> <code>include</code> can be removed, but because we're using some
<code>Inline</code> functionality, we need to grab a copy of <code>INLINE.h</code> from somewhere and
copy it into the root directory of our distribution so that everything compiles
nicely. There's always a copy of it in the <code>_Inline/build/*</code> directory
mentioned above. Providing this header file will allow users of your
distribution that don't have <code>Inline::C</code> installed to use your module as if
they did have it.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>SPI bus access, analog in/out on the Raspberry Pi powered by Perl</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/steve_bertrand/2017/01/spi-bus-access-analog-inout-on-the-raspberry-pi-powered-by-perl.html" />
    <id>tag:blogs.perl.org,2017:/users/steve_bertrand//2771.7902</id>

    <published>2017-01-26T20:29:07Z</published>
    <updated>2017-01-26T23:25:22Z</updated>

    <summary>Well, all of the learning and testing I&apos;ve done with C, XS, managing bits, reading and understanding hardware datatsheets etc in the last few months is really starting to pay off, with a lot of kudos going out to many...</summary>
    <author>
        <name>Steve Bertrand</name>
        <uri>stevebhttp://blogs.perl.org/users/steve_bertrand/</uri>
    </author>
    
    <category term="analog" label="analog" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="io" label="io" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="raspberrypi" label="raspberry pi" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xs" label="XS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/steve_bertrand/">
        <![CDATA[<p>Well, all of the learning and testing I've done with C, XS, managing bits, reading and understanding hardware datatsheets etc in the last few months is really starting to pay off, with a lot of kudos going out to many Perlers for providing guidance and help with my questions, particularly with XS and C.</p>

<p>We now have reliable, working Perl code to output and receive input analog signals on the Raspberry Pi. This example uses an MCP41010 digital potentiometer for the analog out, and an ADC1015 analog to digital converter for analog in. I still have two different ADCs to write code for, two more models of digital pots, and later this week I should be receiving my DACs (digital to analog converter), my GPS receiver chip, and my MCP3004/8 ADCs.</p>

<p>As a bonus, we also now have direct access to communicate on the SPI bus (as the potentiometer does), with <a href="https://metacpan.org/pod/RPi::SPI">RPi::SPI</a>. I even learned (with help) how to pass a Perl array reference into a C function which gets converted into a C <code>unsigned char *</code>, and how to return a Perl array back from C (I'll write another blog post about these two actions in the coming days).</p>

<p>This setup doesn't really do much, but it's the base of what will eventually allow me to have a Pi in the corner that all it does is pull from github and continuously (and automatically!) run unit tests for the Pi software. However, with true analog output/inputs, there's a lot more a Pi can do.</p>

<p>The <a href="https://stevieb9.github.io/rpi-wiringpi/schematic/dpot_adc_schem.jpg">schematic</a> and the <a href="https://stevieb9.github.io/rpi-wiringpi/breadboard/dpot_adc_bb.jpg">breadboard layout</a> for the setup.</p>

<p>Code:</p>

<pre><code>use warnings;
use strict;

use RPi::WiringPi;

my $pi = RPi::WiringPi-&gt;new;

my $adc = $pi-&gt;adc;

my $cs = $pi-&gt;pin(18);
my $dpot = $pi-&gt;dpot($cs-&gt;num, 0);

$dpot-&gt;set(0);

print "\nValue, Output %\n\n";

for (0..255){

    if (($_ % 10) != 0 &amp;&amp; $_ != 255){
        next;
    }

    $dpot-&gt;set($_);

    my $p = $adc-&gt;percent(0);

    print "$_/255: $p %\n";

    select(undef, undef, undef, 0.3);
}

print "\n\nOutput % at 127/255\n\n";

$dpot-&gt;set(127);

for (0..10){
    print $adc-&gt;percent(0) . " %\n";
    select(undef, undef, undef, 0.2);
}

$pi-&gt;cleanup;
</code></pre>

<p>All it does is switch to different taps (resistor level) on the digital pot which increases/decreases output voltage. The ADC's input pin (A0) is connected directly to the output of the pot, as is the LED, just so I can see visually the changes as well as receive them digitally via the software.</p>

<p>Output:</p>

<pre><code>Value, Output %

0/255: 0.36 %
10/255: 4.24 %
20/255: 8.12 %
30/255: 12.00 %
40/255: 15.88 %
50/255: 19.76 %
60/255: 23.70 %
70/255: 27.58 %
80/255: 31.45 %
90/255: 35.33 %
100/255: 39.21 %
110/255: 43.09 %
120/255: 46.97 %
130/255: 50.85 %
140/255: 54.79 %
150/255: 58.61 %
160/255: 62.48 %
170/255: 66.42 %
180/255: 70.24 %
190/255: 74.12 %
200/255: 77.70 %
210/255: 81.21 %
220/255: 84.91 %
230/255: 88.67 %
240/255: 92.67 %
250/255: 96.97 %
255/255: 99.21 %


Output % at 127/255

49.70 %
49.70 %
49.70 %
49.70 %
49.70 %
49.70 %
49.70 %
49.70 %
49.76 %
49.76 %
49.70 %
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>The Perl Foundation Grant Committee is looking for new members</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/sawyer_x/2017/01/the-perl-foundation-grant-committee-is-looking-for-new-members.html" />
    <id>tag:blogs.perl.org,2017:/users/sawyer_x//87.7901</id>

    <published>2017-01-26T09:36:36Z</published>
    <updated>2017-01-26T09:46:45Z</updated>

    <summary>If you&apos;re looking for ways to be more involved and have more influence, here&apos;s your chance! The Perl Foundation&apos;s Grant Committee is looking for new members to the Committee Member position and the Committee Secretary position. You can find more...</summary>
    <author>
        <name>Sawyer X</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/sawyer_x/">
        <![CDATA[<p>If you're looking for ways to be more involved and have more influence, here's your chance!</p>

<p>The Perl Foundation's Grant Committee is looking for new members to the Committee Member position and the Committee Secretary position.</p>

<p>You can find more information on <a href="http://news.perlfoundation.org/2017/01/grants-committee-needs-a-new-m.html">TPF blog</a>.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Saying of the day...</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2017/01/saying-of-the-day.html" />
    <id>tag:blogs.perl.org,2017:/users/ron_savage//297.7900</id>

    <published>2017-01-26T05:17:28Z</published>
    <updated>2017-01-26T05:18:02Z</updated>

    <summary>When your hammer is Perl, every other language looks like a nail!...</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>When your hammer is Perl, every other language looks like a nail!<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Dancer2 0.204003 fixes missing dependencies, improves error handling </title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/jason_a_crome/2017/01/dancer2-0204003-fixes-missing-dependencies-improves-error-handling.html" />
    <id>tag:blogs.perl.org,2017:/users/jason_a_crome//712.7899</id>

    <published>2017-01-26T02:25:27Z</published>
    <updated>2017-01-26T02:26:25Z</updated>

    <summary>Dancer2 0.204003 is on its way to CPAN now, and provides the following changes: The CPANTS testing service reported that some dependencies for Dancer2 were not specified in the distribution. This has been corrected, and we apologize for any issues...</summary>
    <author>
        <name>Jason A. Crome</name>
        <uri>http://www.crome-plated.com</uri>
    </author>
    
    <category term="dancer" label="dancer" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/jason_a_crome/">
        <![CDATA[<p>Dancer2 0.204003 is on its way to CPAN now, and provides the following changes:</p>

<ul>
<li>The <a href="http://cpants.cpanauthors.org/">CPANTS</a> testing service reported that some dependencies for Dancer2 were not specified in the distribution. This has been corrected, and we apologize for any issues this may have caused.</li>
<li>When a route exception occurred, Dancer2 would catch the error first, and would prevent any custom exception handling from trapping the exception. There were some ugly hacks for working around this, but this fix puts things right, and lets the exception hook fire first, and then will trap the error.</li>
<li>Several changes were made to Dancer2&#8217;s Template Toolkit integration, the most significant of which being the removal of the <code>ANYCASE</code> option.</li>
<li>Various documentation improvements.</li>
</ul>

<p>A big thank you to those who contributed to this release and helped get it out the door.</p>

<p>The full changelog is as follows:</p>

<pre><code>0.204003  2017-01-25 15:21:40-06:00 America/Chicago

[ BUG FIXES ]
* GH #1299: Fix missing CPANTS prereqs (Mohammad S. Anwar)

[ ENHANCEMENTS ]
* GH #1249: Improve consistency with Template::Toolkit,
  using correct case for 'include_path', 'stop_tag', 'end_tag',
  and 'start_tag', removing ANYCASE option.
  (Klaus Ita)
* Call route exception hook before logging an error, allowing devs to
  raise their own errors bedore D2 logging takes over. (Andy Beverley)

[ DOCUMENTATION ]
* Add another example of the delayed asynchronous mechanism
  (Ed @mohawk2 J., Sawyer X)
* GH #1291: Document 'change_session_id' in Dancer2::Core::App.
  (Peter SysPete Mottram)
* Fix typo in Dancer2::Core::Response (Gregorr Herrmann)
* Document Dancer2::Plugin::RootURIFor (Mario Zieschang)
</code></pre>

<p>Happy Dancing!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Bit string manipulation made easy with Bit::Manip</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/steve_bertrand/2017/01/bit-string-manipulation-made-easy-with-bitmanip.html" />
    <id>tag:blogs.perl.org,2017:/users/steve_bertrand//2771.7897</id>

    <published>2017-01-25T21:46:01Z</published>
    <updated>2017-01-28T08:49:01Z</updated>

    <summary>I&apos;ve been writing a lot of software lately that deals with direct hardware access (specifically analog and digital hardware for the Raspberry Pi). This means that I&apos;ve had to learn some C, as well as get proficient with bit manipulation...</summary>
    <author>
        <name>Steve Bertrand</name>
        <uri>stevebhttp://blogs.perl.org/users/steve_bertrand/</uri>
    </author>
    
    <category term="bitmanipulation" label="bit manipulation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bitwise" label="bitwise" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="registers" label="registers" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/steve_bertrand/">
        <![CDATA[<p>I've been writing a lot of software lately that deals with direct hardware access (specifically analog and digital hardware for the Raspberry Pi). This means that I've had to learn some C, as well as get proficient with bit manipulation and the bitwise operators.</p>

<p>As part of my learning, I thought I'd write a module to do this bit manipulation for me, hence <a href="https://metacpan.org/pod/Bit::Manip">Bit::Manip</a> was born. (There's also a <code>Bit::Manip::PP</code> for those who can't/don't want to use XS. It should be indexed shortly).</p>

<p>Here's a scenario based example of how the software can be used.</p>

<p>You have a 16-bit configuration register for a piece of hardware that you want
to configure and send in. Here's the bit configuration</p>

<pre><code>|&lt;--------- 16-bit config register ----------&gt;|
|                             |               |
|---------------------------------------------|
|                             |               |
|                             |               |
|&lt;------Byte 1: Control------&gt;|&lt;-Byte0: Data-&gt;|
|                             |               |
|-----------------------------|---------------|
| 15 | 14 13 | 12 11 | 10 9 8 | 7 6 5 4 3 2 1 |
  __   _____   _____   ______   _____________
  ^      ^       ^        ^          ^
  |      |       |        |          |
START    |       |      UNUSED      DATA
      CHANNEL    |
              PIN SELECT
</code></pre>

<p>...and the bit configuration:</p>

<pre><code>15:     Start conversation
        00 - do nothing
        01 - start conversation

14-13:  Channel selection
        00 - channel 0
        01 - channel 1
        11 - both channels

12-11: Pin selection
        00 - no pin
        01 - pin 1
        11 - pin 2

10-8:   Unused (Don't care bits)

7-0:    Data
</code></pre>

<p>Let's start out with a 16-bit word, and set the start bit. Normally, we'd pass
in an actual value as the first param (<code>$data</code>), but we'll just set bit <code>15</code>
on <code>0</code> to get our initial data.</p>

<pre><code>my $data = bit_on(0, 15);
</code></pre>

<p>A couple of helper functions to verify that we indeed have a 16-bit integer, and
that the correct bit was set:</p>

<pre><code>say bit_count($data);
say bit_bin($data);
</code></pre>

<p>Output to ensure we're good.</p>

<pre><code>16
1000000000000000
</code></pre>

<p>Now, we've got the conversation start bit set in our register, and we want to
set the channel. Let's use both channels. For this, we need to set multiple bits
at once. The datasheet says that the channel is at bits 14-13. Take the LSB
(13), pass it along with the data to <code>bit_set()</code>, followed by the number of bits to update and as the last parameter,
put the binary bit string that coincides with the option you want (<code>0b11</code> for
both channels):</p>

<pre><code># setting channel

my $bits_to_update = 2;
$data = bit_set($data, 13, $bits_to_update, 0b11);

# result: 1110000000000000
</code></pre>

<p>We'll use pin 1, and per the datasheet, that's <code>0b01</code> starting from bit 11:</p>

<pre><code># setting pin

$data = bit_set($data, 11, 2, 0b01);

# result: 1110100000000000
</code></pre>

<p>The next two bits are unused, so we'll ignore them, and set the data. Let's use
186 as the data value (10111010 in binary):</p>

<pre><code># setting data

$data = bit_set($data, 0, 8, 186);

# or: bit_set($data, 0, 8, 0b10111010);

# result: 1110100010111010
</code></pre>

<p>Now we realize that we made a mistake above. We don't want both channels after
all, we want to use only channel 1 (value: 0b01). Since we know exactly which
bit we need to disable (14), we can just turn it off:</p>

<pre><code>$data = bit_off($data, 14);

# result: 1010100010111010
</code></pre>

<p>(You could also use <code>bit_set()</code> to reset the entire channel register bits
(14-13) like we did above).</p>

<p>Let's verify that we've got the register configured correctly before we send it
to the hardware. We use <code>bit_get()</code> for this. The 2nd and 3rd parameters are
MSB and LSB respectively, and in this case, we only want the value from that
single bit:</p>

<pre><code>my $value = bit_get($data, 15, 15);
say bit_bin($value);

# result: 1
</code></pre>

<p>So yep, our start bit is set. Let's verify the rest:</p>

<pre><code># data

# (note no LSB param. We're reading from bit 7 through to 0. LSB defaults 
# to 0 if not sent in).

# since we readily know the data value in decimal (186), we don't need
# to worry about the binary representation

say bit_get($data, 7);

# result 186

# channel

say bit_bin(bit_get($data, 14, 13));

# result 1

# pin select

say bit_bin(bit_get($data, 12, 11));

# result 1

# ensure the unused bits weren't set

say bit_get($data, 10, 8);
</code></pre>

<p>So now we've set up all of our register bits, and confirmed it's ready to be
sent to the hardware for processing.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Perl Aventure Series Part 2</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/jt_smith/2017/01/perl-aventure-series-part-2.html" />
    <id>tag:blogs.perl.org,2017:/users/jt_smith//242.7898</id>

    <published>2017-01-25T17:00:04Z</published>
    <updated>2017-01-25T17:00:04Z</updated>

    <summary>A couple weeks ago we had our first meeting for the Perl Adventure Series. Despite a terrible ice storm we still had 3 new people turn out in addition to our regular cast of characters. I hope we see them...</summary>
    <author>
        <name>JT Smith</name>
        <uri>http://www.plainblack.com/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/jt_smith/">
        <![CDATA[<p>A couple weeks ago we had our first meeting for the <a href="http://plainblackguy.tumblr.com/post/155347526439/perl-adventure-series" target="_blank">Perl Adventure Series</a>. Despite a terrible ice storm we still had 3 new people turn out in addition to our regular cast of characters. I hope we see them (and more) back. </p><p>During the meetup we set up our Dist::Zilla config file, and a new <a href="https://github.com/rizen/Adventure" target="_blank">GitHub repository</a> for the adventure series. And we got started designing the mission data structure. </p><p>We had a great time discussing all the implications of this design. There was a heated argument about including code snippets inside the config file in order to keep the game engine generic. However, I’m going to argue to the group that we should be putting these code snippets out into individual modules (or perhaps roles) and then just name those plugins in the config file. I hate the idea of code in a config file. It makes my skin crawl. </p><p>Beyond the code in config debate, we figured out that we were going to use YAML as the storage structure for mission files. Not for live mission data, but just as the initialization data. I think the YAML is hard to read given the big blocks of text we need to include in it, but YAML is a lot lighter than XML, and not as strict as JSON, so the group decided it was best. </p><p>We figured out our data structures for rooms, items, and other initialization data. We still have to figure out the data structures for the actions the player is allowed to take on any given item as well as in a room. I’m sure the robot that the player can control in the <a href="http://www.memento-mori.com/parsely/parsely-4-space-station" target="_blank">Space Mission</a> will add a whole new mix of variables into the mix. </p><p>If this sounds like a fun exercise, and you live within driving distance of Madison, WI, then I encourage you to join us at <a href="https://www.meetup.com/madmongers/events/237119347/" target="_blank">our next meetup on February 14th</a> (assuming your significant other will allow you to leave the house). </p>

         <p>[From <a href="http://plainblackguy.tumblr.com">my blog</a>.]</p>

    ]]>
        
    </content>
</entry>

<entry>
    <title>Strawberry Perl 5.24.1.1 + 5.22.3.1 released</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/kmx/2017/01/strawberry-perl-52411-52231-released.html" />
    <id>tag:blogs.perl.org,2017:/users/kmx//156.7896</id>

    <published>2017-01-24T01:57:27Z</published>
    <updated>2017-01-24T02:01:43Z</updated>

    <summary>Strawberry Perl 5.24.1.1 and 5.22.3.1 are available at http://strawberryperl.com More details in Release Notes: http://strawberryperl.com/release-notes/5.24.1.1-64bit.html http://strawberryperl.com/release-notes/5.24.1.1-32bit.html http://strawberryperl.com/release-notes/5.22.3.1-64bit.html http://strawberryperl.com/release-notes/5.22.3.1-32bit.html I would like to thank our sponsor Enlightened Perl Organisation for resources provided to our project....</summary>
    <author>
        <name>kmx</name>
        
    </author>
    
    <category term="strawberryperl" label="strawberry perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/kmx/">
        <![CDATA[<p><strong>Strawberry Perl 5.24.1.1</strong> and <strong>5.22.3.1</strong> are available at <a href="http://strawberryperl.com">http://strawberryperl.com</a></p>

<p>More details in Release Notes:<br />
<a href="http://strawberryperl.com/release-notes/5.24.1.1-64bit.html">http://strawberryperl.com/release-notes/5.24.1.1-64bit.html</a><br />
<a href="http://strawberryperl.com/release-notes/5.24.1.1-32bit.html">http://strawberryperl.com/release-notes/5.24.1.1-32bit.html</a><br />
<a href="http://strawberryperl.com/release-notes/5.22.3.1-64bit.html">http://strawberryperl.com/release-notes/5.22.3.1-64bit.html</a><br />
<a href="http://strawberryperl.com/release-notes/5.22.3.1-32bit.html">http://strawberryperl.com/release-notes/5.22.3.1-32bit.html</a></p>

<p>I would like to thank our sponsor <a href="http://www.enlightenedperl.org">Enlightened Perl Organisation</a> for resources provided to our project.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Swapping Things</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/morandimus/2017/01/swapping-things.html" />
    <id>tag:blogs.perl.org,2017:/users/morandimus//2921.7895</id>

    <published>2017-01-23T17:18:29Z</published>
    <updated>2017-01-23T17:20:45Z</updated>

    <summary><![CDATA[So we all know the COMPSCI 101 method of swapping two variables: &nbsp; $tmp = $x; $x = $y; $y = $tmp; And we all know the better way of doing it: &nbsp; ($x, $y) = ($y, $x); And yet,...]]></summary>
    <author>
        <name>morandimus</name>
        
    </author>
    
        <category term="worst_perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="variables" label="variables" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/morandimus/">
        <![CDATA[<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">So we all know
the COMPSCI 101 method of swapping two variables:<br />
</span><b><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">&nbsp; $tmp = $x; $x =
$y; $y = $tmp;</span></b><span style="font-size:12.0pt;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><br />
And we all know the better way of doing it:<br />
</span><b><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">&nbsp; ($x, $y) = ($y,
$x);<o:p></o:p></span></b></p>

<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">And yet, I
found the following in PRODUCTION CODE, that a contractor was PAID ACTUAL DOLLARS TO WRITE:<br />
</span><b><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">&nbsp; ($tmp_x, $tmp_y)
= ($x, $y);<br />
&nbsp; ($x, $y) = ($tmp_y, $tmp_x);<br />
</span></b><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Weird that
they knew about parallel assignment but not that you could just apply it to two
variables directly.</span><b><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><o:p></o:p></span></b></p>

<p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Anyhow, this
wasn’t nearly as bad as the code I found in a different module (same vendor) to
swap all the </span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">1</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">s and </span><b><span style="font-size:12.0pt;line-height:
107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">0</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2">s in a string. Now this is a somewhat less trivial
problem than simply swapping two variables, but<br />
</span><b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">&nbsp; $str
=~ tr/01/10/;</span></b><span style="font-size:12.0pt;line-height:107%;
mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"><br />
does the job nicely. Alas, in the same vein as the variable-swap, the method
that vendor went with was:<br />
</span><b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">&nbsp;
$str =~ s/0/2/g;<br />
&nbsp; $str =~ s/1/3/g;<br />
&nbsp; $str =~ s/2/1/g;<br />
&nbsp; $str =~ s/3/0/g;<o:p></o:p></span></b></p>

<span style="font-size:12.0pt;line-height:107%;font-family:&quot;Calibri&quot;,sans-serif;
mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2;
mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA">Good
thing </span><b><span style="font-size:
12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA">$str</span></b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA"> doesn’t contain any </span><b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;
mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2;
mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA">2</span></b><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Calibri&quot;,sans-serif;
mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2;
mso-ansi-language:EN-US;mso-fareast-language:EN-US;mso-bidi-language:AR-SA">s
or </span><b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA">3</span></b><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA">s!</span><div><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Calibri&quot;,sans-serif;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2;mso-ansi-language:EN-US;mso-fareast-language:
EN-US;mso-bidi-language:AR-SA"><br /></span></div>]]>
        
    </content>
</entry>

<entry>
    <title>Perl 5 Porters Mailing List Summary: January 16th-22nd</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/sawyer_x/2017/01/perl-5-porters-mailing-list-summary-january-16th-22nd.html" />
    <id>tag:blogs.perl.org,2017:/users/sawyer_x//87.7894</id>

    <published>2017-01-23T10:20:36Z</published>
    <updated>2017-01-23T10:23:23Z</updated>

    <summary>Hey everyone, Following is the p5p (Perl 5 Porters) mailing list summary for the past week. Enjoy!...</summary>
    <author>
        <name>Sawyer X</name>
        
    </author>
    
        <category term="p5p-summary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/sawyer_x/">
        <![CDATA[<p>Hey everyone,</p>

<p>Following is the p5p (Perl 5 Porters) mailing list summary for the past week.</p>

<p>Enjoy!</p>
]]>
        <![CDATA[<h1>January 16th-22nd</h1>

<h2>News and updates</h2>

<p>Perl 5.25.9 is now
<a href="http://nntp.perl.org/group/perl.perl5.porters/242405">available</a>!</p>

<p>Abigail has
<a href="http://nntp.perl.org/group/perl.perl5.porters/242310">implemented</a>
the discussed deprecations published with a few changes.</p>

<p>New API function ML:available:#242422 <code>op_class</code>.</p>

<p><a href="http://metacpan.org/pod/CPAN">CPAN.pm</a> was updated to version 2.16.</p>

<h2>Grant reports</h2>

<ul>
<li>Dave Mitchell TPF Grant 2
<a href="http://nntp.perl.org/group/perl.perl5.porters/242285">report</a> #158.</li>
<li>Dave Mitchell TPF Grant 2
<a href="http://nntp.perl.org/group/perl.perl5.porters/242286">December</a> 2016
report.</li>
<li>Tony Cook TPF Grant 8
<a href="http://nntp.perl.org/group/perl.perl5.porters/242385">report 9</a>.</li>
<li>Tony Cook TPF Grant 8
<a href="http://nntp.perl.org/group/perl.perl5.porters/242386">report 10</a>.</li>
<li>Tony Cook TPF Grant 8
<a href="http://nntp.perl.org/group/perl.perl5.porters/242387">report 11</a>.</li>
</ul>

<h2>Issues</h2>

<h3>New issues</h3>

<p>Jan Dubois
<a href="http://nntp.perl.org/group/perl.perl5.porters/242307">reports</a>
(Building Perl on Cygwin: /proc/curproc/exe) 5.24.0 and 5.24.1 hang in
the <code>Configure</code> phase on Cygwin.</p>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130561">Perl #130561</a>:
Coredump in <code>Perl_re_op_compile</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130584">Perl #130584</a>:
perl5.18-5.24: Slow <code>pos</code> function in taint mode with <code>\G</code> and
unicode.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130585">Perl #130585</a>:
<code>perl.c</code>: <code>perl_destruct</code>: Assertion failure.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130617">Perl #130617</a>:
<code>op.c</code>: <code>Perl_rpeep</code>: Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130621">Perl #130621</a>:
Segfault in <code>Perl_vwarner</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130622">Perl #130622</a>:
<code>op.c</code>: Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130623">Perl #130623</a>:
<code>pp_sys.c</code> Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130626">Perl #130626</a>:
<a href="http://metacpan.org/pod/Getopt::Long">Getopt::Long</a> fails to call
sub action if optional value is omitted.</li>
</ul>

<h3>Resolved issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=70878">Perl #70878</a>: <code>0_</code>
gives double warning.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129024">Perl #129024</a>:
heap-buffer-overflow <code>S_regmatch</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129149">Perl #129149</a>:
heap-buffer-overflow <code>S_pack_Rec</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129320">Perl #129320</a>:
Assertion <code>!(o-&gt;op_private &amp; ~PL_op_private_valid[type])</code>
failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129869">Perl #129869</a>:
<code>Perl_sv_setsv_flags</code>: Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129887">Perl #129887</a>:
heap-buffer-overflow in <code>S__byte_dump_string</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130333">Perl #130333</a>:
<code>Perl_pp_rv2sv()</code>: Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130334">Perl #130334</a>:
<code>Perl_pp_rv2av()</code>: Assertion failed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130504">Perl #130504</a>:
[PATCH] fix memory leak in <code>B::RHE</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130584">Perl #130584</a>:
perl5.18-5.24: Slow <code>pos</code> function in taint mode with <code>\G</code> and
unicode.</li>
</ul>

<h2>Suggested patches</h2>

<p>Christian Millour
<a href="http://nntp.perl.org/group/perl.perl5.porters/242367">provided</a> (Re:
[PATCH] Re: no '"my $b" used in sort comparison' warning when $bis
dereferenced ?) a patch to the documentation regarding the nature of
<code>$a</code> and <code>$b</code> in <code>sort()</code>.</p>

<p>Neil Bowers
<a href="http://nntp.perl.org/group/perl.perl5.porters/242374">suggested</a>
updating the <code>NAME</code> documentation of
<a href="http://metacpan.org/pod/Getopt::Std">Getopt::Std</a>.</p>

<p>Andy Lester provided several patches:</p>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130591">Perl #130591</a>:
[PATCH] Make arguments to <code>S_invlist_is_iterating</code> and
<code>S_invlist_max</code> be const.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130592">Perl #130592</a>:
[PATCH] Add prototypes for 6 mathoms to satisfy
<code>-Wmissing-prototypes</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130596">Perl #130596</a>:
<code>Perl_utf8_to_uvchr_buf</code> has no prototype in any <code>.h</code> file.</li>
</ul>

<h2>Discussion</h2>

<p>Dave Mitchell
<a href="http://nntp.perl.org/group/perl.perl5.porters/242295">asked</a> several
questions about the slowness of two tests: <code>ext/XS-APItest/t/handy.t</code>
and <code>ext/XS-APItest/t/utf8.t</code>.</p>

<p>Todd Rinaldo sent an email to cpan-workers regarding the toolchain and
removal of <code>.</code> from <code>@INC</code>.
<a href="http://nntp.perl.org/group/perl.perl5.porters/242362">Discussion</a>
continued.</p>

<p>Dave Mitchell has
<a href="http://nntp.perl.org/group/perl.perl5.porters/242421">made</a> the
desired changes to the output format of <code>op_dump()</code> discussed
previously.</p>

<p>Karl Williamson
<a href="http://nntp.perl.org/group/perl.perl5.porters/242439">notes</a> that perl
still attempts to compile regular expressions, even if there are
parsing errors, and wonders if there's a valid reason for it.</p>
]]>
    </content>
</entry>

<entry>
    <title>An informal comparison of sparrow and ansible eco systems</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/melezhik/2017/01/an-informal-comparison-of-sparrow-and-ansible-eco-systems.html" />
    <id>tag:blogs.perl.org,2017:/users/melezhik//1336.7893</id>

    <published>2017-01-20T13:50:02Z</published>
    <updated>2017-01-20T21:19:48Z</updated>

    <summary>Hi! Here is my latest post about Sparrowdo configuration management tool written in Perl6 - Sparrow plugins vs ansible modules - an attempt of informal comparison of sparrow and ansible eco systems. Regards. Alexey...</summary>
    <author>
        <name>melezhik</name>
        <uri>https://sparrowhub.org</uri>
    </author>
    
    <category term="ansible" label="ansible" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="configurationmanagement" label="configuration management" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrow" label="sparrow" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrowdo" label="sparrowdo" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/melezhik/">
        <![CDATA[<p>Hi!  </p>

<p>Here is my latest post about Sparrowdo configuration management tool written in Perl6 - 
<a href="https://sparrowdo.wordpress.com/2017/01/20/sparrow-plugins-vs-ansible-modules/">Sparrow plugins vs ansible modules</a> - an attempt of informal comparison of sparrow and ansible eco systems.</p>

<p>Regards.</p>

<p>Alexey</p>
]]>
        

    </content>
</entry>

<entry>
    <title>I hope to see you at FOSDEM in Brussels</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ovid/2017/01/i-hope-to-see-you-at-fosdem-in-brussels.html" />
    <id>tag:blogs.perl.org,2017:/users/ovid//11.7892</id>

    <published>2017-01-18T20:35:21Z</published>
    <updated>2017-01-25T13:23:08Z</updated>

    <summary>I&apos;ve been rather quiet lately because between building Tau Station and working with some clients, I&apos;m running around faster than a long-tailed cat in a room full of rocking chairs. I&apos;ll be in Brussels for the February 4/5 2017, FOSDEM,...</summary>
    <author>
        <name>Ovid</name>
        <uri>http://www.allaroundtheworld.fr/</uri>
    </author>
    
    <category term="fosdem" label="fosdem" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="taustation" label="tau-station" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ovid/">
        <![CDATA[<p>I've been rather quiet lately because between building <a href="https://taustation.space/">Tau Station</a> and working with some clients, I'm running around faster than a long-tailed cat in a room full of rocking chairs.</p>

<p>I'll be in Brussels for the February 4/5 2017, FOSDEM, talking about <a href="https://fosdem.org/2017/schedule/event/tau_station/">Building the Tau Station Universe in Perl</a>. I was planning on giving a talk about testing, but I was specifically asked if I'd talk about Tau Station. While I love the project, I tried to think of a way it wouldn't sound like a 40 minute infomercial at an open source conference.</p>

<p><figure>
    <img src="https://taustation.space/wp-content/uploads/2016/12/2_hotel.png" alt="Woman relaxing in a high-tech hotel room in a space station." title="Yeah, I don't know what the cables are doing on the floor, either.">
    <figcaption>Relaxing in a high-tech hotel room in a space station.</figcaption>
</figure></p>

<p>I'm pretty sure I've succeeded and I have to say, I think people are going to be really impressed with some of the code examples. In fact, it's gotten me to the point where I'm having more serious doubts about how object-oriented programming is currently taught. For example, what does the <a href="https://en.wikipedia.org/wiki/Single_responsibility_principle">single responsibility principle</a> mean for a combat suit that can pass <a href="https://en.wikipedia.org/wiki/Turing_test">the Turing test</a>? It serves as armor, and might serve as a weapon, and might serve as a medkit, and even give the soldier a pep-talk.</p>

<p>Single-responsibility my ass.</p>

<p>The Tau Station talk will show a very simple way out of that conundrum.</p>

<p>We have an <em>awesome</em> team working on Tau Station. We've used the same hiring strategy that we use hiring for our clients at <a href="https://allaroundtheworld.fr/">All Around the World</a> and it's paid off in spades. You'll be impressed with their work. Fortunately, since this is FOSDEM, even if you can't make it to Brussels, the video will later be online for free and I'll post a link for you.</p>

<p>Hope to see you there!</p>

<p><em>Update</em>: Once again I have had to close comments due to massive amounts of spam I have to clean out every day.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Updated SQL BNFs from Jonathan Leffler</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2017/01/updated-sql-bnfs-from-jonathan-leffler.html" />
    <id>tag:blogs.perl.org,2017:/users/ron_savage//297.7891</id>

    <published>2017-01-18T07:44:02Z</published>
    <updated>2017-01-18T07:47:06Z</updated>

    <summary>Jonathan Leffler has sent me a very slightly updated set of SQL BNF files for SQL-92, SQL-99 and SQL-2003. I&apos;ve put them on-line....</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>Jonathan Leffler has sent me a very slightly updated set of SQL BNF files for SQL-92, SQL-99 and SQL-2003. I've <a href="http://savage.net.au/SQL.html">put them on-line.</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>qk: Quote Membership Hash Keys</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/morandimus/2017/01/qk-quote-membership-hash-keys.html" />
    <id>tag:blogs.perl.org,2017:/users/morandimus//2921.7890</id>

    <published>2017-01-17T16:35:19Z</published>
    <updated>2017-01-17T16:39:54Z</updated>

    <summary><![CDATA[ I recently ran across an article (http://neilb.org/2016/08/08/quoted-words-arrayref.html) by neilb, advocating for a qa() operator that returns an arrayref instead of a plain array: &nbsp; our $cars_ref = qa(sedan hatchback coupe); I love this idea, and I would use it...]]></summary>
    <author>
        <name>morandimus</name>
        
    </author>
    
        <category term="data_structures" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="missing_from_perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="data_structures" label="data_structures" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="missing_from_perl" label="missing_from_perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/morandimus/">
        <![CDATA[<!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->

<p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">I recently
ran across an article (<a href="http://neilb.org/2016/08/08/quoted-words-arrayref.html">http://neilb.org/2016/08/08/quoted-words-arrayref.html</a>)
by neilb, advocating for a </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">qa()</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"> operator that
returns an arrayref instead of a plain array:<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>our
$cars_ref = qa(sedan hatchback coupe);</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"><br />
I love this idea, and I would use it a lot.</span></p>

<p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">I’d like to
add onto this proposal another </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">qw()</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">-style
operator to quote the keys of a membership hash. I suggest </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;line-height:
107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">qk()</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"> for “quote keys.” So<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>our
%is_color = </span></b><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#C00000">qk(</span></b><b style="mso-bidi-font-weight:
normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;
mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">red
blue green</span></b><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#C00000">)</span></b><b style="mso-bidi-font-weight:
normal"><span style="font-size:12.0pt;line-height:107%;font-family:&quot;Courier New&quot;;
mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">;</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><br />
is the same as<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>our
%is_color = map { $_ =&gt; 1 } qw(red blue green);</span></b><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><br />
or<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>our
@colors = qw(red blue green);</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"><br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
line-height:107%;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>our
%is_color = map { $_ =&gt; 1 } @colors;</span></b><span style="font-size:12.0pt;
line-height:107%;mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"></span></p>

<p class="MsoNormal"><span style="font-size:12.0pt;line-height:107%;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Unlike my
previous entry (symbolic “xor”), I wrote this line of code <u>ALL THE TIME</u>.
Taking a cue from neilb, I looked on CPAN to see how often other people do
this. It turns out the answer is “a really, really lot”: <a href="http://grep.cpan.me/?q=map%5Cs*%7B%5Cs*%5C%28%3F%5Cs*%5C%24_%5Cs*%3D%3E%5Cs*1%5Cs*%5C%29%3F%5Cs*%5C%7D%5Cs*qw">http://grep.cpan.me/?q=map%5Cs*%7B%5Cs*%5C%28%3F%5Cs*%5C%24_%5Cs*%3D%3E%5Cs*1%5Cs*%5C%29%3F%5Cs*%5C%7D%5Cs*qw</a></span></p>

<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>X-NONE</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
  DefSemiHidden="false" DefQFormat="false" DefPriority="99"
  LatentStyleCount="371">
  <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 9"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 9"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footnote text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="header"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footer"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index heading"/>
  <w:LsdException Locked="false" Priority="35" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="table of figures"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="envelope address"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="envelope return"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footnote reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="line number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="page number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="endnote reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="endnote text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="table of authorities"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="macro"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="toa heading"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 5"/>
  <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Closing"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Signature"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="true"
   UnhideWhenUsed="true" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Message Header"/>
  <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Salutation"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Date"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text First Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text First Indent 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Note Heading"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Block Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Hyperlink"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="FollowedHyperlink"/>
  <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Document Map"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Plain Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="E-mail Signature"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Top of Form"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Bottom of Form"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal (Web)"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Acronym"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Address"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Cite"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Code"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Definition"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Keyboard"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Preformatted"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Sample"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Typewriter"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Variable"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal Table"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation subject"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="No List"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Contemporary"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Elegant"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Professional"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Subtle 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Subtle 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Balloon Text"/>
  <w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Theme"/>
  <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" QFormat="true"
   Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" QFormat="true"
   Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" QFormat="true"
   Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" QFormat="true"
   Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" QFormat="true"
   Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" QFormat="true"
   Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" SemiHidden="true"
   UnhideWhenUsed="true" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
  <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
  <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
  <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
  <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
  <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
  <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
  <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
  <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
  <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 1"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 2"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 3"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 4"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 5"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 6"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
  <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
  <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 1"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 2"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 3"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 4"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 5"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 6"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 6"/>
 </w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:8.0pt;
	mso-para-margin-left:0in;
	line-height:107%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->]]>
        
    </content>
</entry>

<entry>
    <title>Sparrow plugins evolution</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/melezhik/2017/01/sparrow-plugins-evolution.html" />
    <id>tag:blogs.perl.org,2017:/users/melezhik//1336.7889</id>

    <published>2017-01-16T19:17:30Z</published>
    <updated>2017-01-16T19:48:20Z</updated>

    <summary>Hi! Sparrowdo is a modern configuration management tool written on Perl6. If you wonder how sparrowdo makes a difference you may read this article - Sparrow plugins evolution - an informal introduction to core part of sparrowdo - sparrow plugins....</summary>
    <author>
        <name>melezhik</name>
        <uri>https://sparrowhub.org</uri>
    </author>
    
    <category term="evolution" label="evolution" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrow" label="sparrow" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrowdo" label="sparrowdo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="systemdesign" label="system design" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/melezhik/">
        <![CDATA[<p>Hi! <a href="https://github.com/melezhik/sparrowdo">Sparrowdo</a> is a modern configuration management tool written on Perl6. If you wonder how sparrowdo makes a difference you may read this article - <a href="https://sparrowdo.wordpress.com/2017/01/16/sparrow-plugins-evolution/">Sparrow plugins evolution</a> - an informal introduction to core part of sparrowdo - sparrow plugins.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Perl BoF @ LCA 2017</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/dean/2017/01/perl-bof-lca-2017.html" />
    <id>tag:blogs.perl.org,2017:/users/dean//558.7887</id>

    <published>2017-01-16T05:07:34Z</published>
    <updated>2017-01-16T05:09:35Z</updated>

    <summary>A Perl BoF (Birds of a feather) meeting has been officially organized for this years linux.conf.au Conference in Tasmania Australia. Further details can be found at: https://linux.conf.au/wiki/conference/birds_of_a_feather_sessions/perl_bof/ Or drop in to #australia on irc.perl.org...</summary>
    <author>
        <name>Dean</name>
        <uri>http://bytefoundry.com.au</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/dean/">
        <![CDATA[<p>A Perl BoF (Birds of a feather) meeting has been officially organized for this years <strong>linux.conf.au</strong> Conference in Tasmania Australia.</p>

<p>Further details can be found at: <a href="https://linux.conf.au/wiki/conference/birds_of_a_feather_sessions/perl_bof/">https://linux.conf.au/wiki/conference/birds_of_a_feather_sessions/perl_bof/</a></p>

<p>Or drop in to <strong>#australia</strong> on <strong>irc.perl.org</strong></p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl 5 Porters Mailing List Summary: January 9th-15th</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/sawyer_x/2017/01/perl-5-porters-mailing-list-summary-january-9th-15th.html" />
    <id>tag:blogs.perl.org,2017:/users/sawyer_x//87.7888</id>

    <published>2017-01-16T10:06:16Z</published>
    <updated>2017-01-16T10:07:02Z</updated>

    <summary>Hey everyone, Following is the p5p (Perl 5 Porters) mailing list summary for the past week. Enjoy!...</summary>
    <author>
        <name>Sawyer X</name>
        
    </author>
    
        <category term="p5p-summary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/sawyer_x/">
        <![CDATA[<p>Hey everyone,</p>

<p>Following is the p5p (Perl 5 Porters) mailing list summary for the past week.</p>

<p>Enjoy!</p>
]]>
        <![CDATA[<h1>January 9th-15th</h1>

<h2>News and updates</h2>

<p>Perl 5.22.3 is now
<a href="http://nntp.perl.org/group/perl.perl5.porters/242258">available</a>!</p>

<p>Perl 5.24.1 is now
<a href="http://nntp.perl.org/group/perl.perl5.porters/242259">available</a>!</p>

<h2>Grant reports</h2>

<ul>
<li>Dave Mitchell TPF Grant 2
<a href="http://nntp.perl.org/group/perl.perl5.porters/242209">reports</a>
#156 and #157.</li>
</ul>

<h2>Issues</h2>

<h3>New issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130543">Perl #130543</a>:
<code>Configure</code>: Cross/to-scp duplicates targetdir when rerun.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130546">Perl #130546</a>:
Better-written-as-warning missing on <code>delete</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130550">Perl #130550</a>: Out
of bounds read when calling perl from C.</li>
</ul>

<h3>Resolved issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=77934">Perl #77934</a>: Bus
error with (unshared) dir handles and threads.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130098">Perl #130098</a>:
Multiple segfaults in <a href="http://metacpan.org/pod/Storable">Storable</a>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130262">Perl #130262</a>:
heap-buffer-overflow <code>Perl_pp_split</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130530">Perl #130530</a>:
Assertion failure in <code>utf8.c</code> on HP-UX PA-RISC.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130534">Perl #130534</a>:
Test failures under DragonFly BSD.</li>
</ul>

<h2>Discussion</h2>

<p>Curtis (Ovid) Poe
<a href="http://nntp.perl.org/group/perl.perl5.porters/242221">asked</a> about
rephrasing an error message regarding subroutine names.</p>

<p>Karl Williamson
<a href="http://nntp.perl.org/group/perl.perl5.porters/242212">asked</a> (What to
do about <code>qr/(?i-i:foo)/</code>) whether we should warn when a regular
expression has flags that negate and cancel each other.</p>

<p>Dave Mitchell
<a href="http://nntp.perl.org/group/perl.perl5.porters/242240">suggests</a>
(changing the format of op tree dumping (<code>-Dx</code> / <code>Perl_op_dump()</code>))
changing the output of op tree dumping on the C-side to a more useful
output format.</p>
]]>
    </content>
</entry>

<entry>
    <title>Symbolic xor</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/morandimus/2017/01/symbolic-xor.html" />
    <id>tag:blogs.perl.org,2017:/users/morandimus//2921.7886</id>

    <published>2017-01-11T21:10:29Z</published>
    <updated>2017-01-17T16:14:28Z</updated>

    <summary> Why doesn’t Perl have a symbolic logical xor operator (spelled “^^”)? As far as I can tell, the only reason is that C doesn’t have one... At a minimum, it would remove the need for parentheses in expressions like...</summary>
    <author>
        <name>morandimus</name>
        
    </author>
    
        <category term="missing_from_perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="missing_from_perl" label="missing_from_perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/morandimus/">
        <![CDATA[<!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->

<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Why doesn’t
Perl have a symbolic logical </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">xor</span></b><span style="font-size:12.0pt;
mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"> operator (spelled “</span><b style="mso-bidi-font-weight:
normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">^^</span></b><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:
&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;
color:#44546A;mso-themecolor:text2">”)? As far as I can tell, the only reason
is that C doesn’t have one...</span></p>

<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">At a minimum,
it would remove the need for parentheses in expressions like<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>$flag =
($subflag1 xor $subflag2);</span></b><span style="font-size:12.0pt;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><br />
instead allowing<br />
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2"><span style="mso-spacerun:yes">&nbsp; </span>$flag = $subflag1
^^ $subflag2;</span></b><span style="font-size:12.0pt;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"><br />
…like you can now do with </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">and</span></b><span style="font-size:12.0pt;
mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2"> and </span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;
color:#44546A;mso-themecolor:text2">or</span></b><span style="font-size:12.0pt;
mso-ascii-font-family:Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;color:#44546A;
mso-themecolor:text2">, as long as you spell them “</span><b style="mso-bidi-font-weight:
normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">&amp;&amp;</span></b><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:
&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;
color:#44546A;mso-themecolor:text2">” and “</span><b style="mso-bidi-font-weight:
normal"><span style="font-size:12.0pt;font-family:&quot;Courier New&quot;;mso-fareast-font-family:
&quot;Times New Roman&quot;;color:#44546A;mso-themecolor:text2">||</span></b><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;mso-fareast-font-family:
&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri;
color:#44546A;mso-themecolor:text2">”.</span></p>

<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;
line-height:normal"><span style="font-size:12.0pt;mso-ascii-font-family:Calibri;
mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2">Would I use
this a lot? No. (I would have for maybe the 2nd time yesterday, which is what
made me think of it.) But as someone who loves completeness, the absence of a symbolic
</span><b style="mso-bidi-font-weight:normal"><span style="font-size:12.0pt;
font-family:&quot;Courier New&quot;;mso-fareast-font-family:&quot;Times New Roman&quot;;color:#44546A;
mso-themecolor:text2">xor</span></b><span style="font-size:12.0pt;mso-ascii-font-family:
Calibri;mso-fareast-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:Calibri;
mso-bidi-font-family:Calibri;color:#44546A;mso-themecolor:text2"> absences from
Perl has always bothered me.</span></p>

<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>X-NONE</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
  DefSemiHidden="false" DefQFormat="false" DefPriority="99"
  LatentStyleCount="371">
  <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index 9"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" Name="toc 9"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footnote text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="header"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footer"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="index heading"/>
  <w:LsdException Locked="false" Priority="35" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="table of figures"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="envelope address"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="envelope return"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="footnote reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="line number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="page number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="endnote reference"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="endnote text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="table of authorities"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="macro"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="toa heading"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Bullet 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Number 5"/>
  <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Closing"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Signature"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="true"
   UnhideWhenUsed="true" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="List Continue 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Message Header"/>
  <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Salutation"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Date"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text First Indent"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text First Indent 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Note Heading"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Body Text Indent 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Block Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Hyperlink"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="FollowedHyperlink"/>
  <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Document Map"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Plain Text"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="E-mail Signature"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Top of Form"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Bottom of Form"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal (Web)"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Acronym"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Address"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Cite"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Code"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Definition"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Keyboard"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Preformatted"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Sample"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Typewriter"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="HTML Variable"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Normal Table"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="annotation subject"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="No List"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Outline List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Simple 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Classic 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Colorful 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Columns 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Grid 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 4"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 5"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 6"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 7"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table List 8"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table 3D effects 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Contemporary"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Elegant"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Professional"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Subtle 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Subtle 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 1"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 2"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Web 3"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Balloon Text"/>
  <w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
  <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
   Name="Table Theme"/>
  <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" QFormat="true"
   Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" QFormat="true"
   Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" QFormat="true"
   Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" QFormat="true"
   Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" QFormat="true"
   Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" QFormat="true"
   Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" SemiHidden="true"
   UnhideWhenUsed="true" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" SemiHidden="true"
   UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
  <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
  <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
  <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
  <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
  <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
  <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
  <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
  <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
  <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 1"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 2"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 3"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 4"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 5"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="46"
   Name="Grid Table 1 Light Accent 6"/>
  <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
  <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
  <w:LsdException Locked="false" Priority="51"
   Name="Grid Table 6 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="52"
   Name="Grid Table 7 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
  <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
  <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 1"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 1"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 2"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 2"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 3"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 3"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 4"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 4"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 5"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 5"/>
  <w:LsdException Locked="false" Priority="46"
   Name="List Table 1 Light Accent 6"/>
  <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
  <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
  <w:LsdException Locked="false" Priority="51"
   Name="List Table 6 Colorful Accent 6"/>
  <w:LsdException Locked="false" Priority="52"
   Name="List Table 7 Colorful Accent 6"/>
 </w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:8.0pt;
	mso-para-margin-left:0in;
	line-height:107%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri",sans-serif;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->]]>
        
    </content>
</entry>

<entry>
    <title>say &quot;Hello World&quot; works with the full setting.</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/pawel_murias/2017/01/say-hello-world-works-with-the-full-setting.html" />
    <id>tag:blogs.perl.org,2017:/users/pawel_murias//1978.7885</id>

    <published>2017-01-11T21:03:22Z</published>
    <updated>2017-01-11T21:05:28Z</updated>

    <summary>Finally got the full setting to compile and load and &apos;say &quot;Hello World&quot;&apos; works. I&apos;ll write a bigger update once everything is cleaned up and commited....</summary>
    <author>
        <name>Paweł Murias</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/pawel_murias/">
        <![CDATA[<p>Finally got the full setting to compile and load and 'say "Hello World"' works.<br />
I'll write a bigger update once everything is cleaned up and commited.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl 5 Porters Mailing List Summary: January 2nd-8th</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/sawyer_x/2017/01/perl-5-porters-mailing-list-summary-january-2nd-8th.html" />
    <id>tag:blogs.perl.org,2017:/users/sawyer_x//87.7883</id>

    <published>2017-01-09T13:01:50Z</published>
    <updated>2017-01-09T13:06:26Z</updated>

    <summary>Hey everyone, Following is the p5p (Perl 5 Porters) mailing list summary for the past week. Enjoy!...</summary>
    <author>
        <name>Sawyer X</name>
        
    </author>
    
        <category term="p5p-summary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/sawyer_x/">
        <![CDATA[<p>Hey everyone,</p>

<p>Following is the p5p (Perl 5 Porters) mailing list summary for the past week.</p>

<p>Enjoy!</p>
]]>
        <![CDATA[<h1>January 2nd-8th</h1>

<h2>News and updates</h2>

<p>Perl 5.22.3-RC5 is now
<a href="http://nntp.perl.org/group/perl.perl5.porters/242017">available</a>!</p>

<p>Perl 5.24.1-RC5 is now
<a href="http://nntp.perl.org/group/perl.perl5.porters/242016">available</a>!</p>

<p>Sawyer X
<a href="http://nntp.perl.org/group/perl.perl5.porters/242156">announced</a>
every deprecation will include a release in which it takes effect and a
list of previous and current deprecations with their release dates,
based on an agreement at the core hackathon.</p>

<h2>Grant reports</h2>

<h2>Issues</h2>

<h3>New issues</h3>

<p>We have a META new ticket to track all the blocking issues for 5.26.0:
<a href="http://rt.perl.org/Ticket/Display.html?id=127688">Perl #127688</a>.</p>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130487">Perl #130487</a>:
Bleadperl v5.25.6-215-gb5048e7b9a breaks
<code>MARKELLIS/Plack-Middleware-Debug-CatalystStash-1.000000.tar.gz</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130495">Perl #130495</a>:
<code>toke.c</code>: Assertion failure.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130496">Perl #130496</a>:
<code>pp_hot.c</code>: Assertion failure.</li>
</ul>

<h3>Resolved issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=5844">Perl #5844</a>:
<code>PERL5OPT</code> messes with build.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=113960">Perl #113960</a>:
MSWin32: <code>perl -de1</code> hang up.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=116176">Perl #116176</a>:
<code>s##$_=//#e</code> fails unless <code>$`</code>, <code>$&amp;</code>, or <code>$'</code> are used.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=127663">Perl #127663</a>:
Safety for <code>-i</code> option.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=128250">Perl #128250</a>:
<code>perlref</code>’s sections are a little muddled.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130068">Perl #130068</a>:
<code>setproctitle()</code> support for DragonFly.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130198">Perl #130198</a>:
<code>chop(@x =~ tr///)</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130487">Perl #130487</a>:
Bleadperl v5.25.6-215-gb5048e7b9a breaks
<code>MARKELLIS/Plack-Middleware-Debug-CatalystStash-1.000000.tar.gz</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130495">Perl #130495</a>:
<code>toke.c</code>: Assertion Failure.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130496">Perl #130496</a>:
<code>pp_hot.c</code>: Assertion failure.</li>
</ul>

<h3>Rejected issue</h3>

<h3>Suggested patches</h3>

<p>Dave Mitchell
<a href="http://nntp.perl.org/group/perl.perl5.porters/242033">provided</a> a
fix for
<a href="http://rt.perl.org/Ticket/Display.html?id=78288">Perl #78288</a> to make
<code>ref</code> in boolean context faster, but suggests only merging this in
5.26.0 due to possible changes in other B modules to accommodate this
change.</p>

<p>Aaron Crane
<a href="http://nntp.perl.org/group/perl.perl5.porters/242042">provided</a> (Re:
Does the range operator still have the Unicode Bug?) a patch to update
the documentation for the range operator Unicode bug fix.</p>

<p>Sergey Aleynikov provided a patch in
<a href="http://rt.perl.org/Ticket/Display.html?id=130504">Perl #130504</a> to fix
a memory leak in <a href="http://metacpan.org/pod/B">B</a>.</p>

<p>Colin Newell
<a href="http://nntp.perl.org/group/perl.perl5.porters/242080">provided</a> a
patch to improve the documentation of <code>newSVpv</code> to recommend using
<code>newSVpvn</code>.</p>

<h2>Discussion</h2>

<p>Karl Williamson
<a href="http://nntp.perl.org/group/perl.perl5.porters/242098">asks</a> whether
<code>qr//xx</code> could already be re-purposed in 5.26, since it has been
deprecated for two versions, starting in 5.22.</p>

<p>Andy Lester's
<a href="http://nntp.perl.org/group/perl.perl5.porters/241121">question</a>
about booleans in the core resulted in a merged
<a href="http://nntp.perl.org/group/perl.perl5.porters/242008">patch</a> by Aaron
Crane.</p>

<p>In <a href="http://rt.perl.org/Ticket/Display.html?id=130523">Perl #130523</a> Ed
Avid suggests checking whether <code>$a</code> or <code>$b</code> are used in their global
role after being defined as lexical variables.</p>
]]>
    </content>
</entry>

<entry>
    <title>A blog site for Sparrowdo project</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/melezhik/2017/01/a-blog-site-for-sparrowdo-project.html" />
    <id>tag:blogs.perl.org,2017:/users/melezhik//1336.7882</id>

    <published>2017-01-07T18:54:53Z</published>
    <updated>2017-01-07T19:23:24Z</updated>

    <summary>Hi ! Sparrowdo is lightweight and very flexible configuration management system written on Perl6. I have started a blog site where going to drop technical notes and others news related sparrowdo project, welcome to https://sparrowdo.wordpress.com !...</summary>
    <author>
        <name>melezhik</name>
        <uri>https://sparrowhub.org</uri>
    </author>
    
    <category term="automation" label="automation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="configurationmanagement" label="configuration management" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="deploy" label="deploy" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl6" label="Perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrow" label="sparrow" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sparrowdo" label="sparrowdo" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/melezhik/">
        <![CDATA[<p>Hi ! Sparrowdo is lightweight and very flexible configuration management system written on Perl6. I have started a blog site where going to drop technical notes and others news related sparrowdo project, welcome to <a href="https://sparrowdo.wordpress.com">https://sparrowdo.wordpress.com</a> !</p>
]]>
        

    </content>
</entry>

<entry>
    <title>The Perl Conference 2017 in DC - CFP</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/awwaiid_brock_wilcox/2017/01/the-perl-conference-2017-in-dc---cfp.html" />
    <id>tag:blogs.perl.org,2017:/users/awwaiid_brock_wilcox//423.7881</id>

    <published>2017-01-07T23:20:55Z</published>
    <updated>2017-01-07T23:26:44Z</updated>

    <summary>I&apos;m super excited to be helping organize this year&apos;s largest north-american perl conference! Myself and the other DC-Baltimore Perl Workshop organizers are pitching in big time, and it&apos;s all starting to come together. Here is our CFP (which we&apos;ll keep...</summary>
    <author>
        <name>awwaiid (Brock Wilcox)</name>
        <uri>http://thelackthereof.org/</uri>
    </author>
    
    <category term="conference" label="conference" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl6" label="perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/awwaiid_brock_wilcox/">
        <![CDATA[<p>I'm super excited to be helping organize this year's largest north-american perl conference! Myself and the other DC-Baltimore Perl Workshop organizers are pitching in big time, and it's all starting to come together. Here is our CFP (which we'll keep posting all over the place) :)</p>

<p><a href="http://www.perlconference.us/tpc-2017-dc/">The Perl Conference 2017 in DC</a> (known in a parallel universe as <a href="http://www.perlconference.us/tpc-2017-dc/">YAPC::NA 2017</a>) will be held at the US Patent and Trademark Office (USPTO), in a historic suburb of DC, from June 18-23!</p>

<p>We are happy to open up submissions for talks and tutorials, you can see all the details and submit at <a href="http://www.perlconference.us/tpc-2017-dc/cfp/">www.perlconference.us/tpc-2017-dc/cfp/</a>. We are looking for talks about anything interesting to Perl Developers of all experience levels -- from specific techniques and libraries to good ways to organize an agile team or Getting Things Done ... related technologies like your favorite data storage engine or how you automated your home. If in doubt -- submit!</p>

<p>Follow our twitter feed <a href="http://twitter.com/perlconferences">@perlconferences</a> for news and updates. If you have any questions or comments about the CFP please email <a href="mailto:talks@perlconference.us">talks@perlconference.us</a> or for more general inquiries <a href="mailto:admin@perlconference.us">admin@perlconference.us</a>.</p>

<p>I hope to see you all there!!</p>]]>
        
    </content>
</entry>

<entry>
    <title>camel-harness version 0.6.0</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ddmitov/2017/01/camel-harness-version-060.html" />
    <id>tag:blogs.perl.org,2017:/users/ddmitov//2847.7880</id>

    <published>2017-01-07T21:12:03Z</published>
    <updated>2017-01-07T21:39:08Z</updated>

    <summary>I am happy to announce the release of version 0.6.0 of camel-harness (former CamelHarness.js) - a small Node.js - Electron - NW.js library for asynchronous handling of Perl 5 scripts. The library is already an NPM package with a clear,...</summary>
    <author>
        <name>ddmitov</name>
        <uri>https://github.com/ddmitov</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ddmitov/">
        <![CDATA[<p>I am happy to announce the release of version 0.6.0 of camel-harness (former CamelHarness.js) - a small Node.js - Electron - NW.js library for asynchronous handling of Perl 5 scripts.</p>

<p>The library is already an <a href="https://www.npmjs.com/package/camel-harness">NPM</a> package with a clear, object-based API. Now camel-harness can start long-running, event-driven Perl scripts and communicate continuously with them writing on their STDIN.</p>

<p>As usual, any comments and suggestions are quite welcome!</p>]]>
        
    </content>
</entry>

<entry>
    <title>Any module to convert &apos;whitish&apos; to &apos;white&apos;?</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/ron_savage/2017/01/any-module-to-convert-whitish-to-white.html" />
    <id>tag:blogs.perl.org,2017:/users/ron_savage//297.7879</id>

    <published>2017-01-06T07:34:11Z</published>
    <updated>2017-01-06T07:35:01Z</updated>

    <summary>A sort of de-inflexion module, so to speak....</summary>
    <author>
        <name>Ron Savage</name>
        <uri>http://savage.net.au/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/ron_savage/">
        <![CDATA[<p>A sort of de-inflexion module, so to speak.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Netdisco moves to Github</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/dean/2017/01/netdisco-moves-to-github.html" />
    <id>tag:blogs.perl.org,2017:/users/dean//558.7878</id>

    <published>2017-01-04T23:27:40Z</published>
    <updated>2017-01-04T23:28:28Z</updated>

    <summary>Quoting Oliver G. Hi all, First, a very happy [Gregorian calendar] new year to you, and thanks for continuing to use our software! Following agreement in the dev team, the new home for Netdisco and SNMP-Info is: https://github.com/netdisco Please update...</summary>
    <author>
        <name>Dean</name>
        <uri>http://bytefoundry.com.au</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/dean/">
        <![CDATA[<p><em>Quoting Oliver G.</em></p>

<p>Hi all,</p>

<p>First, a very happy [Gregorian calendar] new year to you, and thanks for <br />
continuing to use our software!</p>

<p>Following agreement in the dev team, the new home for Netdisco and <br />
SNMP-Info is: https://github.com/netdisco</p>

<p>Please update your git repository URLs as in the example below:</p>

<p>$ git remote -v<br />
origin	ssh://USERNAME@git.code.sf.net/p/snmp-info/code (fetch)<br />
origin	ssh://USERNAME@git.code.sf.net/p/snmp-info/code (push)<br />
$ git remote set-url origin git@github.com:netdisco/snmp-info.git</p>

<p>The full list of from/to URL changes (pay close attention!):</p>

<p>ssh://USERNAME@git.code.sf.net/p/snmp-info/code<br />
git@github.com:netdisco/snmp-info.git</p>

<p>ssh://USERNAME@git.code.sf.net/p/netdisco/mibs<br />
git@github.com:netdisco/netdisco-mibs.git</p>

<p>ssh://USERNAME@git.code.sf.net/p/netdisco/misc<br />
git@github.com:netdisco/netdisco-misc.git</p>

<p>ssh://USERNAME@git.code.sf.net/p/netdisco/code<br />
git@github.com:netdisco/netdisco-legacy.git</p>

<p>ssh://USERNAME@git.code.sf.net/p/netdisco/netdisco-ng<br />
git@github.com:netdisco/netdisco.git</p>

<p>See this page if you get stuck with the URL or authenticating: <br />
https://help.github.com/articles/which-remote-url-should-i-use/</p>

<p>I am going to have a look at migrating the tickets, but it may be lossy <br />
in metadata (ticket requestor) so, we'll see. Going forward we would <br />
like the GitHub issues to be used to report bugs and request features, <br />
although of course these mail lists are always preferred for initial <br />
contact and discussion (and will remain at SourceForge).</p>

<p>Any questions, please let me know on or off list,</p>

<p>regards,<br />
oliver.</p>]]>
        
    </content>
</entry>

<entry>
    <title>I release Object::Simple 3.19 - Add official irc channel #object-simple on irc.perl.org</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/yuki_kimoto/2017/01/i-release-objectsimple-319---add-official-irc-channel-object-simple-on-ircperlorg.html" />
    <id>tag:blogs.perl.org,2017:/users/yuki_kimoto//2020.7877</id>

    <published>2017-01-04T12:35:02Z</published>
    <updated>2017-01-04T12:43:35Z</updated>

    <summary>I release Object::Simple 3.19 http://search.cpan.org/dist/Object-Simple/lib/Object/Simple.pm Changes I removed DEPRECATED class_attr and dual_attr methods and clean up tests. And I create the official IRC channel #object-simple on irc.perl.org News Happy new year! This year I try to talk on irc.perl.org. I...</summary>
    <author>
        <name>Yuki Kimoto</name>
        <uri>http://blogs.perl.org/users/yuki_kimoto/2013/08/author-yuki-kimoto.html</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/yuki_kimoto/">
        <![CDATA[<p>I release Object::Simple 3.19</p>

<p>http://search.cpan.org/dist/Object-Simple/lib/Object/Simple.pm</p>

<h2>Changes</h2>

<p>I removed DEPRECATED class_attr and dual_attr methods and clean up tests.</p>

<p>And I create the official IRC channel #object-simple on irc.perl.org</p>

<h2>News</h2>

<p>Happy new year!</p>

<p>This year I try to talk on irc.perl.org.</p>

<p>I also created some irc channels.</p>

<p>#validator-custom</p>

<p>#gitprep</p>

<p>#dbix-custom</p>]]>
        
    </content>
</entry>

<entry>
    <title>The Perl Toolchain Summit 2017</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/book1/2017/01/perl-toolchain-summit-2017.html" />
    <id>tag:blogs.perl.org,2017:/users/book1//208.7876</id>

    <published>2017-01-04T02:00:00Z</published>
    <updated>2017-01-04T02:10:10Z</updated>

    <summary>It is my pleasure and honor to announce that the Perl Toolchain Summit will be held in Lyon, France from Thursday 11th May 2017 through Sunday 14th May 2017. This is the event previously known as the Perl QA Hackathon,...</summary>
    <author>
        <name>BooK</name>
        <uri>http://www.bruhat.net/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/book1/">
        <![CDATA[<p>It is my pleasure and honor to announce that the Perl Toolchain Summit will be held in Lyon, France from Thursday 11th May 2017 through Sunday 14th May 2017. This is the event previously known as the <a href="http://qa-hackathon.org/">Perl QA Hackathon</a>, where we bring together as many of the key people working on the Perl toolchain as we can.</p>
]]>
        <![CDATA[<p>For this tenth edition, the entire event will be hosted in the hotel Campanile Lyon Part-Dieu, which participants of 2014 Perl QA Hackathon may remember. Attendees will stay at the hotel, and the meeting rooms will be opened for extended hours, so that nothing but sleep stands in the way of the code and discussions.</p>

<p>There's enough room to host 30 or more people. Work is in progress to assemble the list of attendees, create the web site, and gather sponsorship to cover the cost of bringing the lead developers together for four days of intense discussion, design and coding.</p>

<p>The organisation is being handled by a small distributed team of people experienced with this event:</p>

<ul>
<li>Philippe Bruhat (<a href="http://metacpan.org/author/BOOK/">BOOK</a>) is chief organiser, and will handle local matters (venue and accommodation) from Lyon, and be the public face of the event. He was co-organiser of the Perl QA Hackathon in 2011, 2012, and 2014.</li>
<li>Neil Bowers (<a href="http://metacpan.org/author/NEILB/">NEILB</a>) will be taking care of sponsorship and the attendees before the event. He was co-organiser in 2016, and helped with sponsorship for 2015.</li>
<li>Laurent Boivin (<a href="http://metacpan.org/author/ELBEHO/">ELBEHO</a>) will be handling the money from Paris, both inwards (getting it from the sponsors) and outwards (covering expenses and refunding attendees). He was co-organiser in 2012 and 2014.</li>
</ul>

<p>The name was changed from "Perl QA Hackathon" to "Perl Toolchain Summit" to more closely reflect the nature of the event: it's not what most people think of when they hear "hackathon", and the scope is more than just Perl QA. It's still all about Perl (and about all Perls).</p>

<p>We will be blogging more in the near future, so watch this space!</p>
]]>
    </content>
</entry>

<entry>
    <title>Perl Adventure Series</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/jt_smith/2017/01/perl-adventure-series.html" />
    <id>tag:blogs.perl.org,2017:/users/jt_smith//242.7875</id>

    <published>2017-01-03T17:00:04Z</published>
    <updated>2017-01-03T17:00:04Z</updated>

    <summary>Last month I offered a bold proposal to my Perl Mongers group (MadMongers): Let’s create a video game from scratch as a learning exercise!At MadMongers we give a talk every month on some area of Perl technology. However, we almost...</summary>
    <author>
        <name>JT Smith</name>
        <uri>http://www.plainblack.com/</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/jt_smith/">
        <![CDATA[<p>Last month I offered a bold proposal to my Perl Mongers group (<a href="http://madmongers.org" target="_blank">MadMongers</a>): Let’s create a video game from scratch as a learning exercise!</p><p>At MadMongers we give a talk every month on some area of Perl technology. However, we almost never put those lessons into a practical hands-on form. Yet, we have members who are everything from “I have never used Perl.” to “I have used Perl every day for 20 years.” So my proposal was to build something relatively simple so that we could build it in roughly 12 two-hour sessions over the course of a year, but complicated enough to have real decisions we could make about its design. That way we could put to use skills like using git, creating a CPAN distribution, writing tests, using data storage mechanisms, parsing text, creating user interfaces, making web services, etc. </p><p>When I was at <a href="http://gameholecon.com" target="_blank">Gamehole Con</a> last year, <a href="http://www.looneylabs.com" target="_blank">Andy Looney (creator of Fluxx)</a> introduced me to a series of games called <a href="http://www.memento-mori.com/parsely/" target="_blank">Parsely Adventures by Jared Sorensen</a>. If you have ever played old text-based adventure games like Zork, then Parsely adventures are basically that except where one person becomes the parser (the computer), and all the other players enter commands by saying verb noun combinations to move the adventure forward. Well, my idea here is to turn this back around on itself once more and turn one of the Parsley Adventures back into a computer game like Zork! </p><p>I’m calling this the Adventure Series, and <a href="https://www.meetup.com/madmongers/events/236612378/" target="_blank">our first meetup is next week on Tuesday at 7pm (US Central)</a>. There we’ll be setting up the git repository, creating a Dist::Zilla config file, designing the initial mission data structure (most likely in YAML), and writing a few tests. If you can make it, you should join us. This should be a grand adventure in more ways than one. </p><p>Over the course of the series we hope to make a real working game with both a command-line and fully visual web interface. The group will be workshopping a Perl 5 version of it live at each MadMongers meeting. In addition, one of our members will be attempting to simultaneously write the whole thing in Perl 6. All of our code will be open source and published on GitHub, and hopefully also CPAN. </p>

         <p>[From <a href="http://plainblackguy.tumblr.com">my blog</a>.]</p>

    ]]>
        
    </content>
</entry>

<entry>
    <title>Rakudo Star: Past Present and Future</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/steve_mynott/2017/01/rakudo-star-past-present-and-future.html" />
    <id>tag:blogs.perl.org,2017:/users/steve_mynott//2714.7874</id>

    <published>2017-01-02T19:07:31Z</published>
    <updated>2017-01-02T19:09:16Z</updated>

    <summary>At YAPC::EU 2010 in Pisa I received a business card with &quot;Rakudo Star&quot; and the date July 29, 2010 which was the date of the first release -- a week earlier with a countdown to 1200 UTC. I still have...</summary>
    <author>
        <name>Steve Mynott</name>
        
    </author>
    
    <category term="perl6" label="perl6" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/steve_mynott/">
        <![CDATA[<p>At YAPC::EU 2010 in Pisa I received a business card with "Rakudo Star" and the<br />
date July 29, 2010 which was the date of the first release -- a week earlier<br />
with a countdown to 1200 UTC. I still have mine, although it has a tea stain<br />
on it and I refreshed my memory over the holidays by listening again to Patrick<br />
Michaud speaking about the launch of Rakudo Star (R*):</p>

<p><a href="https://www.youtube.com/watch?v=MVb6m345J-Q">https://www.youtube.com/watch?v=MVb6m345J-Q<br />
</a></p>

<p>R* was originally intended as first of a number of distribution releases (as<br />
opposed to a compiler release) -- useable for early adopters but not initially production<br />
Quality. Other names had been considered at the time like Rakudo Beta (rejected as<br />
sounding like "don't use this"!) and amusingly Rakudo Adventure Edition.<br />
Finally it became Rakudo Whatever and Rakudo Star (since * means "whatever"!).</p>

<p>Well over 6 years later and we never did come up with a better name although there<br />
was at least one IRC conversation about it and perhaps "Rakudo Star" is too<br />
well established as a brand at this point anyway. R* is the Rakudo compiler, the main docs, a module installer, some modules and some further docs.</p>

<p>However, one radical change is happening soon and that is a move from panda to<br />
zef as the module installer.  Panda has served us well for many years but zef is<br />
both more featureful and more actively maintained.  Zef can also install Perl<br />
6 modules off CPAN although the CPAN-side support is in its early days.  There<br />
is a zef branch (pull requests welcome!) and a tarball at:</p>

<p><a href="http://pl6anet.org/drop/rakudo-star-2016.12.zef-beta2.tar.gz">http://pl6anet.org/drop/rakudo-star-2016.12.zef-beta2.tar.gz<br />
</a></p>

<p>Panda has been patched to warn that it will be removed and to advise the use of<br />
zef.  Of course  anyone who really wants to use panda can reinstall it using zef<br />
anyway.</p>

<p>The modules inside R* haven't changed much in a while. I am considering adding<br />
DateTime::Format (shown by ecosystem stats to be widely used) and<br />
HTTP::UserAgent (probably the best pure perl6 web client library right now).<br />
Maybe some modules should also be removed (although this tends to be more<br />
controversial!).  I am also wondering about OpenSSL support (if the library is<br />
available).</p>

<p>p6doc needs some more love as a command line utility since most of the focus<br />
has been on the website docs and in fact some of these changes have impacted<br />
adversely on command line use, eg. under Windows cmd.exe "perl 6" is no longer<br />
correctly displayed by p6doc. I wonder if the website generation code should be<br />
decoupled from the pure docs and p6doc command line (since R* has to ship any<br />
new modules used by the website).  p6doc also needs a better and faster search<br />
(using sqlite?). R* also ships some tutorial docs including a PDF generated from perl6intro.com.<br />
We only ship the English one and localisation to other languages could be<br />
useful.</p>

<p>Currently R* is released roughly every three months (unless significant<br />
breakage leads to a bug fix release). Problems tend to happen with the<br />
less widely used systems (Windows and the various BSDs) and also with the<br />
module installers and some modules. R* is useful in spotting these issues<br />
missed by roast. Rakudo itself is still in rapid development.  At some point a less frequently<br />
updated distribution (Star LTS or MTS?) will be needed for Linux distribution<br />
packagers and those using R* in production).  There are also some question<br />
marks over support for different language versions (6.c and 6.d).</p>

<p>Above all what R* (and Rakudo Perl 6 in general) needs is more people spending<br />
more time working on it! JDFI! Hopefully this blog post might<br />
encourage more people to get involved with github pull requests. </p>

<p><a href="https://github.com/rakudo/star">https://github.com/rakudo/star<br />
</a><br />
Feedback, too, in the comments below is actively encouraged.</p>

<p><br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Perl 5 Porters Mailing List Summary: December 26th, 2016 - January 1st, 2017</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/sawyer_x/2017/01/perl-5-porters-mailing-list-summary-december-26th-2016---january-1st-2017.html" />
    <id>tag:blogs.perl.org,2017:/users/sawyer_x//87.7873</id>

    <published>2017-01-02T10:46:42Z</published>
    <updated>2017-01-02T10:47:31Z</updated>

    <summary>Hey everyone and happy new year! Following is the p5p (Perl 5 Porters) mailing list summary for the past week. Enjoy!...</summary>
    <author>
        <name>Sawyer X</name>
        
    </author>
    
        <category term="p5p-summary" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/sawyer_x/">
        <![CDATA[<p>Hey everyone and happy new year!</p>

<p>Following is the p5p (Perl 5 Porters) mailing list summary for the past week.</p>

<p>Enjoy!</p>
]]>
        <![CDATA[<h1>December 26th, 2016 - January 1st, 2017</h1>

<h2>News and updates</h2>

<p>An <a href="http://nntp.perl.org/group/perl.perl5.porters/241994">update</a>
on Perl 5.24.1 and 5.22.3 from Sawyer X.</p>

<h2>Grant reports</h2>

<ul>
<li>Dave Mitchell TPF Grant 2
<a href="http://nntp.perl.org/group/perl.perl5.porters/241897">report</a>
#154, #155.</li>
</ul>

<h2>Issues</h2>

<h3>New issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130410">Perl #130410</a>:
<a href="http://metacpan.org/pod/B::Debug">B::Debug</a> remove from core
distribution post-perl-5.26.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130423">Perl #130423</a>:
<code>DBL_MAX</code> (and the like) not parsed.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130445">Perl #130445</a>:
<code>perl5db.t</code> fails and crashes when trying to install Perl 5.25.9.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130447">Perl #130447</a>:
Win32: Define <code>__USE_MINGW_ANSI_STDIO</code> for all gcc builds.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130467">Perl #130467</a>:
Default perl builds to not include <code>.</code> in @INC
(<code>default_inc_excludes_dot</code>).</li>
</ul>

<h3>Resolved issues</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=114466">Perl #114466</a>:
[PATCH] Clarify purpose of <code>installhtml</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=121727">Perl #121727</a>:
Bleadperl breaks <code>MLEHMANN/AnyEvent-7.07.tar.gz</code> on Windows.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=127810">Perl #127810</a>:
Provide <code>-Dfortify_inc</code> <code>Configure</code> option to remove <code>.</code> from <code>@INC</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=127981">Perl #127981</a>:
[PATCH] Deep recursion warning with <code>%Module::CoreList::version</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=128139">Perl #128139</a>:
Bleadperl v5.25.0-18-g1656665 breaks <code>STBEY/Carp-Clan-6.04.tar.gz</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=128967">Perl #128967</a>:
Inconsistency between doc and code for <code>chown</code> using negative
argument: -1.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129348">Perl #129348</a>:
<a href="http://metacpan.org/pod/File::Find">File::Find</a> issue with link
counts on Bash on Ubuntu on Windows.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=129354">Perl #129354</a>:
Default configuration on <code>x86_64-linux-gnu</code> cannot build binary
extension modules.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130068">Perl #130068</a>:
<code>setproctitle()</code> support for DragonFly.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130188">Perl #130188</a>:
Crash on <code>return</code> from substitution in subroutine.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130199">Perl #130199</a>:
<a href="http://metacpan.org/pod/Text::CSV::Encoded">Text::CSV::Encoded</a> is
incorrectly forced to parse widechar.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130242">Perl #130242</a>:
Undocumented change of UTF-8 delimiters to substitution.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130324">Perl #130324</a>:
Inconsistent behaviour of <code>continue</code> inside <code>given</code> inside <code>while</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130385">Perl #130385</a>:
Bleadperl v5.25.7-12-ge03e82a breaks
<code>TDRUGEON/List-Pairwise-1.03.tar.gz</code>.</li>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130445">Perl #130445</a>:
<code>perl5db.t</code> fails and crashes when trying to install Perl 5.25.9.</li>
</ul>

<h3>Rejected issue</h3>

<ul>
<li><a href="http://rt.perl.org/Ticket/Display.html?id=130046">Perl #130046</a>:
Bleadperl v5.25.6-90-g3619505 breaks
<code>SMUELLER/XS-TCC-0.04.tar.gz</code>.</li>
</ul>

<h3>Suggested patches</h3>

<h2>Discussion</h2>

<p>Dave Mitchell
<a href="http://nntp.perl.org/group/perl.perl5.porters/241891">shared</a>
his thoughts on (and initial implementation of) processing 8 bytes at a
time in the regex engine. This would improve the speed of regular
expression operations.</p>

<p>A discussion
<a href="http://nntp.perl.org/group/perl.perl5.porters/241836">started</a>
regarding stack ref counting, which is a recurring issue.</p>
]]>
    </content>
</entry>

<entry>
    <title>CPAN Pull Request Challenge 2017</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/jonasbn/2017/01/cpan-pull-request-challenge-2017.html" />
    <id>tag:blogs.perl.org,2017:/users/jonasbn//2462.7872</id>

    <published>2017-01-01T22:32:31Z</published>
    <updated>2017-01-01T23:54:34Z</updated>

    <summary>I just received a mail from Neil Bowers asking if I would consider having my CPAN distributions be a part of the 2017 CPAN Pull Request Challenge. My undelayed mental response: Well of course... I participated in the 2016 Hacktoberfest,...</summary>
    <author>
        <name>jonasbn</name>
        
    </author>
    
        <category term="cpan-prc-2017" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="prcchallenge2017prcpanprcchallenge2017pullrequest" label="prc challenge 2017 pr cpan-prc-challenge-2017 pull-request" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/jonasbn/">
        <![CDATA[<p>I just received a mail from Neil Bowers asking if I would consider having my CPAN distributions be a part of the 2017 <strong>CPAN Pull Request Challenge</strong>.</p>

<p>My undelayed mental response: <em>Well of course...</em></p>

<p>I participated in the 2016 <strong>Hacktoberfest</strong>, I did not contribute much, but I participated and I would have loved to contribute more. These sort of "events" are good, IMHO they bring out the best in open source and they demonstrate the essence of the open source community.
In addition they help tie a community together, so when you are like me; a maintainer of CPAN distributions with very little time, every patch and every PR is most welcome.</p>

<p>A CPAN Pull Request Challenge gives you exactly that.</p>

<p>The <strong>CPAN Pull Request Challenge 2017</strong> is soon to kick off, which mean YOU have a chance to benefit from this incredible initiative.</p>

<p>If you have received a mail from Neil respond and be take into consideration for possible PR coming your way or you can tag your issues on Github with the label:</p>

<p><code>cpan-prc-2017</code></p>

<p>In order to add the label you have to do the following (This can possibly also be accomplished via the Github API, but that is beyond this blog post):</p>

<ol>
<li>Go to you Github repository issues page</li>
<li>Click "Labels"</li>
<li>Click "New label"</li>
<li>Add the label "cpan-prc-2017"</li>
</ol>

<p>This mean that the label will be present for both issues and PRs.</p>

<p>Please note that labelling issues will not make them go away automagically, but it will be easier for participants to find issues suitable for the challenge, and also lets participants know that you're open to a PR for that issue. Since they can be easily identified using a primitive <a href="https://github.com/search?q=label%3Acpan-prc-2017&amp;ref=searchresults&amp;utf8=%E2%9C%93">search</a>:</p>

<p>https://github.com/search?q=label%3Acpan-prc-2017&amp;ref=searchresults&amp;utf8=%E2%9C%93</p>

<p>Ask not what you can do for the CPAN Pull Request Challenge 2017, but what CPAN-PRC-2017 can do for you.</p>

<p>This blog post has primarily been on getting help with your distributions and issues from the challenge - there is of course also the option of participating as a contributor of PRs.</p>

<p>Please read more about <a href="http://cpan-prc.org/">CPAN Pull Request Challenge</a> at: <a href="http://cpan-prc.org/">http://cpan-prc.org/</a></p>

<p>Have fun - looking forward to your PRs,</p>

<p>jonasbn</p>

<p>Cross-posted from <a href="https://lastmover.wordpress.com/2017/01/01/cpan-pull-request-challenge-2017/">last-mover</a></p>
]]>
        

    </content>
</entry>

<entry>
    <title>Yak Shaving: XML::Writer edition</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/peter_sergeant/2016/12/yak-shaving-xmlwriter-edition.html" />
    <id>tag:blogs.perl.org,2016:/users/peter_sergeant//591.7871</id>

    <published>2016-12-30T17:58:22Z</published>
    <updated>2016-12-30T18:04:50Z</updated>

    <summary>I am messing around trying to fix the QIF files that Lloyds TSB CC statements are presented as, and needed to write XML. XML::Writer seems like a reasonable solution, but I’m not OK with writing a static header by using...</summary>
    <author>
        <name>Peter Sergeant</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/peter_sergeant/">
        <![CDATA[<p>I am messing around trying to fix the QIF files that Lloyds TSB CC statements are presented as, and needed to write XML.</p>

<p><tt>XML::Writer</tt> seems like a reasonable solution, but I’m not OK with writing a static header by using 300 calls to $writer->startTag(‘blah’).</p>

<p>This seems a good job for the computer; specifically for a SAX parser which will happily parse non-balanced XML. Anyway, the result is:</p>

<pre><code>my $writer = XML::Writer::Lazy-&gt;new( OUTPUT =&gt; 'self');
my $title  = "My Title!";

$writer-&gt;lazily(&lt;&lt;"XML");
    &lt;html&gt;
        &lt;head&gt;
            &lt;title&gt;$title&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;p&gt;Pipe in literal XML&lt;/p&gt;
XML

$writer-&gt;startTag( "p", "class" =&gt; "simple" );
$writer-&gt;characters("Alongside the usual interface");
$writer-&gt;characters("123456789");
$writer-&gt;lazily("&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;");
</code></pre>

<p><a href="https://metacpan.org/pod/XML::Writer::Lazy">https://metacpan.org/pod/XML::Writer::Lazy</a></p>

<p>Which is considerably lazier, and allows you to intersperse actual XML::Writer commands with chunks of XML string and have it do largely the right thing.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>C::Blocks Advent Day 13</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-13.html" />
    <id>tag:blogs.perl.org,2016:/users/david_mertens//664.7870</id>

    <published>2016-12-28T08:50:11Z</published>
    <updated>2016-12-28T09:32:55Z</updated>

    <summary>This is the C::Blocks Advent Calendar, in which I release a new treat each day about the C::Blocks library. At the time of writing, we are actually in the season of Christmas, not Advent. I hope you&apos;ll forgive these late...</summary>
    <author>
        <name>David Mertens</name>
        <uri>https://github.com/run4flat/</uri>
    </author>
    
    <category term="advent" label="Advent" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cblocks" label="C::Blocks" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/david_mertens/">
        <![CDATA[<p>This is the <a href="https://metacpan.org/pod/C::Blocks">C::Blocks</a> Advent Calendar, in which I release a new treat each day about the <a href="https://metacpan.org/pod/C::Blocks">C::Blocks</a> library. At the time of writing, we are actually in the season of Christmas, not Advent. I hope you'll forgive these late posts. :-)</p>

<p><a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-12.html">Yesterday</a> I used <a href="https://metacpan.org/pod/C::Blocks">C::Blocks</a> to play around with Perl's C API and mess with keywords. Today I will focus on a couple of neat C tricks that can help clean up the C-end of your library API.</p>
]]>
        <![CDATA[<p>One of the chief goals of <a href="https://metacpan.org/pod/C::Blocks">C::Blocks</a> is to make it easy to share C code with others. It's one thing to share code, but quite another to share useful code, code with an API that is easy to use and easy to read. Part of the reason this is difficult is because good API design is inherently difficult, but part of the reason is that C only provides one way to pass arguments to functions. Fortunately, there are two preprocessor tricks we can use to alleviate this problem.</p>

<h2>Argument Hiding</h2>

<p>The first trick is quite common in Perl's own C API: hiding arguments. Consider the simple <code>sv_setiv</code>, which sets a scalar to the given integer value. For example:</p>

<pre><code>my $var;
cblock {
    sv_setiv($var, 5);
}
print "\$var = $var\n";  # prints '$var = 5'
</code></pre>

<p>Notice that I use this like a function with two arguments, but it's actually a macro that wraps the real function called <code>Perl_sv_setiv</code>:</p>

<pre><code>#define sv_setiv(a, b) Perl_sv_setiv(aTHX_ a, b)
</code></pre>

<p>This makes for a good example for two reasons. First, if you are working with a Perl compiled with <code>MULTIPLICITY</code> (the case if your Perl is threaded), then <code>aTHX</code> is the current Perl interpreter. You are always going to call this function with the current Perl interpreter, so <code>sv_setiv</code> can save us some keystrokes by always adding that as our first argument to the real function. Second, if your Perl is not compiled with <code>MULTIPLICITY</code>, then the Perl interpreter is maintained as a global variable, in which case <code>aTHX</code> is a macro that gets replaced with spaces! In other words, the actual signature for <code>Perl_sv_setiv</code> depends on how you compiled Perl! The complete details for how this works are <a href="http://perldoc.perl.org/perlguts.html#Background-and-PERL_IMPLICIT_CONTEXT">discussed in perlguts</a>, but you can use <code>sv_setiv</code> in blissful ignorance of these details because the macro wrapper takes care of everything for us. This is good API design.</p>

<p>A simpler but arguably more useful example would be a situation where you want to give useful feedback when your function croaks. In that case you can write a function that takes the current line number and file name, in addition to the rest of its arguments. The macro wrapper would supply those automatically, like so:</p>

<pre><code>use strict;
use warnings;
use C::Blocks;
use C::Blocks::PerlAPI;

clex {
    #define munge_input(input) munge_input_(__LINE__, __FILE__, input)

    int munge_input_ (int line, char * file, char * input) {
        /* make sure input is non-null */
        if (input == 0) {
            croak("In %s line %d, munge_input called with null input\n",
                file, line);
        }
        printf("munge_input not yet implemented...\n");
    }
}

cblock {
    munge_input("to be munged");
    munge_input(0);
}
</code></pre>

<p>When I run that, I get this output:</p>

<pre><code>$ perl test.pl
munge_input not yet implemented...
In test.pl line 21, munge_input called with null input
</code></pre>

<p>Just like Perl's <code>Carp</code> provides useful <code>die</code>ing behavior, you can provide useful exceptions by wrapping function calls like this. If you have many public functions and a handful of private ones, your public functions can call the private functions explicitly, sending the values of <code>line</code> and <code>file</code> it received when it was called. This way, somebody using your C API will get useful error reporting regardless of how you internally implement your code.</p>

<h2>Named Arguments</h2>

<p>The Tiny C Compiler is a nearly compliant C99 compiler, which means we can use macro tricks to emulate named arguments. This uses compound literals and variadic macros, both C99 features. The Tiny C Compiler's compound literal handling wasn't quite right for this task until it was fixed very recently (i.e. within the last month). The update is currently only available through a developer's release of <code>Alien::TinyCCx</code>, but should be in the next point release. Take this as a sign of things to come.</p>

<p>First, I'd like to show you how this works. Suppose I wanted to have a GUI command that draws a label somewhere on a canvas. It could have many optional arguments, like padding width, border width, border color, etc. Using a single struct, macro, and function declaration, I can call my function like this:</p>

<pre><code>draw_label(canvas, 1, 5, "X marks the spot");
draw_label(canvas, .y = 5, .x = 1,
    .label = "X marks the spot");
draw_label(canvas, 1, 5,
    .label = "X marks the spot", .x = 3);
</code></pre>

<p>This almost looks like Perl's key/value pair calling convention, except that the keys are prefaced with a period. So, how does this work?</p>

<p>The original idea breaks a normal function declaration into three pieces. First, define a preprocessor macro with the actual name that you are going to use in your public API. For example:</p>

<pre><code>#define draw_label(c, ...) draw_label_(c, (struct draw_label_args_){ __VA_ARGS__ })
</code></pre>

<p>Notice that this is a variadic macro, and it simply dumps the contents of the <code>...</code> into a so-called compound literal declaration. Before we can understand that, we need to look at the struct layout:</p>

<pre><code>struct draw_label_args_ {
    const float x;
    const float y;
    const char * label;
};
</code></pre>

<p>Now look carefully at the different ways we called the function. Judging from those examples, the following would all be valid ways of initializing a <code>draw_label_args_</code> struct:</p>

<pre><code>struct draw_label_args_ my_args
    = { 1, 5, "X marks the spot" };
struct draw_label_args_ my_args
    = { .y = 5, .x = 1, .label = "X marks the spot" };
struct draw_label_args_ my_args
    = { 1, 5, .label = "X marks the spot", .x = 3 };
</code></pre>

<p>The first assignment is a classic struct assignment, the sort of thing you'd see in C89 code. (In C99, any field that is not mentioned is initialized to zero.) In the second case, all labels are mentioned explicitly, and can be out of order! In the third case, we see that we mix sequential positional values and named fields. In fact, named fields override previous identical named fields, or even positional values!</p>

<p>What sort of function do we need? We need a function that accepts a canvas as its first argument and the struct as its second:</p>

<pre><code>static void draw_label_(Canvas * c, struct draw_label_args_ args) {
    if (args.label == 0) args.label = "(none)";
    // default x,y of 0 is OK
    ...
}
</code></pre>

<p>Within the body of the function, the label is accessed as <code>args.label</code>. Likewise the x- and y-positions are accessible via <code>args.x</code> and <code>args.y</code>. If any of those were not specified, they will default to zero, a situation that is fine and suitable for x and y, but not for the label. This can be easily detected and fixed for the label.</p>

<h2>Named Arguments with Nonzero Defaults</h2>

<p>We can take the previous example one step further. The default value for any uninitialized member is zero. A position of zero is valid for x and y, but what if we want to explicitly indicate an unspecified position? Or, what if we want to provide a different default?</p>

<p>We can specify defaults that are different from zero, but there are multiple ways to do it, with varying trade-offs. The key is to remember that later statements in a struct initialization override previous ones. So, one simple approach for specifying nonzero defaults is to revise the macro to something more like this:</p>

<pre><code>#define draw_label(c, ...) \
    draw_label_(c, \
    (struct draw_label_args_){ \
        .x = 100, \
        .y = 100, \
        __VA_ARGS__ \
    })
</code></pre>

<p>(Note that I split the macro definition across multiple lines by ending the line with a backslash.) When this is later used by somebody calling the function, they can override the defaults:</p>

<pre><code>draw_label(canvas, .x = 50);
</code></pre>

<p>Unfortunately, the naive implementation here breaks positional arguments, i.e. the following would no longer work:</p>

<pre><code>draw_label(canvas, 1, 5, "X marks the spot");
</code></pre>

<p>After naming a field, you can continue to list values in succession. Since we ended our defaults at <code>.y</code>, the next valid unnamed field would be the label, not <code>x</code>. To fix this properly, we need to add an additional item to the beginning of our arg struct, something that the user will not need to override. In this case, by moving the canvas into the arg struct, we can get the behavior we want:</p>

<pre><code>struct draw_label_args_ {
    Canvas * c_,
    const float x;
    const float y;
    const char * label;
};
#define draw_label(c, ...) \
    draw_label_(c, \
    (struct draw_label_args_){ \
        .x = 100, \
        .y = 100, \
        .label = "(none)", \
        .c_ = c, \
        __VA_ARGS__ \
    })
static void draw_label_(struct draw_label_args_ args) {
    // canvas is args.c_...
}
</code></pre>

<p>Perhaps more interestingly, we can add a couple of extra members to our argument struct for the calling line and file. This would let us produce an error message naming the calling context. I've mostly been illustrating with snippets of code, so here I'll provide a full working example with C::Blocks:</p>

<pre><code>use strict;
use warnings;
use C::Blocks;
use C::Blocks::PerlAPI;

clex {
    #define salutations(...) salutations_( \
        (struct salutations_args_){ \
        .message = "Hello", \
        .calling_line = __LINE__, \
        .calling_file = __FILE__, \
        __VA_ARGS__ })

    struct salutations_args_
    {
        int calling_line;
        char * calling_file;
        char * name;
        char * message;
        int is_exclamation;
    };

    void salutations_(struct salutations_args_ args)
    {
        /* Croak if no name given.  */
        if (!args.name) {
            croak("salutations called without specifying a name at %s:%d\n",
                args.calling_file, args.calling_line);
        }
        printf("%s %s%s\n", args.message, args.name,
            args.is_exclamation ? "!" : ".");
    }
}

cblock {
    salutations("David");
    salutations("David", .is_exclamation = 1);
    salutations("David", "Merry Christmas");
    salutations("David", "Merry Christmas", 1);
    salutations("David", "Merry Christmas", .is_exclamation = 1);
    salutations(.message = "Merry Christmas",
        .name = "David");
    // runtime error:
    salutations(.message = "Merry Christmas");
}
</code></pre>

<p>When run, I get this output:</p>

<pre><code>$ perl test.pl
Hello David.
Hello David!
Merry Christmas David.
Merry Christmas David!
Merry Christmas David!
Merry Christmas David.
salutations called without specifying a name at test.pl:44
</code></pre>

<p>When I began learning about the distinctions between C and C++, I remember that named arguments and argument defaults were two big niceties in C++ that were missing in C. I did not discover this trick until much later. On the one hand, you need to write a lot of boiler-plate for named arguments with defaults in C. On the other hand, the code shown in the <code>cblock</code> looks really good. In some respects it is even more flexible than key/value pairs in Perl functions because you are not required to specify keys for your arguments if you don't want to. And of course, we're not talking about strict C: we're talking about C::Blocks, which is capable of automating this kind of code with <a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-6.html">interpolation blocks or source filters</a>.</p>

<h2>Caveats</h2>

<p>Before wrapping things up I want to point out two important aspects of these sorts of tricks. Using macros to reduce the argument count is an old and reliable technique. Named arguments and defaults is much newer. I am not sure if these are universally implemented by modern compilers, specifically Microsoft's Visual C. An eventual goal of C::Blocks is to provide an optimizing compiler back-end, in addition to the TCC back-end. If that ever becomes a reality, then named arguments may be a tripping point. (It sorta looks like MS may have gotten compound literals working, but I haven't found a definitive answer on the subject.) But that is probably some ways off, and for now I'd say if you like them, you should use them!</p>

<p>Also, I am new to these sorts of function machinations. I think they're great, but please do not take my code as examples of best practice. They are merely my musings, with the hope that folks will find them illuminating and exciting.</p>

<h2>Conclusion</h2>

<p>Today I showed how to use macros in <a href="https://metacpan.org/pod/C::Blocks">C::Blocks</a> to create C APIs that are versatile and easy to use. Named arguments and defaults rely on newly added behavior in tcc, but it should roll out onto the CPAN soon.</p>

<p>C::Blocks Advent Day 
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-1.html">1</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-2.html">2</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-3.html">3</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-4.html">4</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-5.html">5</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-6.html">6</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-7.html">7</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-8.html">8</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-9.html">9</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-10.html">10</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-11.html">11</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-12.html">12</a>
<a href="http://blogs.perl.org/users/david_mertens/2016/12/cblocks-advent-day-13.html">13</a></p>
]]>
    </content>
</entry>

</feed>
