前回「3ヶ月前の全記事画像消失にたどり着いた話」を書いたとき、最後に「すっきり直って、 正直ほっとしている」と締めた。あれは嘘ではなかったのだけど、正確には「季節ローテーション のバグだけは直った」であって、話はまだ終わっていなかった。今回はその続き。
まずは機械的に仕分けるところから#
季節画像なのか、記事固有のカバー(以下customと呼ぶ)なのかを目視で1件ずつ確認するのは
さすがに現実的じゃないので、Hugoのビルドキャッシュ resources/_gen/images/post に残る
ハッシュ値を手がかりに機械的に分類することにした。考え方はシンプルで、
- 同じハッシュが複数記事に跨って出現する = 使い回されている季節/デフォルト画像
- 1記事にしか出現しないハッシュ = その記事固有のcustom画像
これで46記事を仕分けたところ、custom判定が11件、残り35件が季節側という結果になった。
実際に確認してみると、季節側はさらに2つのグループに分かれていて、片方(9件)は公開月が
ちゃんと同じ季節グループに丸められた、正常なローテーションだった。もう片方(26件)は
公開月がバラバラなのに全部同じ画像を指していて、しかもその画像は今の seasonal/01〜04.jpg
のどれとも一致しない——つまり、前回の記事で解析したあのバグの残骸そのものだった。
該当する26記事の cover.jpg を一旦削除して、修正済みの deploy.sh に再割当てさせたら、
月ごとにきれいに4グループへ分散した。ここまでは想定通り。
穴その1: 0バイトの cover.png という、また別の残骸#
custom判定の11記事を assets/img/cover/custom/ へ移し終えて、いざ hugo server で
確認したら、カテゴリページのビルドがエラーで落ちた。
error calling Resize: failed to resize image ".../cover.png": resize ...: image: unknown format原因は、該当記事のディレクトリに **0バイトの cover.png という残骸**が同居していたこと。
Hugoのページバンドルは cover.* という名前のファイルをfront matterより優先して拾う
慣習があるらしく、以前は同居していた本物の cover.jpg のおかげでたまたま問題が
表面化しなかっただけだった。custom移行で cover.jpg を削除した瞬間、隠れていた
0バイトの残骸が単独で表に出てきた、というオチ。バックアップを取ってから削除して解決。
穴その2: 分類手法そのものに見落としがあった#
ところが、これで一件落着かと思いきや、前回の分類に 入っていない記事 からも同じ エラーが出た。調べてみると、原因は本物の(0バイトではない)PNG画像。ちゃんと中身の ある、正真正銘のcustom画像だった。
なぜ最初の分類で漏れたのか。 resources/_gen はHugoが**実際にレンダリングしたページ
の分しか**キャッシュを作らない。つまり、まだ一度もビルド対象になっていなかった
ページは、キャッシュベースの分類だとそもそも土俵に上がらない。この時点で分類手法を
「Hugoキャッシュ経由」から「 content/post/*/cover.* を拡張子問わず直接ハッシュ
比較」に切り替えて、レンダリング状況に依存しない形に直した。
穴その3: 自作プロパティ名は、ox-hugoにとってただの飾り#
ここまでの調整で「custom画像をfront matterで明示指定する」仕組み自体は組み上がって
いたのだけど、いざ動かしてみると効かない。 all-posts.org 側には確かに指定を
書き込んだのに、書き出された .md のfront matterに一向にその項目が出てこない。
原因は間抜けなもので、 :EXPORT_HUGO_COVER: という 自分で思いついたプロパティ名 を
そのまま使っていたこと。ox-hugoは EXPORT_FILE_NAME や EXPORT_HUGO_TAGS のような、
あらかじめ決められた既知のプロパティしかfront matterに変換してくれない。任意の
キーを追加したいなら、 EXPORT_HUGO_CUSTOM_FRONT_MATTER というplist形式の受け皿を
使うのが正解で、思いつきで名前を作っても黙って無視されるだけだった。
;; NG: ox-hugoが認識せず、front matterに一切出てこない
:EXPORT_HUGO_COVER: custom/foo.jpg
;; OK: 唯一の任意キー用の経路
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :cover "custom/foo.jpg"Emacsのcaptureテンプレート側も同じ間違いをしていたので、新規記事作成時に自動挿入
される空のプレースホルダーも :cover "" の形に直した。
しめに#
前回は「3ヶ月半も気づかれずに進行していた事故」がオチだったけど、今回は逆に 「1つ直したら、もぐら叩きみたいに次から次へと別の問題が顔を出す」タイプの話だった。 機械的な分類、ページバンドルの優先順位、ox-hugoの仕様——それぞれは独立した小さな 落とし穴なのだけど、1つの作業の中で3つ続けて踏むと、さすがに笑ってしまった。
今度こそ本当に片付いた、と思いたい。



