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

<entry>
    <title>Ab(Using) the MetaCPAN API for Fun and Profit v2013</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2013/06/abusing-the-metacpan-api-for-fun-and-profit-v2013.html" />
    <id>tag:blogs.perl.org,2013:/users/olaf_alders//280.4741</id>

    <published>2013-06-03T18:00:39Z</published>
    <updated>2013-06-03T18:06:45Z</updated>

    <summary>I&apos;ll be speaking about using (and abusing) the MetaCPAN API on day 2 of YAPC::NA. If you think you might be attending (or even if you&apos;re not), I thought I&apos;d post some links to some helpful info. No, you don&apos;t...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="icpan" label="icpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yapc" label="yapc" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>I'll be speaking about <a href="http://www.yapcna.org/yn2013/talk/4663">using (and abusing) the MetaCPAN API on day 2 of YAPC::NA</a>.  If you think you might be attending (or even if you're not), I thought I'd post some links to some helpful info.  No, you don't need to do any prep for this talk, but for those who are interested, this is just some background info that will help you get your head around MetaCPAN.</p>

<p>This talk will touch on and expand on some of the points I discussed last year, so you could have a quick look at <a href="http://www.slideshare.net/oalders/abusing-the-metacpan-api-for-fun-and-profit">last year's slides</a>.  I've also put together <a href="https://github.com/CPAN-API/metacpan-examples">some sample code</a> for tomorrow's talk.  If you use <a href="https://metacpan.org/module/Carton">Carton</a>, you can follow the instructions in the top-level README to get started in just a couple of minutes.</p>

<p>On a barely related note,<a href="https://itunes.apple.com/us/app/icpan/id377340561?mt=8"> iCPAN 2.1.0 is now in the app store</a>.  I used it on the flight down to prepare for my talk.  Seemed to work well for my purposes.  :)</p>]]>
        
    </content>
</entry>

<entry>
    <title>Sifting Through the CPAN</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2013/03/sifting-through-the-cpan.html" />
    <id>tag:blogs.perl.org,2013:/users/olaf_alders//280.4404</id>

    <published>2013-03-09T03:32:01Z</published>
    <updated>2013-03-09T04:15:38Z</updated>

    <summary>Some interesting stuff has been said today on The Four Major Problems with CPAN, Don&apos;t release experiments to CPAN and CPAN is for experimentation and I hope that never changes. If you haven&apos;t read these posts yet, I encourage you...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="modules" label="modules" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tagging" label="tagging" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>Some interesting stuff has been said today on <a href="http://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html">The Four Major Problems with CPAN</a>, <a href="http://blogs.perl.org/users/neilb/2013/03/dont-release-experiments-to-cpan.html">Don't release experiments to CPAN</a> and <a href="http://www.dagolden.com/index.php/1946/cpan-is-for-experimentation-and-i-hope-that-never-changes/">CPAN is for experimentation and I hope that never changes</a>.</p>

<p>If you haven't read these posts yet, I encourage you to do so.  They've all got interesting things to say.</p>

<p>(As an aside, let me say that I think PAUSE authors could probably participate more on <a href="http://prepan.org/">PrePAN</a>.  I've posted a few things there and found it quite helpful.  Even if your module is already on CPAN and you just want feedback on it, post something on PrePAN.  I've found the discussion to be of a good quality and actually quite positive.)</p>

<p>One of the proposals which was being discussed was not (immediately) uploading experiments to CPAN. Now, even if we were to propose people uploading less modules (which, to be clear, I'm <strong>not</strong> proposing), we still have many years worth of good, less good and kind of crazy code to sift through.  What this tells me is not that CPAN is full of junk, deprecated modules and weird stuff, but that we need better search tools to deal with the code we already have.  The web on the whole is full of stuff of questionable quality, but modern search engines generally do a decent job of cutting through the noise.  We should also be able to cut through the noise. This is one of the goals of MetaCPAN, but we haven't quite gotten there.</p>

<p>Right from the beginning, we've wanted to implement some system of tagging, which would allow interested parties to impose their own views on what a module is or is not.  Imagine tags like "deprecated", "author unresponsive", "author deceased", "best practices", "needs love", "looking for maint/co-maint".  The list goes on.  You just need to use your imagination.  These sorts of tags could a) help improve search results and b) help humans sift through the results when they do get them.  There's a certain amount of heuristics which can be applied in the parsing and searching phase, but really I think we just need humans to have more influence on the outcome of results and tags are a great way to do that.</p>

<p>Now, where is this tagging of which I speak?  Well, for now it's just a glimmer in our eyes.  My hope was that last year we could round up a GSoC student to take on the tagging project, but with TPF not being one of the accepted organizations in 2012, it didn't happen for us.  There is still hope for GSoC 2013, which has not yet begun accepting applications.  There is also hope that outside the scope of a program like GSoC someone will step forward and "just do it".  Along those lines, I actually think this would be a good candidate for TPF grant.  I've even considered applying for the grant myself, but I'd much rather if it were done by someone with a schedule that's a little more flexible than mine currently is.  </p>

<p>We don't need to be stuck with trying to figure out which module is best for which task. That's a problem which we, to a great degree, have the ability to solve.  It's a layer on top of the CPAN that we can provide.  We just need to do it.</p>]]>
        
    </content>
</entry>

<entry>
    <title>MetaCPAN is Moving Today (Dec 31, 2012)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/12/metacpan-is-moving-today-dec-31-2012.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.4164</id>

    <published>2012-12-31T06:08:56Z</published>
    <updated>2012-12-31T06:27:41Z</updated>

    <summary>This is just a quick note to let everyone know that MetaCPAN is moving to a new hosting sponsor today (Dec 31st). Our old hosting relationship with speedchilli.com has unfortunately come to an end. We&apos;ve been quite grateful for and...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>This is just a quick note to let everyone know that MetaCPAN is moving to a new hosting sponsor today (Dec 31st).  Our old hosting relationship with <a href="http://speedchilli.com/">speedchilli.com</a> has unfortunately come to an end. We've been quite grateful for and more than satisfied with their sponsorship over the last 1.5 years or so.  Having the hardware and bandwidth which speedchilli freely made available to us was instrumental in the early days.  (Initially everything was running off a tiny instance in the Rackspace cloud. It wasn't much, but it was all we could afford after passing the hat around).  Having speedchill sponsor us allowed everyone who contributes to MetaCPAN create something truly special.</p>

