一連のArkサンプルアプリケーションネタは、作りながら記事を書くということをしています。その一環として、勇んでArkのサンプルアプリをデプロイしようと思いましたが、CPANのmetadataだけで12MB程度を食ってディスク容量不足に悩まされたので、広告付き無料アカウントでのArkのインストールは断念しました。
いやはや、流石に生のXREAでは厳しすぎました。ローカルで同じ構成のLinuxマシンを立ててライブラリだけ同期を取ればどうにかなるのかも知れませんが、あまりやせ我慢をしても仕方がないので、さっくりとXREA plusにしました。3GBもあれば、画像・音楽・映像を扱うようなサイトでもなければ、使い尽くすことはまずないでしょう。しかも広告も取り外せますし、MySQL DBが5個まで持てるようになりましたし、cronも使えるようになりましたし......と自らを納得させていますが、そこはかとなく漂う敗北感は如何ともし難いものがあります。
閑話休題、そんなこんなでXREA/Coreserverでlocal::libを使う方法などをご紹介します。perl自体をオレオレディレクトリに入れる方法(ただしActivePerl)は既にご紹介していますが、今回はあくまでperl(処理系)はいつもと一緒(s345.xrea.comの場合には/usr/local/bin/perlにある5.8.8)として、local::libによるオレオレライブラリを設ける方法です。オレオレライブラリにFTPでアップロードしつつスクリプトでuse libする手もありますが、依存が多いモジュールを入れる際には、CPANシェルで入れてしまった方がよいので、大変お勧めです。
追記:Arkのインストールの際に気が付いたのですが、直近で記事を設けるのは厳しそうなので、取り急ぎここに追記します。上記のみだと、Module::Buildを使用する場合に問題が起きます。泥臭い対処法はlook MODULEしてしまうことですが、ちゃんとModule::Buildのマニュアルを読んでから、採るべき対処法を添えて別記事にてフォローする予定です。
基本的にはさくらインターネットと一緒
XREAに於けるこの作業は、先賢の皆さんに学んだものです。というか、さくらとXREA/Coreserverで違うところはユーザーディレクトリのパスやデフォルトシェルくらいじゃないでしょうか。
- id:hide-kさんのlocal::libを使った非rootでのCPAN環境構築 - hide-k.net#blog
- id:magicalhatさんのさくらのレンタルサーバで local::lib を使う - ふしぎなぼうし
- id:charsbarさん(石垣さん)のさくらインターネットでCPAN - Charsbar::Note
- id:otsuneさんのotsune's FreeBSD memo :: ユーザー領域にCPANをインストールする方法
XREA plusへの更改は作業数時間前に済ませる
思わぬ落とし穴ですが、quotacheckのcronは数時間に一回しか回っていないようなので、結構な時間が経って作業をしても平気でDisk quota exceededを食らいます。
数回CPANでモジュールをインストールしただけで......
eorzea@s345:~> quota
Disk quotas for user eorzea (uid 11028):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda2 50513* 49000 50000 4180 0 0
ぎゃふん。容量超過です。こういう場合は一番容量を食っている~/.cpan/metadataを消すのがいいです。
eorzea@s345:~> rm ~/.cpan/metadata
eorzea@s345:~> quota
Disk quotas for user eorzea (uid 11028):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda2 38264 49000 50000 4114 0 0
危ない危ない。
さて、風呂でも浴びて帰って来る頃には容量が増されているかと思ったのですが、駄目でした。きりのいい正時には動くだろうと思っていたのですが、0時0分になっても変わりません。流石にcron設定時刻が被りそうなのでずらしたんだなと思ってはみるものの、なかなか泣けてくる物があります。
ということで、早めに契約更改をしておいた方が良いと思います。ええ、それはもう痛切な実体験を踏まえた助言ですとも。
必要なディレクトリの作成と、環境変数の設定
~/localの作成
これが、local::libで使う先のディレクトリになります。名前は何でもいいのですが、慣習的なlocalを採用します。
eorzea@s345:~> mkdir -p ~/local
BSDPAN対策
otsune's FreeBSD memo :: ユーザー領域にCPANをインストールする方法を参考にさせていただき、以下の設定を施します。
eorzea@s345:~> echo 'export PKG_DBDIR=$HOME/local/var/db/pkg
> export PORT_DBDIR=$HOME/local/var/db/pkg
> export INSTALL_AS_USER
> export LD_LIBRARY_PATH=$HOME/local/lib' >> ~/.bashrc
eorzea@s345:~> source ~/.bashrc
eorzea@s345:~> mkdir -p ~/local/var/db/pkg
viくらい使えよ、という話ですが、コピペで記事を作る上での楽をさせていただきました。まあともあれディレクトリを作りつつBash設定を追加します。他のシェルであればそれ相応に。
CPANシェルの設定
雛形ファイルの作成
さてここでいきなりCPANシェルを回したいところですが、(XREAは共用サーバーなので)/root/.cpanを作れないと怒られます。ということで、自分でCPANシェル設定を~/.cpan/CPAN/MyConfig.pmに書きます。
eorzea@s345:~> mkdir -p ~/.cpan/CPAN
eorzea@s345:~> echo '1;' > ~/.cpan/CPAN/MyConfig.pm
そこにファイルがありさえすればよいので、これで良しです。
CPANシェルの初回起動
eorzea@s345:~> cpan
ということで、CPANシェルの初回起動による設定を行います。基本的にはEnter連発で出来ます。
- Are you ready for manual configuration? [yes]
- CPAN build and cache directory? [/virtual/eorzea/.cpan]
- Cache size for build directory (in MB)? [100]
- Perform cache scanning (atstart or never)? [atstart]
- Cache metadata (yes/no)? [yes]
- Your terminal expects ISO-8859-1 (yes/no)? [yes]
- File to save your history? [/virtual/eorzea/.cpan/histfile]
- Number of lines to save? [100]
- Always try to show upload date with 'd' and 'm' command (yes/no)? [yes]
- Policy on building prerequisites (follow, ask or ignore)? [ask] follow
- Where is your bzip2 program? [/usr/bin/bzip2]
- Where is your gzip program? [/usr/bin/gzip]
- Where is your tar program? [/bin/tar]
- Where is your unzip program? [/usr/local/bin/unzip]
- Where is your make program? [/usr/bin/make]
- Where is your curl program? [/usr/local/bin/curl]
- Where is your lynx program? [/usr/bin/lynx]
- Where is your wget program? [/usr/local/bin/wget]
- Where is your ncftpget program? [/usr/bin/ncftpget]
- Where is your ftp program? [/usr/bin/ftp]
- Where is your gpg program? [/usr/local/bin/gpg]
- What is your favorite pager program? [less]
- What is your favorite shell? [/bin/bash]
- In case you could choose, which installer would you prefer (EUMM or MB)? [EUMM]
- Parameters for the 'perl Makefile.PL' command? ... Your choice: [] ~/local
- Parameters for the 'make' command? ... Your choice: []
- Do you want to use a different make command for 'make install'? ... or some such. Your choice: [/usr/bin/make]
- Parameters for the 'make install' command? ... Your choice: []
- Parameters for the 'perl Build.PL' command? ... Your choice: []
- Parameters for the './Build' command? ... Your choice: []
- Do you want to use a different command for './Build install'? ... or some such. Your choice: [./Build]
- Parameters for the './Build install' command? ... Your choice: []
- Timeout for inactivity during {Makefile,Build}.PL? [0]
- Your ftp_proxy?
- Your http_proxy?
- Your no_proxy?
- Select your continent (or several nearby continents) [] 2
- Select your country (or several nearby countries) [] 4
- put them on one line, separated by blanks, e.g. '1 4 5' [] 8 2
- Enter another URL or RETURN to quit: []
気にするところは以下のところぐらいでしょうか。
- 質問2では、ちゃんと
/virtual/USERNAME/.cpanになっていることを確認します。 - 質問3では、XREA plusでない限りは切り詰めましょう。50MBなんてあっという間です。
- 質問10は、いちいち問い合わせずに全部入れて貰いたいと思う場合は、お好みにより
followにしましょう。 - 質問25が要点で、先程作った
~/localにします。 - 質問37はAsia、38はJapanです。
- 質問39は、さくらインターネットでCPAN - Charsbar::Noteを参考に、山形大学さんをプライマリにしつつ、もう一つお好みでリストに入れています。
これで、以下のファイルが出来ました。
$CPAN::Config = {
'build_cache' => q[100],
'build_dir' => q[/virtual/eorzea/.cpan/build],
'bzip2' => q[/usr/bin/bzip2],
'cache_metadata' => q[1],
'cpan_home' => q[/virtual/eorzea/.cpan],
'curl' => q[/usr/local/bin/curl],
'ftp' => q[/usr/bin/ftp],
'ftp_passive' => q[1],
'ftp_proxy' => q[],
'getcwd' => q[cwd],
'gpg' => q[/usr/local/bin/gpg],
'gzip' => q[/usr/bin/gzip],
'histfile' => q[/virtual/eorzea/.cpan/histfile],
'histsize' => q[100],
'http_proxy' => q[],
'inactivity_timeout' => q[0],
'index_expire' => q[1],
'inhibit_startup_message' => q[0],
'keep_source_where' => q[/virtual/eorzea/.cpan/sources],
'lynx' => q[/usr/bin/lynx],
'make' => q[/usr/bin/make],
'make_arg' => q[],
'make_install_arg' => q[],
'make_install_make_command' => q[/usr/bin/make],
'makepl_arg' => q[~/local],
'mbuild_arg' => q[],
'mbuild_install_arg' => q[],
'mbuild_install_build_command' => q[./Build],
'mbuildpl_arg' => q[],
'ncftpget' => q[/usr/bin/ncftpget],
'no_proxy' => q[],
'pager' => q[less],
'prefer_installer' => q[EUMM],
'prerequisites_policy' => q[follow],
'scan_cache' => q[atstart],
'shell' => q[/bin/bash],
'show_upload_date' => q[1],
'tar' => q[/bin/tar],
'term_is_latin' => q[1],
'unzip' => q[/usr/local/bin/unzip],
'urllist' => [q[ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/], q[ftp://ftp.jaist.ac.jp/pub/CPAN/]],
'wget' => q[/usr/local/bin/wget],
};
1;
__END__
local::libの設定
ここから先は、local::libを使った非rootでのCPAN環境構築 - hide-k.net#blogとほぼ同様です。
local::libのダウンロード
本日現在のlocal::libのバージョンは1.004003です。
eorzea@s345:~> wget http://search.cpan.org/CPAN/authors/id/A/AP/APEIRON/local-lib-1.004003.tar.gz
...
eorzea@s345:~> tar xzvf local-lib-1.004003.tar.gz
...
eorzea@s345:~> eorzea@s345:~> cd local-lib-1.004003/
eorzea@s345:~/local-lib-1.004003>
Makefileの作成
eorzea@s345:~/local-lib-1.004003> perl Makefile.PL --bootstrap=$HOME/local
Attempting to create file /virtual/eorzea/local/.modulebuildrc
Dispatching deprecated method 'CPAN::Config::load' to CPAN::HandleConfigCPAN: File::HomeDir loaded ok
CPAN: File::HomeDir loaded ok
*** Module::AutoInstall version 1.030
*** Checking for Perl dependencies...
[Core Features]
- ExtUtils::MakeMaker ...loaded. (6.360 >= 6.31)
- ExtUtils::CBuilder ...loaded. (0.210)
- ExtUtils::ParseXS ...missing.
- Module::Build ...loaded. (0.280500 >= 0.28)
- CPAN ...loaded. (1.870 >= 1.80)
...
先程依存モジュールを自動で引っ張ってくるようにfollowと設定したのが奏功して、ExtUtils::ParseXSも勝手に入れてくれます(当然、インストール先は~/local/lib/perl5/ExtUtils/ParseXS.pmなどです)。勿論askのままとして、明示的にここで入れても構いません。
依存モジュールを入れる際に、CPANシェルによる始めてのインストールが走ります。ということはつまり、結構重いmetadataファイルを落としてきたりします。たまにプロセスがシステムにより殺される場合がありますが、その場合はもう一度試しましょう。
make, make test, make install
makeしてテストしてインストールします。
eorzea@s345:~/local-lib-1.004003> make
...
eorzea@s345:~/local-lib-1.004003> make test
...
All tests successful, 1 test skipped.
Files=3, Tests=6, 0 wallclock secs ( 0.05 cusr + 0.02 csys = 0.07 CPU)
eorzea@s345:~/local-lib-1.004003> make install
最後にもう二つ環境設定
先頃もMouse継承話でお世話になったid:magicalhatさんのさくらのレンタルサーバで local::lib を使う - ふしぎなぼうしを参考にさせていただき、TMPDIR環境変数とそれに相当するディレクトリを掘っています。実はこれをしなくてもlocal::libを入れられたのですが、念のため入れておくという感じです。
eorzea@s345:~/local-lib-1.004003> cd ..
eorzea@s345:~> mkdir ~/local/tmp
eorzea@s345:~> echo 'eval $(perl -I$HOME/local/lib/perl5 -Mlocal::lib=$HOME/local)
> export TMPDIR=$HOME/local/tmp' >>~/.bashrc
eorzea@s345:~> source ~/.bashrc
local::libの稼働確認
それでは、local::libの稼働確認です。
s345.xrea.comのPerlは5.8.8なので、local::libの依存ライブラリであるExtUtils::ParseXSがコアに入っていません(5.10.0以降)。個別に管理者が入れているわけでもないので、普通にuse ExtUtils::ParseXSすると死にます。ということで、栄えある確認用モジュールにはExtUtils::ParseXSを使うことにしましょう。
CLIでの確認
eorzea@s345:~> perl -MExtUtils::ParseXS -e 'print join "\n", q{ExtUtils::ParseXS}, $ExtUti
ls::ParseXS::VERSION, $INC{ q{ExtUtils/ParseXS.pm} }, q{};'
ExtUtils::ParseXS
2.2002
/virtual/eorzea/local/lib/perl5/ExtUtils/ParseXS.pm
問題ありません。環境変数に入ったライブラリをきっちり使ってくれています。
CGIスクリプトでの確認
同様にCGIスクリプトでも確認します。
以下のスクリプトを書いて、適当な名前を付けて保存しましょう。/virutual/eorzea/public_html/local_lib.cgiなどとします。
#!/usr/local/bin/perl
use strict;
use warnings;
use lib qq($ENV{DOCUMENT_ROOT}/../local/lib/perl5);
use local::lib qq($ENV{DOCUMENT_ROOT}/../local);
use ExtUtils::ParseXS;
print 'Content-type: text/plain', "\n\n";
print join "\n",
'ExtUtils::ParseXS',
$ExtUtils::ParseXS::VERSION,
$INC{'ExtUtils/ParseXS.pm'};
これをCGIで実行してみますと(GET http://eorzea.asia/local_lib.cgi)、無事に読めていることが分かります。use lib...とlocal::libを外すと、ちゃんと死んでくれます。
なお、local::libはどこに置いても問題ありません。アプリケーションに同梱しても良いでしょう(extlibなどで)。今回の確認スクリプトの場合はlocal::lib自体も/virtual/eorzea/local/lib/perl5/local/lib.pmのものを使っているのですが、local::libのインストール先と、local::libで読みに行く先のオレオレライブラリとを混同しないようにしてください。
また、/virtual/eorzea/localという文字列を得るためには、他にuse FindBin;して$FindBin::Bin/../../localなどとして得る方法があります(ただし、/virutual/eorzea/public_html/local_lib.cgiの場合)。といっても、但し書きが雄弁に物語っているように、当該CGIスクリプトのパスを起点とした相対パスとなってしまうので、ちょっと面倒です。ということで、私は$ENV{DOCUMENT_ROOT}を使うこととしました。
一時ファイルなどの削除
最後に、一時ファイルを削除しておきましょう。
eorzea@s345:~> rm ~/local-lib-1.004003.tar.gz
eorzea@s345:~> rm -rf ~/local-lib-1.004003
これで終わりです!
あれ、Arkのインストールは?
あああ、まだquotaが増えないぃぃ(血涙)......。
eorzea@s345:~> date
Mon Jul 27 01:47:40 JST 2009
eorzea@s345:~> quota
Disk quotas for user eorzea (uid 11028):
Filesystem blocks quota limit grace files quota limit grace
/dev/sda2 38276 49000 50000 4122 0 0
ということで、取り敢えずlocal::libが動いていることを確認したので、明日(というか今日)私が終電で帰宅する頃にはquotaが増えていることを願いつつ、次回へ続くことにします。
コメントする