nDiki : Perl 5.8.8

Perl 5.8.8

2006年1月31日リリース。

Windows 用としては ActivePerl がある。

メモ

Perl 5.8.8 に同梱されている CGI.pm 3.15 には PATH_INFO の処理に致命的なバグがある。PATH_INFO正規表現のメタ文字が現れることがあるようなアプリケーションの場合は対策をとる必要がある (記事)

関連情報

2006年2月11日 (土)

野良パッケージと依存 Perl モジュールのインストールセット をCPAN::Site

WiKickerオフラインで簡単にインストールできるようにしたい。 WiKicker 自体は

 perl Makefile.PL
 make
 make test
 make install

で簡単にインストールできるのだが、事前に CPAN にある依存 Perl モジュール(とそれらが依存している Perl モジュールら)をインストールしておかなければならない。

オンライン環境では CPAN.pm を使って芋蔓式にインストールできる。 WiKicker は次回のリリースから Module::Install を採用するので、perl Makefile.PL 時にそれらを行うことができるようにもなる。

しかしオフライン環境になると、話は変わってくる。

普通にやろうとするとあらかじめ依存関係を全部洗い出して事前にダウンロードしておき、依存関係の順番を考えながらインストールしていかなければならない。

これがかなり面倒。しかも各モジュールのバージョンアップにともない、その時その 時で変化する可能性があるので、適宜確認しなければならない。

でれば CPAN.pm の力を借りたい。

CPAN.pm はインストール時に $CPAN::Config->{keep_source_where} (通常 ~/.cpan/sources) に溜め込むので、これを CD-ROM 等に書き込んでオフラインインストールで使用することができる (cf. perldoc CPAN)。

だいたいはこれでうまくいくのだが問題もあって、この方法だと(WiKicker などの)野良パッケージを、うまく一緒にすることができない。

野良パッケージを扱うには CPAN::Site、あるいは CPAN::Mini::Inject あたりを使えば良さそうだ。

今回はまず、CPAN::Site での手順を調べてみる。

~/perl-5.8.8 以下にクリーンな Perl 5.8.8 をインストールしてインストールセットを作成していく。

CPAN::Site をインストールする (オンライン)

 rm -rf ~/.cpan
 ~/perl-5.8.8/bin/perl -MCPAN -e shell
 cpan> install LWP
 cpan> install CPAN::Site
 cpan> exit

これで CPAN::Site が使えるようになるとともに、CPAN::Site と LWP および依存モジュールのソースアーカイブが ~/.cpan/sources 以下にたまる。

WiKicker のインストール中に libwww-perl を途中で入れると CPAN.pm が使ってこともあってかうまくいかないので、先に一緒に入れてしまう。

インストールしたい野良パッケージ用のローカル CPAN サーバを作成する

野良パッケージら (今回は WiKicker のみ)を含んだ ローカル pseudo CPAN サーバを作成する。

 mkdir -p ~/public_html/CPAN/authors/id/N/NA/NANEY
 cp WiKicker-0.xx.tar.gz ~/public_html/CPAN/authors/id/N/NA/NANEY
 ~/perl-5.8.8/bin/mkpackages ~/public_html/CPAN

CPAN::Site に含まれている mkpackages を使うことで、CPAN::Site が参照することのできるインデックスファイルが作成される。

WiKicker と依存するモジュールをインストールする (オンライン)

次に ローカル CPAN サーバと、CPAN (ミラー) からパッケージを自動ダウンロードしてインストールする。ここでは CPAN.pm のかわりに CPAN::Site を使用する。

 ~/perl-5.8.8/bin/perl -MCPAN::Site -e shell
 cpan> o conf urllist unshift http://localhost/~myname/CPAN
 cpan> reload index
 cpan> install WiKicker
 cpan> exit

ここでローカル CPAN サーバを file:/// 等で指定すると、そこから読みとったファイルは ~/.cpan/sources/ 以下にコピーされないので一箇所にまとめることができないので注意 (かなりはまった)。

これが終わると、WiKicker とそれに必要なファイルが ~/.cpan/sources にたまる。

これを適宜アーカイブして保存する。

