ちょっと Perl 書いた。

最近、ネットがつながっていなくても、好きなタイミングでCPANモジュール入れてプログラミングしたいと思い、CPAN::Miniを入れてます。だけど、普段はネット繋がってるのでローカルのミラーが古くなるといやだなと思って、シェルを立ち上げたときに、minicpan を実行するか聞いてくれるようにしてみました。
あと、Amon2とかどんどん便利になってそうなので常に最新版を使えるように cpan-outdated | cpanm とかも実行するか聞かれるようにしてみました。適当ですが下記の感じ。

余談ですが、こういうツール類のインストールとかは @hidek さんのブログが網羅的な感じでいいかんじだと思いました。
http://blog.hide-k.net/archives/2010/11/perl_3.php

#!/usr/bin/env perl
use 5.14.0;
use warnings;

my @cmds = (
    'minicpan',
    'cpan-outdated | cpanm'
);

ask_and_go($_) for @cmds;

sub ask_and_go {
    my $cmd = shift;
    print "Do you want to run `$cmd` ? [no]: ";
    chomp(my $input = <>);
    return unless $input ~~ /^y/i;
    say `$cmd`;
}


以下、実行結果。

Last login: Thu Nov 10 16:41:56 on ttys000
Do you want to run `minicpan` ? [no]: y
Updating /Users/hirofumi/mirrors/cpan/
Mirroring from http://ftp.riken.jp/lang/CPAN/
===============================================================
authors/01mailrc.txt.gz ... resulted in an HTTP error with status 500
http://ftp.riken.jp/lang/CPAN/authors/01mailrc.txt.gz: 500 Server closed connection without sending any data back
modules/02packages.details.txt.gz ... updated
modules/03modlist.data.gz ... up to date
authors/id/B/BI/BINGOS/POE-Component-SmokeBox-Recent-1.34.tar.gz ... updated
authors/id/B/BI/BINGOS/CHECKSUMS ... updated
authors/id/B/BR/BRADH/Sub-Mage-0.004.tar.gz ... resulted in an HTTP error with status 500
http://ftp.riken.jp/lang/CPAN/authors/id/B/BR/BRADH/Sub-Mage-0.004.tar.gz: 500 Server closed connection without sending any data back
authors/id/D/DA/DANAJ/Data-BitStream-0.04.tar.gz ... updated
authors/id/D/DA/DANAJ/CHECKSUMS ... updated
authors/id/D/DA/DANAJ/Data-BitStream-XS-0.02.tar.gz ... updated
authors/id/D/DR/DRSTEVE/Net-LastFMAPI-0.2.tar.gz ... updated
authors/id/D/DR/DRSTEVE/CHECKSUMS ... updated
authors/id/G/GN/GNUSTAVO/modules/SVN-Hooks-1.10.tar.gz ... updated
authors/id/G/GN/GNUSTAVO/modules/CHECKSUMS ... updated
authors/id/J/JA/JAK/File-Value-1.02.tar.gz ... updated
authors/id/J/JA/JAK/CHECKSUMS ... updated
authors/id/J/JJ/JJNAPIORK/MooseX-Role-BuildInstanceOf-0.07.tar.gz ... updated
authors/id/J/JJ/JJNAPIORK/CHECKSUMS ... updated
authors/id/K/KE/KENTARO/Module-Install-PrePAN-0.01.tar.gz ... updated
authors/id/K/KE/KENTARO/CHECKSUMS ... updated
authors/id/L/LE/LECSTOR/PDF-Boxer-0.002.tar.gz ... updated
authors/id/L/LE/LECSTOR/CHECKSUMS ... updated
authors/id/L/LL/LLAP/Plack-Middleware-TemplateToolkit-0.25.tar.gz ... updated
authors/id/L/LL/LLAP/CHECKSUMS ... updated
authors/id/M/MA/MARKSTOS/CGI.pm-3.57.tar.gz ... updated
authors/id/M/MA/MARKSTOS/CHECKSUMS ... updated
authors/id/M/MD/MDOOTSON/Alien-wxWidgets-0.54.tar.gz ... updated
authors/id/M/MD/MDOOTSON/CHECKSUMS ... updated
authors/id/M/MD/MDOOTSON/Wx-0.9903.tar.gz ... updated
authors/id/M/MI/MIRK/Net-Z3950-SimpleServer-1.15.tar.gz ... updated
authors/id/M/MI/MIRK/CHECKSUMS ... updated
authors/id/N/NE/NEIKON/Algorithm-KNN-XS-0.01001.tar.gz ... updated
authors/id/N/NE/NEIKON/CHECKSUMS ... updated
authors/id/P/PJ/PJB/MIDI-ALSA-1.13.tar.gz ... updated
authors/id/P/PJ/PJB/CHECKSUMS ... updated
authors/id/R/RE/REEDFISH/Net-FullAuto-0.9981.tar.gz ... updated
authors/id/R/RE/REEDFISH/CHECKSUMS ... updated
authors/id/R/RE/REID/Algorithm-Pair-Best-1.036.tar.gz ... updated
authors/id/R/RE/REID/CHECKSUMS ... updated
authors/id/R/RK/RKITOVER/DBIx-Class-Schema-Loader-0.07012.tar.gz ... updated
authors/id/R/RK/RKITOVER/CHECKSUMS ... updated
authors/id/R/RW/RWSTAUNER/Dist-Zilla-Plugin-Run-0.013.tar.gz ... updated
authors/id/R/RW/RWSTAUNER/CHECKSUMS ... updated
authors/id/S/SM/SMUELLER/Math-ConvexHull-MonotoneChain-0.01.tar.gz ... updated
authors/id/S/SM/SMUELLER/CHECKSUMS ... updated
authors/id/S/SQ/SQUEEK/App-CPAN-MetaDB-0.01.tar.gz ... updated
authors/id/S/SQ/SQUEEK/CHECKSUMS ... updated
authors/id/T/TO/TOBYINK/HTML-HTML5-Microdata-ToRDFa-0.100.tar.gz ... updated
authors/id/T/TO/TOBYINK/CHECKSUMS ... updated
authors/id/T/TO/TOBYINK/RDF-Prefixes-0.002.tar.gz ... updated
authors/id/T/TO/TOKUHIROM/Amon2-3.22.tar.gz ... updated
authors/id/T/TO/TOKUHIROM/CHECKSUMS ... updated
authors/id/W/WR/WROG/Net-OpenID-Common-1.14.tar.gz ... updated
authors/id/W/WR/WROG/CHECKSUMS ... updated
authors/id/Z/ZI/ZIGOROU/Test-Mock-Guard-0.07.tar.gz ... updated
authors/id/Z/ZI/ZIGOROU/CHECKSUMS ... updated

