約 2,721,069 件
https://w.atwiki.jp/atwikimyj/pages/16.html
[1]perlのソースをダウンロードする [2]stable.tar.gzを適当な場所(/usr/local)に保存、解凍 [3]perlインストール時の設定を行う 解凍したファイル群にINSTALLというテキストファイルがある。それを開くと、 非常に長い説明がある。くじけそうになるが、ここが頑張り所なのでなんとか 内容を見る。 ありました!デフォルトではインストール時にこういうパスにデータを入れる ようというのが。 ○perl実行ファイル $prefixexp = /usr/local ○スクリプトファイル $prefixexp/bin ○ライブラリファイル $prefixexp/lib/perl5/(5.8.8などのversion番号) [4]解凍したディレクトリに移動 # cd /usr/local/perl5.8.8 #./Configure このままデフォルト設定でインストールすれば上記の 構成でperlがインストールされる # /usr/local/bin/perl -v を実行して、バージョン番号が出ればOK でもまだこのインストールしたperlにはパスが通ってない。 従来インストールされているperlの実行ファイルが有効に なっている。 そのperlの実行ファイルというのは /usr/bin/perl このファイルを別名で保存する。 /usr/bin/perl.hoge とかにしてシンボリックリンクを張る # ln -s /usr/local/bin/perl /usr/bin/perl [5]パスを通す /etc/profile を編集し、 PERL_PATH=/usr/local export PERL5LIB=${PERL_PATH}/lib export PATH=${PERL_PATH}/bin $PATH を追記し、コンフィグの読み直し # ldconfig この段階でパスは通っているので # perl -le print for @INC とすると、 /usr/local/lib /usr/local/lib/perl5/5.8.8/i686-linux /usr/local/lib/perl5/5.8.8 /usr/local/lib/perl5/site_perl/5.8.8/i686-linux /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_per と表示され、@INCのパスも変わった。 perl自体のインストールはこれでOK でもmod_perlを使っている場合は perlのバージョンアップしたら必ずmod_perlもrebuild しないとだめなのです。 あと、必要に応じて、下記のこともやんないといけないのです。 perlモジュールインストール Catalystインストール Apache config設定
https://w.atwiki.jp/atwikimyj/pages/25.html
参考 [http //d.hatena.ne.jp/ZIGOROu/20061105/1162736838] CPAN [http //search.cpan.org/~mschilli/Log-Log4perl-1.10...] use宣言 use Catalyst Log Log4perl; ※Catalystのプラグインではない。 * log吐き出し先ファイルを設定(confのパーミッションを775にしてね) PACKAGE- log(Catalyst Log Log4perl- new("/var/www/vhosts/hoge.net/conf/log4perl.conf")); #PACKAGE setup; わからないけどsetupのメソッドを使うとエラーになる(なぜかDB内のUserテーブルが読めない!というエラー なんなんだ。。) エラーログにエラーが出る Log Log4perl configuration looks suspicious No loggers defined at /usr/local/lib/perl5/site_perl/5.8.8/Log/Log4perl/Config.pm line 308., referer http //hoge.net/user/Login/ ロガーを定義していないと思う、、とかわいいログが残っている。 confに何もかかれていない。でもエラーログにはいつもよりいろんなログが 出るようになった。 これでいいような。。。confの意味は?
https://w.atwiki.jp/perlism/pages/11.html
Perl 【読み】ぱぁる 【属性】プログラミング言語 ラリーウォール氏により開発され、インタプリタ式でC,AWK,シェルライクな、いまやCGIの代名詞と言っても過言ではない、他の言語とは比べ物にならないほど柔軟性に富んだプログラミング言語である。 ただ、その柔軟性が裏目に出ることがほとんどで、Aというプログラムでは通用したコードも、ひとたびBというプログラムで同じものを書くと、全く通用しなくなるといったことが起こりやすい言語である。 某人曰く、「Practical Extraction and Report Language」(実用的データ取得レポート作成言語) また某人曰く、「Pathologically Eclectic Rubbish Lister」(病的折衷主義のガラクタ出力装置)
https://w.atwiki.jp/atwikimyj/pages/15.html
perlバージョンアップ後に出てくる問題 perlのバージョンアップをすると、影響の出るものの一つに mod_perlがあるようだ。 perlのバージョンをあげて、mod_perlを利用してperlを起動させると Apacheの起動時に DynaLoader object version 1.05 does not match $DynaLoader VERSION (以下メッセージは延々続く・・) というようなエラーが出てhttpd自体が起動しなくなった。 DynaLoaderのバージョンがマッチしない・・? そもそもDynealoderって何? 調べると、perlからCで書かれたプログラムを呼び出すことができる モジュールらしい。 とりあえず再インストールを試みる。しかしCPANではそんなモジュールは 存在しない!とエラーで怒られる。調べるとperlのアプリケーション内に デフォルトでついてくるものらしい。なので個別でインストールとかは できないらしい。 手詰まり。何がおきているのやら、、。 ということでさらにエラーメッセージから調べる。 私と同じ問題にあたった人をapacheのメーリングリストで発見。 Mailing list archives(Apache-ML) http //mail-archives.apache.org/mod_mbox/perl-dev/200411.mbox/%3c20041119124457.GB3387@bongo%3e 結局 「perlをアップグレードしたら、mod_perlの静的なリンクが外れるから、 毎回mod_perlのrebuildが必要だよ」 というお答えが出ていた。。 つまり、CGIではなく、apache起動時にモジュール読ませて起動するperlは mod_perlになるのだが、このmod_perlが読み込むライブラリとDynaLoaderの ライブラリが不整合を起こしている(らしい)。なのでmod_perlをrebuild することでライブラリの整合が図れる、、はず。 mod_perlのrebuild rebuildだけやりたいけど、、よくわからん。大体意味もわからずにインス トールすると後で泣きを見る。とくにmod_perlってバージョンとか整合性 とかいろいろとデリケートだったような、、。 Apache1.xの環境ではmod_perl1.xを組み合わせ、 Apache2.xの環境ではmod_perl2.xを組み合わせる必要がある。 静的なインストールと動的なインストールがある 基本的にはapacheとmod_perlの両方を一度にビルドするべき などの情報がわかる。また、注意したいのは、mod_perl1.xについての情報 はたくさんあるが、MP2の情報は少なめ。よく読んでMP2の資料を探さないと いけない。 ということで下記が参考になった。 HATENA Diary NAOYA 「■ 10分で完了、mod_perl 2.0 で Hello, World!」 http //d.hatena.ne.jp/naoya/20060108/1136705441 isoya9の日記 「 [Linux] CentOS4 に mod_perl 2.02 をインストールする」 http //isoya.at.webry.info/200610/article_25.html 動的にmod_perlをインストールする場合は、先にapxsを インストールする必要がある。 # whereis apxs とコマンドを打って、何も出てこないのでapxsがインストール されていないことがわかった。 ということでWEBを参考にしながらapxsのインストール apxsはhttpd-develに含まれるため、 #yum install httpd-devel でインストールは終わり。 $ wget http //perl.apache.org/dist/mod_perl-2.0-current.tar.gz apacheのAPI削除 MP2インストール 上記のWEBサイトのとおりに作業をしてすんなりインストール完了。
https://w.atwiki.jp/astrophysics/pages/53.html
Perlのメモページ Perlを使ってごにょごにょできるようになるのを目指すページ。 Perl診断メッセージ Perlのエラーメッセージ等でわからないことがあれば。 サンプルコードによるPerl 入門 配列関係 配列の最後の要素にアクセスしたい @hoge という配列を作ったときの、配列の個数は $#hoge で手に入る。つまり、これは @hoge - 1 と同じ意味になる。 ファイル関係 改行を入れる。 perl -pe s/ /\n/g とすれば、空白を改行にすることができる。 CPANからStatisticsをインストール ここを参照のこと。 ファイルの入出力 スクリプト内でファイルを開きたいときは open (INFILE,"hoge"); とすれば、hogeがINFILEに入る。 ファイルに出力したいときは、 open (OUTFILE, " hoge"); とすれば、hogeに、OUTFILEが入る。 あと、openしものはきちんとcloseする。 close INFILE; close OUTFILE; (うまくない)例としては、 open (INFILE,"hoge"); open (OUTFILE," hogenew") while($str = INFILE ){ s/ / \ /g; print OUTFILE ; } close (INFILE); close (OUTFILE); など。 コメントアウト 一行だけのときは # を用いる。 複数行の場合は、 =comment =cut ではさめば良い。 長々しい整数値を書くとき 例えば、1234567890123という数字は、一瞬で何桁あるのかわかりずらい。そういう場合は、perlでは、 1_234_567_890_123 と書くことが許される。これは、1234567890123と同じ意味になる。 grep とあるテキストだったりリストの中から、特定の要素だけを取り出したいときは、grepを使うと便利な場合が多い。 例えば、1..1000までの間の奇数は、 @odd = grep { $_ % 2 } 1..1000; と1行で書くことができる。 map とあるリストの要素に対して、同じような変換をしたければ、mapを使うと便利な場合がある。 例えば、1..1000までの数に対して、おのおの2をかけた値のリストを作りたければ、 @even = map $_ * 2, 1..1000; とすればよい。
https://w.atwiki.jp/atwikimyj/pages/38.html
mod_perl2では実行しているスクリプトのあるディレクトリを カレントディレクトリとして認識してくれないので面倒! という記事によくあたる。へえ、それ面倒だな、、と思っていたが、 いろいろと調べるとそうとは限らないようだ。 カレントディレクトリがどうなるかは、動作モデルによるらしい。 参考: TurboLinux「Apache MPM を変更する」 http //www.turbolinux.co.jp/support/document/knowledge/627.html えーっと、Apache2では動作モデルがいっぱい選択できる。その中の prefork動作とWorker動作について説明すると、、 prefork動作ではクライアントからのリクエストがある度 に子プロセスを作成する。 Worker動作では複数のプロセスとスレッドによりリクエストを処理します。 複数のスレッドは同じメモリを共有し、連携して処理が行われます。 スレッドってなんじゃい?linuxでのマルチスレッド、マルチプロセスの話は hatenaの伊藤さんが詳しく説明されています。 Hatena Diary naoya「マルチスレッドのコンテキスト切り替えに伴うコスト」 http //d.hatena.ne.jp/naoya/20071010/1192040413 (社内勉強用の資料のようです。いいなあ。はてな入ってperlやりてえなあ でもこの資料まともに読めない自分のような人間は必要ないだろうなあ) preforkは従来のmod_perlと同じやり方となり、安定性がある。 worker動作をさせたほうが、効率的で、処理が速い、らしい。 よほどの理由がない限り、worker動作を使いこなせるはずもない。 また、preforkはスクリプトのあるディレクトリをカレントディレクトリ として認識してくれるので、やはりこちらか。ということで、 下記のサイトを参考にPrefork専用のハンドラーを利用するということにする。 adiary開発日誌「2006/04/15(土) mod_perl で chdir」 http //adiary.blog.abk.nu/07 TransFreeBSDの日記 「[perl]ModPerl {PerlRun,Registry,RegistryPrefork}でのカレントディレクトリ、BEGINブロック、@INCの扱いメモ」 http //freebsd.g.hatena.ne.jp/TransFreeBSD/20061124/p1 日誌「Apache MPM」 http //tkusano.asablo.jp/blog/2006/11/10/745619
https://w.atwiki.jp/atwikimyj/pages/90.html
mod_perl2を使う上でカレントディレクトリを変更できない という場合がある。これは設定を変更することで 回避できる(普通のCGIと同じように使えるが、その分プロセス をたくさん使用するのでメモリを余計使う)。 それにはperlのインストール時に"ithread"という機能が有効 になっていなければならない。 Perlインストール時にデフォルトでインストールすると ithreadという機能が無効になった状態でインストール される。 その状態で、httpd.confに PerlOptions +Parentを付与しても下記のようなエラーがでる。 # apachectl graceful Syntax error on line 15 of /var/www/vhosts/flier.net/conf/vhost.conf PerlOption `Parent requires an ithreads enabled Perl そもそもithreadとは何ぞや Perlのithreads http //www.donzoko.net/doc/memo/perlithreads.html#basic すばらしい解説ページ。 ここの「基本編」内のperlドキュメント日本語訳によると、 現在起動しているperlでithreadが有効になっているかどうかは perl -V にてperlのコンフィグを確認し、 useithreads=undef なら無効 useithreads=define なら有効 とある。早速確認すると、undefだった。有効にするには、 perlをインストールする際のConfigureにてオプションを 追加することでithreadを有効にすることが可能になる。 freeBSDならば簡単にexportなど(よくわからんが)を使えば ithreadだけちょちょっと有効にできるみたい。 しかし今使っている環境はCentOSなのだ、、。 ということでperlの再インストールが必要となる。 [1]perlのstable版をダウンロード、サーバにアップ [2]解凍、解凍したフォルダに移動 [3]Configureで設定を行う # ./Configure -Dprefix=/usr/local -Dusethreads -de -U d_setlocate の後に #make そして #make test 最後に #make install make testの途中で以下のようなsyslogのエラーが出るが ext/Sys/Syslog/t/syslog...................# Failed test syslog() should return true 0 # in ../ext/Sys/Syslog/t/syslog.t at line 109. 弾小飼御大のblogを確認すると http //blog.livedoor.jp/dankogai/archives/50494105.html このエラーは特に問題ないみたい。 再度Perl -Vを実行して、有効になっていれば ithread有効化は完了。
https://w.atwiki.jp/atwikimyj/pages/88.html
PLESK環境での話。 某PLESK環境のVPSでmod_perl2を使おうとしたが、 ApacheはVersion2なのだが、mo_perlが1.99だった。 ということでmod_perl2にアップグレードする。 このサイトを思いっきり参考にさせていただきました。 isoya9の日記 Linux CentOS4 に mod_perl 2.02 をインストールす>る 1.apxsをインストール 確認すると下記のパスに /usr/sbin/apxs が存在。つまりapxsがインストールされていたので次の工程へ。 2.既存 Apache2 API を削除 $ find /usr/lib/perl5 -name Apache2* -exec rm -rf {} \; $ find /usr/lib/perl5 -name Apache2* -exec ls -lR {} \; perlライブラリ内のApache2関連のAPIを根こそぎ削除しています。 実行後は何も表示されません。 3.mod_perl2の入手とインストール Apacheのmod_perlのページ からインストールをします。 ほかのアプリケーションと同じように、ダウンロード、 解凍、make、make test、make installでOK。 途中でapxsのパスを聞かれるのでインストールした 時のパス(/usr/sbin/apxs)を入力する必要があります。 ここでmod_perl2がインストールされているかチェック #!/usr/bin/perl print "Content-Type text/plain\n\n"; print ($ENV{ MOD_PERL } || ERROR ); 上記のような簡単なスクリプトを作成し、 mod_perl_test.pl と名づけ(今回のPLESK環境では拡張子plで のみmod_perl2による動作をすることになっ ている)、実際に実行してみる。 mod_perl/2.0.3 というような表示がされればとりあえず バージョンアップに成功。だめな場合は ERRORが出るので次の作業に。 4.CPANからmod_perl2をインストール もし3までの作業で、mod_perl2が動かなかったら apacheのエラーログを見てみる。PLESK環境であれば virtualHostのエラーログとなる。 /var/www/vhosts/DOMAINNAME.COM/statistics/logs の中のerror_log になるだろう。 その中に failed to resolve handler `ModPerl Registry Can t locate ModPerl/Registry.pm in @INC (@INC (略) というようなエラーが出ていたら、たぶん、 mod_perl2用のモジュールを入れる必要がある。 ということで $perl -MCPAN -e shell \ cpan install mod_perl2 ここで、インストールに失敗する場合はたぶんroot権限で サーバにログインしてこの作業をしようとしているのでは ないかと思われる。その場合は途中で出てくるテストを すべてスキップする。 [warning] result [ error] You are running the test suite under user root . Apache cannot spawn child processes as root , therefore こんなwarningが出るのでここでスキップするか聞いてくるので YESを選ぶとスキップできる。 また、この作業の中で /usr/lib/httpd/modules/mod_perl.so というファイルを作成しようとするが、すでにこのファイルが 存在する場合はエラーになってしまう(そういうメッセージが 出る) その場合は上記のファイルをリネームして再度この作業を 実行させればよい。 これで再度 mod_perl_test.pl を実行してみるとおそらくmod_perlのバージョンが表示される はずである。
https://w.atwiki.jp/atwikimyj/pages/37.html
ぬおおお、、なんでぇ、、ライブラリを、、読んでくれないんだよぉ! なんで、このパスを、、読んでくれないんだよぉ! だから、、SetEnvしてんじゃんかぁ!PERL5LIBだろぉ? と叫び続けたあの日。 この記事は、perlのライブラリのパスと戦う人への応援歌です (応援歌であって、必ずしもあなたの抱える問題の解決を保障しません) perlを使うと一言で言っても、どのような状況で起動するか によって、読みに行くライブラリが変わる、つまり@INCの 中身が変わる。 1 シェル(bash)からperlを起動させた場合 2 mod_perl2から起動させた場合(Apache起動時) 3 CGIからperlを起動させる場合(ブラウザからアクセス) もしかしたらもっとパターンはあるかもしれないが。 以下場合分けで対処をする。 1 シェル(bash)からperlを起動させる場合 コマンドラインからの入力でperlを実行する場合。 /etc/profile を編集し、以下を記述する。 PERL_PATH=/usr/local export PERL5LIB=${PERL_PATH}/lib export PATH=${PERL_PATH}/bin $PATH これで、コマンドラインからの # perl -le print for @INC などの動作には反映される 2 mod_perl2から起動させた場合(Apache起動時) Apacheがperlを起動させる場合、 たとえば、httpd.conf内でCatalyst関連の ライブラリを読ませるときはperlを起動して いるのだが、なぜか前のバージョンのperl で使っていたと思われるライブラリパスを 読みにいっちゃう。 解決策は、 httpconf内にライブラリのパスを記述すること。 普通考えると SetEnv PERL_PATH "/usr/local" SetEnv PERL5LIB "/usr/local/lib" と書けば環境変数が変わる、、と思うのだが これじゃだめ(涙) 試行錯誤の末、perlのライブラリがあるディレクトリすべてを PerlSwitches -I/usr/local/lib/perl5/5.8.8 PerlSwitches -I/usr/local/lib/perl5/5.8.8/i686-linux PerlSwitches -I/usr/local/lib/perl5/site_perl/5.8.8 と記述すると、Apacheからのperl起動時に@INCに入れてくれる ようだ。うーん。これってバッドノウハウ? 3 CGIからperlを起動させる場合(ブラウザからアクセス) 具体的にはWEBサイトを開いたときにperlが起動する場合。 これは略
https://w.atwiki.jp/atwikimyj/pages/86.html
しらぎく実験室 雑記帳 http //www.marguerite.jp/Nihongo/Labo/Temp/ModPerl.html#config_2 mod_perl2の貴重な体験的TIPSが載っております。 mod_perl 2.0.2 へのマイグレーション http //d.hatena.ne.jp/naoya/20060108/1136692447 はてなの伊藤さんのページ。mod_perl1、1.99、2の違いと、 2への移行の話が載っています。