Wednesday, February 27, 2013

Snippets Teil 1 - 100 Distributionen mit den meisten "++" auf MetaCPAN

Mojolicious ist ein Modul, das gewisse Diskussionen auslöst. Zum Einen hat es den Vortreil, dass es alle notwendigen Module mitliefert und somit keine Abhängigkeiten (außer Perl > 5.10) hat, zum Anderen nutzt es nicht CPAN.

Klingt paradox, aber genau so ist es. Viele sagen, dass Mojolicious Anti-CPAN ist und damit die Anti-CPAN-Haltung einiger Unternehmen unterstützen würde. Im Perl-Weekly Newsletter #64 sind ein paar Blogposts zu dem Thema verlinkt.

Ich kann die Argumente nachvollziehen, aber ich persönlich finde es auch eine Stärke von Mojolicious. Man kann das Modul sehr einfach auch auf Shared Webhosting Paketen installieren - man muss nicht erst noch die ganzen Abhängigkeiten installieren.

Außerdem hat Sebastian Riedel ganze Arbeit geleistet. Die Module, die die Basisarbeiten machen, sind ausgereift und haben einige nette Features. Eines der Module, die ich im Moment am häufigsten verwende ist Mojo::UserAgent (und hat damit LWP::UserAgent abgelöst). Gerade wenn ich irgendwelche JSON-APIs von Webseiten abfragen möchte, ist es schnell und einfach. Und ich kann aus der Antwort schon direkt den geparsten JSON-Part holen und mit einem Auszug daraus arbeiten.

Hier ein Beispiel wie man die Distributionen auf MetaCPAN bekommt, die die meisten "++" bekommen haben:



#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;

my $res = $ua->post(
    'http://api.metacpan.org/v0/favorite/_search' => json => {
          "query" => { 
            "match_all" => {}
           },
          "facets" => { 
            "leaderboard" => {
              "terms" => {
                "field" => "distribution",
                "size"  => 100
          } } },
          "size" => 0
    }
);

my $terms = $res->res->json( '/facets/leaderboard/terms' );
say $_->{term} for @{$terms};

Saturday, February 23, 2013

Hilfe beim Auffinden von Typos

Für mich ist es recht wichtig, dass Kommentare und Dokumentation keine Rechtschreibfehler haben. Leider lässt sich das nicht immer verhindern. Um in OTRS möglichst viele Fehler auszumerzen habe ich mir ein kleines Hilfsskript geschrieben.

Ich habe vorher noch Text::Aspell installiert, damit es das Wörterbuch etc. von aspell verwendet.


#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

use PPI;
use Search::Tools::SpellCheck;
use File::Basename;
use File::Find::Rule;
use List::Util qw(first);

my $dir = $ARGV[0];

if ( !$dir || !-d $dir ) {
    say "$0 ";
    exit;
}

my @files = File::Find::Rule->file->in( $dir );

my $spellchecker = Search::Tools::SpellCheck->new(
    max_suggest => 4,
    lang        => 'en_US',
);

FILE:
for my $file ( @files ) {

    # skip hidden files
    my $filename = basename( $file );
    next FILE if $filename =~ m{ \A \. }xms;

    # skip some files
    next FILE if first{ $filename eq $_ }( qw/INSTALL INSTALL.SuSE INSTALL.RedHat README CHANGES/ );
   
    # skip some files based on path
    next FILE if $file =~ m{/scripts/}xms;
    next FILE if $file =~ m{/Language/}xms;

    # skip some file types (based on suffix)
    next FILE if $file =~ m{ \.(?:gif|png|js) \z }xms;

    # check for typos in comments
    my $comments = extract_comments( $file );
    if ( $comments ) {
        $comments =~ s/note:/note/;

        eval {
            my $suggestions_for_comments = $spellchecker->suggest( $comments ) || [];
            print_suggestions( $file, $suggestions_for_comments );
        };
    }

    # skip if the file if it's not a perl file
    next FILE if $file =~ m{ \.(?:pm|pl) \z }xms;

    # check for typos in pod
    my $pod = extract_pod( $file, {} );
    if ( $pod ) {
        $pod =~ s/note:/note/;

        eval {
            my $suggestions_for_pod = $spellchecker->suggest( $pod ) || [];
            print_suggestions( $file, $suggestions_for_pod );
        };
    }
}

sub print_suggestions {
    my ($file, $suggestions) = @_;

    return if !@{ $suggestions };

    say $file, ':';
    for my $suggestion ( @{ $suggestions } ) {
        next if ref $suggestion ne 'HASH';
        next if first{ $suggestion->{word} eq $_ }(qw/agpl txt otrs ag www html/);
        next if $suggestion->{word} =~ m{ \A (?:\d+|\d+-\d+(?:-\d+)?) \z }xms;
       
        say $suggestion->{word}, ' -> ', join ' __ ', @{$suggestion->{suggestions}} 
            if $suggestion->{suggestions} &&; @{ $suggestion->{suggestions} };
    }
}