<p>We'll have an announcement in the near future, to formally thank our excellent, new hosting sponsor.  At this point I just want to say that there is a lot of work going on behind the scenes to move everything over to the new machines.  The bulk of the actual move has been taken on by <a href="https://metacpan.org/author/PERLER">Moritz Onken</a>, who was able to jump in over the holidays to just get it done. I should also thank <a href="https://metacpan.org/author/LLAP">Leo Lapworth</a> for moving our deployment to Puppet and for nagging everyone to make sure it was working. This was done well before we knew that we'd need a new hosting sponsor, but it sure makes re-deploying a lot easier.  I'd also like to thank <a href="https://metacpan.org/author/DRTECH">Clinton Gormley</a>, <a href="https://metacpan.org/author/FLORA">Florian Ragwitz</a> and <a href="https://metacpan.org/author/RWSTAUNER">Randy Stauner</a> for their contributions over the last little while.  There are a lot of people working in the background to keep MetaCPAN running smoothly.  I certainly haven't mentioned all of them here, but we're grateful for all of their efforts.</p>

<p>Part of the new deployment requires a full re-index of both CPAN and BackPAN, so there may be some dists which have not been indexed at the time when we switch over the DNS.  So, please be patient if some search results aren't returning exactly what you want.  That will be fixed as the indexing completes.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Have you added your Perl project to 24pullrequests.com?</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/12/have-you-added-your-perl-project-to-24pullrequestscom.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.4088</id>

    <published>2012-12-01T04:02:41Z</published>
    <updated>2012-12-01T04:14:41Z</updated>

    <summary>24pullrequests.com takes the spirit of the Advent coding calendar and puts a new spin on it. Try to send one pull request per day for the next 24 days and 24pullrequests.com will help you track your progress. At the time...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="adventcalendar" label="advent calendar" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="github" label="github" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pullrequests" label="pull requests" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p><a href="http://24pullrequests.com">24pullrequests.com</a> takes the spirit of the Advent coding calendar and puts a new spin on it.  Try to send one pull request per day for the next 24 days and 24pullrequests.com will help you track your progress.  At the time of writing, 1,224 devs have already signed up.</p>

<p><a href="http://24pullrequests.com/projects">Some Perl projects</a> are already represented, but there's still room for more.  It would be good to see some more Perl projects on the list for participating Perl devs who are looking for something to contribute to.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Introducing HTTP::CookieMonster</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/09/introducing-httpcookiemonster.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.3852</id>

    <published>2012-09-19T16:55:47Z</published>
    <updated>2012-09-20T04:27:57Z</updated>

    <summary>If you&apos;ve ever had the pleasure of poking around in your WWW::Mechanize or LWP::UserAgent cookie_jar, you&apos;ll know it&apos;s not an entirely painless process. It&apos;s certainly not impossible, but it feels a bit like jumping through hoops. The cookie_jar functionality in...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cookies" label="cookies" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="httpcookiemonster" label="http::cookiemonster" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lwpuseragent" label="lwp::useragent" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="oalders" label="oalders" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwwmechanize" label="www::mechanize" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>If you've ever had the pleasure of poking around in your <a href="https://metacpan.org/module/WWW::Mechanize">WWW::Mechanize</a> or <a href="https://metacpan.org/module/LWP::UserAgent">LWP::UserAgent</a> cookie_jar, you'll know it's not an entirely painless process.  It's certainly not impossible, but it feels a bit like jumping through hoops. The cookie_jar functionality in LWP::UserAgent and the modules which inherit from it is provided by <a href="https://metacpan.org/module/HTTP::Cookies">HTTP::Cookies</a>. Before I go any further, I'd like to thanks <a href="https://metacpan.org/author/GAAS">Gisle Aas</a> for HTTP::Cookies, which is a very important bit of code.  This isn't a complaint about HTTP::Cookies, but rather an attempt to make it even more accessible.</p>

<p>Before we do anything with cookies, let's make one request to ensure we have some cookies in our cookie_jar.</p>

<pre>
    use WWW::Mechanize;
    my $mech = WWW::Mechanize->new;
    $mech->get('http://www.nytimes.com');
</pre>

<p>nytimes.com sets a couple of cookies by default and they are now in your cookie_jar. You can now get a list of your cookies (as objects) with just a "use" statement and 1 additional line of code.</p>

<pre>
    use HTTP::CookieMonster qw( cookies );
    my @cookies = cookies( $mech->cookie_jar );
</pre>

<p>Now you can iterate over your cookies.  Available methods are documented at <a href="https://metacpan.org/module/HTTP::CookieMonster::Cookie">https://metacpan.org/module/HTTP::CookieMonster::Cookie</a>.</p>

<pre>
    foreach my $cookie ( @cookies ) {
        print $cookie->key, $cookie->val, $cookie->expires, "\n";
    }
</pre>

<p>Maybe you just want to get one particular cookie without having to loop over an array. The NYT website serves an "RMID" cookie.</p>

<pre>
    my $cookie = cookies( $mech->cookie_jar, 'RMID' );
</pre>

<p>There's one caveat here.  It's quite possible that you could have multiple cookies in your cookie jar with the same name, since there's nothing to stop many different domains (or subdomains) from serving up cookies with the same name.  If you're not sure, get an array of cookies instead.</p>

<pre>
    my @cookies = cookies( $mech->cookie_jar, 'RMID' );
</pre>

<p>If you get more than one cookie, you'll need to figure out which one you really want.  Calling cookies($cookie_jar, 'cookie_name') in scalar context will return the first matching cookie.  Calling it in list context will return all cookies in the order in which HTTP::Cookies provides them.</p>

<p>Now, let's say you want to mangle your cookies.  That's easy to do via the OO interface.</p>

<pre>
    use HTTP::CookieMonster;
    my $monster = HTTP::CookieMonster->new( $mech->cookie_jar );
    my $cookie = $monster->get_cookie('cookie_name');
    print $cookie->val;

<p>    $cookie->val('random stuff');<br />
    $monster->set_cookie( $cookie );</p>

<p>    # now fetch a page using the mangled cookie<br />
    $mech->get( $url );<br />
</pre></p>

<p>Now that we can easily read our cookies, we can also easily test them:</p>

<pre>
    use Test::Most;
    ok( $cookie->secure, "this is a secure cookie" );
</pre>

<p>It's also simple to add a new cookie to the jar:</p>

<pre>
    use HTTP::CookieMonster::Cookie;
    my $cookie = HTTP::CookieMonster::Cookie->new
       key       => 'cookie-name',
       val       => 'cookie-val',
       path      => '/',
       domain    => '.somedomain.org',
       path_spec => 1,
       secure    => 0,
       expires   => 1376081877
    );

<p>    $monster->set_cookie( $cookie );<br />
    $mech->get( $url );<br />
