Plagger とは

10年前に流行は終わってしまった感がある Plagger ではあるが、 ウェブをメールに集約するならばいまだ Plagger の代替となるものはないと思う。 フィードをあれこれ加工が行える。 詳しくはプレゼン資料を参照。

Plagger の衰退理由としては IFTTT や Zapier などの登場や、WebSub や PubSubHubbub のプッシュ型プロトコルの登場、 バッチ方式のプル型の古さ、Perl の衰退などが考えられる。

インストール

  • システムを汚したくないので plenv と cpanm を使って HOME 以下にインストールする
  • インストールした Perl や Plagger に PATH を通さない
  • テストでエラーが出るものは –notest つきでインストールする
  • Plagger はインストールせずにレポジトリから直に使用するのが推奨のためインストールしない (assets_path の指定が不要になる。)
sudo apt-get install -y libxml2-dev zlib1g-dev libexpat1-dev libdb-dev libssl-dev libgmp-dev unzip libmpfr-dev swig
git clone https://github.com/tokuhirom/plenv.git ~/.plenv
git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build

# 子 bash に一旦入る。
PATH="$HOME/.plenv/bin:$PATH" bash
eval "$(plenv init -)"

plenv install -l | head 

# バージョンを選択する。マイナーバージョンが偶数が安定版。
plenv install 5.28.0
plenv global 5.28.0
plenv install-cpanm

cpanm YAML::Loader::Base
cpanm Module::Install::TestBase
cpanm LWP::Protocol::https

git clone https://github.com/miyagawa/plagger.git ~/.plagger/repo

cpanm --installdeps ~/.plagger/repo

# エラーがでるなら個別に
cpanm IO::Socket::SSL --notest

plenv rehash

# bash を抜ける
exit

動作確認

~/.plenv/bin/plenv exec perl ~/.plagger/repo/plagger -v

適当な場所 (~/.plagger/conf/*.yaml) に設定ファイルを置いて、 適当なシュルスクリプト (run-plagger) を作成する。

#! /bin/bash

for i in ~/.plagger/conf/*.yaml ; do
   ~/.plenv/bin/plenv exec perl ~/.plagger/repo/plagger -c $i
done
  • 使ってみると結構バグってたのでパッチをかき集めたり、バグフィクスした。次回セットアップするときはこちらで手順を作成する。 https://github.com/fujii/plagger
  • Plagger::Plugin::CustomFeed::Twitter を追加した。
  • Plagger のテストのためには cpanm –installdeps –with-recommends ~/.plagger/repo で必要なものをインストールする。

内部実装

Plagger を使うには 内部実装、とくにプラグインの hook ポイントを理解しておく必要がある。 ドキュメントはなく、ソースコードの Plagger.pm 内を run_hook で検索するとなんとなく分かる。 また、下のブログにまとめられている。

たとえば Filter::EntryFullText と Deduped での Filter::Rule では Filter::EntryFullText のほうが先に実行されるため、 本文を取得してから重複の削除が行われる。

もしも逆順に重複の削除をしてから本文を取得したいならば、 Plagger を2段階に実行する方法が考えられる。

レシピ

もう少し使ってからまとめる。

https://gist.github.com/fujii/0d88a0757ed1ccf5c0e75d27e157de56

感想

内部実装を理解してないと使えず、かなり時間を要した。 こんなに苦労すると最初にわかっていれば、 Python の rss2email や Python 版 Plagger であるhabuを分解して 機能を再利用したほうが良かったのではないかと思えた。 もしくは、これくらいの規模なら自分の好みの言語で作るのもありかも。 型安全でメモリ管理が楽でライブラリが揃っていそうな Haskell や Rust あたりか。

Deduped を用いるとデータベースを用いた重複削除が行えるが、 重複削除したとに publish の段階でエラーが発生した場合に、 データを失ってしまう可能性が気になる。 Unix 的パイプ型設計の限界かもしれない。 Plagger のようになんでもできる設計ではなく、 feed の取得と mail の送信に特化した設計が望ましい。

Plagger 同様、RSS も Atom も衰退傾向に思われるが、改めて Atom は良い技術だと思った。 WebSub と一緒に普及して欲しい。 一部で流行したてけど、すでに衰退傾向にもみえる Mastodon ではあるが、 WebSub 使っているようなので興味が湧いてきた。

むむむ、 HTML::TreeBuilder::XPath が HTML5 で追加されたタグを扱えない。 HTML::HTML5::Builder::Document でできるような気がするが、そろそろ挫折しそう。