オフラインでインストールする

別の環境で例えば /usr/local/perl-5.8.8 にインストールされた PerlWiKickerオフラインでインストールするとする。

先の工程で作成したファイルセットが /tmp/CPAN においてあるものとする。

 /usr/local/perl-5.8.8/bin/perl -MCPAN -e shell
 # 初期化でオフラインのため CPAN ミラーの選択ができずに URL の入力を
 # 求められたところで file:///tmp/CPAN を指定
 cpan> install LWP
 cpan> install CPAN::Site
 cpan> exit

まずは以上で CPAN::Site が入るで、CPAN::Site で shell を起動しなおす。

 /usr/local/perl-5.8.8/bin/perl -MCPAN::Site -e shell
 cpan> install WiKicker
 cpan> exit

これで /tmp/CPAN から芋蔓式に WiKicker がインストールされる。

ポイント

Debian のパッケージリポジトリなどとは違って、CPAN は基本的に「一つのリポジトリおよびそのミラー」という概念しかないようである。 したがってモジュールのインデックスファイルも1組しかなく、複数のサイトから異なるモジュールセットを配布するということができるようになっていない。

これに対し、自前パッケージ群用にも1セットインデックスファイルを作って扱えるようにしようというのが CPAN::Site である。

これを用いると「もう一つのリポジトリ」を扱えるようになるが、逆にいうと利用する場合は CPAN::Site をインストールしなければならないということでもある。

[ 2月11日全て ]

2006年2月12日 (日)

野良パッケージと依存 Perl モジュールのインストールセット を CPAN::Mini::Inject

前回は CPAN::Site を用いたオフライン用インストールセットを作成した。

今回は空の CPANミラーを作り、そこに野良パッケージを突っ込んで使用する形でインストールセットを作成してみる。

~/perl-5.8.8 以下にクリーンな Perl 5.8.8 をインストールしてインストールセットを作成していく。

CPAN::Mini::Inject をインストールする (オンライン)

 perl -MCPAN -e shell
 cpan> install CPAN::Mini::Inject
 cpan> exit

CPAN::Mini::Inject は、インストールセットには必要ない。 ~/perl-5.8.8 にはインストールせずに、普段使っているほうにインストールしておく。

インストールしたい野良パッケージ用のローカル CPAN サーバを作成する (オンライン)

以下スクリプト例(エラー処理などは省略)

 #!/usr/bin/perl -w
 use strict;
 use File::Path;
 use CPAN::Mini;
 use CPAN::Mini::Inject;
 my $remote     = 'ftp://ftp.dti.ad.jp/pub/lang/CPAN/';
 my $local      = '/home/myname/public_html/CPAN';
 my $repository = '/home/myname/repository';
 mkpath([$local, $repository], 1, 0755);
 # module_filters で全てのモジュールを対象外にして、空の CPAN ミラーを作る
 CPAN::Mini->update_mirror(remote => $remote,
                           local  => $local,
                           diremode => 0755,
                           trace => 1,
                           module_filters => [ qr/./ ]);
 my $injector = CPAN::Mini::Inject->new;
 $injector->{config}{remote} = $remote;
 $injector->{config}{local} = $local;
 $injector->{config}{repository} = $repository;
 $injector->{config}{diremode} = 0755;
 # CPAN::Mini::Inject リポジトリに追加したあと、
 # CPAN ミラーへ 注入
 $injector->add(repository => $repository,
               module => 'WiKicker',
               authorid => 'NANEY',
               version => '0.xx',
               file => 'WiKicker-0.xx.tar.gz')
  ->inject;

これで、~/public_html/CPAN に野良パッケージの追加された CPAN ミラーが作成される。

WiKicker と依存するモジュールをインストールする (オンライン)

 rm -rf ~/.cpan
 ~/perl-5.8.8/bin/perl -MCPAN -e shell
 cpan> o conf urllist pop
 cpan> o conf urllist push http://http://localhost/CPAN
 cpan> reload index
 cpan> o conf urllist push ftp://ftp.dti.ad.jp/pub/lang/CPAN/
 cpan> install WiKicker
 cpan> exit