</pre></p>

<p>HTTP::CookieMonster will re-examine your cookie_jar every time you call it.  This means that it can keep up with changes to the cookie_jar which happen outside of your code.  Just think of it as a simple wrapper around HTTP::Cookies. The interface is not yet set in stone, but I think it's quite useable already.  Feedback is most welcome.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Using Plack::Middleware::CSRFBlock and jQuery to deal with Cross Site Request Forgery</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/07/using-plackmiddlewarecsrfblock-and-jquery-to-deal-with-cross-site-request-forgery.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.3586</id>

    <published>2012-07-19T20:00:41Z</published>
    <updated>2012-07-19T20:11:20Z</updated>

    <summary>At $work, our flagship application was recently audited for potential security issues. One of the items which raised a red flag was the fact that we weren&apos;t dealing with the threat of CSRF (Cross Site Request Forgery). The solution which...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="crosssiterequestforgery" label="cross site request forgery" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="csrf" label="csrf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="get" label="GET" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jquery" label="jquery" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plack" label="plack" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plackmiddleware" label="plack::middleware" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="post" label="POST" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>At $work, our flagship application was recently audited for potential security issues.  One of the items which raised a red flag was the fact that we weren't dealing with the threat of CSRF <a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery">(Cross Site Request Forgery)</a>.  The solution which we decided to implement was to add a CSRF token to all POST requests.  This token should only be known to the app and the end user.  Passing it along with a POST request gives some measure of assurance that a POST by the user is intentional and so can help to reduce the risk of CSRF.</p>

<p>On the Perl side of things, it was actually easy to implement.  Since the app is deployed under Plack, CSRF tokens could easily be implemented with <a href="https://metacpan.org/module/Plack::Middleware::CSRFBlock">Plack::Middleware::CSRFBlock</a>, albeit <a href="https://github.com/oalders/Plack-Middleware-CSRFBlock/commits/develop">a slightly modified version</a> (which I still need to contact the author about). This module parses outgoing HTML which is produced by your app.  If it finds a form which can POST, it creates a hidden form input field inside the form and inserts a CSRF token into it.</p>

<p>So, that takes care of your traditional forms in HTML, but it doesn't detect your fancy jQuery Ajaxy goodness.  It turns out, that's fairly easy to handle in one place as well:
</p>

<pre>
        var token = 'some_random_secret';
        // some defaults for all ajax calls
        $.ajaxSetup({
            cache: false,
            data:  {'csrf_token': token}
        });
</pre>

<p>And with that, we re-submitted ourselves to the <a href="http://portswigger.net/burp/">Burp Suite</a> scanning software, hoping for a clean bill of health.  Again, it was not meant to be.  This time, the Burp Suite pointed out that the CSRF token is not very secret when it is attached to the params of a GET request.  It can show up in browser history, web server logs, etc.  That is sub-optimal to be sure.  As far as fixing this goes, I was still looking for a solution to fix this in one place.  The app is big enough on JS that I wasn't about to scour for every GET and fix this manually.  It turns out that jQuery has a solution for this as well, courtesy of <a href="http://stackoverflow.com/questions/6996993/jquerys-ajaxsetup-i-would-like-to-add-default-data-for-get-requests-only">StackOverflow</a>:</p>

<pre>
        var token = 'some_random_secret';
        // some defaults for all ajax calls
        $.ajaxSetup({
            cache: false
        });

<p>        $.ajaxPrefilter(function (options, originalOptions, jqXHR) {<br />
            // do not send data for GET/PUT/DELETE<br />
            if(originalOptions.type !== 'POST' || options.type !== 'POST') {<br />
                return;<br />
            }<br />
            options.data = $.param($.extend(originalOptions.data, { csrf_token: token }));<br />
        });<br />
</pre></p>

<p>
This allows us to mangle only the params of POST requests, leaving GET, PUT and DELETE untouched.  That's basically it.  There were still some additional hacks we had to put into place in order to get the tokens to work with 3rd party plugins (like tinyMCE), but for the most part this was a very clean and simple solution. It didn't clutter the app with a lot of extra code (Perl or JS) which will need to be maintained.  If you can fix something without seeing a big bump in lines of code, people will be more inclined to thank you down the line.
</p>
<p>
I should add the caveat that using Plack::Middleware to solve this particular problem may not scale well for your particular case.  The app in question doesn't deal with high volumes of traffic,  so the tradeoff of some extra computation versus a comprehensive HTML audit made it a very tidy solution for us.
]]>
        
    </content>
</entry>

<entry>
    <title>iCPAN 2.0.0 now Available in the App Store</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/05/icpan-200-now-available-in-the-app-store.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.3285</id>

    <published>2012-05-24T05:19:59Z</published>
    <updated>2012-05-24T05:54:43Z</updated>

    <summary>I&apos;m happy to announce that iCPAN 2.0.0 is now in the app store. If you&apos;re not familiar with it, iCPAN is a free iOS app which allows you to browse CPAN Pod on your iPhone/iPod/iPad. The previous version of iCPAN...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="icpan" label="iCPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ios" label="iOS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="objectivec" label="objective-c" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>I'm happy to announce that <a href="https://github.com/oalders/iCPAN">iCPAN</a> 2.0.0 is now in <a href="http://itunes.apple.com/us/app/icpan/id377340561?mt=8">the app store</a>. If you're not familiar with it, iCPAN is a free iOS app which allows you to browse CPAN Pod on your iPhone/iPod/iPad.  The previous version of iCPAN was released in November of 2010, so this has been a long time in coming.</p>

<p><big>If only CPAN had a web service...</big></p>

<p>Originally, my hope was to release frequent iCPAN updates with new Pod, bug fixes and improvements.  However, I was running into a lot of problems with getting good coverage of CPAN modules.  There was (not  yet) a web service which you could query to find out what is currently indexed in CPAN or where you can find all the Pod in an arbitrary distribution.  I had been rolling my own solution with the help of some CPAN modules, but my coverage was only around 60,000 documents, which was poor.  After discussing this with some friends at PerlMongers in Toronto, I started hacking on an API to provide the Pod as well as some metadata.  The API soon had a name: <a href="http://metacpan.org">MetaCPAN</a>.  Working on MetaCPAN was so much fun and so productive that consequently most of my open source efforts were directed toward this project.  This all took place around the time of the last iCPAN update, but I still had hopes to keep iCPAN reasonably up to date.  After all, it only took about 6 weeks of evenings and weekends to get a proof of concept up and running for MetaCPAN.  I would have plenty of time to keep iCPAN running as well.</p>

