$[0]の謎は偶然の産物経由で知ったPerlの関数引数 $[0]の謎
自分の場合、デリファレンスするとき必ず
use strict;
use warnings;
sub hoge {
print ${ $_[0] }
}
my $str = 'foo';
hoge( \\$str );
見たいに{}で囲むようにしてる。何故か。
あとreferenceとderefereceを「レファレンス」「デレファレンス」と読んでたんだけど自分だけ?
$[0]の謎は偶然の産物経由で知ったPerlの関数引数 $[0]の謎
自分の場合、デリファレンスするとき必ず
use strict;
use warnings;
sub hoge {
print ${ $_[0] }
}
my $str = 'foo';
hoge( \\$str );
見たいに{}で囲むようにしてる。何故か。
あとreferenceとderefereceを「レファレンス」「デレファレンス」と読んでたんだけど自分だけ?
かなり困った。書けないんじゃなくて見れない。
はてなダイアリーは使ったことないんだけど、購読しているサイトが多いから結構困る。
早く終わらないかな。
日本の著作権制度の融通の利かなさ加減についてを読んで思ったこと。
著作権法の改正かなんかあった場合、著作物のフェアユース(公正利用)を法的に認めるように要求していけば良いんじゃないかと思った。
もっともフェアユースが盛り込まれるか微妙だけど。
違法なダウンロードを規制することと衝突する権利について。
上記記事をまとめると、著作物の違法なダウンロードを規制すると、
の二つの問題がある。ということらしい。
で、思ったんだけど、誰が何をダウンロードしたかを調査する場合、通信の秘密を侵害されることにはならないんだろうか。
少なくとも、ISPは何をダウンロードしたか分かってるし、何をダウンロードしたか分かれば、それが違法か適法かが分かる。
と言うことを思った。
昨日書いた改造案はどうしたら良いんだろう、と言うことを今日遠出をしているときに考えてた。
で、こうなった。
aggregator.parse
aggregator.filter.'formatName'
aggregator.entry.fixup
説明するっていうか忘れないようにまとめると、
Aggregator系のプラグインでaggregator.filter.feed、aggregator.entry.fixupを行うのを廃止、代わりにaggregator.parseフェーズをrun_hook_onceで実行して、なんらかの形でPlagger::Feedを取得、そのあと$context->update->add( $feed )する。
で、aggregator.parseフェーズではまず、渡されたデータを解析する前に、aggregator.filter.'formatName'を実行する。RSSやAtomだったらaggregator.filter.feed、HTMLだったらaggregator.filter.htmlとか。
で、aggregator.filter.*でデータソースを修正してから、実際に解析してPlagger::FeedにPlagger::Entryを詰め込む。その際にaggregator.entry.fixupを実行する。
と言うのが結構スマートだと思う。
だめだ、眠い。
Plaggerで大量のFeed捌く場合はAggregator::XangoとかAggregator::Asyncとか使えるから問題はない。
問題は100とか200とかのHTMLを巡回する場合。
CustomFeed::DebugでダミーFeed作ってFilter::EntryFullTextとかでタイトルと本文ゲットとかするわけだけど、これを高速化する手順がなかなか見つからない。
Filter::EntryFullTextとXangoくっつけて高速化するパッチはあったけど、他にも似たようなことをしようとすると、似たようなことを繰り返すことになってしまう。
で、データとってくる部分を共通化できないかってことで、色々考えてた。ぶっちゃけFilter::EntryFullTextでタイトルと本文(HTMLのbody)と更新日時取ってくる代わりにCustomFeed::AntennaとかAggregator::Antennaとか作って高速化できないかなーと色々ソース見たものの、構造的になんかうまくできない感じだなーどうしたらいいんだ改造してしまえと言う結果が昨日と今日のPlagger関係のエントリだったりする。
いや、真剣にどうしよう。今の速度でレンタルの共用サーバでPlagger定期的に動かすのは数からいってちょっとやばいのでなんとかしたい、というかなんとかしないとアンテナが作れない。まあ、自分でサーバ用意してFTPで共用サーバに上げればば良いんじゃねとか思うけど、サーバが用意できない。だからレンタルサーバに突っ込んだんだけど、(ryっていうかループ。
うん。どうしたもんか。と言いつつもこういうの考えてるの結構好き。
遠出して疲れて眠いせいか妙にテンション高い。
パッチを修正しました。修正したのはAggregator::Simpleにaggregator.parseフェーズを実装するパッチ 修正版です。
=== lib/Plagger/Plugin/Aggregator/Simple.pm
==================================================================
--- lib/Plagger/Plugin/Aggregator/Simple.pm (revision 52)
+++ lib/Plagger/Plugin/Aggregator/Simple.pm (local)
@@ -15,7 +15,7 @@
my($self, $context) = @_;
$context->register\_hook(
$self,
- 'customfeed.handle' => \\&aggregate,
+ 'customfeed.handle' => $self->can('aggregate'),
);
}
@@ -38,7 +38,7 @@
$res = $self->fetch_content($feed\_url) or return;
$self->handle_feed($feed_url, \$res->content, $args->{feed});
} else {
- return;
+ $self->handle_content($url, $res, $args->{feed});
\}
return 1;
@@ -215,6 +215,19 @@
$str;
}
+sub handle_content {
+ my ($self, $url, $res, $feed) = @_;
+
+ my $context = Plagger->context;
+ my $args = {
+ url => $url,
+ response => $res,
+ feed => $feed,
+ };
+
+ $context->run_hook_once('aggregator.parse', $args);
+}
+
1;
__END__
なんか書いてみたらあっさりできてしまった。
ちなみに他のAggregator系のプラグインで対応するにはやっぱり改造が必要なので注意。
自分の環境(WindowsXP + ActivePerl)だけなのかよく分からないんだけど、
plugins:
- module: Subscription::Config
config:
feed:
- url: http://ryusukeworks.com/atom.xml
- module: Aggregator::Xango
でPlaggerごと固まる。Aggregator::AsyncやAggregator::Simpleだと問題ない。
なんでだ。
追記
さくらインターネットでも固まることを確認。