Archive for the ‘Perl’ Category

Fukuoka Perl Workshop #24 行ってきた(あと、自分の知ってる昔話)

行ってきました。
Fukuoka Perl Workshop #24 YAPC::Asia レポート 2013

そういえば、YAPC::Asiaをやるって知ったのが、ちょうど千葉に行くその日の朝だったんだよなあと。(笑)


YAPC::Asiaの話をきいて。
来年は是非都合付けて参加したいなと思いました。
と……その前に。


懇親会でみんなノリノリでありました。

イベント参加して思ったこと。
Perl歴はアホみたいに長いのですが(たぶん1993〜4年あたりから…だから、20年近くいってるねwww。途中に若干ブランクはありますが…)、ひたすらレガシーなPerlしかいじってこなかったので、もっとモダンなPerlについて知らないとアカンなあ、ということでした。
次回までには時間作っていろいろやってみようかなと。

ちなみに。
CGIよりもfmlを使ったのが最初でしたね。
まだバージョン4だった頃だったよねと思ったらやっぱりそうでした。
Perlの歴史 Perl 1,2,3,4
このスライドを見ててなつかしくなっておりました。

perlでのsignal処理

$SIG で対応。

ループをCtrl-Cで抜ける場合、SIGINTが送られますので、$SIG{INT} に無名サブルーチンをセットすればOK。

プログラムは、こんなかんじになります。

#!/usr/bin/perl

@nonosirare = ( 
                "くず",
                "ばーか",
                "すけべ",
                "ばか",
                "しんじらんない",
                "あ゛ん?",
                "おたんこなす",
                "だいっきらい",
                "いいかげんにしたら",
                "モジモジしてキモイねー",
                "はげろ",
                "なにえらそうなこといってんの",
                "でてって",
                "くず",
                "むしんけー",
                "は?",
    );

local $SIG{INT} = sub { $l = 0; };         # localはなくても大丈夫?

$c = 0 ;
$l = 1 ;
while($l)
{
    $j = $nonosirare[ int(rand($#nonosirare + 1)) ] ;
    print $j ;
    $c ++ ;
}

print "\n\n" ;
printf( "%d回罵られました。ありがとうございます。\n" , $c);

実行し、Ctrl-CしてSIGINTを送ったり、kill -INT (pid) してSIGINTを送ったりすると、ループから抜けてループを回した回数が表示されます。
一番下に回数が出てる

Perlでリモートのsyslogサーバにsyslogを送りつける

CPANのSys::Syslogを使えば一発。

リモートのsyslog(UDP経由)を受けられるsyslogdが稼働してるホストを loghost として。

#!/usr/bin/perl

use Sys::Syslog ;
use Sys::Syslog qw(:standard :macros) ;

Sys::Syslog::setlogsock( "udp" , "loghost" ) ;

Sys::Syslog::openlog( 
         'testsyslog33' ,
         'nowait' ,
         'local0' ) ;

Sys::Syslog::syslog( 'info' , "homu!homu!homuhomu!" ) ;

Sys::Syslog::closelog() ;

こんなかんじで書けば、loghostのsyslogdにこんなかんじで出てくる。

Nov 24 09:31:56 localhost.local testsyslog33: homu!homu!homuhomu!

FacilityとLevelについては適当にやったけど、このへんはRFC3164とか見てくれ。
(ってかsyslog扱うんならこのへん知ってる前提で)

Yahoo!JAPANのOpenIDが急に動かなくなった人へ

PerlでNet::OpenID::Consumer を使ってOpenIDの認証をしてるケースです。

つい先日あたりから(判明したのは今日)、

naive_verify_failed_return

を返してエラーになってしまいます。

なんでか、って延々と調べてたら・・・わかりました。
Need help deciphering this LiveJournal OpenID error

It comes from this line:

        return $self->_fail("naive_verify_failed_return") unless $args{'lifetime'};

So it did a dumb-mode (stateless) check_authentication request to your
server, but wasn’t able to find a “lifetime:\n” row where was
non-zero.

lifetimeがかえってないよー(または返すモードになってないよー)、ってかんじです。
Consumer.pmを再度確認。該当の記述はこちら。

        return $self->_fail("naive_verify_failed_return") unless
            $args{'is_valid'} eq "true" ||  # protocol 1.1
            $args{'lifetime'} > 0;          # DEPRECATED protocol 1.0

はい・・・そういうことです。

早い話が、ローカルに認証用のキャッシュ持たせないとだめっす。
というわけで、オブジェクト作ってるところでキャッシュを作るようにすればOK。

use CGI;
use LWP::UserAgent;
use Net::OpenID::Consumer;
use Cache::File ;

my $csr = Net::OpenID::Consumer->new(
  ua => LWP::UserAgent->new,
  cache => Cache::File->new( cache_root=>'/tmp/opicache',
                             default_expires=>'6000sec'      ) ,
  args => $query,
  consumer_secret => "hogehogehoge" ,
  required_root => "https://example.com/" ,
  minimum_version => 2.0
  );

参考:ソースから読むOpenID (1) – Yet Another Hackadelicなど