<p><big>How did this break?</big></p>

<p>Things may have stayed reasonably on track, but an iOS update broke iCPAN along the way.  After many hours of debugging, I was just not able to find the root of the issue, so I decided to rewrite iCPAN as a Universal app (one with a native iPhone and iPad UI).  I started working on the iPad, but my personal resources were dwindling.  The number of developers working on iCPAN had been cut in half (from 2 to 1) and the number of kids in our family had doubled (from 1 to 2). Now with a newborn in the home, I didn't have the time or energy to finish off the app. Any spare time I did have available was generally spent making some small contributions to MetaCPAN where I could.</p>

<p><big>Any day now...</big></p>

<p>By July of 2011 things had settled a bit and I was back at it, spending a lot of late nights finishing up the iPad UI.  I was <a href="http://blogs.perl.org/users/olaf_alders/2011/07/icpan-is-almost-on-the-ipad.html">optimistic that I'd be able to release iCPAN soon</a>.  However, as I soon discovered, the consistent late nights were quite productive in the short term, but the sleep deficit over the long term made me generally unproductive during the day.  I eventually had to concede that my brain doesn't function well on little sleep, so I gave up a lot of the late nights and put iCPAN on the shelf.  It was nice to have my brain back.</p>

<p>A few months ago, I got the bug to finish things up.  It had really been bothering me that I had been telling people "this thing is almost done" for so many months. I also saw the excellent <a href="https://play.google.com/store/apps/details?id=com.qubling.sidekick&hl=en">CPAN Sidekick</a> in the Android app store and I was starting to feel a bit embarrassed about not having iCPAN working.  Bad (but fair) reviews for iCPAN were piling up.  I buckled down and spent any available free time on getting this done.  It turned out to be vastly more work than I had anticipated or budgeted, but I did get the app to a releasable state about 1 week ago when I submitted it to the app store.</p>

<p><big>The Post-Mortem</big></p>

<p>I've learned a lot along the way. I've learned Objective-C, XCode, Interface Builder and iTunes Connect.  I've learned about managing certs for releasing apps, how<br />
 to distribute an app via an Ad Hoc Distribution (TestFlightApp in my case) and how to keep the iPhone and iPad UI in the same app while making sure that the logic<br />
 uses shared classes.  It has also made me appreciate Perl all that much, in particular CPAN, Moose, DBIx::Class, built-in regex support and the ability to express<br />
 so much in Perl with very little code. I've learned Apple's Core Data. I know how to optimize an SQLite database with 80K rows in a table so that it runs smoothly on a phone.  (I could write an entire post on that topic alone).</p>

<p>iCPAN 2.0.0 has just over 80,000 documents available, which is a huge improvement over the previous version. It has been downloaded over 1,300 times in the last 1.5 years.  If you do like it, please take a moment to review it in the app store or <a href="https://github.com/oalders/iCPAN">watch it on Github</a>.  If you don't like it, please contact me or, even better, send me a pull request. :)</p>]]>
        
    </content>
</entry>

<entry>
    <title>MetaCPAN at the QA Hackathon</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2012/04/metacpan-at-the-qa-hackathon.html" />
    <id>tag:blogs.perl.org,2012:/users/olaf_alders//280.3064</id>

    <published>2012-04-09T02:47:47Z</published>
    <updated>2012-04-09T03:06:23Z</updated>

    <summary>One week ago, I happily had the opportunity to be at the QA Hackathon in Paris. In the past I had been vaguely aware that the hackathon exists and I had some shadowy idea of what goes on at such...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>One week ago, I happily had the opportunity to be at the QA Hackathon in Paris.  In the past I had been vaguely aware that the hackathon exists and I had some shadowy idea of what goes on at such a thing, but I just never considered getting involved. I didn't think it was very much related to the sorts of things I work on.  Happily, it turns out that I was wrong.</p>

<p><strong>First off, thanks!</strong></p>

<p>Before I even talk about the code, I need to thank the organizers and the sponsors. Philippe Bruhat (BooK), Laurent Boivin (elbeho) and Les Mongueurs de Perl did an absolutely fantastic job keeping a large group of people housed, fed and occupied.  The only responsibility I had to take for myself was booking a flight and finding my way from the airport to the hotel.  Beyond that, pretty much everything was taken care of.  The venue (which was really cool) was maybe a 5 minute walk from the hotel.  The dinners I attended were great.  At the hackathon itself there was an impressive supply of food (including fresh fruit) pretty much always available.  Your needs were met. :)</p>

<p>This, of course, would not have been possible on this scale without the help of many generous sponsors.  It's encouraging to see that companies (and individuals) see the value in this sort of work.  Please note that I am lifting this list of sponsors directly from <a href="http://www.dagolden.com/index.php/1660/perl-qa-hackathon-wrapup/">David Golden's Hackathon post</a>:</p>

<p><a href="http://www.cite-sciences.fr/fr/cite-des-sciences/">The City of Science and Industry</a>, <a href="http://www.diabolocom.com/">Diabolo.com</a>, <a href="http://www.dijkmat.nl/">Dijkmat</a>, <a href="http://duckduckgo.com/">DuckDuckGo</a>, <a href="http://dyn.com/">Dyn</a>, <a href="http://freeside.biz/freeside/">Freeside Internet Services</a>, <a href="http://www.hederatech.com/">Hedera Technology</a>, <a href="http://www.jaguar-network.com/">Jaguar Network</a>, <a href="http://www.mongueurs.net/">Mongueurs de Perl</a>, <a href="http://shadow.cat/">Shadowcat Systems Limited</a>, <a href="http://www.splio.com/">SPLIO</a>, <a href="http://www.teclib.com/en">TECLIB'</a>, <a href="http://weborama.com/2/">Weborama</a>, and <a href="http://www.perl-magazin.de/">$foo Magazine</a></p>
<p><b>These people made individual donations:</b> Martin Evans, <a href="http://mdk.me/">Mark Keating</a>, Prakash Kailasa, Neil Bowers, 加藤 敦 (Ktat), Karen Pauley, Chad Davis, Franck Cuny, 近藤嘉雪, Tomohiro Hosaka, Syohei Yoshida, 牧 大輔 (lestrrat), and Laurent Boivin</p>

<p><strong>Some of the highlights for MetaCPAN</strong></p>

<ul>
	<li>A very short chat with Andreas Koenig set off a chain of events that is seeing 2packages.details updated much more frequently than it was up until now. This means that newly uploaded modules will be searchable on MetaCPAN much more quickly than they have been over the last year or so.  This is a major improvement and one that I'm particularly happy about. We still have some work to do on MetaCPAN to take advantage of the more frequent updates, but it's excellent to have them.</li>
