いまさら聞けない? 初心者向けPlagger設定覚え書き その6

いまPla その6です。
その5で複数のフィードをまとめてメールする場合に重複が削除できないという話をしましたが、このことについてmizzyさんがコメントとご自身のブログで説明してくださいました。

SmartFeed::All は「各エントリにID“smartfeed:all”を付け」るのではなく、複数のフィードをひとまとめにしたフィードをつくり、そのフィードに対して ID”smartfeed::all” つけるものです。エントリにIDをつけるわけではありませんので、ご注意ください。
(コメントより引用)


要約すると、

  • SmartFeed::All なフィードは、各フィードが Deduped される前につくられる。
  • SmartFeed::All なフィードは smartfeed.feed フェーズを通過しないので、Filter::Rule が適用されない。

(「mizzy.org - SmartFeed::All で生成されるフィードには Filter::Rule は適用できない」より引用)

より詳しい説明はソースと照らし合わせながらわかりやすく解説下さっていますのでmizzy.orgさんをご覧下さい。


私の解釈が間違っていたのはその4からで、ここで「SmartFeed::Allというモジュールを使っています。これは各エントリに“smartfeed:all”というIDをくっつけるためのものです。」といっていますがこれが間違いです。結果的にはそれほど的はずれではないのですが、致命的なのはSmartFeed::Allが仮想のフィードを作っているということが抜けているところです。この仮想フィードにIDを付加しています。

SmartFeed::Allについて重複が削除できないと書いた問題については、実際に問題となっていたのはSmartFeed::Allによって仮想フィードが作られるタイミングと、Filter::RuleによってDedupedされるタイミングでした。(このことについてはmizzyさんがソースとともに解説してくださっています。やっぱソースちゃんと読まないとダメだなあ。)


重複が削除できないと嵌ってしまった最大の原因は、Plaggerがconfig.yamlに書いた順番に実行していると思っていたためです。実際にはそうではなく、config.yamlを「解釈 → 使うモジュールをload → 決められた順番で実行」という流れになっています。実際にconfig.yamlにPublish::Gmailを一番上に書いてもSubscription::Configを一番下に書いても実行されるであろう順番に書いたものと同じように動作します。

例えば一般的な順番で書いたconfig.yaml↓と

  - module: Subscription::Config
    config:
      feed:
        - http://homepage1.nifty.com/maname/

  - module: CustomFeed::Config

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: Publish::Gmail
    config:
      mailto:   xxx@gmail.com
      mailfrom: xxx+plagger@gmail.com

順番を逆さまに入れ替えたconfig.yaml↓が同じ動作をするわけです。

  - module: Publish::Gmail
    config:
      mailto:   xxx@gmail.com
      mailfrom: xxx+plagger@gmail.com

  - module: Filter::Rule
    rule:
      module: Deduped

  - module: CustomFeed::Config

  - module: Subscription::Config
    config:
      feed:
        - http://homepage1.nifty.com/maname/

その決められた順番(当然ですがソースで決まっています)がSmartFeed::Allの方がFilter::Ruleよりも先だと言うわけですね。ですから仮想フィードを作るときにルールを指定するためには

  - module: SmartFeed
    rule:
      module: Deduped

としてSmartFeed自体にルールを持たせる必要があります。当然ですがここでFreshなどのルールを持たせることもできます。思うように動作しない場合には処理の順序が自分の思ったとおりになっていない可能性があると思います。

ものすごくざっと流れを書くと、

Subscription
     ↓
 CustomFeed
     ↓
 SmartFeed
     ↓
Filter::Rule
     ↓
   Widget
     ↓
  Publish(Feed生成とか出力)

とかなるのかな? まだ触れてないモジュールに関してはよくわからないです。あまりアテにしないで下さい。ちゃんとソース読んでまたこの話題は書くつもりです。


今はこうして複数の新聞社の科学ニュースを取得してまとめてメールしています。更新頻度がそれほど高くないのでまとめた方が読みやすくなるのではないかと思います。

いまさら聞けない? 初心者向けPlagger設定覚え書き その7

いまPla その7です。
今回はその4から進めてきた SmartFeed の話を一端切り上げてWidgetの使い方とWidget::Simpleを使った簡単なWidget pluginの作り方についてみていきたいと思います。今回のWidgetというお題はしげふみメモさんにリクエストいただきました!(おおげさ)
今回のお話は「しげふみメモ:PlaggerのCOOKPADレシピ印刷用Widget」を参考にさせていただいてます。


