表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
現実世界にゼロデイを見つけたので、こっそり修正しています  作者: せい | 健康優良不良プログラマ


この作品ページにはなろうチアーズプログラム参加に伴う広告が設置されています。詳細はこちら

7/9

第7話 二度押された Enter

Enter は、見た目より危ない。


文字を改行するだけのキーに見える。


けれど、場所が変われば意味も変わる。


チャットなら送信。


注文画面なら確定。


予約画面なら申し込み。


管理画面なら削除。


同じ一押しでも、受け取る相手が違えば結果はまるで違う。


だから俺は、空中キーに Enter を割り当てることを後回しにしていた。


レシートを透明な袋へ入れたあと、MICA は俺より先に警告を出した。


「Enter 入力の検証を提案しません」


「まだ何も言ってない」


「あなたの視線がキーボードの右端に移動しました」


「目ざといな」


「危険な操作に関しては、あなたより目ざとく設定されています」


言い返せない。


仮想キー一つで s が入るなら、Enter も入る可能性が高い。だが、Enter は文字ではなく命令になりやすい。


俺は MICA に条件を読ませた。


「ネットワーク遮断」


「確認」


「対象は空ファイル」


「確認」


「実行権限なし。保存先は一時ディレクトリ。外部アプリへフォーカスを移さない」


「確認」


「決済、送信、削除、予約、通知に接続する経路なし」


「確認。追加で、クリップボード書き込みも無効化しました」


「そこまでやるか」


「Enter です」


「説得力がある」


Enter は「はい」と同じだ。


問題は、誰に向かって「はい」と言ったことになるか分からない点にある。


俺は画面の左側に、危険な例を並べた。


送信する。


購入を確定する。


予約を申し込む。


選択した行を削除する。


どれも、普通の画面なら Enter 一つで実行されてもおかしくない。しかも、たいていの人は一度押しただけなら一度だけ実行されると信じている。


その信頼が壊れると、システムは急に怖くなる。


「模擬ボタンを置きますか」


「置かない」


「理由」


「今は試したいのが Enter であって、俺の自制心じゃない」


「正しい判断です」


「もう少し喜べる言い方はないのか」


「危険なことをしなかっただけで加点される設計にはしていません」


「厳しい」


厳しいくらいでいい。


面白い現象は、人間に余計な一歩を踏ませる。押したらどうなるか。つないだらどうなるか。外へ出したらどうなるか。


その一歩の先に、誰かの支払い、誰かの予約、誰かのデータがあるなら、遊びでは済まない。


俺は専用エディタを開いた。画面には空のテキスト領域だけがある。保存ボタンもない。送信ボタンもない。ファイル削除の機能もない。


机上には新しい方眼紙を敷き、まだ使っていない枠を一つだけ描いた。枠の中に、薄く `Enter` と書く。


「表示名は不要です」


「俺の気分には必要だ」


「気分で危険キーを増やさないでください」


「増やしてない。一つだけだ」


仮想キーを生成する。


白い点が、机の上に現れる。


前より少しだけ見やすい。慣れたせいか、現象の方が安定したせいかは分からない。


「入力先、空ファイル」


「固定済み」


「押下判定、二百ミリ秒以内の再入力を破棄」


「設定済み」


「録画開始」


「開始」


俺は指を枠へ近づけた。


触れてはいない。


それでも、白い点が一拍遅れて震える。


画面のカーソルが下へ動いた。


一行。


いや、二行。


空のテキスト領域に、改行が二つ入っていた。


「一回しか入れてない」


「押下ログは一回です」


「入力結果は二回」


「はい」


「嫌な返事だ」


「嫌な結果です」


MICA がすぐに候補を並べた。


長押し。


チャタリング。


デバウンス漏れ。


エディタ側の処理重複。


入力イベントの再送。


どれも普通の候補だ。


普通の候補があるうちは、現実側のせいにしない。


それは、俺が自分に課している数少ない礼儀だった。


この礼儀を捨てると、何でも世界のせいにできてしまう。


入力が二回入った。


世界がおかしい。


表示がずれた。


世界がおかしい。


ログが合わない。


世界がおかしい。


そんな調査に金を払う依頼主はいないし、俺もそんな仕事を信用しない。


現実が本当におかしいなら、なおさら普通の原因を先に潰す必要がある。


「長押しではない」