<li>Florian Ragwitz (rafl) and Matthew Horsfall (wolfsage) created a new /distribution endpoint to the MetaCPAN API.  This endpoint currently contains only a summary of the RT bug counts.  In future, Github issues and other things which are not specific to a versioned distribution will also be found here.</li>
<li>Michael Peters (wonko) fixed a bug in the indexer which affected about 800 packages. He also wrote a command line script we can use to analyze which modules are missing from the index and why that might be.  This is going to be a very helpful diagnostic tool and one that we, frankly, needed a long time ago.  We're very happy to have this now.</li>
<li>Nicholas Perez (nperez) wrote <a href="https://metacpan.org/module/MetaCPAN::API::Tiny">MetaCPAN::API::Tiny</a>, which is basically an implementation of <a href="https://metacpan.org/module/MetaCPAN::API">MetaCPAN::API</a></li>
<li>After David Golden (dagolden) mentioned that a MetaCPAN command line interface would be helpful, Chris Nehren (apeiron) <a href="https://github.com/apeiron/metacpan-api/tree/apeiron/metacpan-cli">began working on it</a>. I'm not sure why nobody thought to create one in the past, but this is going to be another helpful tool to come out the hackathon.</li>
<li> I spent some of my time fixing bugs and adding a bit of new stuff, but most of my time was spent looking over existing pull requests as well as dealing with pull requests from the hackathon itself.  I was also able to spend time with new MetaCPAN hackers, getting them started with their own local deployments as well as working on the codebase.  I didn't get to write as much code as I had planned to, but spending time accepting patches and working with developers who are new to the project is an ideal situation to be in.</li>
</ul>

<p><strong>A New MetaCPAN Logo</strong></p>

<p>As part of the weekend, we were also able to announce <a href="http://entries.contest.metacpan.org/2012/03/and-winner-is.html">Raul Matei as the winner of the MetaCPAN logo contest</a>, which <a href="http://www.enlightenedperl.org/">EPO</a> so kindly provided the prize money for.  We went live with the new logo immediately, which looks great and takes care of one more missing piece of the puzzle.</p>

<p><strong>Wrapping Up</strong></p>

<p>We now have a number of new hackers who are armed with enough knowledge to bend the MetaCPAN code to their will.  Together we fixed bugs, improved the test suite, worked on new functionality, dreamed up even cooler things to do and generally got a lot of good things done.</p>

<p>For MetaCPAN, the hackathon feels like a great success. I'm so pleased to have been a part of it. I got to meet lots of great people, hang out in a beautiful city and focus my daytime hours on MetaCPAN without any distractions. I've also got a much clearer understanding of what the QA Hackathon is all about it and I see how valuable it really is to get all of these hackers in the same room together.   It's so much easier when you can walk up to some and *actually* poke them for information rather than having to wait until they check IRC, email, a bug queue etc.  That in itself is a big win.</p>]]>
        
    </content>
</entry>

<entry>
    <title>++ Goes on Hiatus</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/12/-goes-on-hiatus.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2621</id>

    <published>2011-12-30T06:08:05Z</published>
    <updated>2011-12-30T06:27:32Z</updated>

    <summary>If you saw @kraih&apos;s recent MetaCPAN tweet, you&apos;ll know that MetaCPAN&apos;s ++ feature has been gamed. Now, we were aware there was some potential for gaming. Initially you needed a PAUSE id to be able to ++, but this had...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>If you saw @kraih's <a href="https://twitter.com/#!/kraih/status/152207331986382849">recent MetaCPAN tweet</a>, you'll know that MetaCPAN's ++ feature has been gamed. Now, we were aware there was some potential for gaming.  Initially you needed a PAUSE id to be able to ++, but this had an unexpected side effect in that there were some requests for PAUSE accounts with the justification of "I'd like to be able to ++ on MetaCPAN".  Because this placed an additional burden on the already busy PAUSE admins, we were asked to remove this requirement.  </p>

<p>The result of this was that the bar was now much lower for someone who wanted to create a MetaCPAN account and begin using the ++ feature.  People behaved and used the feature as it was meant to be used.  It was helpful, a great addition to the site and it led to a fun little leaderboard where you could get a glimpse of what people in the Perl community care about in general.  You could also view recent ++ activity, which could give you an indication of what is trending "right now".  So far, so good.  The code was written in good faith and the community used it in that same spirit.</p>

<p>Earlier this week someone start to game the system, apparently creating fake Github accounts, creating MetaCPAN accounts with that Github login and then boosting first Dancer and the Mojolicious in the leaderboard.  I don't know if it was the same person and I really don't care to do the research.  By later today the bot was adding ++ data for modules which didn't even exist -- a bug we weren't aware of.  It was getting to the point of silliness and the ++ feature had at best been rendered useless and at worst become somewhat of an embarrassment.  </p>

<p>So, earlier this evening, I turned off the ++ feature on the MetaCPAN front end.  I'm not going to pontificate on whether the bot behaviour is good (points out an obvious weakness in the code) or if it's bad behaviour (the exploit was run without an appropriate issue being opened first).  What I am going to say is that a feature which was very helpful to many people has been now taken offline.  A lot of work goes into this stuff and some of that work has been rendered useless for the time being.  I can't give any kind of estimate as to when this might come back online.  The limiting factors are a) finding an appropriate way of limiting abuse and b) finding a volunteer to sink the necessary hours into it.  </p>

<p>So, I'd like to extend my congratulations to the person(s) who sunk the time into defeating the ++ system, but who conversely can't be bothered to provide a patch to fix the hole. You've accomplished what you set out to do and now somebody else gets to clean up after you.  Your parents must be so proud.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Not a designer? Get involved with the MetaCPAN logo contest anyway!</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/12/not-a-designer-get-involved-with-the-metacpan-logo-contest-anyway.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2588</id>

    <published>2011-12-20T04:26:21Z</published>
    <updated>2011-12-20T05:06:45Z</updated>

    <summary>The MetaCPAN logo contest is now in full swing, thanks in no small part to FLORA for his blood, sweat and tears in organizing it and also to the Enlightened Perl Organization, which fully funded this contest with astonishing speed....</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="logocontest" label="logo contest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>The MetaCPAN logo contest is now in full swing, thanks in no small part to <a href="https://metacpan.org/author/FLORA">FLORA</a> for his blood, sweat and tears in organizing it and also to the <a href="http://www.enlightenedperl.org/">Enlightened Perl Organization</a>, which fully funded this contest with astonishing speed. </p>

