2004年12月27日月曜日

Class::DBIとApache::ReloadでInternal Server Error

mod_perlで動作するアプリケーションを開発する場合、更新されたモジュールをリロードしてくれるApache::Reloadのようなモジュールを利用するのが一般的だと思いますが、Apache::Reloadが有効になっている状態でClass::DBIを継承したモジュールを更新すると以下のようなエラーメッセージをはいてInternal Server Errorになるという現象に悩んでました。

>

[Sun Dec 26 20:06:02 2004] [error] Can't use an undefined value as a HASH reference
at /usr/local/perl-5.8.5/lib/site_perl/5.8.5/Class/DBI/Relationship/HasMany.pm line 51.\n
Compilation failed in require at /usr/local/perl-5.8.5/lib/site_perl/5.8.5/Apache/Reload.pm line 140.\n

<

そこで少し調べてみると、Re: Apache::Reload and CDBI won't play togetherに次のような記述が。

>
Class::DBI prevents you from overwriting already declared methods. To
fix this, you would need to hack Apache::Reload to clear the symbol
table of your package just before reloading it, or hack Class::DBI to
ignore overwriting subs.
<

Class::DBIはすでに宣言されているメソッドの上書きをさせないのが原因で、これを回避するには、リロードされる前にシンボルテーブルをクリアするようにApache::Reloadをhackするか、上書きを無視するようにClass::DBIをhackしろということのようです。

そこで今回は開発環境でしか使わないApache::Reloadをhackし、パッチを書いてみました。(Class::DBIに比べてApache::Reloadはコードの量が少ないのでhackが簡単。)

>

--- Reload.pm.orig 2004-12-26 19:35:31.000000000 +0900
+++ Reload.pm 2004-12-26 20:22:40.000000000 +0900
@@ -122,6 +122,14 @@
}

