CPANの更新で問いただされるapxsのパス
which apxsでも見つからなくて、
find / -name apxsを叩くとかなり時間がかかって
/user/sbin/apxs
と表示された
スクリプト言語Perlのカンファレンス(会議)に15,16日と行ってきました。
生で生みの親であるLallyWall氏を拝見できたこと。
なぜか忍者がいたこと。
Mac bookとiPadだらけだったこと。
色々勉強になったこと。
ほったらかしのモジュール(HTML::AAとImage::Magick::Thumbnail::Simple)をどうにかしないといけないと思ったこと。
PostScript::Simpleを拡張して業務で使っているので何とかしてみたいこと。
PostScriptが笑いのタネにされていたこと。
ことこと。
一通り入れた後に、MySQLを入れ忘れたのに気がついて入れてみたところ、PHPからアクセスできない。実際にはphpMyAdmin3からアクセスできない。エラーメッセージも表示されず、1分ぐらい待たされて方真っ白な画面になってしまう。
コマンドからは問題なくアクセスできるものの、mod_phpからアクセスできない。
このときのPHPは5.3.3、MySQLは5.1.50(64bit)でした。
httpd.confやphp.iniやmy.iniをいじっては見たものの改善せず。
ここで不貞寝しました。
そして翌日。
まず最初にMySQLをノーマルからエッセンシャルに入れ替えたり、32bitにしたりバージョンを入れ替えたりしたけれどうまくいかない。PHPを入れる際にVCのライブラリを更新したのでそれに問題があるのではと考え、仕方がなくWindows7を入れなおすことに。
とりあえずWindows7を上書きでインストールしなおしてみたところ、前のシステムが複製されて残っていて、とっても気持ちが悪い状態に。仕方がないので改めてパーティションをフォーマットしなおしてから、改めて入れなおすことに。
まず最初にMySQL5.1.50(64bit)を入れて、次にApache2.2.16、そしてVCを更新せずにPHP5.3.3を入れなおしてみたところ、やはり現象は同じ。
ここでふとPHPのインストーラーにVCの対象を選択する新しい項目があったのを思い出して、前のバージョンで試してみようと思い立ちました。
PHP5.2.14を入れなおしたところ、zlib.dllがないといわれるのでネットから拾ってきて放り込んだところ、難なく起動。
問題だったのはPHP5.3.3.
データベースとの連携が高いはずのPHPで、このような障害が発生しました。
何でもかんでも組み込み関数にしてしまったPHPの成れの果てを垣間見た気がしました。
結局それ以外では、ActivePerlを64bitにするとMinGWと連携できないようなので、32bitで入れなおしたぐらいで、特に大きな問題もなく開発環境は整いました。
あとはデータを移していくだけです。これもかなり面倒なのですが。
CGIでフォームから送信された文字列をJSONにエンコードしていたときの話です。
キーは英数字、値をUTF-8の文字列にした場合、エンコードした結果をSTDOUTに出力した場合は問題ないのに、DBに格納すると化けるという不思議な現象が発生しました。
「Perl JSON 文字化け」なので検索すると色々出てきますが、どれも参考にならず。「to_json()」も「encode_json()」もダメで、適当にいじっていたら「JSON->new->latin1->encode()」が正解でした。
とはいえ、なぜそうなのかが不明なので、環境によっては動かないかもしれません。
とりあえず、文字コード周りはエンコードを回避するためのパラメータを用意しておいて欲しいものです。
あと、JSONはpureperlなので、スクリプトをアップする際には使用したモジュールをコピーしておくと、動作が保障されると思われます。
でめたしでめたし。
自作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を使ってしまっていて、なぜ新しいバージョンを読まないのだろうと数時間悩んだなんて恥ずかしくていえません。
なにはともあれでめたしでめたし。
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使いとしてはこっちのほうが見やすいのです。
でめたしでめたし。
昨日、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
でしのぐことに。
おそるおそるクローラを起動するとエラーを吐かずに正常に機能するようになりました。
でめたしでめたし。
パソコンの使い始めといえばN88-BASICとか、MS-DOS5.0AHとか、Window3.1とかの世代なのですが、PC-9821Xa/7Eを手に入れて以来、それなりに周辺機器には手を出してきました。
その中で今まで手に入れていないメジャーな機器にMOとプリンタがありましたが、ついにプリンタを買うことにしました。
プリンタはずっと欲しかったのですが、携帯のデジカメで済ますのがほとんど。
とはいえ、最近のサービスは領収書など自分で印刷しろってのが多く、ファミマTカードの請求書も印刷のみなのでこれはいよいよ買うしかないと、重い腰を上げたのです。
頻繁に使うわけではなく、インクジェットだと起動時のクリーニングでインク代が馬鹿にならないらしいので、思い切ってレーザーを選択することに。
デザインとか使い勝手とか考えて、結局ブラザーのHL-2140にしました。
買ったのは楽天の店で12000を切る安さ。
ポイントを使って1万ちょいで手に入れました。
![]()
di:ブラザー 新品送料無料!A4 モノクロレーザープリンタージャスティオ HL-2140メーカー保証…
実際に使ってみても、特に問題ありません。
レーザなので電気を食うのはわかっていましたが、電圧が不安定になるのか、電磁波の影響かわかりませんが、起動時と印刷時に部屋の蛍光灯がちらつくぐらいで、思っていたよりも静かだし、いい買い物をしたのではないかと思ってます。
トナーセーブモードがあるのですが、印刷ごとに設定品ければならないのでちょっと面倒です。
どうやら、初期状態は固定なようで、印刷のジョブごとに再設定が必要なのは調整して欲しいところです。
Perlの場合
ref( $str );
全て大文字の文字列が返る
PHPの場合
gettype( $str );
全て小文字の文字列が返る
通常のCGIでは問題なく動くスクリプトを、いざmod_perl環境下に置いたとたんに動かなくなるのはよくある話。
変数や配列などの初期化がいい加減で、どんどん肥大化してしまうのは、日ごろから心がければ何とか回避できるものの、いまだに良くわからないエラーが次のもの。
「Undefined subroutine &ModPerl::ROOT::ModPerl::Registry::」
Registryの後には実行されるスクリプトのパスが入る。
つまり、mod_perl環境下で実行ファイルはモジュールとして扱われる。
このため、ライブラリやモジュールの読み込みまわりで順番がおかしくなり、ファイルが見つからないといわれることになるのだ。
この文字を検索すると以下のようなサンプルが表示される。 さてはて、いったいどうしたものか。
LoadModule perl_module modules/mod_perl.so
PerlRequire "/path/to/startup.pl"
startup.plを読めばいいらしいのだが、そのとおりにやってもサーバーエラーになる。Apacheのエラーログを見ても同じメッセージか載ってないので、構文エラーという前に効果がないのかもしれない。
日本語のサイトがひとつも見つからないときは、英語が苦手でなければと常に思う。
しかし、このエラーも.htaccessと、httpd.confにディレクトリで指定したときでは挙動が違うような気がする。
Apache起動時に読み込ませた環境では、実行時に読む.htaccessと違うのはもちろん当たりまえなのだが、解決方法が見つからなければいくら原因がわかっていてもしょうがないのである・・・
最悪の場合、ライブラリをやめて1つのファイルに全部詰め込む荒業に出るか?
Recent Comments