自作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を使ってしまっていて、なぜ新しいバージョンを読まないのだろうと数時間悩んだなんて恥ずかしくていえません。
なにはともあれでめたしでめたし。
昨日、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
でしのぐことに。
おそるおそるクローラを起動するとエラーを吐かずに正常に機能するようになりました。
でめたしでめたし。
Perlでzipファイルを扱うには「Archive::Zip」というモジュールが便利なのですが、gzファイルも同じ感覚で扱おうとしたら以下のようなエラーが出ました。
format error: can't find EOCD signature
エラー処理をしないとさらに5行ぐらい表示されます。
どうもgzファイルには対応していないらしいです。
調べてみると「Compress::Zlib」というモジュールが使えるらしいので弄ってみました。
そもそもgzという圧縮形式はファイルをアーカイブする機能がないので、圧縮ファイルと解凍ファイルは1対1の関係です。サンプルではバッファの展開しか載っていないので、とりあえずその方法で使いました。
$dest = Compress::Zlib::memGunzip($buffer);
でめたしでめたし。
Perlでセッション管理の話です。
PHPだとセッションはsession_start()と$_SESSIONで楽に扱えますが、Perlではたまに苦しみます。
さて、今回はローカルのVistaのActivePerlでは正常に動くスクリプトをcoreserverにアップすると挙動が違うのです。
クッキーは更新されているのに、セッションファイルが更新されません。
クッキーがない場合はセッションファイルを作成しているのですが、それ以降の更新が行えません。
また、クッキーだけ残してセッションファイルを削除するとセッションファイルの作成すらしてくれません。
極めつけはアクセスすると1分ごとにセッションファイルが量産されていくのです。
もちろんセッションの有効期限はそんなに短くありません。
どうしてかな~と、いじっているとどうやらリダイレクトが悪さをしているようです。
たとえばログイン処理でログインに成功するとログイン後のトップページへリダイレクトするわけですが、そうすると正常にセッションが更新されません。
リダイレクトをやめて一度ページを表示するなど出力をクローズしておけば期待した動きをしてくれます。
でも、CGI::redirectとCGI::Sessionの相性が悪いという話は聞いたことがありません。自分の開発環境では一度もそういう現象には出くわしたことがありません。
環境が違う点といえば・・・cgiwarpぐらいかな。「CGI::Session coreserver」とかでぐぐっても同じ現象の記事が見つからないので自分の書き方が悪いのかな~
えらいことになった。
とりあえずTerm::ReadKeyを入れればいいらしい
[root@localhost ~]# cpan
Sorry, we have to rerun the configuration dialog for CPAN.pm due to
some missing parameters...
Normally CPAN.pm keeps config variables in memory and changes need to
be saved in a separate 'o conf commit' command to make them permanent
between sessions. If you set the 'auto_commit' option to true, changes
to a config variable are always automatically committed to disk.
どうやらTerm::ReadKeyというものが必要なようなので、いれてみる。
cpan[1]> install Term::ReadKey
CPAN: Storable loaded ok (v2.15)
Going to read '/root/.cpan/Metadata'
Database was generated on Tue, 15 Dec 2009 08:56:54 GMT
Running install for module 'Term::ReadKey'
Running make for J/JS/JSTOWE/TermReadKey-2.30.tar.gz
CPAN: checksum security checks disabled because Digest::SHA not installed.
Please consider installing the Digest::SHA module.
CPAN: Time::HiRes loaded ok (v1.9717)
Scanning cache /root/.cpan/build for sizes
............................................................................DONE
CPAN: Compress::Zlib loaded ok (v1.42)
CPAN: Archive::Tar loaded ok (v1.54)
TermReadKey-2.30/
TermReadKey-2.30/genchars.pl
TermReadKey-2.30/Makefile.PL
TermReadKey-2.30/Configure.pm
TermReadKey-2.30/test.pl
TermReadKey-2.30/ReadKey.pm
TermReadKey-2.30/META.yml
TermReadKey-2.30/ReadKey.xs
TermReadKey-2.30/ppport.h
TermReadKey-2.30/MANIFEST
TermReadKey-2.30/README
CPAN: File::Temp loaded ok (v0.22)
CPAN: YAML loaded ok (v0.70)
CPAN.pm: Going to build J/JS/JSTOWE/TermReadKey-2.30.tar.gz
Checking if your kit is complete...
Looks good
Writing Makefile for Term::ReadKey
cp ReadKey.pm blib/lib/Term/ReadKey.pm
AutoSplitting blib/lib/Term/ReadKey.pm (blib/lib/auto/Term/ReadKey)
/usr/bin/perl -I/usr/lib/perl5/5.8.8 genchars.pl
Writing termio/termios section of cchars.h... Done.
Checking for sgtty...
Sgtty NOT found.
Writing sgtty section of cchars.h... Done.
/usr/bin/perl /usr/lib/perl5/5.8.8/ExtUtils/xsubpp -noprototypes -typemap /usr/lib/perl5/5.8.8/ExtUtils/typemap ReadKey.xs > ReadKey.xsc && mv ReadKey.xsc ReadKey.c
gcc -c -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DVERSION=\"2.30\" -DXS_VERSION=\"2.30\" -fPIC "-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE" ReadKey.c
/bin/sh: gcc: command not found
make: *** [ReadKey.o] エラー 127
JSTOWE/TermReadKey-2.30.tar.gz
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
Make had returned bad status, install seems impossible
Failed during this command:
JSTOWE/TermReadKey-2.30.tar.gz : make NO
makeに失敗しました。
しかたがないのでyumからいれてみることに
[root@localhost ~]# yum install perl-Term-ReadKey
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* addons: rsync.atworks.co.jp
* base: rsync.atworks.co.jp
* extras: rsync.atworks.co.jp
* updates: rsync.atworks.co.jp
Setting up Install Process
No package perl-Term-ReadKey available.
Nothing to do
orz=3
えっと、あとはどうすればいいんだろう?
Windowの場合、CPANではNOT OKがでるけど、ppmで簡単に追加できた。
Linux(CentOS)の場合、cpanではNOT OKが大量に出て、個別にモジュールを入れていっても、開発系のライブラリがほとんど入ってないためか、それぞれがNOT OKになってしまう。
結局yumから1つづつ入れていくことになった。
perl-XML-DOM
perl-DIgest-SHA
libxml2
libxml2-devel
Sys-Syslog
perl-Log-Log4perl
んだけど、ログに関するライブラリが入らない。
よくよく見ればCPANの起動時にBundle::CPANを入れろと書いてあるではないか。そういうことならと入れてみる。
何事もなく無事に終了し、Net::Amazonも難なく入った。
結局何が問題なのかって、Bundle::CPANを入れてなかったことだけが問題だったのかもしれない。
新しいマシンが調達できたので、Windowsを載せかえる作業をしています。
このマシンはクローラとして使うのでサーバやスクリプト等のインストールを行う必要があります。
Perlga使えないとどうしようもないので、真っ先にActivePerlをインストールするわけですが、そういえば5.10になったなと思いながら作業を進めていると、CPANを起動したらMinGWというコンパイラを入れろというメッセージが。
5.8まではこういう表示もなく、手作業でMicrosoftからwin32cのソフトを入れていました。
MinGWというものが何かは良くわかっていませんが、Cのコンパイラであることに違いないでしょう。
そしてCPANでコンパイラが必要なモジュールを入れるときに勝手に探してきてインストールまで行ってくれました。
これはかなり楽になりましたね~
追記)プロンプトからのcpanのインストールコマンドがcpan モジュール名になってますね。
cpan install モジュール名を入れたら怒られました。
Perlの場合
ref( $str );
全て大文字の文字列が返る
PHPの場合
gettype( $str );
全て小文字の文字列が返る
Recent Comments