10月 11
パソコンの使い始めといえばN88-BASICとか、MS-DOS5.0AHとか、Window3.1とかの世代なのですが、PC-9821Xa/7Eを手に入れて以来、それなりに周辺機器には手を出してきました。
その中で今まで手に入れていないメジャーな機器にMOとプリンタがありましたが、ついにプリンタを買うことにしました。
プリンタはずっと欲しかったのですが、携帯のデジカメで済ますのがほとんど。
とはいえ、最近のサービスは領収書など自分で印刷しろってのが多く、ファミマTカードの請求書も印刷のみなのでこれはいよいよ買うしかないと、重い腰を上げたのです。
頻繁に使うわけではなく、インクジェットだと起動時のクリーニングでインク代が馬鹿にならないらしいので、思い切ってレーザーを選択することに。
デザインとか使い勝手とか考えて、結局ブラザーのHL-2140にしました。
買ったのは楽天の店で12000を切る安さ。
ポイントを使って1万ちょいで手に入れました。

di:ブラザー 新品送料無料!A4 モノクロレーザープリンタージャスティオ HL-2140メーカー保証…
実際に使ってみても、特に問題ありません。
レーザなので電気を食うのはわかっていましたが、電圧が不安定になるのか、電磁波の影響かわかりませんが、起動時と印刷時に部屋の蛍光灯がちらつくぐらいで、思っていたよりも静かだし、いい買い物をしたのではないかと思ってます。
トナーセーブモードがあるのですが、印刷ごとに設定品ければならないのでちょっと面倒です。
どうやら、初期状態は固定なようで、印刷のジョブごとに再設定が必要なのは調整して欲しいところです。
4月 15
Perlの場合
ref( $str );
全て大文字の文字列が返る
PHPの場合
gettype( $str );
全て小文字の文字列が返る
3月 29
通常のCGIでは問題なく動くスクリプトを、いざmod_perl環境下に置いたとたんに動かなくなるのはよくある話。
変数や配列などの初期化がいい加減で、どんどん肥大化してしまうのは、日ごろから心がければ何とか回避できるものの、いまだに良くわからないエラーが次のもの。
「Undefined subroutine &ModPerl::ROOT::ModPerl::Registry::」
Registryの後には実行されるスクリプトのパスが入る。
つまり、mod_perl環境下で実行ファイルはモジュールとして扱われる。
このため、ライブラリやモジュールの読み込みまわりで順番がおかしくなり、ファイルが見つからないといわれることになるのだ。
この文字を検索すると以下のようなサンプルが表示される。
LoadModule perl_module modules/mod_perl.so
PerlRequire "/path/to/startup.pl"
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions +ParseHeaders
Options +ExecCGI
# in startup.pl, i have this:
use lib "/path/to/webObjects";
use Apache2 ( );
use ModPerl::Registry ( );
use Carp;
use CGI;
use lib_webObjects;
1;
startup.plを読めばいいらしいのだが、そのとおりにやってもサーバーエラーになる。Apacheのエラーログを見ても同じメッセージか載ってないので、構文エラーという前に効果がないのかもしれない。
日本語のサイトがひとつも見つからないときは、英語が苦手でなければと常に思う。
しかし、このエラーも.htaccessと、httpd.confにディレクトリで指定したときでは挙動が違うような気がする。
Apache起動時に読み込ませた環境では、実行時に読む.htaccessと違うのはもちろん当たりまえなのだが、解決方法が見つからなければいくら原因がわかっていてもしょうがないのである・・・
さてはて、いったいどうしたものか。
最悪の場合、ライブラリをやめて1つのファイルに全部詰め込む荒業に出るか?
1月 11
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/" );
12月 10
mod_perlでいろいろ動かしてみると、モジュールの対応というものを意識せざるを得なくなりました。
自作のテンプレートモジュールをテストしていたところ、どうも通常とは結果が異なることに気がつきました。
よくよく調べてみると、モジュール内で保持している変数の値がずっと残っているためと判明。
newで呼ばれるところに初期化の処理を加えたところ、希望通りの動きをしてくれました。
よくよく考えると当たり前なのですが、作りが甘いことを実感しました。
公開中のものも、そのうち修正しないとダメですね。
12月 10
かなり昔(確か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
12月 08
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に化けることがあるらしい。
どうしてこうなるのかは謎。
パースの問題なのか、どこかでコードを指定しなければならないのかはよく分からず。
12月 07
Perlでエラーのお話。
“eq”は別の予約語の場合もあり。
例えば、
if( $temp eq 'asdf' ){}
という、何の変哲も無い比較を行うときに出現するエラー。
これを回避するには、
if( "$temp" eq 'asdf' ){}
とすればいいのだけれど、これは$tempが純粋なスカラーでない場合に発生する。
つまり、
print ref $temp;
この場合、リファレンスを調べるとSCALARではないとき。
自分がよく遭遇するのは、
XML::LibXML::NodeList
のとき。
スカラーが帰っていると思い込んでいると、たまに痛い目にあいます。
10月 20
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に可読性を求めるなといわれそうですが。
10月 08
Excelのデータを読む必要が出てきました。
稼動しているシステムでは表向きはPHP、内部はほぼPerlという、
純粋なPHPプログラマにはお手上げのシステムです。
もちろん私はPerlerなので、痛くも痒くもありませんが。
さて、例によってPerlとPHPの間にゴングが鳴らされました。
Perlはお決まりのものがあるので置いといて、PHPのPEARでExcelを探してみると・・・
- Spreadsheet_Excel_Writer: Package for generating Excel spreadsheets
- Structures_DataGrid_DataSource_Excel: DataSource driver using Excel spreadsheets
- Structures_DataGrid_Renderer_XLS: Renderer driver using PEAR::Spreadsheet_Excel_Writer
この3つがヒットしました。
ちなみに、PECLには登録なしでした。
なんかいまいちっぽいので、PEARに登録の無いものを探してみることに。
PHPExcelなるものを発見しました。
このライブラリを取り上げているサイトは多いけど、
実際に使っていたり、サンプルコードを掲示しているサイトが一つも無い・・・
Documentを読んだ限りでは多機能だとわかりますが、
本当に動くかどうか検証されていないものをシステムに入れるわけには行きません。
やはり使い慣れたPerlモジュール「Spreadsheet::ParseExcel」の出番ですか・・・
Recent Comments