<p>Just to recap, the contest rules are posted at <a href="http://contest.metacpan.org">contest.metacpan.org</a> and the entries are being posted at <a href="http://entries.contest.metacpan.org">entries.contest.metacpan.org</a>.</p>

<p>Now, you don't need to be a designer to get involved.  Here are a couple of ways you can help out:</p>

<p>1) Get the word out. Let your designer friends know there is $400 up for grabs (not to mention eternal glory).  If you're active on Twitter, please tweet about it as well.  Send an email to your local PerlMongers group etc.</p>

<p>2) Comment on the entries.  Because there is no limit on the number of entries per contestant, the logo submission process is allowed to be iterative.  Constructive criticism can lead to authors resubmitting tweaked versions of their logos, which can only be good for the contest.</p>

<p>As aside, anyone who has contributed to MetaCPAN will be able to vote on submissions.  If you'd like to vote, it's not too late to get a pull request in to MetaCPAN.  <a href="https://github.com/CPAN-API/metacpan-web/issues/">Fix an issue</a>, send a documentation patch, etc.  There are lots of place to help.  If you're unsure of where to begin, say hello on #metacpan and someone will be sure to point you in the right direction.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Happy Birthday, MetaCPAN!</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/11/happy-birthday-metacpan.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2389</id>

    <published>2011-11-03T03:55:19Z</published>
    <updated>2011-11-03T05:02:39Z</updated>

    <summary>It was exactly 1 year ago today (Nov 3, 2010) that I registered the metacpan.org domain name. Over the course of this year, the project has gone from a couple of guys writing some code to a true community effort....</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>It was exactly 1 year ago today (Nov 3, 2010) that I registered the <a href="https://metacpan.org">metacpan.org</a> domain name.  Over the course of this year, the project has gone from a couple of guys writing some code to <a href="https://metacpan.org/about/contributors">a true community effort</a>.  MetaCPAN is steadily being adopted by Perl developers around the globe and it is steadily gaining in functionality.</p>

<p>Together we've created a free, open, collaborative project which makes new tools available to CPAN lovers everywhere.  The API has spawned some cool and very useful projects.  The web site has spawned some much needed functionality in the form of diffs, syntax highlighting, author profiles etc.  </p>

<p>What you may not know is that MetaCPAN is now set up in such a way that all resources (servers, DNS, email, domain registration, etc) can be configured by a handful of core devs.  This means that if any one (or several) core devs drop out of the picture, the project can continue on as before.  There is no one person who can act as a blocker to the rest of the contributors and anything which might be considered controversial requires consensus before it gets pushed to the master branch.  So far, I think this has yielded good results.</p>

<p>For example, here's the latest roundup, which <strong>does not include numerous bug fixes and other tweaks by <a href="https://metacpan.org/author/PERLER">PERLER</a>, among others</strong>:</p>

<p>Sept 6: <a href="https://metacpan.org/author/PLU">PLU</a> adds <a href="https://metacpan.org/about/contributors">a contributors leaderboard</a></p>

<p>Dyn officially comes on board as <a href="https://metacpan.org/about/sponsors">our DNS sponsor</a></p>

<p>Sept 9: <a href="https://metacpan.org/author/RWSTAUNER">RWSTAUNER</a> adds CPANRatings links to /release and /module pages</p>

<p>Sept 12: <a href="https://metacpan.org/author/KENTNL">KENTNL</a> adds <a href="http://identi.ca">identi.ca</a> to author profiles</p>

<p>Sept 15: <a href="https://metacpan.org/author/JROBINSON">JROBINSON</a> adds <a href="http://flattr.com">flattr</a> to author profiles</p>

<p><a href="https://metacpan.org/author/DRAEGTUN">DRAEGTUN</a> adds <a href="http://news.ycombinator.com/">hackernews</a> to author profiles</p>

<p>Sept 19: <a href="https://metacpan.org/author/KENTNL">KENTNL</a> adds <a href="http://geekli.st">geekli.st</a> to author profiles</p>

<p>Sept 27: <a href="https://metacpan.org/author/LLAP">LLAP</a> edits <a href="http://learn.perl.org">learn.perl.org</a> links to point at MetaCPAN</p>

<p>Oct 14: <a href="https://metacpan.org/author/MIYAGAWA">MIYAGAWA</a> updates cpanminus to support the following syntax: "cpanm --metacpan" (code courtesy of <a href="https://metacpan.org/author/TOKUHIROM">TOKUHIROM</a>)</p>

<p>Oct 16: <a href="https://metacpan.org/author/TOKUHIROM">TOKUHIROM</a> <a href="http://tokuhirom.github.com/talks/20111015-yapcasia2011-metacpan/#0">posts his slides</a> from his YAPC::Asia talk on MetaCPAN.</p>

<p>Oct 17: <a href="https://metacpan.org/author/KENTNL">KENTNL</a> comes up with <a href="https://gist.github.com/1291928">a nice little hack</a> to employ caching in <a href="https://metacpan.org/module/MetaCPAN::API">MetaCPAN::API</a> calls </p>

<p>Oct 18: <a href="https://metacpan.org/author/AZAWAWI">AZAWAWI</a> <a href="http://padre.perlide.org/trac/wiki/PadreCPANExplorer">integrates MetaCPAN into Padre</a></p>

<p>Oct 19: <a href="https://metacpan.org/author/AZAWAWI">AZAWAWI</a> adds the ability for Padre to fetch Pod directly from MetaCPAN with the option of inserting the SYNOPSIS directly into your document</p>

<p>Oct 20: <a href="http://www.youtube.com/watch?v=B-nXNBjrXmc">The video</a> of <a href="https://metacpan.org/author/TOKUHIROM">TOKUHIROM</a>'s MetaCPAN talk is posted.  That is a quick turnaround on posting video.  :)</p>

<p>Oct 21: I add <a href="https://metacpan.org/favorite/recent">a chronologically sorted list of distributions to get a ++ on MetaCPAN</a>.  (A <a href="https://metacpan.org/favorite/leaderboard">++ leaderboard</a> is also made available).</p>

<p>Oct 26: Dimitar Petrov now has mcpan.org online.  This means converting links from <a href="http://search.cpan.org/~miyagawa/Plack-0.9985/lib/Plack.pm">search.cpan.org</a> to MetaCPAN is as simple as adding the letter "m": <a href="http://search.mcpan.org/~miyagawa/Plack-0.9985/lib/Plack.pm">search.mcpan.org</a></p>

<p><a href="https://metacpan.org/author/RWSTAUNER">RWSTAUNER</a> adds syntax highlighting for .c, .h and .xss  See <a href="https://metacpan.org/source/DOY/Moose-2.0205/mop.c">https://metacpan.org/source/DOY/Moose-2.0205/mop.c</a></p>

