約 2,743,765 件
https://w.atwiki.jp/ko-suke/pages/56.html
せっかく作ったPerlスクリプトをperlが入ってない環境でも使いたいということで、Perl2exeを使ってみた。 基本的に"ここ"に書いてある通りでOKのよう. インストール "ここ"からダウンロードして、解凍。特に変わった作業は無し。 使い方 解凍したフォルダに ***.plを持っていき、コマンドプロンプトで、 perl2exe.exe ***.pl と、実行で***.exeができる。実に簡単。 気づいた点無料版では、実行時2秒のDelayが入る。 使用期間に制限がある?? ドラッグ ドロップでは動くようにしたかったが、うまく動かず。
https://w.atwiki.jp/usonx/pages/18.html
ファイル名生成(拡張子だけ変更) $filename = (split(/\./,$ARGV[0]))[0]; $filename = $filename.".csv"; 1が立っているbit数を数える sub bitcount { # 1の数を数える $bits = $_[0]; $bits = ($bits 0x55555555) + ($bits 1 0x55555555); $bits = ($bits 0x33333333) + ($bits 2 0x33333333); $bits = ($bits 0x0f0f0f0f) + ($bits 4 0x0f0f0f0f); $bits = ($bits 0x00ff00ff) + ($bits 8 0x00ff00ff); return ($bits 0x0000ffff) + ($bits 16 0x0000ffff); } 実行環境におけるlocaltimeの取得方法 # 実行環境のlocaltimeを取得(普通はJST) my $now = time(); my $off = (timegm(localtime($now))-timegm(gmtime($now)))/60; printf( "%+03d %02d\n", $off/60, $off%60 ); 時刻フォーマットの読み込み方 $utc0にyy/mn/dd hh mm ssのテキストが入っている $utc0=~ /(\d+)\/(\d+)\/(\d+) (\d+) (\d+) (\d+)/; my $yy = $1; my $mn = $2; my $dd = $3; my $hh = $4; my $mm = $5; my $ss = $6; フォルダ内にあるファイルリストの取得 exe化にも問題にならないので、良い感じ。glob()はエラーになってしまう。plのままなら、globが良い。 opendir(DIRHANDLE, "./"); my $cnt = 0; foreach(readdir(DIRHANDLE)){ next if /^\.{1,2}$/; # . や .. をスキップ $file[$cnt] = $_; $cnt++; } closedir(DIRHANDLE); perlで符号付き型変換 # 16進を符号付き10進に変換する sub dec2dec() { my $val = shift; my $bit = shift; # 範囲確認 #if ( ($val (2**($bit-1)-1)) or ($val -(2**($bit-1)))) { # die "$valは指定されたビット数$bitでは2の補数表現ができません。?n"; #} if($val (2**($bit-1)-1)) { # 負値なら return $val - (2**$bit); }else{ # 正値なら return $val; } } 改行コード0x0Dを付けない Windowsでは、改行コードが0x0D0Aであるため、テキストデータでは、自動で改行コードが変換される。しかし、バイナリ出力では0x0Aを出力しようとすると、勝手に0x0D0Aに変換されてしまうという弊害となる。そこで、この自動変換を止めるには、下記のようにすれば良い。 open OUT, " raw", "data1.txt"; 0x0A を出力する時に 0x0A → 0x0D, 0x0A という置換をするには、↓か、無印 open OUT, " crlf", "data2.txt"; テキストをバイナリに変換する perl内のテキストデータをそのままバイナリに変換する。もちろん、テキストデータは16進数内のテキスト[A-F\d]である必要がある。 foreach(@line) { my $disp = $_; # 改行コード削除 $disp =~ s/\s//gi; # 出力 print OUT pack("H*", $disp); } バイナリデータ読み込み 読み込みだけでなく、書き込みの時も同様。ファイルポインタをbinmodeにする必要がある。 以下の方法は読み込むデータが大きい時には使えない(Out of memory!と言われる) open INFILE, " $ARGV[0]" or die "file open error $!"; # バイナリモードに変更 binmode INFILE; for( my $i = 0; $i 4; $i++ ) { my $buf; # 名前と得点を読み込む #read INFILE, $buf, 1; sysread(INFILE, $buf, -s INFILE); # $bufをアンパック my @temp = unpack C* , $buf; my $ch = unpack("H2", pack("C", $temp[0])); my $disp = sprintf("0x%02X\n",$temp[0]); print $disp; } # ファイルを閉じる close INFILE; そのような場合は、1Byteずつ読み込んで処理する # 対象のファイルオープン open INFILE, " $ARGV[0]" or die "file open error $!"; # バイナリモードに変更 binmode INFILE; # 出力ファイル open OUT," $str1" or die "file open error 2 $!"; $cnt = 1; while(1) { last if undef == read(INFILE, $code, 1); $data = sprintf("%02X", unpack("C",$code) ); #$data = unpack("W",pack( C ,hex($data))); print OUT $data; } 平均値/標準偏差 # 平均値算出 for($i=0;$i $cnt;$i++) { # x行目の処理 $ave_cnt[$i] = 6; $ave[$i] = 0; # 平均値の個数集計 if(int($AZ00[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ00[$i];} if(int($AZ10[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ10[$i];} if(int($AZ15[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ15[$i];} if(int($AZ20[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ20[$i];} if(int($AZ30[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ30[$i];} if(int($AZ40[$i]) == 0){$ave_cnt[$i]--;}else{$ave[$i] += $AZ40[$i];} # その行の個数が0ならaveも0 if($ave_cnt[$i] == 0){ $ave[$i] = 0; }else{ $ave[$i] = $ave[$i]/$ave_cnt[$i]; } } # 標準偏差算出 for($i=0;$i $cnt;$i++) { # x行目の処理 $std[$i] = 0; # 標準偏差の処理 値が0なら飛ばす if(int($AZ00[$i]) != 0){$std[$i] += ($AZ00[$i] - $ave[$i])*($AZ00[$i] - $ave[$i]);} if(int($AZ10[$i]) != 0){$std[$i] += ($AZ10[$i] - $ave[$i])*($AZ10[$i] - $ave[$i]);} if(int($AZ15[$i]) != 0){$std[$i] += ($AZ15[$i] - $ave[$i])*($AZ15[$i] - $ave[$i]);} if(int($AZ20[$i]) != 0){$std[$i] += ($AZ20[$i] - $ave[$i])*($AZ20[$i] - $ave[$i]);} if(int($AZ30[$i]) != 0){$std[$i] += ($AZ30[$i] - $ave[$i])*($AZ30[$i] - $ave[$i]);} if(int($AZ40[$i]) != 0){$std[$i] += ($AZ40[$i] - $ave[$i])*($AZ40[$i] - $ave[$i]);} # その行のstdを出力 if($ave_cnt[$i] = 0){ $std[$i] = 0; }else{ # n法 標準偏差 $std[$i] = sqrt($std[$i]/($ave_cnt[$i])); } } ビットシフトサンプル #!/usr/bin/perl # 以下は変更する必要なし #----------------------------------------------------------------------------- # # acspac2flg (version $Id eodv,v 1.4 2007/05/22 02 22 33 Exp $) # # uc_acsmode_pacテレメをフラグに変換する # # Usage # acspac2flg.pl hogehoge.csv 5 14 # # options # 1.ファイル名指定 #2.SATTIME列指定(0,1,2,3…で数える) #3.acspac列指定(0,1,2,3…で数える) # # example # acspac2flg.pl hogehoge.csv 5 14#(1) # #----------------------------------------------------------------------------- # Libraries my $SATTIME; my $acsmode; my $subacsmode; my $acqsts; my $sunpre; #----------------------------------------------------------------------------- # Code begin #----------------------------------------------------------------------------- ($opt) = @ARGV; if ($opt eq "-h") { show_usage(); exit; } # オプションがない場合 if ($#ARGV == -1){ print "Error ファイル名を指定してください\n"; } # オプションが3つある場合 if ($#ARGV == 2){ # 対象ファイルのオープン open(IN," $ARGV[0]") || die "Error can t open $ARGV[0]\n"; @line = IN ; close(IN); # ヘッダ出力 $disp = sprintf("#SATTIME,acsmode,subacsmode,acqsts,sunpre,pac\n"); print $disp; # pacからフラグへ変換 $cnt = -1; foreach (@line){ # ヘッダ情報を飛ばす if ($cnt == -1){$cnt++; next;} # 衛星時刻 $SATTIME= (split(/\,/,$_))[$ARGV[1]]; # acsmode/subacsmode $temp= hex(((split(/\,/,$_))[$ARGV[2]])); $acsmode= ($temp 0) 0x07; $subacsmode= ($temp 3) 0x07; $acqsts= ($temp 6) 0x01; $sunpre= ($temp 7) 0x01; # 表示 $disp = sprintf("%f,%d,%d,%d,%d,%d\n",$SATTIME,$acsmode,$subacsmode,$acqsts,$sunpre,$temp); print $disp; # インクリメント処理 $cnt++; } } # オプションが2つある場合 if ($#ARGV == 1){ } exit; #----------------------------------------------------------------------------- # Sub code begin #----------------------------------------------------------------------------- sub show_usage() { print "Usage \n"; print " eodv [-h]\n"; print "\n"; print "options \n"; print " -h 利用方法を提示する\n"; print "\n"; print "example \n"; print "eodv -h #(1) HELP\n"; } ASCII - Binary変換 $ascii = pack("H*", $par1); $bainary= unpack("H*", $par1); 文字列に文字を挿入する方法 $zip = "5770001"; substr($zip, 3, 0) = "-"; print $zip; # 577-0001 正規表現参照 行に"#"があるとき、1ループを飛ばす # ヘッダ情報を飛ばす if (/#/){next;} 正規表現置換 スペースをカンマに置換する # csv置換 $log = $_; $log =~ s/\s+/,/g; 正規表現マッチ 先頭からyymmddmm.ssの規則でマッチする場合 if(/^[\d]{8}.[\d]{2}$/){} 2文字ずつに分割($strの文字列を2文字ずつに分割する) my @chars = $str =~ /.{2}/g; 16進数から10進数への変換 但し、16進はCDABなどの形式であること(0xCDABはダメ $temp_Dec = hex($temp_Hex); 16進数(文字)から数字に変換 右側の$dataが16進数文字だったものが、数字に変換される $data = unpack("W",pack( C ,hex($data))); 10進数から2進数への変換 $bins[$i] = unpack( B8 ,pack( C ,$hexs[$i])); 16進数(文字)から実数(IEEE754 単精度float)への変換 $posx_f = unpack "f", pack "L", hex($posx); 16進数(文字)から実数(IEEE754 倍精度double)への変換 これなのだが・・・ 別の参考サイト。こっちがいいかも 1行置換 perl -pi -e "s/txt/text/g" *.html *.pl perl -pi -e "s/\015\012/\015/g" *.txt 参照置換 ()の中身が$1になる。この場合、test,に置換される。 s/(test)/$1,/g 繰り返し置換 s/([A-F\d]{4})/$1,/g; SHIFT-JIS関連の置換 シフトJISでは、「-」や「表」の文字をperlで置換しようとするとエラーとなってしまう そこで以下のようにするとよい($tmp1にシフトJISの文字が来る) $disp =~ s/\Q$tmp1\E/$tmp2/gi; 区切り切り出し ドット「.」区切りの最初の文字列をfilenameに代入 $filename = (split(/\./,$ARGV[0]))[0]; 文字列操作 $tempの0文字目から2文字を代入 $bnum = substr($temp,0,2); perlにおける2次元配列 my @dat = (); $data[0][0] = 1; 数字判定 整数のみであれば下記 $aを適切な変数名に変更すること if($a =~ /^[0-9]+$/){} 実数であれば if($a =~ /^[0-9.\-]+$/){} テキスト出力整形 空白で列を揃えたい場合 $tmp = sprintf("%15.14s",$prv[$i]); system関数(複数ファイルの結合) 引数が2つ以上ある場合は、下記のように指定する必要があるので、注意。 ただsystemは絶対パス指定での実行可能なので、パスが通ってなければsystemが良い。 my @cmd = ( copy , "$tmp*_1Hz.txt",$tmp."_1Hz.tsf"); my $ret=system(@cmd); もう1つのやり方として、 my $cmd = "cat $str1"; my $ret = `$cmd`; 2つのファイルの結合 my @cmd = ( type , $header ,$tmp."_1Hz.txt"," ".$tmp."_1Hz.tsf"); $ret=system(@cmd); reverse関数 reverse関数は、文字列を逆順に並びかえる。 この時、スカラーかリストかにより動作がかわる。 スカラー変数:文字を逆順に並びかえる。 リスト:要素を逆順に並びかえる。 @data = reverse @data; perlスクリプトのテンプレ #!/usr/bin/perl # 以下は変更する必要なし #----------------------------------------------------------------------------- # # csv2srs (version $Id eodv,v 1.4 2007/05/22 02 22 33 Exp $) # # SRSの算出 # # Usage # csv2srs.pl hogehoge.csv # # options # 特に無し # # example # csv2srs.pl hogehoge.csv #(1) # #----------------------------------------------------------------------------- # Libraries my @dt, @dg, @alpa, @beta, @A, @B, @C, @D, @yy; my $tt,$bs,$bb,$ymax; $Q= 10; $PI= 3.1415926; $g = 9.80665;# [m/s2] #----------------------------------------------------------------------------- # Code begin #----------------------------------------------------------------------------- ($opt) = @ARGV; if ($opt eq "-h") { show_usage(); exit; } # オプションがない場合 if ($#ARGV == -1){ print "Error ファイル名を指定してください\n"; } # オプションが1つある場合 if ($#ARGV == 0){ # 対象ファイルのオープン open(IN," $ARGV[0]") || die "Error can t open $ARGV[0]\n"; @line = IN ; close(IN); # SRS算出 $cnt = -1; foreach (@line){ # ヘッダ情報を飛ばす if ($cnt == -1){$cnt++; next;} # 時間[sec]/加速度取得[m/s2] $dt[$cnt+1] = (split(/\,/,$_))[0]; $dg[$cnt+1] = (split(/\,/,$_))[1]; # インクリメント処理 $cnt++; } # ヘッダ出力 $disp = sprintf("f[Hz],G[g],Q=%f\n",$Q); print $disp; } # オプションが2つある場合 if ($#ARGV == 1){ } exit; #----------------------------------------------------------------------------- # Sub code begin #----------------------------------------------------------------------------- sub show_usage() { print "Usage \n"; print " eodv [-h]\n"; print "\n"; print "options \n"; print " -h 利用方法を提示する\n"; print " -make Level-2を更新する\n"; print "\n"; print "example \n"; print "eodv -h #(1) HELP\n"; } perlスクリプトのexe化 perlスクリプトをexe化する方法がある。exe化する理由としては、perl実行環境がない人への配布等、perlが分からない人にあげても当然実行も加工もできないので、exe化してアプリケーションとして配布すると便利である。 exe化にはいくつか方法がある。perl2exeは簡単に変換環境を整えることができるが、フリーではないことと、ファイル読み込み(おそらくパスの指定)でエラーが出る(原因がよくわからない)。個人的にはPARがオススメ。ただし、PARは環境を整えるのが大変である。 perl2exe http //www.indigostar.com/perl2exe.htm PAR http //hamachiya.com/junk/memo_PAR.html perl2exeのバージョンアップにより、パス問題が解決されているもよう?簡単にplをexe化でき、ほぼ想定通りに動かすことができた。PARの環境を整えるより簡単なので、良いかも…。 使い方は、コマンドプロンプト上で、「perl2exe.exe hoge.pl」でOK 組込み用のモジュールを使用している場合は、上手く変換できない場合がある。 32bit:p2x-9.100-Win32 http //www.indigostar.com/perl2exe.php perl2exeで変換できる(できている?)モジュール use Time Local; use File Basename;
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/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/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/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/hitkik/pages/100.html
バイナリー出力CGI http //homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_kj14.htm http //www.geocities.jp/ky_webid/perl5/018.html
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/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/perlism/pages/11.html
Perl 【読み】ぱぁる 【属性】プログラミング言語 ラリーウォール氏により開発され、インタプリタ式でC,AWK,シェルライクな、いまやCGIの代名詞と言っても過言ではない、他の言語とは比べ物にならないほど柔軟性に富んだプログラミング言語である。 ただ、その柔軟性が裏目に出ることがほとんどで、Aというプログラムでは通用したコードも、ひとたびBというプログラムで同じものを書くと、全く通用しなくなるといったことが起こりやすい言語である。 某人曰く、「Practical Extraction and Report Language」(実用的データ取得レポート作成言語) また某人曰く、「Pathologically Eclectic Rubbish Lister」(病的折衷主義のガラクタ出力装置)