店頭に貼る掲示物を四十枚ぶん出力した。A5の紙面に店の名前と遊び方を載せ、真ん中に符号を置いた形だ。出したあと、念のために画像から符号を読み直して確かめた。四十枚中、三枚が読めなかった。画面で見るぶんには、三枚とも他の三十七枚と何も違わなかった。
端数の倍率が、模様を割っていた
原因は拡大のしかたにあった。符号を小さめに作っておき、紙面に合わせて端数の倍率で引き伸ばしていた。符号は正方形の升目の集まりでできている。端数で拡大すると、この升目の一つが、あるところでは二画素、隣では三画素になる。人の目には同じ模様に見えるが、読み取る側は升目の境目を等間隔だと思って探しているので、幅が揺れると位置の見当がずれる。
直し方は単純だった。升目一つを一画素で作り、そこから整数倍だけで拡大する。こうすれば全部の升目が必ず同じ幅になる。作り直して四十枚とも読めた。拡大は自由にできるものだと思い込んでいたが、模様が意味を持つ画像では、倍率は自由ではなかった。
弱い道具で、合否を出していた
もっと厄介だったのは、その判定に使っていた道具のほうだ。広く使われている画像処理の道具に符号の検出機能があり、最初はそれで確かめていた。ところが同じ四十枚の画像で、別の復号器は四十枚すべてを読めたのに、こちらは三十八枚しか読めなかった。試しに画像を八分の一に縮めてみると、差はもっと開いて、四十枚中五枚しか読めなかった。
つまり、この道具は手元のカメラより明らかに弱い。そのまま使い続けていたら、実際には読める札を「読めない」と判定して直そうとするか、逆に道具の癖を回避する形に符号を寄せて、現実の読み取りとは関係のない最適化をしていたはずだ。判定に使う道具は、使う人の環境より弱くても強くても困る。実機に近いほうへ替えて、以降はそちらで測ることにした。
住所が伸びると、模様が細くなる
もう一つ、あとから効いてくる性質がある。符号に入る文字数が増えると、同じ紙面のなかで升目の数が増え、一つあたりが細くなる。この時点で焼いていた文字列は百六文字ほどで、四十九かける四十九の升目だった。公開する場所が決まって住所が変われば、この文字数は動く。長くなれば細くなり、細くなれば読み取りの余裕が減る。
だから、公開先が確定したら符号を刷り直して、もう一度画像から読み直すこと、と手順に書き足した。一度確かめたから大丈夫、が通用しない種類の確認だった。
記号を描くと、豆腐になる
紙面の細かいところでも一つつまずいた。項目の頭に小さな記号を置こうとして、絵文字や記号の文字をそのまま描画したら、四角い枠だけが並んだ。使っていた描画の道具が、その字の形を持っていなかったからだ。画面では出るのに紙では出ない、という食い違いは、確かめるまで気づけない。結局、記号は文字として置くのをやめて、丸と線の組み合わせで自分で描いた。少し手間だが、どこで出力しても同じものが出る。
実物から、実物へ
最後は通しで確かめた。印刷した掲示物の写真から符号を復号し、その文字列を公開しているサーバへ送って、印が入るところまで六枚とも通った。あわせて、署名を一文字だけ書き換えた文字列も送り、こちらは無効として断られることを見た。通る側だけを見ても、通らない側だけを見ても意味がない。両方そろって、はじめて確かめたことになる。
次の回は、集めた印のなかから、疑わしい動きをどう扱ったかを書く。