phpを使っていると、ステータスコードを描くのを忘れてしまうので、メモしておく。
print "Status: 302 Moved\n"; print "Location: http://127.0.0.1/\n\n";
または、
use CGI; print CGI::redirect( "http://127.0.0.1/" );
phpを使っていると、ステータスコードを描くのを忘れてしまうので、メモしておく。
print "Status: 302 Moved\n"; print "Location: http://127.0.0.1/\n\n";
または、
use CGI; print CGI::redirect( "http://127.0.0.1/" );
ImageMagickでEPSを背景なしのpngにする方法があったけど、やり方をすっかり忘れてしまったので、GostScriptにお願いすることに。
・イラストレータで見た大きさと同じ画像に変換するには「-r72」のおまじない
・背景を透明にするには「-sDEVICE=pngalpha」のおまじない
を唱えよう
gs -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pngalpha -dEPSCrop -r72 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=output.png input.eps
Windowsの場合はgsではなくgswin32cになります。
mod_perlでいろいろ動かしてみると、モジュールの対応というものを意識せざるを得なくなりました。
自作のテンプレートモジュールをテストしていたところ、どうも通常とは結果が異なることに気がつきました。
よくよく調べてみると、モジュール内で保持している変数の値がずっと残っているためと判明。
newで呼ばれるところに初期化の処理を加えたところ、希望通りの動きをしてくれました。
よくよく考えると当たり前なのですが、作りが甘いことを実感しました。
公開中のものも、そのうち修正しないとダメですね。
かなり昔(確かApache2.0が出た頃)にWindows2000でmod_perlを使ってみようとして挫折したままでした。
なぜ動かなかったのかまでは、はっきり覚えていません。
心機一転、改めてmod_perlに挑戦です。
OSはCentOS5.2、Apacheは2.2.3、mod_perlは2.0.2です。
まずは、mod_perlをインストールします。
yum -y install mod_perl
パッケージが見つかるとインストールが開始され・・・ずに、
Parsing package install arguments Package mod_perl - 2.0.2-6.3.el5.i386 id already installed.
つまり、既にインストールされているとのこと。
手間が省けてラッキーなのか、必要のないモジュールをロードしていたのは問題なのかは気にしてはいけません。
次に、httpd.confを設定しますが、この環境ではperl.confから設定をロードしているので、そのファイルの編集します。
LoadModule perl_module modules/mod_perl.so
これは先述の通り、インストール済みでロード済みなので、このまま。
仮にコメントアウトされているなら外します。
次に、スクリプトの起動設定ですが、perl.confで弄ると、なぜか500エラーになってしまうので、.htaccessで設定を行うことにします。本当はエラーの原因を見つけ出して修正できればいいのですが、まだまだ勉強が必要のようです。
httpdをrestartして問題がなければ、.htaccessの設定に移りましょう。
# mod_perl <IfModule mod_perl.c> <Files ~ "\.(cgi|pl)$"> SetHandler perl-script PerlHandler ModPerl::Registry PerlSendHeader On </Files> </IfModule>
そもそも、拡張子の.cgiと.plはAddHandler cgi-scriptで設定してあるので必要ないのかもしれませんが、一応付けておきます。
mod_perlが実行できるかどうかは、
#!/usr/bin/perl -w use strict; print "Content-Type: text/html\n\n"; print exists $ENV{'MOD_PERL'} ? 'true' : 'false';
このようなスクリプトで確認できます。
trueが表示されれば、サーバー側の設定は終わりました。
次はスクリプトの設定です。
基本的な事として、編集の初期化に注意すること、実行パスはルートになることさえわかっていれば、特に問題はないでしょう。
自作のモジュールなどを利用している場合は、モジュールを読む前に、例えばドキュメントルートが/home/public_html/の場合は、
use lib '/home/public_html/';
ちなみに、BEGINではダメらしいです。
そして、
chdir '/home/public_html/';
このあたりを押さえておけば動くはずです。
Let’s mod_perl life!
Windowsではどうやるんだろう・・・orz
PerlのXML::libXMLモジュールのお話です。
問題が発生したのと同じ条件で、例題として、xmlの中のNameを取り出すことにする。
my $parser = XML::LibXML -> new(); my $dom = $parser -> parse_file( $file ); my @xmlObj = $dom -> getElementsByTagName( 'xml' ); foreach( @xmlObj ){ my $name = $_ -> findnodes( './Name' ); }
$nameに入る文字がUTF-8のとき(スカラーではなくリファレンスが入る?)、UTF-7に化けることがあるらしい。
どうしてこうなるのかは謎。
パースの問題なのか、どこかでコードを指定しなければならないのかはよく分からず。
Perlでエラーのお話。
“eq”は別の予約語の場合もあり。
例えば、
if( $temp eq 'asdf' ){}
という、何の変哲も無い比較を行うときに出現するエラー。
これを回避するには、
if( "$temp" eq 'asdf' ){}
とすればいいのだけれど、これは$tempが純粋なスカラーでない場合に発生する。
つまり、
print ref $temp;
この場合、リファレンスを調べるとSCALARではないとき。
自分がよく遭遇するのは、
XML::LibXML::NodeList
のとき。
スカラーが帰っていると思い込んでいると、たまに痛い目にあいます。
PHPでMySQLを扱うときのお話。
データベースに変更のあった行の数を取得する
mysql_affected_rows();
ただし、UPDATEの場合、更新が行わなければ0が返る。
このページはhttp://pg.penlabo.net/another/md5.htmlに移行します。
use Digest::MD5; my $file = 'exsample.txt'; open FILE, $file; binmode FILE; print Digest::MD5 -> new addfile( *FILE ) -> hexdigest; close FILE;
$file = 'exsample.txt'; echo md5_file( $file );
URLエンコードとは「スペース以外を%HH形式に変換し、スペースを+に変換する」などの仕様については軽く流しておいて、実際にどう使うかメモしておく。ちなみにPHPではいつもアンダースコアを混ぜてしまいsyntax errorを出すのはお約束になっています。
PHPでURLエンコード
rawurlencode( $uri );
PHPでURLデコード
rawurldecode( $uri );
rawが付かないものは、いつかどこかで不具合を起こすかもしれないので、つけておいたほうが無難です。
そして、エンコードの結果は大文字になっているので、他のスクリプトと連携させるときには注意すること。
ローカルはWindowsで動いているのに、リモートにアップしたとたん大文字小文字の違いで動かなくなったりなどよくあること。
ちなみに、Perlでよく使われる以下のようなURLデコードは小文字に変換されます。
PerlでURLエンコード
sub url_encode( $ ){
my $str = shift;
$str =~ s/([^\w ])/'%'. unpack( 'H2', $1 )/eg;
$str =~ tr/ /+/;
return $str;
}
PerlでURLデコード
sub url_decode( $ ){
my $str = shift;
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack( 'H2', $1 )/eg;
return $str;
}
この場合に問題になるのはエンコードのほうで、デコードはほとんど関係有りません。エンコードで大文字にするか小文字にするかは、どちらかに決めておいたほうがいいかもしれませんが、ブラウザで表示されるのは一般的に大文字なので、PerlのURLエンコードにはuc()
の追加をお勧めします。つまり次のようになります。
PerlでURLエンコード
sub url_encode( $ ){
my $str = shift;
$str =~ s/([^\w ])/'%'. uc( unpack( 'H2', $1 ) )/eg;
$str =~ tr/ /+/;
return $str;
}
間違えてはいけないのは、RFC1738には、大文字と小文字の両方が表記されており、「大文字で無ければならない」のではなく、「大文字の方が何かと都合がよい」ということです。PHPと連携させなければ特に考えなくてもいいです。
packはコピペが多く、それほど使いこなせているわけでもないので、他に方法がありそうな気もしますが、見慣れたコードに関数を追加するという明瞭な方法をとることも可読性という意味では大事でしょう。Perlに可読性を求めるなといわれそうですが。
データベースを利用していて、割と使用頻度の高い関数mysql_insert_id()
同時に書き込んだ場合、この値が狂うとこまるし、テーブルをロックしたほうがいいのかどうかを調べてみました。
PHP: mysql_insert_id – Manualによれば、セッションで管理されていて、MySQLのlast_insert_idと同じ機能だということです。
つまり、テーブルをロックする必要はないということでした。