Do you want to run `cpan-outdated | cpanm` ? [no]: y
--> Working on T/TO/TOKUHIROM/Amon2-3.22.tar.gz
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Amon2-3.22.tar.gz ... OK
Configuring Amon2-3.22 ... OK
Building and testing Amon2-3.22 ... OK
Successfully installed Amon2-3.22
1 distribution installed

YAPC Asia 2011 Tokyo に参加してきた


Perlのお祭りYAPCに今年初めて行ってきました。
遠方からの参加者支援制度で旅費を支援していただき、LTをするチャンスをいただきました。


以前、tokuhiromさんが福岡にいらしたときに「どうせくるなら何かトークした方がいい」
自分のアピールでも、作った物を知ってもらう為でも、何かの目的でトークしたらいんじゃないか
みたいな事を言ってたと思うので、LTなんかしたことないけどやってみようと思いました。


LTの内容は最近やってる事、研究成果、地域の憂いなど何でも良いということだったので
地域の憂いについてやろうかなと決めました。スライドはYAPCの2、3日前にちゃちゃっと
作っていたのですが、前夜祭、初日、懇親会と参加して感動し、いろいろと考えさせられ
結局全部作り直して原稿からスライドを起こして何度もリハーサルしてビールかっくらって
臨みました。アラームをちょうどご清聴ありがとうございましたで鳴らすつもりだったのに
4分ちょいで終わってしまいましたが。。。


5人くらいの方に素晴らしかったとお褒めをいただき、とても嬉しかったです。
半分自分に対して言っているような気持ちで書きました。
同じような境遇や考えの人がいたら友達になれると嬉しいです。
招待LTだし動画が上がるかわかりませんがスライドはこれです。


最後のhidekさんのキーノートも聞けて良かったです。きっと良いマネージャでないと
人気者とかならないはずですから。僕の会社にはPerlハッカーはいないし、僕自身も
まだまだなので、プレーイングマネージャな時期がしばらく続くと思うけど、自分は
その方向で進んでいるので今後も参考にさせてもらいたいなと思います。
Being Geek 注文しちゃいました。


この日記を書いて僕の YAPC Asia 2011 はようやく終了です。
そして YAPC Asia 2012 の始まりなのかもしれません。
いろいろほんとに頑張りたい。

来年はどこで開催されるんでしょうか。
楽しみです。

  • -

10月25日追記
YAPCでLTでもすると、他にもちょこっと嬉しい事あるかもよ。ってことで事例をひとつ。


サンバダンサーに囲まれながらコーディングしてる画を妄想してしてしまいましたw
こんな感じ

Plack::Middleware::ExceptionNotice というのを書いた

以前に作りっぱなしだったやつがあまりにもやりっぱなしだったので、ちょこっと考え直してみた。

書いた理由は、plackup -E deployment app.psgi とかで起動した場合に、例外が発生したらメールで通知して欲しかったからなんだけど、そんなもの既にあるよとか、本来そんなやり方するものじゃないとかツッコミがいただけると幸いです。それ以外にもまずいところがあったら教えて下さい。