<p>Oct 28: <a href="https://metacpan.org/author/RWSTAUNER">RWSTAUNER</a> adds syntax highlighting to Changes files.  See <a href="https://metacpan.org/source/BRICAS/CPAN-Changes-0.18/Changes">https://metacpan.org/source/BRICAS/CPAN-Changes-0.18/Changes</a><br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Objective-C for Perl Hackers</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/09/objective-c-for-perl-hackers.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2236</id>

    <published>2011-09-30T03:26:58Z</published>
    <updated>2011-09-30T03:40:58Z</updated>

    <summary>I&apos;ve been messing around with Objective-C off and on for a while now. Whenever I take a break and come back to it, I find myself having to look up some of the same syntax over and over. Some examples...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="objectivec" label="objective-c" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>I've been messing around with Objective-C off and on for a while now.  Whenever I take a break and come back to it, I find myself having to look up some of the same syntax over and over.  Some examples would be:</p>

<p>Perl: <br />
<pre><br />
$foo =~ s{bar}{baz}g;<br />
</pre></p>

<p>Objective-C:<br />
<pre><br />
foo = [foo stringByReplacingOccurrencesOfString:@"bar" withString:@"baz"];<br />
</pre></p>

<p>Perl:<br />
<pre><br />
$list{'foo'} = 'baz';<br />
</pre></p>

<p>Objective-C:<br />
<pre><br />
[list setObject:baz forKey:@"foo"];<br />
</pre></p>

<p>One thing in particular that gets me is the assigning a value to a dictionary, like in the example above.  Naming the value *before* the key seems counter-intuitive to me.  Luckily Xcode is great with autocompletion, which makes a lot of this easier, but I still find I need reference materials which are more Perlish.  To make things easier for myself, <a href="https://github.com/oalders/objective-c-for-perl-hackers/wiki">I've set up a wiki</a> to map Perl syntax to Objective-C where it makes sense.  </p>

<p>Feel free to edit/update/correct the wiki where you see fit. I make no claims of expertise here, but I do find myself referring back to this list and adding to it as I write my own Objective-C code.</p>

<p><a href="https://github.com/oalders/objective-c-for-perl-hackers/wiki">https://github.com/oalders/objective-c-for-perl-hackers/wiki</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>MetaCPAN August Roundup</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/09/metacpan-august-roundup.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2155</id>

    <published>2011-09-01T05:37:26Z</published>
    <updated>2011-09-01T05:42:18Z</updated>

    <summary>August was another busy month for MetaCPAN, so I think a recap is in order. I&apos;ll proceed chronologically. 2011-08-01 Gabor Szabo included MetaCPAN in his first issue of the Perl Weekly. It&apos;s an excellent aggregation of all Perl things blog...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>August was another busy month for MetaCPAN, so I think a recap is in order. I'll proceed chronologically.</p>

<p>2011-08-01</p>

<p><a href="https://metacpan.org/author/SZABGAB">Gabor Szabo</a> included MetaCPAN in his first issue of the <a href="http://perlweekly.com/">Perl Weekly</a>. It's an excellent aggregation of all Perl things blog and newsworthy. I can tell you just from the time involved in a MetaCPAN recap that Gabor is spending a huge amount of time on his weekly newsletters. I follow a lot of blog posts, but I find his weekly recap helps me find interesting stuff I may have missed.</p>

<p>2011-08-03</p>

<p>Have you every blown away a lot of data you didn't have a backup for? I know I have. It was client data and it was ugly. A lot of us have been there and precisely this happened to MetaCPAN. In our rush to get cool features online, we put off taking snapshots of all the cool data Perl hackers were adding to the system. On this particular day, <a href="http://blogs.perl.org/users/olaf_alders/2011/08/metacpan-undergoes-unplanned-re-index.html">it came back to bite us</a>.  So, what was effectively a hard reset forced us to re-evaluate, re-index and put a proper backup strategy in effect. You could say our new slogan is "The New MetaCPAN: Now with Backups!".</p>

<p>If you added any info (author or +1) before Aug 3 and haven't logged in since, you'll need to clear your MetaCPAN cookies, reauthenticate and start from scratch. It's sub-optimal, to be sure, but lessons have been learned, more hard disks have been installed and we're working on sponsorship to get a second server online which we can fail over to.</p>

<p>2011-08-04</p>

<p>There had been some complaints about not being able to diff on MetaCPAN, so on Aug 4th <a href="https://metacpan.org/author/PERLER">Mo</a> put a little something together to do just that. <a href="https://metacpan.org/diff/release/BOBTFISH/Catalyst-Runtime-5.90001/BOBTFISH/Catalyst-Runtime-5.90002">It looks great</a>, works well and may have been some small compensation for the events of the previous day. :)</p>

<p>On the same day <a href="https://metacpan.org/author/RJBS">RJBS</a> announced that his <a href="http://advent.rjbs.manxome.org/2010/">advent calendars</a> now link to MetaCPAN rather than search.cpan.org!</p>

<p>2011-08-08</p>

<p>On this day <a href="https://metacpan.org/author/SARTAK">SARTAK</a> added wishlist functionality to MetaCPAN. If you find the PayPal button too mercenary, you may appreciate the wishlist as a way of letting others thank you for your hard work. Log in to add this to your author profiles. </p>

<p>2011-08-10</p>

<p>On this day <a href="https://metacpan.org/author/YANICK">YANICK</a> added <a href="http://klout.com">klout.com</a> to the author profiles.</p>

<p>2011-08-16</p>

<p>On this day <a href="https://metacpan.org/author/AYOUNG">AYOUNG</a> added <a href="Ohloh.net">Ohloh.net</a> to author profiles and I added <a href="http://www.github-meets-cpan.com/">github-meets-cpan.com</a> to the profiles as well.</p>

<p>2011-08-17</p>

<p>On this date mo gave a <a href="https://github.com/CPAN-API/presentations/tree/master/yapc_eu_2011">MetaCPAN lightning talk</a> at YAPC::EU, complete with impressive graphics.</p>

<center>
<img src="http://farm7.static.flickr.com/6207/6062540710_8c18e9bcbe.jpg">
</center>

<p>2011-08-18</p>

<p>On this day <a href="https://metacpan.org/author/DOHERTY">DOHERTY</a> rebranded the +1 to ++ to make it more Perlish and less Googlesque.</p>

<p>2011-08-19</p>

