Ubuntu 11.04 下使用 App::perlbrew 安裝 Perl 5.12.3

感謝 gugod 提供的新版把 Ubuntu 11.04 (Natty) 下無法 compile 的問題搞定了:「Ubuntu 11.04 and perlbrew installation problems」。主要的原因在於 library 放置的路徑改變,造成 PerlConfigure 抓不到。

順便紀錄一下,有時 CPAN mirror 更新不夠快,cpanm 安裝可能會失敗,這個問題加上 cpan.cpantesters.org mirror 就可以解決:(放到 .bashrc 裡)

export PERL_CPANM_OPT="--mirror http://cpan.nctu.edu.tw/ --mirror http://cpan.cpantesters.org/"

Perl 的 eval

沒有把 eval 的 manual 弄清楚,結果中了不少槍... 以這段 code 來說:

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

sub a {
    eval {
        return 'Inside eval';
    };

    return undef;
}

print Dumper a();

__END__

輸出結果會是 undef,而非 Inside eval,因為:

the value returned is the value of the last expression evaluated inside the mini-program; a return statement may be also used, just as with subroutines.

沒專心看 manual 的結果 XD

不過這還是沒解決我遇到在 eval 裡面仍然會因為 croak 而結束的情況... 再加油吧 :o

DotCloud 提供 Perl (PSGI) PaaS 服務...

DotCloud 在官方的 blog 上宣佈提供 Perl PaaS:「DotCloud introduces Camel-as-a-Service with its new Perl stack」,這應該是第一個 Perl Paas,也應該跟 miyagawa (PSGI 協定的建立者與維護者) 加入 DotCloud 有些關係。

協定是 PSGI,系統目前是用 nginx 加上 uWSGI。目前只有 web 端的部份可以用 Perl,Worker 還不行。

等帳號下來後再來玩看看...

幾個使用 LWP (WWW::Mechanize) 的好習慣...

WWW::Mechanize 是繼承 libwww-perl 中 LWP::UserAgent 的工具,所以這個方式通用於兩者...

首先是在取得資料時加上 Accept-Encoding: gzip 的 header,這可以在產生物件時指定,之後就都會送出:

my $ua = LWP::UserAgent->new;
$ua->default_header('Accept-Encoding' => 'gzip');

取回後直接透過 HTTP::Response 的 decoded_content 幫你處理:

my $res = $ua->get($uri);
my $msg = $res->decoded_content;

取回的 $msg 會是 Perl internal encoding,要變成 UTF-8 還需要透過 Encodeencode('utf8', $msg)

這樣只要 server-side 有支援 gzip 就會自動壓縮並且在本地端解開,沒壓縮也沒關係,HTTP::Response 會依照 Content-Type 處理。

Updateclkao 指出 WWW::Mechanize 預設值就會包括 gzip 設定,剛剛拿 code.jquery.com 測試沒錯。

Twitter 轉 Plurk 的程式...

程式在這裡,用 Perl 寫的,讀 Twitter 的 RSS feed 然後丟上 Plurk

另外裡面用到的 SQLite schema 是:

CREATE TABLE entry (id INTEGER PRIMARY KEY AUTOINCREMENT, guid VARCHAR, updated BOOLEAN);

其中 updated 欄位是沒用到的,但我暫時懶的改了...

btw,寫這個程式讓我對 Plurk 的資安感覺到絕望 XD

在 Perl 裡用 LWP::UserAgent (以及繼承它的模組) 時使用 HTTPS 連線處理 CA 認證...

libwww-perl 裡的 LWP::UserAgent 可以處理 HTTPS,並利用 CA 驗證 public key 是否簽過。在 FreeBSD 下安裝 ca_root_nss 後可以在 /usr/local/share/certs/ 下看到檔案,於是可以這樣用:

#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;

INIT {
    my $ua = LWP::UserAgent->new;
    $ua->ssl_opts(SSL_ca_file =>
        '/usr/local/share/certs/ca-root-nss.crt');

    my $res = $ua->get('https://mail.google.com/mail/');
    print $res->content;
}

Debian 或是 Ubuntu 下則是透過 ca-certificates 裝到 /etc/ssl/certs/ 下,並且分成很多檔案,這時候本來的 ssl_opts 就要改成 SSL_ca_path => '/etc/ssl/certs/';

PS:FreeBSD 上因為是單檔,依照 SSL_CTX_load_verify_locations(3) 這邊的說明,沒辦法用 CApath...

CPAN 官方支援 Syntax Highlighter...

剛剛看到 CPAN 網站上直接由官方支援 Syntax Highlighter:Syntax highlighting for search.cpan.org,雖然目前的 UI 做的並不太好 (選擇 theme 的選擇條應該是上下都要有,目前只有最下方),但仍然是進步不少...

之前的 Greasemonkey script 在 Firefox 4.0 上爛掉 (因為 async loading 的關係),本來還在想要怎麼處理,現在看起來就用官方提供的就好了...

多使用 namespace::clean 與 namespace::autoclean

純粹實際驗證用:

因為 Carp 預設會將一些函式 export 到現有的 namespace 下,如果不使用 namespace::clean 或是 namespace::autoclean 這類工具幫你清除,會造成 namespace 與 object 內帶有這些函式。

結果是:

可以看到沒有 B 沒有 clean 導致外面 (package main) 可以看到 carp

其實這篇是要測 pastie 是不是比 Gist 好用... :o

加速 Perlbrew 安裝 Perl 的速度

Perlbrew 0.18 其中一項很重要的功能,是在 install perl 時可以使用 -j 的參數,像是這樣:

perlbrew --force install -j 4 perl-5.12.3

-j 這個參數會傳給 make,同時跑的 job 數量。(make 會處理 dependency 問題,理論上不會有問題)

Linode 512 上面 (Debian 64bits) 只用了 7 分鐘就把 Perl 5.12.3 裝完了 (之前是 21 分鐘),時間就是金錢啊... 細節可以參考 0.18 的 Changes 的說明。