読者です 読者をやめる 読者になる 読者になる

いまさら聞けない? 初心者向け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生成とか出力)

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


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