Skip to main content
  1. Posts/

カバー画像を直したら、また別の穴が3つ出てきた話

·137 words·1 min
Table of Contents

前回「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_NAMEEXPORT_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つ続けて踏むと、さすがに笑ってしまった。

今度こそ本当に片付いた、と思いたい。

Related