Publish::Maildirへのパッチ

Publish::Maildirへパッチを頂きました。多分人生で初めての経験です。勉強になる部分があり、大変ありがたいです。すぐに取り込めそうな場所は取り込みました。

とは言っても、動作に関係の無い点ばかりです。一番重要な点については、悩んでいます。というのは、このまま実装すると自分の環境では負荷がひどいことになりそうだからです*1


頂いたパッチの拡張内容は、以下の設定をconfig.yamlに記述することで、動作を切り替えるようになっています。

  1. mailfrom(問題なく取り込み済み)
  2. keep_read : 既読の縁取を再配信/未読化しない
  3. keep_deleted : 削除されているエントリーを再配信/未読化しない
  4. trash(上記のkeep_deletedで必要、デフォルトは.Trashのほうが一般的かも?)

その中で、大きな拡張点は2と3です。

順番が逆になりますが、3から考えたいと思います。

keep_deletedで「削除されたエントリーは上書きせずに無視する」という動作については、ゴミ箱の中に既読したエントリーを多数抱えなくてはいけません。自分の場合は、1日経ったら自動で削除する設定にしていますので、これはあまり役に立ちません。
取り込んだFeedはgmailに送ってますので、実際に取り込んだFeedの件数(更新があった回数で、ダブり含む)を調べてみました。昨日は100件近くあります。これが、平均3エントリーくらいあるとすると、Trashには300通/メール溜まることになります。
これ以外にも、TrashにはMLからのメール等も溜まりますので、削除したメールを3日残す設定(多分頻繁にエントリーを更新するのは3位でしょう)にした場合は1000通以上にもなる可能性があります。
サーバー上の負荷を考えると、1000通以上から毎回Message-Idを検索し、重複を検知しなくはいけない方法は少し躊躇してしまいます(サーバーに余裕があればいいのですが)。

2についても同様ですが、こちらは多分それほど検索対象が多くなる可能性は少ないと思われます。もし、気になるエントリーがあればMaildirに残さずに、SBM等にブックマークしたり、GoogleNoteにメモすればいいからです。
しかし、検索対象を少なくすることは再配信/未読化の判定基準を無くすることにもなりまので、Maildirに溜めておくとすると、Trashと同様に時間が右肩上がりに増えて行きます。

で、対応はどうしようかと考えたのですが、やはりPublish::Maildirへ届く前にはじく方法が一番と思われます。多分miyagawaさんからのアドバイスがあったCache(野良プラグイン)がいいのでしょうが、いまいち使い方がわかりませんでした。

そこで、もしかしたらCacheと同じ動作かもしれませんが、Filter::EntryIndexを作ってみました。Message-Idから探すのではなく、$entry->id_safeが同じエントリーを制御できるようにindexファイルを作ります。ファイルの内容からMessage-Idを探すよりは早いでしょう。

とりあえず別エントリーでアップします。

*1:自分主体ですいません