実装はこんな感じ。
Plack::Middleware::ExceptionNotice

package Plack::Middleware::ExceptionNotice;
use strict;
use warnings;
use parent qw/Plack::Middleware/;
use Plack::Util::Accessor qw( notifier );
use Class::Load;

sub call {
    my($self, $env) = @_;

    my $res = $self->app->($env);
    my $stacktrace = $env->{'plack.stacktrace.text'};
    return $res unless $stacktrace;

    Class::Load::load_class($self->notifier);
    die $self->notifier->notice($stacktrace) ||
        'Exception notifier does not return the results.';
}

1;


使い方はこんな感じ。
app.psgi

builder {
    enable "HTTPExceptions";
    enable 'ExceptionNotice',
        notifier => 'MyApp::ExceptionNotifier';
    enable "StackTrace";
    $app;
};

Plack::Middleware::StackTrace は例外が発生すると plack.stacktrace.text をセットするので、その有無で通知を行います。通知を行う方法は自由で notice というメソッドを実装したクラスを指定します。


今回作ってみた通知用のクラスはこんな感じ。
MyApp::ExceptionNotifier

package MyApp::ExceptionNotifier;
use strict;
use warnings;
use Email::MIME;
use Email::Send;

sub notice {
    my ($self, $e) = @_;
    my $email = Email::MIME->create(
        header      => [
            From    => 'from@example.com',
            To      => 'to@example.com',
            Subject => 'raise exceptions',
        ],
        attributes => {
            content_type => "text/plain",
            charset      => "utf-8",
            encoding     => '8bit',
        },
        body_str => $e,
    );

    my $sender = Email::Send->new({mailer => 'Sendmail'});
    $sender->send($email) or die $!;
    return 'noticed exception.';
}

1;

supervisord enviromment

http://supervisord.org/subprocess.html?highlight=enviroment
上記のよればサブプロセスの環境変数の設定ができるらしいがうまくいかなかった。

Amazon Linux AMI 32bit
supervisord 3.0a10

親プロセスの環境変数は引き継げるようなので、supervisord.conf にて同等の設定を行い、kill -HUP すると環境変数が設定された。

他に方法ないかなー

Plack::Middleware::ExceptionNotifierというのを書いた


2011/10/12 追記
あまりにもやりっぱなしなのでこっちで考え直したものを晒してます。←突っ込みはこちらで

enable 'Plack::Middleware::ExceptionNotifier',
          from => 'from@example.com',
          to => 'to@example.com';

みたいにして使ってみます。

package Plack::Middleware::ExceptionNotifier;
use strict;
use warnings;
use parent qw/Plack::Middleware/;
use Devel::StackTrace;
use Try::Tiny;
use Email::MIME;
use Email::Send;
use Plack::Util::Accessor qw( from to );

our $StackTraceClass = "Devel::StackTrace";

sub call {
    my($self, $env) = @_;

    my $res = try {
        $self->app->($env);
    } catch {
        my $caught = $_;
        my $cut = sprintf ' at \Q%s\E line %s\.\n', (caller)[1, 2];
        $caught =~ s/$cut//;
        my $trace = $StackTraceClass->new(
            indent => 1, message => $caught,
            ignore_package => __PACKAGE__,
        );
        local $SIG{__DIE__} = 'DEFAULT';
        $self->notice($trace->as_string);
        die $_;
    };

    return $res;
}

sub notice {
	my ($self, $e) = @_;

    my ($subject) = $e =~ /([^\n]+)/;
    my $email = Email::MIME->create(
        header      => [
            From    => $self->from,
            To      => $self->to,
            Subject => $subject,
        ],
        attributes => {
            content_type => "text/plain",
            charset      => "utf-8",
            encoding     => '8bit',
        },
        body_str => $e,
    );

    my $sender = Email::Send->new({mailer => 'Sendmail'});
    $sender->send($email) or die;
}

1;

ディレクトリ名を再帰的に小文字にするワンライナー

世の中にはワンライナーごときでブログを書いてる人もいるもんだなと思って自分も書いちゃう系。

perl -MFile::Find -le 'find sub {return unless -d && /[A-Z]/;rename $_, lc $_}, @ARGV' .

findとかでやるにはどうすんだ?

supervisordの自動起動について

supervisordの自動起動について調べてたらDebianUbuntu用の起動スクリプトの情報がヒットする。
http://ja.w3support.net/index.php?db=sf&id=96499

参考にして自作する手もあるが、面倒だしバグも出るかもしれないので /etc/rc.local に追記する事にした。

ちなみにsupervisordはSIGTERMを受け取るとサブプロセスを終了させて停止するみたいなので、シャットダウン時にサブプロセスが強制終了するようなことはなさそう。
http://supervisord.org/running.html (一番下の方