細かく刻んでも直らなかった、経路を変えたら一度で通った
記事のアイキャッチ画像を、CMSへ入れる作業をしていました。画像を文字列に変換して、少しずつ送り込む方法です。
ところが、ときどき壊れます。送った文字列と、届いた文字列が違う。
対処として分割をどんどん細かくしていきました。7000字で壊れたので2500字にし、それでも壊れたので1750字にしました。1750字なら通る。通ったのですが、1枚の画像を送るのに17回かかる計算になりました。
失敗する手順を細かく刻んで通した話と、そのあと経路そのものを変えたら一度で終わった話です。同じ作業が66回から1回になりました。
細かくすれば通る、までは正しかった
画像をそのまま送れないので、いったん文字の並びに変換します。変換すると元の1.3倍くらいの長さになり、1枚で2万8千字ほどになりました。
これを一度に送ると壊れます。どこで壊れたのかを知るために、分割するたびに短い検査用の値を一緒に送って、届いた側で計算し直して突き合わせました。合わなければその回だけやり直せます。
| 1回あたりの長さ | 結果 |
|---|---|
| 7000字 | 不一致 |
| 2500字 | 不一致 |
| 1750字 | 4回連続で一致 |
1750字なら安定して通ります。これで「送れる方法」は確立しました。
1枚17回。今回は4枚必要だったので、66回の往復になります。
しかも毎回、検査用の値を計算して突き合わせます。1回でも合わなければ、その回をやり直します。作業として成立してはいますが、成立させるために手間が積み上がっている状態でした。
細かくするのは、経路を疑っていない証拠だった
ここで手が止まりました。1750字という数字に、根拠が無いことに気づいたからです。
7000で駄目、2500で駄目、1750で通った。通ったという事実しかありません。なぜ1750なら大丈夫なのかは説明できていません。次に別の環境で同じことをしたら、また試して探すことになります。
そして、そもそもの前提を疑っていませんでした。「この経路で送る」ことは決まったこととして扱い、その中でどう工夫するかだけを考えていました。
ファイルをファイルのまま渡す
やり直したのは、経路の側です。
文字列に変換して少しずつ流し込むのではなく、画像ファイルをそのままCMSのアップロード欄へ渡しました。ブラウザがファイルを受け取る仕組みは元からあり、CMSにもファイルを受け取る画面が元からあります。使っていなかっただけです。
| 文字列に変換して送る | ファイルのまま渡す | |
|---|---|---|
| やり取りの回数 | 66回 | 1回 |
| 送る量 | 元の約1.3倍 | 元のまま |
| 壊れたときの検知 | 自分で検査値を付ける | 仕組みの側が持っている |
| 画像の劣化 | 途中で形式を変換していた | 無し |
4枚まとめて、約1.9MBを一度で渡して終わりました。分割そのものが不要になったので、検査値の計算も、やり直しの判断も全部消えました。
1750字という調整も、検査値を突き合わせる仕組みも、それ自体は正しく動いていました。役目を終えて消えたのではなく、最初から必要の無い経路を選んでいたということです。
手順の途中に自作の工夫が積み上がってきたら、それは経路を疑う合図でした。
細かく刻む対処が要るときもある
もちろん、分割が悪いわけではありません。
経路がひとつしか無いなら、その中で安定する大きさを探すのは正しい対処です。今回もそれで一度は通しました。壊れたことに気づけるようにした部分は、経路を変えたあとも考え方として残ります。
問題は、そこで止まったことです。「通す方法が見つかった」時点で満足してしまい、「そもそもこの経路でよかったのか」を考えませんでした。
今回の学び
まず、通った理由を説明できない手順は、まだ解けていないということ。1750字で通ったのは事実ですが、なぜ通るのかは分かっていません。説明できない数字が手順に残っているとき、それは運用でごまかしている合図でした。
次に、工夫が積み上がるほど、前提を疑いにくくなること。分割の仕組みと検査の仕組みを自分で作った後だと、その経路を捨てる判断はしにくくなります。手間をかけたものほど、使い続ける理由になってしまいます。
そして、「どうやってうまくやるか」の前に「この道でいいのか」を1回置くこと。今回は66回を1回にしました。差が出たのは工夫の質ではなく、経路の選び方でした。
この記事を共有する
関連記事

長さが合っているのに、中身が壊れていた
画像を分割して送ったら、長さは1文字も違わないのに真っ黒な画像が上がりました。どこで壊れたかを見つけるまでの遠回りと、検証をどこに置くべきかの話です。
自分のブログに記事が投稿できない — WAFの誤検知と、渡し方を変える解決
自分のブログに、自分で書いた記事が投稿できなくなりました。 原因はサーバーのWAF(Webアプリケーションファイアウォール)でした。記事の本文に含まれるコードが、攻撃と誤検知されて遮断されていたのです。回避を4種類試して […]

順番で決まる名前は、いつか壊れる
用語集の102語に記事からリンクを張ろうとしたら、そのIDが「何番目に出てきたか」で決まっていた。1語足すたびに以降が全部ずれる仕組みを、手書きの対応表に置き換えた話。