Bulknews::Subtech RSSフィード

2006/09/25 (月)

[Plagger] Discovery proof of concept 03:16  [Plagger] Discovery proof of concept - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] Discovery proof of concept - Bulknews::Subtech

IRC にて、del.icio.us のフィードを Subscription::Feed に食わせて、その各URL に対するはてなブックマークのフィード (b.hatena.ne.jp/entry/rss/$url) を集めてくる には? という質問があったのでちょっと書いてみた。

package Plagger::Plugin::Discovery::HatenaBookmarkComments;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

sub handle {
    my($self, $context, $args) = @_;

    my $url = $args->{feed}->url;
       $url =~ s/#/%23/;
    $args->{feed}->url("http://b.hatena.ne.jp/entry/rss/$url");

    return; # not success ... to be fetched with Aggregator::Simple
}

1;

このあたりは ページが見つかりません。 - Plagger とか ページが見つかりません。 - Plagger でもっとスマートに、かつ assets とかを使って透過的にやりたいなとは思っていますが、現状でもこのコードで動きますね。

やってることはシンプルで customfeed.handle をフックして $args->{feed}->url を書き換えつつ最後に return しているのがポイント。customfeed.handle は run_hook_once なるメソッドでフックが実行されているため、Chain of Responsibilities パターンとなっている。return; することによってその後に実行される Aggregator::Simple が読み込む URL を変えているというわけ。

Aggregator::Simple は config.yaml になければ自動で読み込みされるので、デフォルトでは customfeed.handle フェーズの最後で実行される。

[Plagger] kwalify schema YAML 02:39  [Plagger] kwalify schema YAML - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] kwalify schema YAML - Bulknews::Subtech

というわけで http://www.megabbs.com/~nihen/blog/2006/09/plaggeryamlglobalkwalify.html を参考に、plugins: の下のスキーマも追加してコミットした。

ページが見つかりません。 - Plagger

各プラグインごとの config 項目については対応していないけど、ベーシックな config.yaml の syntax check という意味では十分使えるでしょう。

以下は実行例。 foo.yaml では module: を moudle: と typo している。

% kwalify -f examples/schema.yaml examples/xoxo2opml.yaml
examples/xoxo2opml.yaml#0: valid.
% cat foo.yaml
plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://www.kernel.org/pub/linux/kernel/v2.6/
  - moudle: Foo::Bar
% kwalify -f examples/schema.yaml foo.yaml
foo.yaml#0: INVALID
  - [/plugins/1] key 'module:' is required.
  - [/plugins/1/moudle] key 'moudle:' is undefined.
%

懸念材料としては kwalify は Ruby で、Plagger の YAML.pm とは完全互換ではないので、kwalify で OKとでても YAML.pm ではダメ、というのもあるかもしれないし、その逆も。この辺は ingy がやってる PyYAML 移植計画に多少期待しつつ、という感じか。

[Plagger] Plugin CLI installer via Schema 02:09  [Plagger] Plugin CLI installer via Schema  - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] Plugin CLI installer via Schema  - Bulknews::Subtech

で、config のスキーマが自動で抽出できたら、コマンドラインでプラグインを対話式に追加していくのもいいなあ、と。

% plagger add Publish::Gmail
Setting up Publish::Gmail ...
  Your Email: foo@example.com
  SMTP server? [localhost]
  ...
New block for Publish::Gmail is appended to your config.yaml
%

あ、もちろんスキーマは Web UI でフォームつくるなりにも使えますよね。


[Plagger] YAML validator 02:06  [Plagger] YAML validator - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] YAML validator - Bulknews::Subtech

Plagger用YAMLのvalidation checker、あればうれしいとは思いますよ - Charsbar::Note

自分でつくろうという気はありませんが、あった方が親切なのはたしかだと思いますよ。

各プラグインのPODを読んでいるだけじゃわかんないことっていっぱいありますので。

同じく。 [YAML] Kwalify - Bulknews::Subtech - subtech でもかいたけど、POD なり何なりから YAML のvalidator を(半)自動で生成したいなぁ~というのはありますね。Plagger Conference のときは Excel でスキーマつくって入力、ってネタもありましたし。

で、前もかいたけどプラグインごとにスキーマが違うのでkwalif一発、ってわけにはいかないけど 404 megabbs Not Found で global の部分のとっかかりはできているので、あとはプラグインを最初に読み込んで、それぞれのプラグインの validator を作った後に読み直し、とかすればいいのかな?

プラグインごとのスキーマはPOD から自動で取り出すのが Perl 的、な気がしますがリストとかハッシュとかを受ける場合は自然言語ではちょっと書きにくいですね。

追記:

はてなブログ

そうそう、これは同意。なのでデフォルトで POD から抽出するという lazy な手法をとりつつ、Data::FormValidator で validate かける、というのがいいと思う。上で「(半)自動」と書いたのはそういう意味 。Data::FormValidator を使うのも考えてた。D::FV じゃなくて FV::Simple でもいいし、Kwality の schema ファイルでもなんでも、DRY で相互変換可能ならそれでいい。