Widgetっていうのは抽出してきたエントリに情報を付け加えるためのアイテムです。例えばWidget::HatenaBookmarkUsersCountというWidgetを使うことでそのエントリが何人のユーザにブックマークされているかわかるようにしてくれます(ただしPlaggerが実行されたときのユーザ数になります)。このほかにもはてブに登録するためのアイコンをくっつけたり(Widget::HatenaBookmark)、Googleページランクを調べたり(Widget::Simpleのgoogle_pagerankプラグイン)することができます。

こんな風にくっつけることができます。(GIGAZINE風)


このほかにもWidgetプラグインとかWidget::Simpleのプラグイン(これはassetsの中にyamlとしてあります)とかがあります。

書き方も簡単でconfig.yaml

  - module: Widget::HatenaBookmark

  - module: Widget::Simple
    config:
      widget: google_pagerank

とかするだけです。


Widget::Simpleのプラグインは簡単に作ることができます。試しにGoogleのキャッシュへのリンクを生成するためのプラグインを作ってみました。
google_cache.yaml

link: http://www.google.com/search
query: 
  q: my $p = $args->{entry}->permalink; $p = "cache:" . $p; $p
content: Google Cache

たったこれだけです。

基本的にはどこかへのリンクを作ることになりますのでそれにエントリの情報を付け加えて適当なものにするという指定をしています。このファイルをassetsの下にある plugins/Widget-Simple/ に保存します。以下解説。

link
リンクを張る基本になるURLを書きます。ここではGoogleの検索後のURLですね。
query
linkで指定した基礎URLに追加する文字列を指定します。ただ指定するだけではなくqueryの下位に「xxx: yyy」とすることで展開されて「?xxx=yyy」となります。xxxはサーバに渡される変数名、yyyがその変数に代入されるものになります。複数ある場合には並列にいくつでもかけます。またここでPerlの書式を使って文字列をいじることができます。ここではエントリのpermalinkの前に“cache:”という文字列を追加しています。最後に使う変数を書いておきます。(ここでは$p)
append
ここでは使っていませんが、単純にlinkで指定したURLの後ろにくっつけるときに使います。ただし上の例でlinkを「http://www.google.com/search?q=cache:」としてpermalinkをつなげようとしたら失敗しました。“?x=y”のような場合はqueryを使った方が無難そうです。
content
リンクになる文字列や画像を指定します。

ここでは使いませんでしたが、“content_dynamic”というのもあります。単純にcontentで指定するのではなく、permalinkなどを使うときに用います。permalinkの場合は

[% entry.permalink %]

と指定すれば展開されてエントリのpermalinkになります。


ファイルを作るまでもないときにはconfig.yamlのなかで指定することも可能です。

  - module: Widget::Simple
    config:
      link: http://www.google.com/search
      query:
        q: my $p = $args->{entry}->permalink; $p = "cache:" . $p; $p
      content: Google Cache

先ほどのgoogle_cache.yamlの内容をWidget::Simpleのconfigにあたえてやればこれで同じように動きます。限られたサイトだけに使いたい場合やテスト時に使ってみると良いと思います。


いまPla シリーズ

//d.hatena.ne.jp/toshi123/20060912#p1" title="引用元:Muibrog">いまPla その1:基本的yamlの書き方、Filter::EntryFullTextの使い方についてです。
//d.hatena.ne.jp/toshi123/20060913#p1" title="引用元:Muibrog">いまPla その2:CustomFeed::Configの使い方についてです。これで個人ニュースサイトもばっちり?
//d.hatena.ne.jp/toshi123/20060914#p1" title="引用元:Muibrog">いまPla その3:同じサイトから2パターンの以上の領域を抽出したいときにはどうするか。こんどこそばっちり?
//d.hatena.ne.jp/toshi123/20060915#p1" title="引用元:Muibrog">いまPla その4:メールを送る以外の出力方法、2つ以上のサイトをひとまとめにする方法についてです。
//d.hatena.ne.jp/toshi123/20060916#p1" title="引用元:Muibrog">いまPla その5:ひとつのフィード・サイトから複数の出力を行う方法。 SmartFeedに関する試行錯誤(誤解していました)
//d.hatena.ne.jp/toshi123/20060919#p1" title="引用元:Muibrog">いまPla その6:SmartFeedに関する誤解と正しい解釈。config.yamlに書いた順番と実行される順番の違い。
//d.hatena.ne.jp/toshi123/20060919#p2" title="引用元:Muibrog">いまPla その7:Widgetつくっちゃえばいいじゃない。使い方と作り方。