ここでローカル CPAN サーバを file:/// 等で指定すると、そこから読みとったファイルは ~/.cpan/sources/ 以下にコピーされないので一箇所にまとめることができないので注意。

またCPAN ではモジュールインデックスファイルは1組しか持てないようで、初期設定のままだと野良パッケージを含む CPAN ミラーのインデックスファイルが使われない。 そのため一旦 urllist を空にした後、 自分の CPAN ミラーを指定しインデックスファイルをロードする。 その後にソースパッケージを取得するセカンダリとして通常の CPAN (ミラー)を指定するようにしている。

これが終わると、WiKicker とそれに必要なファイルが ~/.cpan/sources にたまる。

これを適宜アーカイブして保存する。

オフラインでインストールする

別の環境で例えば /usr/local/perl-5.8.8 にインストールされた PerlWiKickerオフラインでインストールするとする。

先の工程で作成したファイルセットが /tmp/CPAN においてあるものとする。

 /usr/local/perl-5.8.8/bin/perl -MCPAN -e shell
 # 初期化でオフラインのため CPAN ミラーの選択ができずに URL の入力を
 # 求められたところで file:///tmp/CPAN を指定
 cpan> install WiKicker
 cpan> exit

これで /tmp/CPAN から芋蔓式に WiKicker がインストールされる。

ポイント

CPAN::Site を利用して構築した場合は、インストール時にも CPAN::Site が必要だが、こちらはインストールセットの利用には CPAN.pm だけで良いというのが利点。

今回は CPAN::Mini で空の CPAN ミラーを作成し野良パッケージを追加した。

ここで最初から CPAN の最新パッケージの全ミラーCPAN::Mini で作成し、これに野良パッケージを追加してインストールセットを作ってしまうという方法もある。 この場合は後で必要に応じてミラーからパッケージを入れられるというメリットがあるかわりに、ミラー作成のコストがかかるというデメリットがある。

[ 2月12日全て ]

2006年2月17日 (金)

SVN::Webインストール失敗

社内サーバ上の Subversion リポジトリを気軽に閲覧できるように、以前から試そうと思っていた SVN::Web をインストールしてみる。

しかし SubversionPerl バインディングである SVN::Core は、Subversion パッケージに同梱されていて独立していないのか。 SubversionRed Hat Linux 8.0 へ RPM パッケージで入れているのだが、SVN::Web の方は /usr/local/perl-5.8.8 以下にインストールした Perl 5.8.8 上へ入れようと思っていたので、はたと困る。

 --with-perl5=/usr/local/perl-5.8.8/bin/perl

で configure して、Perl モジュールだけインストールしてみたけれどうまく動かず。

素直に Red Hat Linux 8.0 に標準で入っている Perl 5.8.0 に入れるかなぁ。

[ 2月17日全て ]

2006年7月8日 (土)

Perl 5.8.8CGI.pmPATH_INFO 処理の問題にぶつかる

手元の WiKicker (や DiKicker) で、「C++」という文字列を含む URI にアクセスしたらエラー

 Nested quantifiers in regex; marked by <-- HERE in m//C++ <-- HERE .html$/ at (eval 27) line 7.

正規表現の一部として使う時には \Q...\E していたと思ったが抜けがあったか。 とコードをチェックしてみたが、それっぽいところなし。 そもそも、Perl 5.005_03 だと問題おきていないし。

確認したら CGI.pm の url() の中でのエラーだった。 quotemeta されていない。

Perl 5.8.8 に含まれている CGI.pm 3.15 で問題を確認。3.17 までは駄目で、3.19 以降だと \Q...\E するように修正されている (3.18 は CPAN にないので不明)。

標準 Perl ライブラリバグを踏んだか……。 標準 Perl ライブラリアップグレードはなにかと面倒なので、システム要件にはしたくはないんだよねぇ。

[ 7月8日全て ]

2006年7月28日 (金)

PerlCR/LF/CRLF 全対応の1行毎読み込み処理

Perl プログラムでテキストファイル処理を 改行コード CR/LF/CRLF 全対応にしようと思ったが、書こうとするとこれが結構面倒臭いことに気がつく。