sub extract_comments {
    my ($file) = @_;

    return if !$file || !-f $file;

    my $content = '';

    if ( open my $fh, '<', $file ) {

        while ( my $line = <$fh> ) {
            my  ($comment) = $line =~ m{ [#](.*) }xms;
            next if !$comment;

            $content .= ' ' . $comment;
        }
    }

    return $content;
}

sub extract_pod {
    my ($file, $config) = @_;

    return if !$file || ! -f $file;

    my $content;

    if ( open my $fh, '<', $file ) {

        if ( $config->{encoding} ) {
            binmode $fh, ':encoding(' . $config->{encoding} . ')';
        }

        local $/;
        $content = <$fh>;
    }

    my $pod = extract_pod_from_code( $content );

    return $pod;
}

sub extract_pod_from_code {
    my ($code) = @_;

    return if !$code;

    my $parser    = PPI::Document->new( \$code );

    return if !$parser;

    my $pod_nodes = $parser->find(
        sub {
             $_[1]->isa( 'PPI::Token::Pod' );
        },
    );

    my $merged = PPI::Token::Pod->merge( @{$pod_nodes || []} );

    return '' if !$merged;
    return $merged->content;
}



Einige Dateien musste ich rausnehmen, weil Search::Tools::SpellCheck ziemlich schnell Fehler wirft. Das ist auch der Grund, warum ich dann "eval" benutzt habe...

Wer noch Ideen hat, wie man das ganze verbessern kann, dann immer her damit. Das Prozedere hat noch einige Schwächen, weil auch Sachen wie "AG", "AGPL", "HTML" etc. agemeckert wird. Dadurch bekommt man ziemlich viele "False Positives" und man muss bei einem Projekt wie OTRS einige zehntausend Zeilen durchschauen um die wirklichen Fehler zu finden.

Es werden auch einige Fehler nicht gefunden...

Thursday, February 14, 2013

Hannover.pm // German Perl-Tour Teil 1

Ich habe mir für 2013 vorgenommen, an Perlmonger-Treffen in mindestens 8 deutschen Städten teilnehmen. Ich finde es immer wieder spannend, andere Gruppen zu treffen und zu sehen was in anderen Städten so
los ist.

Auf Grund Arbeit und Familie war mein erstes Perlmonger-Treffen 2013 nicht in Frankfurt, sondern in dieser Woche in Hannover. Ich war hier vor Ort, weil ich hier eine Perl-Schulung gehalten habe. Das Treffen von Hannover.pm fand dann am 13.02. im PSV Hannover statt. Laut Doodle waren "nur" 6 Personen angemeldet, aber im Endeffekt waren wir zu acht.

Was mir sehr gut gefallen hat war, dass die Gruppe immer/meistens einen extra Nebenraum mit großen Fernseher hat. Man ist in einer Gaststätte (hat damit Verpflegung), hat aber Ruhe um sich zu unterhalten und mit dem großen Fernseher kann man auch mal spontan etwas zeigen.

Delticom, einer der Sponsoren des Deutschen Perl-Workshops, war mit drei Mann ganz stark vertreten. Reifen habe ich online zwar noch nicht gekauft, aber gut zu wissen, dass reifendirekt.de mit Perl umgesetzt wurde.

Ansonsten war noch Wolfgang von heise da und wo die drei anderen gearbeitet haben, habe ich leider wieder vergessen.

burnersk hat eine kurze Tech-Demo gegeben: Er hat eine kleine Anwendung mit Dancer und DBIx::Class geschrieben. Für mich war das interessant, weil ich eher zu den Mojolicious-Anhängern gehöre und noch nicht so viel mit Dancer zu tun hatte.

Es sah ganz nett aus, da Dancer mir -- soweit ich weiß -- keinen Vorteil bringt, bleibe ich bei Mojolicious. Aber der Vortrag hat mich auch wieder daran erinnert, dass ich mit Corion mal einen kleinen Dancer/Mojolicious-Shootout machen wollte.

Jedenfalls will burnersk mit der Anwendung seine "Haushaltsausgaben" tracken und sich dann Einsparvorschläge machen lassen.

Nach dem Essen habe ich kurz ein paar Sachen von mir vorgestellt: Zum einen OPAR, einem Repository für freie OTRS-Erweiterungen. Eigentlich habe ich das nur kurz vorgestellt, weil einer der Anwesenden erzäht hat, dass "sein Unternehmen" OTRS einsetzt. Wir haben uns auch kurz darüber unterhalten, dass es nicht so einfach ist, Patches im OTRS-Kern unterzubringen.

AUf der OTRS-Mailingliste habe ich jetzt gelesen, dass das OTRS-Repository auf Github.com wandern soll. Dann wird es hoffentlich einfacher, Patches einzureichen und dass diese auch in den Kern eingepflegt werden.

Nach OPAR habe ich dann perlybook.org vorgestellt. Mit dieser Seite kann man die Dokumentationen von CPAN-Modulen als ebook (.mobi oder .epub) bekommen.

burnersk hat seinen E-Book-Reader rausgeholt und mal kurz gezeigt, wie die Dokumentation dann auf so einem Reader aussieht. Es macht mir natürlich Freude zu sehen, dass perlybook.org tatsächlich verwendet wird (und nicht nur von mir).

Auch die Perl-Tutorials von perltuts.com gibt es hier als EBooks. Vielleicht auch mal hier der Aufruf an alle, Ideen zu liefern was man noch so einbinden könnte. Wir können relativ einfach alle POD-Quellen einbinden,
Aktuell arbeite ich in meiner Freizeit an einer GithubT-Integration. Viel Dokumentation findet man einfach auf Github. Auch die Texte für den Perl-Adventkalender liegen dort.

Wo wir schon bei Github waren, habe ich auch gleich auf ein Modul hingewiesen, das momentan nur auf Github und nicht auf CPAN zu finden ist: Excel-Reader-XLSX von John McNamara (der auch Spreadsheet::WriteExcel macht). Es gibt zwar einen XLSX-Parser auf CPAN, aber der verbraucht extrem viel Speicher. Bei einem Kunden hat das mal den gesamten Server lahmgelegt. John McNamara sagt zwar, dass das Modul noch im Beta-Status ist, aber es funktioniert einwandfrei.

Ansonsten haben wir uns viel über Ausbildung, (schlechte) Berufsschulen und die aktuelle Situation von Unternehmen die Perl-Programmierer suchen. Es ist für diese immer noch sehr schwer wirklich Perl-Leute zu finden.

Weitere Themen, die mir jetzt so spontan einfallen:

 * Stackoverflow
 * Perlprogrammierende Inder
 * Hotels/Hostels in Hannover
 * airbnb

Mir hat das Treffen viel Spaß gemacht und ich freue mich, einige im nächsten Monat auf dem Deutschen Perl-Workshop wiederzutreffen. Danke @HannoverPM

Monday, February 11, 2013

Helau! - Frühjahrsausgabe des Perl-Magazins ist da...

In wenigen Tagen beginnt die Fastenzeit, aber auf das Perl-Magazin muss man nicht verzichten. Die Frühjahrsausgabe 2013 des Perl-Magazins (http://perl-magazin.de) ist da...


Inhalt dieser Ausgabe:

 * Ist Dein Code Perl-5.18-sicher?

   Am Hashing ändert sich in Perl 5.18 einiges. Für den normalen Programmierer kaum sichtbar, kann es in wenigen Fällen doch zu Problemen kommen - wenn man sich auf die Reihenfolge von Schlüsseln verlässt.

 * HowTo - Algorithm::CheckDigits

   Thomas Fahle stellt das Modul Algorithm::CheckDigits vor, dass die Überprüfung von Prüfziffern z.B. von ISBN oder Kreditkarten umgesetzt werden kann.

 * SEX: Stream EXchange mit F*EX

   Mit F*EX können beliebig große Dateien an beliebige Empfänger verschickt werden. Ullrich Horlacher stellt mit SEX eine Erweiterung vor, mit der ein Datenstrom an einen Empfänger geleitet werden kann.

 * Mojolicious Tutorial - Teil 2

   In diesem Teil des Mojolicious-Tutorials wird das erste Formular umgesetzt. Dabei wird auch gezeigt, wie man auf die unterschiedlichen Parameter (Route, GET und POST) zugreifen kann. Außerdem werden die Unterschiede verschiedener Umgebungen aufgezeigt. Schließlich werden noch die ersten Plugins für Mojolicious vorgestellt.

 * Synchrone Operationen sind überholt

   SawyerX gibt eine Einführung in asynchrone Programmierung. Dazu verwendet er das Modul AnyEvent.

 * Rezension - Leidenschaft und Perl

   Auch in dieser Ausgabe stellt Herbert Breunung zwei Bücher vor: Der leidenschaftliche Programmierer ist kein Perl-Buch, könnte aber trotzdem interessant sein. Perl ist ein Buch aus dem mitp-Verlag -- genau wie das erstgenannte Buch -- das eine Einführung in Perl gibt.

 * Rezension - SQL Performance Explained

   Das Buch "SQL Performance Explained" wird vorgestellt.

 * TPF News

   Jede Menge Neuigkeiten aus der Perl Foundation.

 * CPAN-News

   Neben zwei ausführlicheren Vorstellungen werden wieder vier weitere neue Module auf dem CPAN vorgestellt.