<p>This date marks the intial Github commit of <a href="https://github.com/wata">wata's</a> excellent <a href="https://github.com/wata/CPANHelper">CPANHelper Chrome helper extension</a>. I've been making use of this extension every day and I can tell you it's very cool. I highly recommend it. <a href="https://chrome.google.com/webstore/detail/lmbbdfdngngmcjihfdbknndaoijmmlhe">Install it now</a>.</p>

<p>On this date I also became aware that <a href="https://metacpan.org/author/TOKUHIROM">TOKUHIROM</a> is slated to give <a href="http://yapcasia.org/2011/talk/28">a MetaCPAN talk at YAPC::ASIA</a>. Kudos to him for submitting the proposal. He has done a lot of work with the API and I hope he posts his slides.  :)</p>

<p>2011-08-22</p>

<p>Around this date, I added links to Changelogs on MetaCPAN at the release level. This was a much-requested feature.</p>

<p>2011-08-23</p>

<p>On this date Mo added <a href="https://metacpan.org/requires/module/Modern::Perl">"reverse dependency" listings</a>.</p>

<p>2011-08-24</p>

<p><a href="https://metacpan.org/author/VTI">VTI</a> came up with another gem on Aug 24th. <a href="http://perlresume.org/">PerlResume.org</a> is an excellent example of the kind of cool stuff you can do with the MetaCPAN API. Look yourself up and see how your Perl Résumé stacks up against those of other authors.</p>

<p>2011-08-29</p>

<p>Around this time I became aware of the fact that <a href="p3rl.org">p3rl.org</a> now points at MetaCPAN. Try it: <a href="http://p3rl.org/shit">http://p3rl.org/shit</a></p>

<p>August also marks the wrap-up for Mo's Google Summer of Code project, which was a huge success. Over the coming weeks we'll be putting a road map together, to make plans for going forward without the same GSoC resources at our disposal. We've got a really solid foundation to work on going forward, so we're feeling quite good about how the project is progressing.</p>

<p>In other news, we're working to bring a new sponsor on board this week and I'll have an update on that once that has been set up.</p>

<p>My apologies to any contributions I may have inadvertently missed in this roundup. It wasn't intentional.</p>

<p>If you'd like to get involved, stop by #metacpan in irc.perl.org, follow us on <a href="http://twitter.com/metacpan">Twitter</a> or just comment on this post.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Kickstarting the Gitpan</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/08/kickstarting-the-gitpan.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2148</id>

    <published>2011-08-31T04:28:01Z</published>
    <updated>2011-08-31T05:05:28Z</updated>

    <summary>If you&apos;ve played with Gitpan at all, you probably have an idea of how cool this project is. The idea behind Gitpan is to take all of CPAN and make it available as Git repositories which are tagged by release....</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="cpan" label="cpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="github" label="github" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gitpan" label="gitpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>If you've played with <a href="https://github.com/gitpan">Gitpan</a> at all, you probably have an idea of how cool this project is. The idea behind Gitpan is to take all of CPAN and make it available as Git repositories which are tagged by release. It's a great idea. It makes it trivial for Github (and Git users in general) to create patches for modules which don't already exist in a public Git repo. It's also useful in the case where <a href="http://marcel-maint.github.com/">the original Git repositories for modules on CPAN may no longer easily be found online</a>.</p>

<p>Now, if you've followed <a href="https://github.com/schwern/gitpan">the Gitpan project</a>, you probably also know that it is not currently up to date, which is a shame. I contacted <a href="https://metacpan.org/author/MSCHWERN">Schwern</a> about this recently and he was kind enough to create and tag some <a href="https://github.com/schwern/gitpan/issues?sort=created&labels=getting+it+running+again&direction=desc&state=open">issues which are blockers</a> to the resumption of Gitpan.</p>

<p>If anyone out there has some interest in getting this project back online, there's enough info in these issues to get you started. There may well also be some resources in the <a href="https://github.com/CPAN-API/cpan-api/wiki/Beta-API-docs">MetaCPAN API</a> which could speed the work along as well. If Gitpan gets back up and running it would be one more resource we could link to from <a href="http://metacpan.org">metacpan.org</a> and could likely lead to some more interesting mashups down the line.  </p>

<p>If you do feel inclined to do some heavy lifting on this, please stop by #metacpan so that we can give you some guidance as to how best to integrate MetaCPAN with Gitpan.</p>]]>
        
    </content>
</entry>

<entry>
    <title>MetaCPAN Undergoes &quot;Unplanned Re-index&quot;</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/olaf_alders/2011/08/metacpan-undergoes-unplanned-re-index.html" />
    <id>tag:blogs.perl.org,2011:/users/olaf_alders//280.2046</id>

    <published>2011-08-03T17:02:50Z</published>
    <updated>2011-08-03T17:12:35Z</updated>

    <summary>Earlier today a some dev work on MetaCPAN had the unfortunate side effect of dropping the ElasticSearch index. This has effectively forced us to re-index the site from scratch. What makes this particularly painful is that we&apos;ve lost the author...</summary>
    <author>
        <name>Olaf Alders</name>
        <uri>http://www.wundercounter.com</uri>
    </author>
    
    <category term="metacpan" label="metacpan" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/olaf_alders/">
        <![CDATA[<p>Earlier today a some dev work on MetaCPAN had the unfortunate side effect of dropping the ElasticSearch index.  This has effectively forced us to re-index the site from scratch.  What makes this particularly painful is that we've lost the author data (including +1) which so many Perl devs have lovingly created over the past few weeks.</p>

<p>The short story is that minicpan should be indexed within a few hours. The rest of CPAN and BackPAN will likely be in the next day or so.</p>

<p>Because we've been looking at adding new features and haven't spent time on a proper backup strategy, we're in a suboptimal place right now.  The good news is that this didn't happen several weeks from now with much more author data.  Also, we're now forced to find a workable backup solution as our first priority.</p>

<p>I think now would be a good time to put out a call for volunteers. If you're inclined to help dig in with some sysadmin-minded tasks or just want to help with the overall MetaCPAN ecosystem, we could really use your help.  The interest in the project is great, but so is the number of open issues, which grows by the day.</p>

<p>The more devs we have who can dig in and get something done, the closer we'll be to getting a bullet-proof system online which we can deploy and recommend with confidence.</p>

<p>Now might be a good time to remind folks that we are indeed still in beta, so there is some allowance for unplanned downtime etc.  We're doing our best with the resources we have. If you'd like to help speed the progress, your contributions will be warmly welcomed.</p>

<p>Please drop in at #metacpan on irc.perl.org with kudos or complaints.</p>]]>
        
    </content>
</entry>

</feed>