俺は録画を一フレームずつ送った。


指先が枠に入ってから離れるまで、設定した時間より短い。


「チャタリングは」


「物理キーを押していません」


「空中の当たり判定が揺れた可能性」


「判定ログは一回です」


「エディタ側は」


MICA が差分を表示する。


エディタに渡したイベントは一つ。


エディタが受け取った改行も一つ。


だが、テキスト領域に反映された改行は二つ。


「どこで増えた」


「表示反映時、または現実側の入力層」


「表示反映なら画面だけ増える。ファイル内容は」


「二改行です」


「じゃあ表示だけじゃない」


Enter が二回効く。


それは、改行ならまだ笑える。


だが、これが送信ボタンならどうなる。


二通送る。


決済なら二回払う。


予約なら二席取る。


削除なら、一つ余計に消す。


バグの怖さは、見た目の派手さではない。何を二回やったかで決まる。


「MICA、operation_id を入れる」


「同じ操作を一回分として扱う識別子ですね」


「そう」


たとえば受付番号だ。


窓口で同じ番号札を二回出しても、二人分の手続きにはならない。同じ番号なら、もう処理済みだと分かる。


プログラムでも同じ考え方を使う。


一回の操作に番号を振る。


同じ番号の操作がもう一度来たら、二回目は捨てる。


これをちゃんとやっておくと、通信が不安定でリトライが走っても、注文や決済が二重になりにくい。


「発行単位は」


「指先が枠に入った瞬間」


「時間窓は」


「一秒」


「長すぎます」


「じゃあ三百ミリ秒」


「妥当です」


「俺の判断に厳しいな」


「Enter です」


またそれだ。


MICA が検証コードを更新する。


`operation_id` を発行し、同じ ID の入力を一度だけ通す。二度目以降はログへ残して捨てる。


俺はテキスト領域を空に戻した。


方眼紙の枠を撮る。


録画を開始する。


指を近づける。


白い点が震える。


画面のカーソルが下へ動く。


今度は、一行だけだった。


「重複排除は効いた」


「はい。ファイル内容も一改行です」


「よし」


「よし、ではありません」


MICA の声が硬い。


画面の端に、ログが三行出ていた。


`keydown accepted`


`duplicate discarded`


`unmapped fluctuation`


受け付けた入力。


捨てた重複。


対応する入力がない揺れ。


「三つ目は何だ」


「不明です」


「ログ名が不穏だな」


「不穏なものには、不穏と分かる名前を付けます」


三つ目の揺れは、入力としては採用されていない。


ファイルにも出ていない。


それなのに、机上の方眼紙では、Enter 枠の外側がほんの少しだけ暗くなっていた。


半月形ではない。


点でもない。


細い線が、枠の外をなぞったように見える。


俺はレシートの袋を見た。


知らない痕。


その言葉を、口に出さずに飲み込む。


「MICA、二重実行の説明だけで足りるか」


「足りません」


「operation_id のミスだけなら」


「受け付けた入力と捨てた重複までは説明できます」


「三つ目は」


「説明できません」


画面のログを拡大する。


三つ目の時刻は、捨てた重複よりさらに一拍遅い。


俺の指は、もう枠から離れている。


当たり判定も閉じている。


入力先も空ファイルのまま。


「外部由来候補に入れるか」


「入れたくありません」


「感情みたいなことを言うな」


「統計的に弱い候補を増やしたくない、という意味です」


「でも除外は」


「できません」


俺は椅子にもたれた。


Enter は一回しか押していない。


画面上の結果も、一回分に抑えた。


それでも、現実側には三つ目が残る。


重複排除は効いた。


二重実行は止めた。


なのに、止めたはずの外側で、別の何かが反応していた。


■ 技術メモ


【二重実行】


二重実行は、一回だけ実行したつもりの処理が二回走ることです。


改行なら小さな問題で済みますが、送信、決済、予約、削除では大きな事故になります。


【冪等性】


冪等性は、同じ操作を何度行っても結果が一回分に収まる性質です。


通信のリトライやボタンの連打があっても、同じ注文や決済を二重に処理しないために重要です。


【operation_id】


operation_id は、同じ操作かどうかを見分けるための識別子です。


同じ operation_id の処理がもう一度来た場合、二回目以降を捨てることで二重実行を防ぎやすくなります。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