$/ に正規表現が設定できないため、<FILEHANDLE> で単純に3パターン対応ができない (LFCRLF に対応とかならすぐできる)。

小さいファイルと仮定して良いなら全部読み込んで自前で行分割、大きいファイルならまじめにバッファリングして改行コードをスキャンして行処理するのが正攻法かな。 多少効率悪くなりそうだけれど。

Pod::Html (1.0504) の場合

Perl 5.8.8Pod::Html (1.0504) だと pod2html の中で $/ = "" と設定して、パラグラフ単位で読み込んでそのあと処理している。

PerlIO レイヤー

最近の Perl であれば PerlIO::crlf、 PerlIO::eol あたりが使えそうである。

もちろん Perl 5.005_03 だと NG。

[ 7月28日全て ]

2006年12月15日 (金)

Perl テストスクリプトの中で標準エラー出力を一時的に止める

make test で実行するテストスクリプトの中で、標準エラー出力を止めたい場合がある (わざとエラーを起こす時など)。

Perl 5.8.8 の ExtUtils/MM_Unix.pm を参考に

  {
    local *STDERR_COPY;
    my $duped = 0;
    $duped = 1 if open(STDERR_COPY, '>&STDERR');
    open(STDERR, '> ' . File::Spec->devnull()) if $duped;
    my $result = `$command`;
    my $status = $?;
    open(STDERR, '>&STDERR_COPY') if $duped;
  }
  warn "This message is printed to STDERR\n";

としてみた。 LinuxWin32 ではとりあえずうまくいって動いている。

追記

(open が2引数なのは、当時古い Perl バージョンでも動くように書いたから)


[ Perl テストスクリプトの書き方 ]

[ 12月15日全て ]

2006年12月17日 (日)

USB メモリPerl を入れて持ち歩きたい

ポータブルアプリケーション詰め込み。

自分の場合エディタPerl があれば随分できることが増えるので、何とか Perl を入れておきたい。 しかし定番の WindowsActivePerl はセットアップが必要であり、持ち歩きには向かない。

何かいい Perl ディストリビューションがないかなと探してみたところ、インストール不要Apache ディストリビューションが目についた。 そういえばこれらには Perl が含まれていてインストール不要で使えるものがあるらしいので、それらが使えるかもしれない。

XAMPP for Windows 1.5.5

標準の XAMPP では Perl インタプリタしか入っていなかった。 さすがにこれでは使い物にならない。

XAMPP for Windows ADD-Ons Perl 5.8.8-2.2.3

XAMPP で実用的な Perl 環境を用意するにはこちら。ActivePerl 5.8.8.817 上に Web アプリケーションに必要そうな パッケージが用意されている。 そのかわり 200MB (!) 近い容量が必要。 でかすぎ。

README には setup_xampp.bat に実行の指示がある。

Uniform Server 3.3

ActivePerl 5.8.7.815 が含まれている。 Perl インタプリタと、いくつかのパッケージが含まれている。 パッケージは結構少なめにおさえてあるので、容量はかなり少ない。 しかし

 perl -MConfig -e "print Config::myconfig()"

が動かないなどそのまま使えるわけではなさそうだ。

やっぱり ActivePerl?

試した2つとも結局は ActivePerl を使っているようである。 ActivePerl の部分のライセンスはどうなっているのだろう?

もしかしたら ActivePerl の AS package を展開して、不要なファイルを削除すれば (インストーラで設定されるリポジトリなどの情報を使う部分は駄目にしろ)、ある程度動くのかな。

それと Installer.bat の中で、一部ファイル(.bat、Config.pm、Config_heavy.pl、perllocal.pod、.packlist、config.h) のリロケーションをしているので、このあたりがポイントになりそう。

要確認。

[ 12月17日全て ]

2007年2月9日 (金)

XAMPPWiKicker を動かしてみた。PPM インストール OK。

Perl で書いた Web アプリケーションのポータブルな Win32 デモ環境として XAMPP を使ってみるとどんな感じになるか試してみた。

使ったバージョンは以下。

