2005年06月11日
HTTP::MobileAgent:サブクラス検知でいきなりつまづく
先に書いたHTTP::MobileAgentアーキテクチャ改修提案ですが、まだ本家には連絡していません。
とりあえず何か形がないと言っても流されるかもしれないので...。
とはいえ、今ある機能を全部再現してから提案、となると、元々一人メンテナ無理でしょ、というアタリから出てるのに本末転倒なのでアレですが、とりあえず最低限のアイデアの実現の目処は立ててから提案するかなと。
で、サブクラス・プラグインの自由な別開発、新規開発を可能にするための自動検知機構ですが、いきなりつまづきました。
こんな感じの実装を考えていたのですが(これはサブクラスの例ですが、プラグインも同じ)、
HTTP::MobileAgent.pmのimportメソッド
呼ばれているHTTP::MobileAgent.pmと同じライブラリツリーにインストールされているサブクラスは、自動検知できる。
いくんですけど、よく考えたら、サブクラスって、同じツリーにインストールされるとは限りませんよね。
PATHが通っているところならどこにでもインストールされる可能性があるわけで、特に開発環境でなんか、本番とは違うところにPATH通して開発中のプラグインとか置きたい、とか思うかもしれないのに、この方法だとそういうサブクラス・プラグインは検知されない。
同じようなことを、全てのPATHに関して自動検知してやろうとすると、@INCの全てのパスについてディレクトリ内調査してやらないといけない事になり、非常に効率が悪い。というか、実用性ゼロ。
できればプラグイン・サブクラスの自動検知にはこだわりたい...あるいは、他の方法でもいいんだけど、本体とサブクラス・プラグインの開発は独立しつつも、インストールさえすれば協調するようなやり方を何とかしたい、んですけど...。
誰かいいアイデアないですか...。
とりあえず何か形がないと言っても流されるかもしれないので...。
とはいえ、今ある機能を全部再現してから提案、となると、元々一人メンテナ無理でしょ、というアタリから出てるのに本末転倒なのでアレですが、とりあえず最低限のアイデアの実現の目処は立ててから提案するかなと。
で、サブクラス・プラグインの自由な別開発、新規開発を可能にするための自動検知機構ですが、いきなりつまづきました。
こんな感じの実装を考えていたのですが(これはサブクラスの例ですが、プラグインも同じ)、
HTTP::MobileAgent.pmのimportメソッド
sub import{
my $install_dir = __FILE__;
$install_dir =~ s/\.pm/\/SubClass/;
opendir (DIR,$install_dir);
foreach my $file (readdir(DIR)){
if (($file =~ /^(.+)\.pm$/) && ($1 ne 'NonMobile')) {
my $subclass = "HTTP::MobileAgent::SubClass::$1";
eval "use $subclass;";
push (@subclasses,$subclass);
}
}
foreach my $eachclass (@subclasses,"HTTP::MobileAgent::SubClass::NonMobile"){
$eachclass->init();
}
}
これで、一応うまくいくんです。呼ばれているHTTP::MobileAgent.pmと同じライブラリツリーにインストールされているサブクラスは、自動検知できる。
いくんですけど、よく考えたら、サブクラスって、同じツリーにインストールされるとは限りませんよね。
PATHが通っているところならどこにでもインストールされる可能性があるわけで、特に開発環境でなんか、本番とは違うところにPATH通して開発中のプラグインとか置きたい、とか思うかもしれないのに、この方法だとそういうサブクラス・プラグインは検知されない。
同じようなことを、全てのPATHに関して自動検知してやろうとすると、@INCの全てのパスについてディレクトリ内調査してやらないといけない事になり、非常に効率が悪い。というか、実用性ゼロ。
できればプラグイン・サブクラスの自動検知にはこだわりたい...あるいは、他の方法でもいいんだけど、本体とサブクラス・プラグインの開発は独立しつつも、インストールさえすれば協調するようなやり方を何とかしたい、んですけど...。
誰かいいアイデアないですか...。
[composed and posted with ecto]
Related query words in Google & Yahoo
Related Books from Amazon
Trackback to this entry
TrackBack URL :
Trackbacks
サブクラス発見ロジック
Excerpt: HTTP::MobileAgent:サブクラス検知でいきなりつまづく - ここギ...
Weblog: Lost-Season
Tracked: 2005年06月13日 00:37
Excerpt: HTTP::MobileAgent:サブクラス検知でいきなりつまづく - ここギ...
Weblog: Lost-Season
Tracked: 2005年06月13日 00:37
HTTP::MobileAgentのアーキテクチャ改修案、本家に取り込んでもらえそう
Excerpt: ...といっても、俺の実装を採用してもらえそう、ということではなく、こ...
Weblog: ここギコ!
Tracked: 2006年07月14日 23:09
Excerpt: ...といっても、俺の実装を採用してもらえそう、ということではなく、こ...
Weblog: ここギコ!
Tracked: 2006年07月14日 23:09
こんにちは。
Catalystが使ってるModule::Pluggable::Fastの
ロジックって、たぶん@INC全部見てると思うんですが、
あれと同じようなロジック組んでSledge::Plugin以下
探させたら、
Benchmark: timing 100 iterations of find_pluins...
find_pluins: 2 wallclock secs ( 2.06 usr + 0.13 sys = 2.19 CPU) @ 45.66/s (n=
100)
こんな感じでしたけど、どうでしょう。
Posted by: kato at 2005年06月13日 00:51うーん...。
こんな話題ふっときながら、恥ずかしながらなんですけど、あまりいろんな面での経験とかってないんですよね...。
だから判断付きかねるなあーと。
最初の判定にどれだけ時間かかっても、mod_perlやFastCGIだったらそれほど問題はないと思うんですけど、
HTTP::MobileAgentってモジュールの性質的にCGIでもよく使われると思うんですよ...。
CGIで使ったからっていって、少々負荷が上がったからといって使えなくなるようなモジュールじゃ困るなあ、と思うんですが、
かといってどの辺から使えねー!になるのかが経験がなくて判断つきかねるって感じで。
こいつの場合、SubClassとPlugin両方探しにいきますしね...。
今思いついたんですけど、__FILE__下はとりあえず見に行って、後はCGIとかなら環境変数でサブクラス・プラグインが指定されてればそれだけを読んで、指定されてなければ@INC全部見に行く、とかって仕様にしようかな...。
Post a comment
![[ここギコ!]](http://kokogiko.net/logo.png)



・国連人権委、アイヌ・琉球文化の保護を日本に勧告(ほるほる)
・3Dどきゅめんと…って何?点字文書?(building2008)
・3Dどきゅめんと…って何?点字文書?(building2008)
・Vodafone 3GのUserAgent問題:その後(Igroktectonick)
・GoogleMapsと連動したいならPostGISの他にmysqlという選択肢も出てきた あとジオメディアサミット関西も(okumula)
・人員がクラスタ化できている職場と言うのはうらやましい そろそろ限界です(「ま」のつく人)
・もうAmazonクレジットカードは使いません...楽天カード一本で。(名無し)
・ジオメディア忘年会 新年会から始まり東京1、2、関西と続いたジオメディア2008の締めくくり(ぴかぴか)
・GoogleMapsと連動したいならPostGISの他にmysqlという選択肢も出てきた あとジオメディアサミット関西も(kokogiko)