PHPにPEAR::SOAPをインストールする

CentOS5.3での話です。
SOAPが必要になったのでPEARからインストールすることにしました。
PHP5ではあらかじめ用意されているみたいだけど、公式にすらまともな解説がないのであきらめました。
pear install SOAP-beta
Did not download optional dependencies: pear/Mail, pear/Mail_Mime, pear/Net_DIME, use –alldeps to download automatically
pear/SOAP requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
pear/SOAP can optionally use package “pear/Mail”
pear/SOAP can optionally use package “pear/Mail_Mime”
pear/SOAP can optionally use package “pear/Net_DIME”
No valid packages found
install failed
どうやら、インストーラーが古いのと、いろいろと足らないものがあるので–alldepsスイッチをつけろとのこと。

pear install --alldeps SOAP-beta
pear/SOAP requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
pear/Mail_Mime requires PEAR Installer (version >= 1.6.0), installed version is 1.4.9
pear/Mail_mimeDecode requires PEAR Installer (version >= 1.6.0), installed version is 1.4.9
pear/Mail_mimeDecode requires package "pear/Mail_Mime" (version >= 1.4.0, excluded versions: 1.4.0)
downloading Mail-1.2.0b2.tgz ...
Starting to download Mail-1.2.0b2.tgz (21,972 bytes)
........done: 21,972 bytes
downloading Net_DIME-1.0.1.tgz ...
Starting to download Net_DIME-1.0.1.tgz (7,535 bytes)
...done: 7,535 bytes
downloading Net_SMTP-1.3.3.tgz ...
Starting to download Net_SMTP-1.3.3.tgz (10,944 bytes)
...done: 10,944 bytes
downloading Auth_SASL-1.0.3.tgz ...
Starting to download Auth_SASL-1.0.3.tgz (5,724 bytes)
...done: 5,724 bytes
install ok: channel://pear.php.net/Auth_SASL-1.0.3
install ok: channel://pear.php.net/Net_SMTP-1.3.3
install ok: channel://pear.php.net/Net_DIME-1.0.1
install ok: channel://pear.php.net/Mail-1.2.0b2


まだ何か文句を言っているので、PEARをアップグレードしてみる

pear upgrade PEAR
downloading PEAR-1.9.0.tgz ...
Starting to download PEAR-1.9.0.tgz (291,634 bytes)
.............................................................done: 291,634 bytes
upgrade ok: channel://pear.php.net/PEAR-1.9.0
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
To install use "pear install pear/PEAR#featurename"


もう一度SOAPを入れなおしてみる

pear install -f --alldeps SOAP-beta
WARNING: "pear/HTTP_Request" is deprecated in favor of "pear/HTTP_Request2"
downloading SOAP-0.12.0.tgz ...
Starting to download SOAP-0.12.0.tgz (71,233 bytes)
.................done: 71,233 bytes
install ok: channel://pear.php.net/SOAP-0.12.0


まだしつこく何か言ってるけど、疲れたので放置。

PHPのPEARで覚書

CENTOS5.3での話です。
PEARをアップグレードしようとすると以下のように怒られました。

pear upgrade PEAR
WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
pear/PEAR dependency package "pear/Archive_Tar" installed version 1.3.1 is not the recommended version 1.3.3, but may be compatible, use --force to install
No valid packages found
upgrade failed


PEARが古いのと、Archive_Tarが古いといわれてしまいました。

pear channel-update pear.php.net
Retrieving channel.xml from remote server
Update of Channel "pear.php.net" succeeded


まずPEARを更新して、

pear upgrade pear/Archive_Tar
pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
No valid packages found
upgrade failed


あれ、失敗?

pear install -f pear/Archive_Tar
warning: pear/Archive_Tar requires PEAR Installer (version >= 1.5.4), installed version is 1.4.9
downloading Archive_Tar-1.3.3.tgz ...
Starting to download Archive_Tar-1.3.3.tgz (18,119 bytes)
......done: 18,119 bytes
install ok: channel://pear.php.net/Archive_Tar-1.3.3


強引にねじ込みました。

RGBをCMYKに変換する

結論から言うと失敗作というか、最小値と最大とのみを考慮して作られた式です。
はっきりいって使い物になりませんが、フリーソフトではつかっちゃっているようです。
動作確認用に作ったものなので、細かいエラーチェックは抜きです。

#===============================================================================
# RGB => CMYK(cmyが同じ値の場合kに割り振る)
#-------------------------------------------------------------------------------
sub rgb2cmyk {

	my $rgb = shift;
	$rgb =~ /^#?(..)(..)(..)$/;
	my %color = (
		'r' => hex( $1 ),
		'g' => hex( $2 ),
		'b' => hex( $3 ),
	);

	$color{'c'} = 1 - ( $color{'r'} / 255 );
	$color{'m'} = 1 - ( $color{'g'} / 255 );
	$color{'y'} = 1 - ( $color{'b'} / 255 );
	$color{'k'} = 0;
	if(
		   $color{'c'} == $color{'m'}
		|| $color{'m'} == $color{'k'}
	){
		$color{'k'} = $color{'c'};
		$color{'c'} = $color{'m'} = $color{'y'} = 0;
	}

	return %color;

}

結局、色を絞って変換テーブルを自作することになりましたけどね。

