明日お披露目するはずだったアプリにバグが見つかった。開発が遅れに遅れて、やっと完成したと思っていただけに、チームの落胆は大きい。しかも、バグが見つかったのはプロジェクトマネージャーの前で動作確認をしている最中だったため、何とも言えない空気になってしまった。
開発からお披露目までの間にはいくつかのテスト段階があるものである。当然今回もその行程を踏んでいたはずだ。テスターいわく、問題は全て報告済みだったとのこと。テストの報告書はマネージャーが最終的に承認することになっているが、どうも話がかみ合わない。
テストの過程で何が起きたのかまだイマイチわからないが、開発者としてはバグを修正することが仕事なので、早速とりかかることになった。
結論から言うと、アプリの方もコミュニケーションの問題だった。正確には、うちのアプリと外部のアプリとの連絡が上手くいっていなかったようだ。
アプリ同士の連絡はhttpという、インターネット上での通信に使われているものと同じ仕組を使っている。ざっくり言うと、ウェブサイトのアドレスのようなも文字列に情報を組み込んでやりとりするのだ。例えばこんな感じのやつで、「?」に続く部分が情報を含んでいる。
https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=12&ct=1418163099&rver=6.4.6456.0&wp=MBI_SSL_SHARED&wreply=https:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1041&id=64855&mkt=ja-JP&cbcxt=mai
ネットユーザーなら誰もが日常的に目にしているものだが、ランダムに文字が並んでいるようにしか見えないので特に気に留めていない人も多いと思う。試しに上の文字列を「&」という記号で区切ってみよう。
https://login.live.com/login.srf?wa = wsignin1.0
& rpsnv = 12
& ct = 1418163099
& rver = 6.4.6456.0
& wp = MBI_SSL_SHARED
& wreply = https:%2F%2Fmail.live.com%2Fdefault.aspx
& lc = 1041
& id = 64855
& mkt = ja-JP
& cbcxt = mai
こうしてみると、XXX=YYYという構造が連なっていることがわかるだろうか。中でも分かりやすいのが
wreply = https:%2F%2Fmail.live.com%2Fdefault.aspx
でreplyは「返事」または「返信」という意味なので、「=」に続く部分は返信用の住所みたいなものだ。
そしてこの返信用の住所もhttpの形式になっている。
https:%2F%2Fmail.live.com%2Fdefault.aspx
ただ、ここでは「/」という記号が「%2F」という形式に化けている。「/」はアドレスの中で区切りを担当している特別な記号なので、そのまま入れると文字列をそこで区切ってしまう。この意図的な文字化けを「エスケーピング」という。
エスケーピングは日本語の文でも、普通に行われていることだ。例えば文法の教科書などで句読点について説明する場合を考えよう。
A:句点とは。のことをいう。
B:句点とは「。」のことをいう。
Aの文だと、途中で文が終わってしまっているように見える。それは、句点に「文と文を区切る」という役割があるからである。だから、カッコで囲むことによって、ここで文を区切りたいのではなく、単に「。」という記号について説明しているだけだということをハッキリさせてあげた方が親切だ。
人間の場合はAでもなんとなく意味がわかるが、コンピュータは馬鹿なので「。」のところで馬鹿正直に文を区切ってしまうから、句点の意味が永遠にわからなくなってしまう。
話が思いっきり脱線してしまったが、結局アプリ同士の連絡ミスを修正するためにどうしてもメッセージに「&」という記号を織り込む必要がでてきた。でも、「&」は「/」みたいに特別な意味を持つ記号なので、アプリのメッセージに挿入する段階で自動的にエスケープされてしまうのだった。これは仕様なので仕方がない。
この事例にぶつかるのは初めてだが、プログラミングでは記号に特殊な意味を持たせることが多いので、エスケーピングは悩みの種だ。今日はなんとか工夫をして乗り切ることができたが、こういう問題が多発するとしばしば私の方が逃げ出したくなる。
