perlbrewのproxy対応

perlbrew (http://search.cpan.org/~gugod/App-perlbrew/)を教えてもらって便利そうなので使ってみたけど、proxy対応していなかったので、環境変数から呼ぶようにしてみました。
これで環境変数にhttp_proxyがあればproxy使ってくれます。
もう少し真面目に書いてCPANにパッチ送ろうかな。。。

注意点としては、HTTP::Liteのproxyメソッドが、http://host:port/ のフォーマットを前提にしているので、最後にスラッシュがないとうまく動きません。(昔yumもそんなんだったな。。。)

$ diff -ub perlbrew.orig perlbrew

--- perlbrew.orig       2010-05-31 18:36:45.630114803 +0900
+++ perlbrew    2010-05-31 18:40:10.086114474 +0900
@@ -922,6 +922,7 @@
             my $http_get = sub {
                 my ($url, $cb) = @_;
                 my $ua = HTTP::Lite->new;
+                $ua->proxy if exists $ENV{http_proxy};
 
                 my $loc = $url;
                 my $status = $ua->request($loc) or die "Fail to get $loc";

Perl Quiz

ネタをふられたので回答
http://d.hatena.ne.jp/hirafoo/20100319/1269007390

問題は以下参照

http://quill.to/yoshiki/0a66f62e14

びみょーなかんじだけど

再起の場合

$key =~/\./ ?  foo($a_ref->{$`}, $', $value) : ($a_ref->{$key} = $value);

evalの場合

$key=~s/\./}->{/g ? eval"\$a_ref->{$key} = $value" : ($a_ref->{$key} = $value);

ーー追記ーー
暗号といわれたので長い変数版

再起の場合

use English; # use のところに書いてください
$key =~/\./ ?  foo($a_ref->{$PREMATCH}, $POSTMATCH, $value) : ($a_ref->{$key} = $value);

引越し手続き

一括で手続きできるサービス発見!

引越しコンシェルジェ
http://www.tepore.com/hikkoshi/renraku/

引越しの事務手続きってかなり面倒くさいので手続き代行のサービス作りたいけど、個人でできないからなーと思っていたんですよね。
が、NTTやら銀行やらクレジットカードやら携帯電話やら対応してないもの多すぎ。

対応しているところは既に自力で手続きした後だったorz

今後に期待!

terminfo & ncurseのバージョンあげた

cygwinで追加のパッケージ入れようとしたら、terminfoとncurseのバージョンあがってた。
おかげでterminfoのディレクトリ構造が変わり、zshvimの挙動が悲惨な感じになった。

zshが補完のたびにプロンプトが崩れていくのは作業する気力がなえていく。。。

解決策

~/.terminfoに必要なファイルを配置する

また使うかも知れないので以下の感じでコマンド登録しといた。

make_terminfo () {
        for CHAR in `find /usr/share/terminfo -type f | xargs -n 1 basename | perl -le '%hash; while(<>){/^(.)/; $hash{$1}=1;} print join("\n",keys %hash)'`
        do
                mkdir -p ~/.terminfo/$CHAR
                find /usr/share/terminfo -type f -name "$CHAR*" -exec cp {} ~/.terminfo/$CHAR \;
        done
}

WWW::Mechanize + Proxy 認証

某サイトからデータ引っ張ってくるためにWWW::MechanizeとWeb::Scraperでコーディングした。

Mech + Proxy認証でハマったところ。。。

clone
my $mech_clone = $mech->clone

上記でcloneを作成すると、Proxyの設定はしてくれない。

そのため、元々のオブジェクトにおいてproxyメソッドでproxyを設定した場合は、プロキシを利用しない。
また、環境変数を設定しておきnewでenv_proxyを呼ばせて自動設定させた場合は、proxy認証部分(http://foo:bar@proxyhost:proxyportのfoo:bar部分)にアクセスしようとする。

実際の動作としては、$mech->{handlers}->{request_preprepare}にLWP::UserAgent::Proxyオブジェクトが入らない。

これは、$mech->cloneではLWP::UserAgentのcloneメソッドを利用している(下記参照)のでLWPのバグor仕様っぽい。

use base 'LWP::UserAgent';

--snip--

sub clone {
    my $self  = shift;
    my $clone = $self->SUPER::clone();

    $clone->cookie_jar( $self->cookie_jar );

    return $clone;
}

cloneするのにいちいちproxyを設定しなおすのも嫌なのでmechがproxyを持っていたら再度設定するように書き直した。

こんな感じ。

sub mech_fixup {
    package WWW::Mechanize;
    no warnings 'redefine';
    *clone = sub {
        my $self  = shift;
        my $clone = $self->SUPER::clone();

        $clone->cookie_jar( $self->cookie_jar );

        if(exists $self->{proxy}){
            while(my ($k, $v) = each %{$self->{proxy}}){
                $clone->proxy([$k],$v);
            }
        }
        return $clone;
    }
}

Web::Scraperのドキュメント

Podが充実してないので若干使いにくい。
ぐぐれば山ほど出てくるし、ソース読めばいいとはいえPod充実させてほしいなぁ