(http://www.apachefriends.org/jp/xampp-windows.html)

C: ドライブで試す

それぞれ 自己解凍型 7-ZIP アーカイブをとってくる。 最初に XAMPP を展開し、次にその xampp ディレクトリの中で Perl アドオンを展開。 xampp ディレクトリを c: の直下に移動する。

次にコマンドプロンプトを開き c:\xampp\perl\bin へ移動後 ppm コマンドを起動して作成済みの PPM パッケージをインストールする。 インストール先は \xampp\perl 以下とドライブ無しのパスで指定されているようで、問題なく必要な Perl ライブラリをインストールできた。

次に \xampp\xampp-control.exe を実行して GUI 管理ツールを立ち上げ、その画面から Apache を起動。 普通の Win32Apache もインストールしてある PC だったため、xampp-control から Apache を起動したらそちらが立ち上がってしまったが、これは Svc にチェックが入っていたからだった。Svc を外せば \xampp 以下の Apache がきちんと起動する。

あとは \xampp\htdocs 以下で WiKicker CGI プログラムの配置や設定ファイルを作成すれば OK。 もともと WiKicker は相対パスだけで動くようになっている*1ので、問題なく実行することができた。

*1多分

他のドライブに移す

一度セットアップできた \xampp ディレクトリを TrueCrypt 仮想ドライブにコピーして起動してみた。

こちらも問題なく OK。

ということで XAMPP でお手軽に Perl CGI プログラムの動く Web サーバ環境を作れることを確認できた。

問題があるとすれば XAMPP + Perl アドオンが馬鹿でかいところか。400MB オーバー。 今回何が一番時間がかかったかって、XAMPP + Perl アドオンを展開した直後の xampp ディレクトリを、後でまた使えるように 7-ZIP の最高圧縮する処理に時間がかかった。 使っている PC では 50分以上かかったよ。

[ 2月9日全て ]

2008年5月28日 (水)

今日のさえずり - 100g 減る前にアタック買いだめ

2008年05月26日

2008年05月27日

2008年05月28日

[ 5月28日全て ]

2013年11月25日 (月)

Hatena Engineer Seminar #2 に行って Vagrant やイベントログの話を聞いてきた

株式会社はてな主催のセミナー Hatena Engineer Seminar #2 (#hatenatech) に参加応募したら当選したのでありがたく参加してきた。イベントログを Fluentd で集めて MongoDB に入れて集計したり ElasticSearch に入れて Kibana で見える化するという話、まわりのプロジェクトでちょうどホットトピックになっていたので概要を知る上でもとても参考になった。

あと開発環境を Vagrant にするという話も、最近の流れのようでそろそろ知っておきたいと思っていたので良かった。パフォーマンス的にはやはり課題もあるようなので、今使っているホストでどれぐらいストレスなくできるのかが気になるところではあるなあ。

はてなセミナーは初参加だけれど、なにか実直な印象で好感が持てた。これがはてなカラーなのかな。デモンストレーションも動画にしてあってしっかり準備されているしスライドもしっかりしていた。デモンストレーションは個人的にはライブで見たかったけどね。

アンケートもストレートに採用について興味があるかという内容で、正直に人狩りアピールしていて気持ち良かった。

開会の挨拶 @stanaka 氏 #hatenatech

Vagrant と Chef でつくるはてなブックマーク開発環境 @aereal 氏 #hatenatech

はてなにおけるモダンiOSアプリ開発入門 @cockscomb 氏 #hatenatech

  • Titanium は使わなくなった。

Fluentd, MongoDB, Kibanaをつかった はてなブログABテストの事例 @shiba_yu36 氏 #hatenatech

あと会場で id:matsu_nao (ナオタロウ)氏に声をかけていただき再会できて嬉しかったです。お元気そうでなにより。今日は体調も考えて懇親会は遠慮して退散してきたので、またの機会でゆっくりお話させていただければと思います。

[ 11月25日全て ]

About

Naney Naneymx

Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。

※本サイトの内容は個人的見解であり所属組織とは関係ありません。

Process Time: 0.024848s / load averages: 0.42, 0.31, 0.27