生成した画像に、undefinedと書いてあった
記事のアイキャッチは、自分で書いたスクリプトで作っています。タイトルと一言、それに題材に合わせた線画を1枚に組んで、画像として書き出す仕組みです。
連載を続けるために作った5枚を見返したとき、そのうち1枚に「undefined」と書いてありました。
生成した画像に文字化けのような欠損が入っていたのに気づかなかった話です。なぜ止まらなかったのか、なぜ見落としたのか、そして次から止まるようにした変更を書きます。
線画の代わりに、文字が出ていた
本来そこには、その回の題材を表す薄い線画が入ります。地図、盾、矢印、電波。背景に溶ける程度の濃さで置いてあります。
1枚だけ、その位置に undefined という薄い文字が入っていました。
| 回 | 入るはずだったもの | 実際 |
|---|---|---|
| 第1回 | 地図 | 地図 |
| 第2回 | 目次を表す線 | undefined |
| 第3回 | 盾 | 盾 |
| 第4回 | 矢印 | 矢印 |
| 第5回 | 電波 | 電波 |
なぜ止まらなかったか
生成の仕組みは、記事ごとの設定(題名・一言・図柄の名前)を受け取って、HTMLの文字列を組み立てます。その文字列をブラウザに読ませて、写真を撮るように書き出しています。
図柄は、名前から一覧を引いて取り出します。第2回だけ、その引き当てに失敗していました。
一覧に無い名前を引くと、返ってくるのは「無い」という値です。
それをそのまま文字列に埋め込むと、「undefined」という7文字の文字として混ざります。組み立ては成功し、ブラウザも普通に描き、画像も無事に書き出されます。
どこにも失敗がないので、どこにも警告が出ません。
なぜ見落としたか
理由は3つ重なっていました。
| 理由 | 内容 |
|---|---|
| 薄い | 背景に溶ける濃さで置いている。意識して見ないと読めない |
| 1枚だけ | 5枚並べて見れば違和感が出るが、1枚ずつ確認していた |
| まだ公開前 | 予約投稿だったので、SNSのカードにも一覧にもまだ出ていない |
気づいたのは、続きの回を作るために元のデザインを見に行ったときでした。同じ見た目に揃えるつもりで拡大したら、書いてありました。
作った直後には気づかず、別の目的で見返したときに見つかっています。出力を最後にちゃんと見ていなかったということです。
欠けたら止まるようにした
直した内容は2つです。
ひとつは、その1枚を作り直したこと。もうひとつは、生成する前に図柄の指定があるかを確かめて、無ければその場で止めるようにしたことです。
if (!MARKS[a.mark]) throw new Error('図柄の指定が無い: ' + a.file);
1行ですが、これがあれば今回は画像が書き出される前に止まっていました。
「次から気をつける」は、次に同じことが起きたときの対策になりません。今回も気をつけていなかったわけではなく、薄い文字が1枚だけ混ざっている状態が、気をつけて見つかる範囲の外にありました。
気をつける代わりに、止まるようにしておく。そのほうが確実でした。
公開前でよかった、で終わらせない
今回は予約投稿の段階で見つかったので、公開された画像に混ざることはありませんでした。
ただ、これはたまたま続きを作る用事があっただけです。無ければそのまま公開され、SNSで共有されるたびにその文字が一緒に流れていました。アイキャッチは、記事の中で一番先に人の目に触れる部分です。
見つかった理由が偶然である場合、同じ偶然は次に起きないものとして扱ったほうがよいと考えています。
今回の学び
まず、欠けた値は、文字として混ざるということ。文字列を組み立てる処理は、中身が欠けていても組み立てには成功します。成功したという事実は、中身が正しいことを何も保証していませんでした。
次に、1枚ずつ見ると、揃っていないことに気づけないこと。並べて比べれば違和感として出ますが、順番に見ると「そういうもの」として通り過ぎます。
そして、気をつけるより、止まるようにすること。1行の確認を足すだけで、次からは書き出される前に分かります。注意力に任せていた部分を、仕組みに移し替えられました。
この記事を共有する
関連記事

勉強法(3) 調べる場所が決まらない時間
「読めない」「分からない」を、調べられる形まで分解する話です。詰まる場所は毎回ほぼ同じ構造をしていました。

再試行は入れていた。それでもデプロイが落ちた
再試行の処理は、半年前から入れていました。CMSが500を返したら、少し待ってもう一度投げる。3回まで。 それでも、デプロイが落ちました。 この記事で扱うこと 再試行を入れてあったのに効かなかった話です。何が返ってきてい […]

勉強法(2) 測らないと、分かったことにならない
このサイトで実際にやった「確かめ方」を3つ。どれも、確かめていなかったら間違ったまま進んでいたものです。