EPSファイルのリンク配置でつまづく

細かい構文は別の機会に。
EPSファイルを作るには、ImageMagickで画像をEPS化したものを、PerlのPostScript::Simpleでデータ毎埋め込んでいましたが、1つのデータでは特に問題がなくても、面付けまで自動的にやろうと思った場合、ファイルサイズがとんでもないことになってしまいます。
そこで、画像のEPSファイルをリンクで指定できれば面付けしてもファイルサイズはぜんぜん問題になりません。
そこで、いろいろ調べて見つけたものを試してみました。
しかし、GSViewでは問題なく表示されても、イラストレータで開けません。
いろいろ試してみると、ファイルパスの指定方法に問題があるとわかりました。厳密にいうと、イラストレータのファイルパスの扱いに問題があるのですが。

リンク先の画像EPSを特定の場所におこうとした場合、ドライブを含む、若しくはドライブ以下の絶対パスが必要です。
そのパスを指定したくない場合は、ドライブの直下に置けばいいことがわかりました。
つまり・・・
Cドライブの直下に置けば、

%%BeginDocument: image.eps
(image.eps) run
%%EndDocument


となります。
仮にC:/eps/に置くとすれば、

%%BeginDocument: image.eps
(C://image.eps) run
%%EndDocument


となります。
ファイルパスを指定するのは面倒なので、ドライブを1つつぶしてその直下に置いたほうが断然楽でしょう。

PHPのparse_ini_fileでハマる

parse_ini_fileは設定ファイルをパースしてくれる関数ですが、使い勝手が良いのか悪いのか。
文字列に「”」ダブルクオートを含む場合、そのままでは記述できません。
エスケープしてみたり、文字列をほかのもので囲んでみたりしたけど、希望するとおりにならない。
しかたなくphpのリファレンスを見ると、定数で逃げればいいとの事。
iniを動的に作成したりする場合は、

define( 'QUOTE', '"' );

必須ということですね。

こういうやり方が残っているとは、PHPもまだまだだなぁと思う今日この頃でした。
ちなみに、検索で調べた中で文字列自体を定数にしろという意見もありましたが、定数と変数の違いを理解していない人が多いのは残念です。
とはいえ、自分も定数に逃げている部分もあるので、大きいことはいえませんが。

HTTP_REFERERは使うな

PHPで組んだものをIEデミルとどうも動きが怪しい。
ちょっと調べてみると、IEがセキュリティ設定の都合でHTTP_REFERERを吐いていないらしく、一部画面の推移に影響が出ていた。
てっきりJavaScriptだけだと思っていたのに、サーバにも情報を隠蔽していたらしい。
仕方がないので、HTTP_REFERERを使わないようにい変更するしかない・・・

Spreadsheet_Excel_Readerのバグ

セルの書式に文字列を指定すると、

Notice: Undefined variable: formatstr in D:\xxx\xxx\Excel\reader.php on line 636


という注意が出ます。
xxxは適当なパスだと思ってください。

このエラーメッセージの出るところを見てみると、変数の初期化がきちんと行われていなため、例外処理が不完全だということのようです。
このあたりの一連の処理が始まるところで、$formatstrを初期化してしまいましょう。
630行目に
$formatstr=”;
とでもしておきます。
これで注意が表示されなくなりました。
このあたりは、PHPのバージョンが違うと注意は表示されないのかもしれません。
このライブラリのようなコードの書き方はあまり馴染めません。
中括弧({})を使ったほうが見やすいと思うのですが。

イラストレーターのEPSデータを考察

イラストレータといっても、手持ちのは古いままで7でのお話です。
EPSで保存すると、プレビューとサムネールを保存するかどうかの確認がありますが、これはいったいどのように格納されているかを調べてみました。

調べるといっても、サムネイルもプレビューも含まないで保存したEPSファイルと、サムネイルまたはプレビューを含んだEPSファイルを比較しただけです。

保存したファイル名と保存日時のデータは無視して、それ以外を比較します。

まず、サムネイルを含んだEPSファイルを比較しました。
違っていたのは、以下のとおりです。
46行目にある
%AI7_Thumbnail: 128 128 8
から
%%EndData
これが、サムネイルデータのようです。
バイナリが16進で格納されているようです。
どの画像形式かはわかりませんが、おそらくTIFFではないでしょうか。

次に、プレビューを含んだEPSファイルを比較しました。
違っていたのは、以下のとおりです。
1行目の先頭にバイナリデータが含まれています。
その後に通常のEPSデータが始まります。
%!PS-Adobe-3.0 EPSF-3.0
そして34行目に、
プレビューを含まないEPSファイルでは
%AI3_DocumentPreview: Header
となっているところが、
プレビューを含むEPSファイルでは
%AI3_DocumentPreview: PC_ColorTIFF
となっいます。
そして一番最後にまたバイナリデータが含まれています。
通常のEPSデータの末尾である
%%EOF
の後に、バイナリデータが追加されています。

他のイラストレータのバージョンでは、また違うかもしれません。
比較に使用したファイルをおいておきます。
サムネイルもプレビューも含まないEPSファイル
サムネイルを含むEPSファイル
プレビューを含むEPSファイル

mod_perlでライブラリが見つけられない

通常の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つのファイルに全部詰め込む荒業に出るか?