if ($mtime > $Stat{$file}) {
+ my $package = $key;
+ $package =~ s/\//::/g;
+ $package =~ s/\.pm$//;
+ if ( UNIVERSAL::isa($package, 'Class::DBI') ){
+ no strict 'refs';
+ warn "Apache::Reload: clear the symbol table of $package\n" if $DEBUG;
+ %{"$package\::"} = ();
+ }
delete $INC{$key};
# warn "Reloading $key\n";
if (my $symref = $UndefFields{$key}) {
<



2004年12月25日土曜日

画像がない場合は「No image」画像を表示するように

amazletのJavascriptを参考にして、Amazon Keyword Searchも商品の画像がない場合、「No Image」の画像を表示するようにしました。

それと地味にブラウズノードを手動で追加してます。自動化はまだできず。。



2004年12月24日金曜日

Class::DBI::DTO

前々からClass::DBIでデータをcreateする際の引数にハッシュのリファレンスでなく、オブジェクトを渡せたらいいなーと思っていたので、そんな感じのことができるClass::DBI::DTOというモジュールを書いてみました。
Class::DBI::DTO - Data Transfer Object for Class::DBI
ドキュメントは途中ですがあしからず。。
dtoメソッドで生成されるインスタンスはparamメソッドを持っているので、SledgeのFillinFormではadd_fobjectにそのままインスタンスを渡せます。

DTOという単語はオブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座を読んでいたときに出てきたもので、JAVAの偉い人が考えた概念らしいです。このモジュールの用途として、データをセッションに入れたり、そのままフィルインさせたりと何となくTransferな感じかなーと思ってこの名前を付けました。勝手に使ったら怒られるんだろうか。。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座



2004年12月17日金曜日

Shibuya Perl Mongers テクニカルトーク #5

Shibuya Perl Mongers : Shibuya Perl Mongers テクニカルトーク #5に行ってきました。アルファギークな方々による技術的に濃ゆい話(iPod,ITunesのAPI,SpiderMonkey,SOAP,XML-RPC,TDD,JAPHなど)をたっぷり聞いてきました。

特に参考になったのが竹迫さんのXML::ParserのUTF8フラグ問題の対処方法。perl5.6、5.8のどちらにも通用する対処方法は今後の開発に使えそうです。

また、JAPHを読むでは、マジカルインクリメントを用いて「perl」と表示するというコードに関心。

>
my $A="a";for(1..285075){$A++;}print"$A";
<

文字aをインクリメントしていくと、285075番目がperlという文字列になるということですが、ふと「horiuchi」は何番目なんだろうと気になり、それを出すコードを書いてみました。

>
my$a='a';my$b=1;my$c=shift;while($a ne $c){$a++;$b++}print"$b";
<

今朝の9時半から計算し始めましたがまだ計算してます。。現在「112348132」。。いつ終わるかなー。。

Perl Mongersに初めて参加したのが去年の今頃。そのときは自分が何も知らなすぎてこの人たちは何を言ってるんだとかなりのカルチャーショックを受けたのを覚えています。今回もSpiderMonkeyとか初めて聞く単語もあって、いい刺激になりました。

それと、帰りにh.g.lさんとボンディ 神保町本店 で食べたカレーがおいしかったです。




2004年12月16日木曜日

MIME::Lite::TT::Japanese-0.05

MIME::Lite::TT::Japaneseを0.05にアップデートしました。

search.cpan.org: Yasuhiro Horiuchi / MIME-Lite-TT-Japanese

アップロードしたばかりでCPANにはまだ反映されてませんがそのうち反映されると思います。
反映されました 11/16 9:00

0.04からの変更点は

- Dateフィールドに日本のローカルタイムをセットするようにした。

の一点です。MIME::Lite::TT::Japaneseから受け取ったメールの日時がユニバーサルタイムになっていて、Beckyなどで受信するとぱっと見、日付がずれているように見えるのが気になったので、修正しました。ローカルタイムの生成にはMail::Dateを使わせて頂きました。



Sledge::Plugin::SaveUploadImage-0.02

アップロードされたファイルをjpg,gif,png形式で保存するSledge::Plugin::SaveUploadImageを0.02にバージョンアップしました。

Sledge::Plugin::SaveUploadImage-0.02

保存の際の画像のサイズを指定できるようにしました。

また、0.01からインターフェースを変えました。
0.01では保存先のディレクトリとファイル名を別々に渡してやる必要がありましたが、
0.02ではこれを一つにまとめてパスとし、パスの最後が/で終わっている場合はディレクトリと見なし、ファイル名は自動的に発行するようにしました。

返値はファイル名でなく保存先のパスに変更しました。









2004年12月13日月曜日

Google Suggest

Google Suggestがおもしろいです。検索フォームに単語を入力するとそれを補完する形で検索単語の候補をGoogle側でリストアップし、表示してくれます。検索結果の総数も一緒に表示してくれるので、どの単語が一般的なのかとか、単語のスペルはあってるかとか検索意外にも役立ちそうです。

そして早くもmiyagawaさんがperlモジュール化してます。その早さにびっくり。

Amazon Keyword Searchをちょこっと拡張

Amazon Keyword Searchのブラウズノード検索をちょこっと拡張しました。拡張点は以下の通り。

-ブラウズノードの階層構造に対応
--ノードに子ノードがある場合は右側に子ノード一覧を表示するようにしました。

-ノードのパンくず表示
--ノードのパンくずを書籍情報の上に表示するようにしました。

-2度目以降の表示の高速化
--今までは同じノードのランキング表示でもアフィリエイトIDが異なるとキャッシュを使わなかったんですが、同じノードであればキャッシュにヒットするようにしました。

-Google Adsenseをつけた
--URLトラッキング機能を試したかったのでつけてみました。

ブラウズノードについては、現在は手動で更新しているので、すべてのブラウズノードを網羅していません。この部分については手動で追加していくのはしんどいので自動化したいですね。
時間があるときにWWW::Mechanizeとかを使ってやってみようと思います。



ドラクエ8買おうかと思ったけど。。

昼に久しぶりに新宿に出たので、ヨドバシでドラクエ8買っちゃおうかなーと思ったんですが、ゲーム館にいってみるとなにやら長蛇の列が。。今日はPSPの発売日だったんですね。あまりにも人が多くて買うのに時間がかかりそうだったので、ドラクエ8はあきらめました。。

2004年12月7日火曜日

AWS Keyword Searchにブラウズノード別売り上げTOP20を追加

hori-uchi.com: AWS Keyword Searchにブラウズノード別売り上げTOP20を表示する機能を追加してみました。

キーワード検索についてもちょっと修正して、ページングを行えるようにしました。また、1ページに表示する件数を20件にしたので、検索速度も少し速くなったと思います。


Template::Plugin::TagRescue

Webアプリケーション開発において、ユーザが入力したデータをブラウザに表示するような場合には、XSSなどの脆弱性を排除するため、HTMLタグのエスケープは必須です。
でも、What's Newをブラウザから更新するようなアプリケーションの場合、aタグは使いたいとか、imgタグは使いたいというような特定のタグのみ許可してほしいという要望は結構あるものです。

これを簡単にやってくれるのがTemplate::Plugin::TagRescueです。フィルターとして動作するので、使い方も簡単。

>

[% USE TagRescue%]
[% '<a href="http://hori-uchi.com">hori-uchi.com</a><b>bold</b>' | html_except_for('a') %]
<



Template::Toolkitのテンプレート内で割り算

Template::Toolkitのテンプレート内で割り算の商を取得したくて、
>

[% c = int (a / b) %]
<
などと直感的に書いてみたんですが、やっぱり構文エラーになってしまいました。しょうがなくマニュアルを眺めていると、以下のような記述が。

>>
Template Toolkit Manual: Directives

The 'div' operator returns the integer result of division. Both '%' and 'mod' return the modulus (i.e. remainder) of division. 'mod' is provided as an alias for '%' for backwards compatibility with version 1.

[% 15 / 6 %] # 2.5
[% 15 div 6 %] # 2
[% 15 mod 6 %] # 3
<<

>

[% c = a div b %]
<
でできるんですね。絶対忘れるのでメモ。


2004年12月6日月曜日

perl 5.8.6 released

perl5.8.6がリリースされました。

5.8.5からの変更点はsearch.cpan.org: perldelta - what is new for perl v5.8.6で確認できます。






Jcodeが0.88にバージョンアップ

search.cpan.org: Dan Kogai / Jcode-0.88

CPANのアップデートをみてたらJcodeが0.88にバージョンアップされてました。
Encodeのラッパーになるって話を聞きましたがそれはまだのようです。


2004年12月4日土曜日

Amazon Keyword SearchとBidders Keyword Searchに手を加えました。

先日作ったAmazon Keyword SearchBidders Keyword Searchに以下のような改良を施しました。

**Amazon Keyword Search
-任意のアフィリエイトIDを使えるようにした。

今までは無条件で僕のアフィリエイトIDを埋め込んでいましたが、URLに特定の書式でアフィリエイトIDを埋め込むことでそのアフィリエイトID付きのリンクを生成するようにしました。URLの書式はこんな感じです。
>

[]http://hori-uchi.com/aws/aaff/[]アフィリエイトID/
<
たとえば僕のアフィリエイトIDはhori-uchiwebloなので、それを埋め込むとこうなります。
>

[]http://hori-uchi.com/aws/aaff/hori-uchiweblo/[]
<

**Bidders Keyword Search
-検索した商品にアフィリエイト付きリンクをつけた。
-任意のアフィリエイトIDを使えるようにした。

ビッダーズの方もURLに任意のアフィリエイトID,リンクIDを埋め込むことでキックバック先を変更できるようにしました。URLのルールは以下の通りです。

>

[]http://hori-uchi.com/bidders/baff/[]アフィリエイトID/リンクID/
<

実際に値を放り込むとこんな感じになります。
>

[]http://hori-uchi.com/bidders/baff/0s8fBBsidxhs_uQRu3db4Nq--/309638/[]
<

後は両方ともページ送りがついてないので、それはそのうちつけようかと。。Data::Pageでも使えば簡単にできると思うので時間を見つけて実装します。

2004年12月3日金曜日

ビッダーズWebサービスもいじってみました

先日のアマゾンウェブサービスに続いてビッダーズWebサービスもいじってみました。少しいじってできたものがこれです。今回もperl, Sledge, mod_perlで作ってます。

hori-uchi.com: Bidders Keyword Search

機能は前回のアマゾンと同じくただ検索できるだけ。。
とりあえずさわってみた印象として、
-まだ利用者数が少ないのかレスポンスが早くて快適
-検索キーをUTF-8でなくShift_JISで渡すのにちょっと驚いた。
-レスポンスに画像のリンクあるけど商品へのリンクはない??

ビッダーズWebサービス自体はまだベータ版ということでこれからも機能拡張していきそうです。

ビッダーズもアマゾンなどと同じくアフィリエイトをやっているようなのでほんとはこれと絡めたかったんですが、明日は朝から、Internet Week 2004のWeb and Internet Applications Day に参加するのでとりあえず今日は寝ることにします。