Madison Area Perl Mongers Tonight

Tonight’s topic: REST on your SoC with Device::WebIO

System on a Chip (SoC) devices, such as the Raspberry Pi and pcDuino, are becoming increasingly popular. They almost always have a working Perl installed, and some library for controlling the I/O pins. Wouldn’t it be nice to unify the API across devices? While we’re at it, why not add a REST interface, too? The Device::WebIO modules do exactly that, and this presentation will show you how to use them.

This is also the 20th anniversary of Perl. There is a rumor of cake.

[From my blog.]

A most amusing annoyance

Came across this in my travels this morning:

$ perl -E 'sub x { say "y"}; my $x = 'x'; $x->();'
Undefined subroutine &main::1 called at -e line 1.

Why on earth does this compile and run in the first place? Fixing the shell quotes makes the problem go away.

Which modules are currently loaded by process?

Have you ever wondered which modules are currently loaded by current process? With Perl it's very simple to know this piece of info. Perl saves loaded modules in a hash %INC.

Lets have some dirty hands:

use Data::Dumper;
print STDERR Dumper \%INC;

The output is as follows:

$VAR1 = {
          'warnings/' => '/usr/share/perl5/warnings/',
          '' => '/usr/share/perl5/',
          '' => '/usr/lib64/perl5/',
          '' => '/usr/share/perl5/',
          '' => '/usr/share/perl5/',
          '' => '/usr/share/perl5/',
          '' => '/usr/share/perl5/',
          'Data/' => '/usr/lib64/perl5/Data/'

The hash simply contains the module path as value.

So this can be used for cleaning up too, with it you can figure out why you're not getting the version of the module you're expecting, for example.

Synchronizing Opera bookmarks with Perl, Org, and git

Who here like me still uses Opera (specifically Opera 12 on Linux)? It's being abandoned, the bugs are piling up, and more websites are not rendering correctly on it. However, the combination of keyboard shortcuts and some specific features like editing+applying source code makes me still stick to it.

The Opera makers provide a service called Opera Link that can synchronizes your browser bookmarks and a few other stuffs between computers and mobile devices. However I prefer not to use it and rely on some good ol' tools instead.

I also happen to be a fan of Org so Org will be the master document.

The steps that I describe here might be too much of a hassle, but I like it and thus share it.

First, you install the CPAN module App::ConvertOperaBookmarksToOrg which includes the utilities adr2org and org2adr.

Then you convert your Opera bookmarks to an Org document with this command:

% adr2org -T ~/.opera/bookmarks.adr > repo/

Getting IP address with Perl

A common situation which you will usually come across, is to retrieve the IP.

Using WWW::curlmyip, this task is very easy.

use WWW::curlmyip;
my $ip = get_ip();

Lets inspect the module on closely to understand how it works.

use strict;
package WWW::curlmyip;
$WWW::curlmyip::VERSION = '0.02';
use 5.008;
# ABSTRACT: Returns your ip address using L<>
    require Exporter;
    use base 'Exporter';
    our @EXPORT = 'get_ip';
    our @EXPORT_OK = ();
sub get_ip {
    my $response = HTTP::Tiny->new->get('');
    die join(' ', 'Error fetching ip: ',
                  ($response->{status} or ''),
                  ($response->{reason} or '')) unless $response->{success};
    my $ip = $response->{content};
    chomp $ip;

It's a one file module, which simply contacts, retrieves the content with HTTP GET request, and finally chomps the result; because there exists an extra new line character which is useless.

So simple, isn't it ?
But It's also very useful !

A Grand, 2014

A couple of days ago I got a tip that I was very close to being the first CPAN author to upload 1000 releases in a year (989). Today I topped it off:

Thus ends my CPAN numbers ambitions. From now on I will concentrate on -Oquality -Ofun and -Oacmeism. Actually the numbers stuff ended in early September.

The -Oquantity and -Ofrequency flags were fun for a while, and it resulted in my getting a large portion of my modules into an up to date state; but numbers for numbers sake has a limited appeal.

Note: It was ironic that one of my final releases was from a pull request by SHARYANTO++ who leads almost all the CPAN statistics. :-)

Elasticsearch Custom Scoring

Elasticsearch has a builtin scoring algorithm which works quite well in practice, but sometimes you want to roll your own scoring algorithm. Let's examine how to create a custom scoring algorithm using the function score query.

Let's assume we want to search and score Perl job offers based on a set of weighted keywords. To get the score of each offer, we'll multiply the weights of matching keywords where positive keywords have weights greater than one, and negative keywords are weighted less than one. Thus, the positive and negative keyword matches add and take away from the final product (score) respectively.

Define the Qualitative Importance and Their Weights

Qualitative Tags

Instead of assigning weights directly to keywords, let's use qualitative tags of desirability (importance) for each keyword (trait). Borrowing from okcupid's five degree scale of importance:

  • mandatory
  • very
  • somewhat
  • little
  • irrelevant

This takes care of the non-negative traits, now let's add qualifiers for negative traits using a similar pattern:

  • mandatory_neg
  • very_neg
  • somewhat_neg
  • little_neg

Actual Weights

Final TPF Devel::Cover grant report

About is a common blogging platform for the Perl community. Written in Perl and offering the modern features you’ve come to expect in blog platforms, the site is run by Dave Cross and Aaron Crane, with a design donated by Six Apart, Ltd.