PerlのJSONで文字化けを回避する

Perl No Comments »

CGIでフォームから送信された文字列をJSONにエンコードしていたときの話です。
キーは英数字、値をUTF-8の文字列にした場合、エンコードした結果をSTDOUTに出力した場合は問題ないのに、DBに格納すると化けるという不思議な現象が発生しました。
「Perl JSON 文字化け」なので検索すると色々出てきますが、どれも参考にならず。「to_json()」も「encode_json()」もダメで、適当にいじっていたら「JSON->new->latin1->encode()」が正解でした。
とはいえ、なぜそうなのかが不明なので、環境によっては動かないかもしれません。
とりあえず、文字コード周りはエンコードを回避するためのパラメータを用意しておいて欲しいものです。
あと、JSONはpureperlなので、スクリプトをアップする際には使用したモジュールをコピーしておくと、動作が保障されると思われます。
でめたしでめたし。

Perlモジュールのバージョン違いに填まる

Perl No Comments »

自作CMSでJSONを使うことにしました。
最近あまり使っていませんが理屈はわかっています。JavaScriptではevalです。
ではなくて、PerlではJSONモジュールを利用すれば問題ない、はずでした。
結論から言うと、ローカルのテスト環境と、coreserverではJSONモジュールのバージョンが違うためにサブルーチンが見つからないとかいわれて怒られていたのでした。
ローカルの環境では2.21、coreserverは3年前の1.14で、to_jsonやfrom_jsonがありません。幸いなことにJSONhaPurePerlなのでコピーするだけでも動きます。
ということで、ライブラリパスを追加するのですが、pushではダメです。
先に読んでくれないと困るのでunshiftします。

BEGIN{ unshift @INC, (./'; }


これで問題なく動くようになりました。
ちなみに、unshiftではなくてpushを使ってしまっていて、なぜ新しいバージョンを読まないのだろうと数時間悩んだなんて恥ずかしくていえません。
なにはともあれでめたしでめたし。

ActionScriptの記法(コーディングスタイル)に馴染めない

Perl, PostScript No Comments »

ActoinScriptをいじり始めて半年ぐらいになりますが、まだまだ記法に馴染めません。
特にイベントをいちいち追加しなければならないところなどもどかしく、ボタンなんてクリックするためにあるんだからクリックイベントのメソッドぐらい用意して置けよなんて思うわけです。

btn.addEventListener( MouseEvent.CLICK, btn_onClick );
function btn_onClick( e:MouseEvent ):void{
  trace( e.target.name );
}


一般的なマニュアルではこうなっていますが、いちいち関数名を考える身にもなってくれと、どの道、このイベント以外からは参照しない処理だと、いちいち分けないといけない意味がわからないのです。
つまりこういうこと。

btn.addEventListener(
  MouseEvent.CLICK,
  function( e:MouseEvent ):void{ trace( e.target.name ); }
);


関数名の重複を怖がる必要はなくなりました。
JavaScriptが頭にあると、スクリプトは外部ファイルに置くべきという理屈から、いちいち関数を用意していたと思うのですが、パブリッシュが前提のActionScriptでは不要の作業。
よく考えればどうってこと無いのですが、解説サイトによっては「関数名の重複を避けるためにパッケージ化」しますなどと、むだな手間を掛けているのを見るとうんざり。
無名関数をもっと使いこなしたほうがいい気がします。
それに、処理速度とか、オブジェクト指向だとかそっちのけで、Perl使いとしてはこっちのほうが見やすいのです。
でめたしでめたし。

CentOS5.5でyum一括アップデートしたらPerlがCompress::Zlibでコケるようになった

Perl No Comments »

昨日、yum一括更新を行ったのですが、その後でどうもクローラが正常に機能しなくなりました。
ログを見てみると、Compress::Zlibで以下のようなエラーを吐いていることを確認。(コピペでなくて入力なのでタイポあるかも)

dualvar is only available with the XS version of  Scalar::Util at /usr/perl5/lib/site_perl/5.8.8/Compress/Zlib.pm line 9


つまりはScalar::Utilのせいで動かないらしいです。
そこでCPANからScalar::UtilをiinstallしようとしてもNOT OKになってしまうので、とりあえず

force install Scalar::Utilde


でしのぐことに。
おそるおそるクローラを起動するとエラーを吐かずに正常に機能するようになりました。
でめたしでめたし。

プリンタを買いました

CentOS, Folding@home, Perl, 未分類 No Comments »

パソコンの使い始めといえばN88-BASICとか、MS-DOS5.0AHとか、Window3.1とかの世代なのですが、PC-9821Xa/7Eを手に入れて以来、それなりに周辺機器には手を出してきました。
その中で今まで手に入れていないメジャーな機器にMOとプリンタがありましたが、ついにプリンタを買うことにしました。
プリンタはずっと欲しかったのですが、携帯のデジカメで済ますのがほとんど。

とはいえ、最近のサービスは領収書など自分で印刷しろってのが多く、ファミマTカードの請求書も印刷のみなのでこれはいよいよ買うしかないと、重い腰を上げたのです。
頻繁に使うわけではなく、インクジェットだと起動時のクリーニングでインク代が馬鹿にならないらしいので、思い切ってレーザーを選択することに。
デザインとか使い勝手とか考えて、結局ブラザーのHL-2140にしました。
買ったのは楽天の店で12000を切る安さ。
ポイントを使って1万ちょいで手に入れました。

di:ブラザー 新品送料無料!A4 モノクロレーザープリンタージャスティオ HL-2140メーカー保証…

実際に使ってみても、特に問題ありません。
レーザなので電気を食うのはわかっていましたが、電圧が不安定になるのか、電磁波の影響かわかりませんが、起動時と印刷時に部屋の蛍光灯がちらつくぐらいで、思っていたよりも静かだし、いい買い物をしたのではないかと思ってます。
トナーセーブモードがあるのですが、印刷ごとに設定品ければならないのでちょっと面倒です。
どうやら、初期状態は固定なようで、印刷のジョブごとに再設定が必要なのは調整して欲しいところです。

型を取得する

PHP, Perl No Comments »

Perlの場合

ref( $str );


全て大文字の文字列が返る

PHPの場合

gettype( $str );


全て小文字の文字列が返る

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

MySQL, Perl No Comments »

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

リダイレクトのためのレスポンスヘッダ

Perl No Comments »

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/" );

モジュールがmod_perlに対応しているかどうかについて

Perl No Comments »

mod_perlでいろいろ動かしてみると、モジュールの対応というものを意識せざるを得なくなりました。
自作のテンプレートモジュールをテストしていたところ、どうも通常とは結果が異なることに気がつきました。
よくよく調べてみると、モジュール内で保持している変数の値がずっと残っているためと判明。
newで呼ばれるところに初期化の処理を加えたところ、希望通りの動きをしてくれました。
よくよく考えると当たり前なのですが、作りが甘いことを実感しました。
公開中のものも、そのうち修正しないとダメですね。

CentOS5.2でmod_perlを使えるようにする

Perl No Comments »

かなり昔(確か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

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン