curl で試すと別のものを試している
ブラウザーの名乗りなしで届いたカウンター要求は、数えられた訪問がふつう触れる十二か所のうち二か所にしか書かない。応答は 200。ちゃんとしたカウンター画像を返す。十二のうち十が飛ばされたとは、どこにも書かれない。
この選別は何のためで、何を奪うのか
ここのカウンターはロボットと人を分けていて、分ける手がかりは、その相手が自分について名乗る文字列である。目印の一覧は短く、意図してあいまいさがなく、curl/ はそこに載っている。空の名乗りも載っている。名乗りがまったくない要求はブラウザーではない、という理屈だ。
どちらも正しい。むき出しの curl をロボット扱いするのは間違いではない。実際そうなのだから。困るのは、その curl を打っている人がたいてい、ロボット判定が働くかどうかを確かめているのではない、という点だ。数えられるかどうかを確かめていて、そして知らぬ間にロボット用の道を注文している。
得られるもの。その日の合計が一つ増え、ロボットの欄が一つ増える。それだけだ。一意の訪問者の行はないので、訪問者については何もない。在席一覧にも載らない。ページも国もブラウザーも基本ソフトも機種も時刻もない。確かめたかった部分こそが、走らなかった部分である。
この失敗には症状がない
ここが立ち止まる値打ちのあるところだ。何も測っていない試験は、ふつう自分から名乗り出る。誤り、空の結果、数字があるはずの場所のゼロ。ここでは応答が 200。中身は本物のカウンター画像、3,361 バイト。絵の中の数字さえ増える。その日の合計は、実際に起きた二つのうちの一つだからだ。
だから試験は合格に見える。そこから続くすべて —「計数の道筋は動いている」「新しい列は書かれている」「今回の変更は何も壊していない」— は、確かめるはずだったコードの大半を飛ばした実行から引いた結論である。
書いている最中に起きた
この記事のもとになった測定の最初の版は /c/<番号> を要求していた。それはカウンター画像の住所ではない。本物は意匠と拡張子を持つ、/c/<番号>-<意匠>.png だ。要求は 404 を返した。
スクリプトは三度こう出した。十二か所のうち 0 か所に書く。それは本当のことで、しかも目を細めれば、まさに正しく働いているロボット選別の姿でもある。404 は同じ表の中、ゼロの一行上にあった。一分ほど読まれずにいた。ゼロのほうが面白く、しかも期待と合っていたからだ。
これはこの記事が扱っているのと同じ誤りの、一段上のものだ。誰も確かめていない理由で、測定がもっともらしい答えを出した。捕まえられたのは、スクリプトが要求を信じるかわりに十二の表の行を数えていたからにすぎない。失敗した要求と、選別された要求は、外から見ると同じ顔をしている。
かわりにどうするか
ブラウザーの名乗りを送る。旗を一つ、-A に本物の文字列を添えるだけで、同じ要求が二か所ではなく十二か所のうち十か所に書く。
そして反対側で数える。応答の符号は、要求が届いたことを言う。要求が何をしたかは言わない。要点が副作用にある場合はどこでも — カウンター、待ち行列、記録の一行、どこかの一行 — 試験はその副作用を見に行かねばならない。関わる表すべてについて前後を数えるのは、ここでは二十行で済み、あいまいな結果を二度はっきりさせた。一度は選別のため、もう一度は 404 のためである。
ブラウザーの名乗りをつけても、十二か所のうち二か所は空のままだった。ロボットの欄は当然として、もう一つは参照元の一覧で、送った参照元を記録しなかった。この二つめはまだ追いかけていないので、ここでは説明しない。書いておくのは、そうしない道が、十一行の表を見せて十二行だと言うことだからである。