第4話 仮想キー一個
白い点は、俺の指先に遅れて反応した。
それなら次に考えることは一つだ。
押せるのか。
午前四時半を少し過ぎた。窓の外はまだ暗い。NEXTPULSE へ出す通常報告の下書きは、MICA が裏で整えている。俺の目の前には、方眼紙、レシート、付箋、二台のスマホ、そして画面外に出る白い点がある。
現場の言葉に直せば、やりたいことは単純だ。
空中に、一個だけボタンを置く。
そのボタンに指を近づけたら、空のテキストファイルに一文字だけ入る。
それができれば、画面外の点はただの変な光ではない。入力にできる。
「MICA、安全条件」
「先に確認します。フルキーボード案を検出しました。却下します」
「まだ何も言ってない」
「予測精度に自信があります」
「ひどい偏見だな」
「過去ログに基づく分類です」
否定はしない。
頭の中では、すでに机の上に半透明のキーが並んでいた。AからZ。数字。記号。ショートカット。画面に触れず、キーボードにも触れず、空中で操作できる作業台。
できたら、絶対に気持ちいい。
できたら、絶対に危ない。
「キーは一つだけだ」
「対象文字は」
「s」
自分の仕事名義、soma の最初の一文字。
意味は薄い。だから安全だ。Enter でも Escape でもない。保存でも削除でも送信でもない。ただの小文字一つ。
「入力先は空ファイル。ネットワーク遮断。外部アプリなし。実行系への入力は禁止」
MICA が淡々と条件を並べる。
「追加。フォーカスは専用エディタのみ。貼り付け、ショートカット、変換、連続入力は禁止。入力後は即停止」
「いい」
「さらに、同じ接触で二回以上入らないようにします」
「そこは大事だな」
一回触れたつもりで、二文字も三文字も入るなら使えない。
ボタンを一度押したら、一回だけ反応する。指が震えても、触れっぱなしでも、余計な入力を増やさない。
そのために、短い待ち時間を置く。
技術名で言えばデバウンスだが、今は名前より現象が大事だった。
「MICA、空ファイルを作れ。名前は sandbox-s.txt」
「作成しました。ファイル内容は空。外部同期なし」
「入力イベントのログも取る」
「通常デバイス、仮想候補、画面外座標、指先距離、発火時刻を記録します」
「発火って言い方、物騒だな」
「入力イベントの発生です」
「分かってる」
まずはボタンを作らない。
白い点が指に反応するだけの状態で、指先までの距離を測る。近づける。離す。点の縁がどれくらい揺れるかを見る。
方眼紙の上に、一センチ四方の枠を鉛筆で描いた。
ここに点が入ったときだけ、キーとして扱う。
外なら無視。
枠の中に入ったら、一回だけ s を入れる。
それだけだ。
「当たり判定を設定します」
MICA が言った。
「枠の中に入ったかどうかを見るだけです」
「説明口調が板についてきたな」
「あなたの説明不足を補っています」
「助かる」
白い点を出す。
方眼紙の枠より少し左に出た。
俺は画面外座標の値を調整する。
点が右へずれる。
もう少し。
枠の中央に来た。
ここで指を近づける。
触れない。押さない。空気を撫でるように、点の少し上を通す。
点の縁が揺れた。
だが、ファイルには何も入らない。
「しきい値未満です」
「まだ遠いか」
「安全側です」
俺は指を一ミリ下げた。
実行。
点が浮く。
指先が近づく。
点の縁がへこむ。
エディタの空白に、小さな文字が現れた。
s
俺はしばらく黙った。
たかが一文字だ。
キーボードなら、寝ぼけた小学生でも打てる。スマホなら親指で終わる。声に出すほどのことじゃない。
だが、その s は、キーボードから来ていない。
マウスでもない。
画面上のボタンでもない。
机の上の空気に置いた、一センチ四方の見えないキーから来た。
「入力を確認しました」
MICA の声が、少しだけ遅れて聞こえた。
「通常デバイス由来ではありません。OS の入力ログに該当するキーボードイベントはありません」
「じゃあ、どこから入った」
「専用エディタの内部イベントとして記録されています」
「俺たちが作った道だけ通った?」
「現時点では、そのように見えます」
「いいな」
「よくありません」
「いいだろ。一文字だけだ」
「一文字でも入力です。入力は副作用を持ちます」
正しい。
文字を入れるということは、状態を変えるということだ。空ファイルは、もう空ではない。取り消せる変化でも、変化は変化だ。
「二回目は」
「待ってください」
「分かってる。条件を変えずに再実行」
「指が枠内に残っている場合、入力しない設定です」
「デバウンス確認」
「はい」
指を同じ位置に置いたまま、もう一度白い点を出す。
点はへこむ。
ファイルには何も増えない。
s のまま。
「よし」
「連続入力は抑制されています」
「指を離したら?」
俺は指を大きく離し、三秒待った。
もう一度、近づける。
点がへこむ。
エディタに二つ目の文字が入った。
ss
「一回離せば、次を受ける」
「想定通りです」
その瞬間、俺の頭の中で、またキーが並んだ。
s の隣に o。
その隣に m。
その隣に a。
自分の名前くらいなら、すぐ打てる。アルファベットを並べれば文章も打てる。数字を置けばショートカットも作れる。Enter を置けば実行もできる。
「MICA」
「はい」
「フルキーボード案を」
「却下します」
「最後まで言わせろ」
「却下します」
俺は笑った。
止められると分かっていて言った。たぶん、止めてほしかった。
便利さは危険に似ている。
一度うまくいくと、次はもっと便利にしたくなる。もっと速く、もっと広く、もっと強く。そうやって、制限を外した瞬間に、道具は事故になる。
「今日は s だけ」
「記録しました」
「入力先も空ファイルだけ」
「確認しました」
「ネットワークは戻さない」
「戻しません」
俺は仮想キーを消した。
画面外座標の生成を止め、当たり判定を外し、専用エディタの入力経路を閉じる。
空中には何もない。
方眼紙の上にも、点はない。
エディタには、ss だけが残っている。
「終了」
「観測ログを保存しました」
「通常報告は」
「七割です。いま戻れば、朝十時には十分間に合います」
「戻る」
そう言って、俺はレシートを片づけようとした。
指が止まった。
レシートの上に、薄い痕が残っていた。
白い点を置いた位置。
方眼紙の枠と同じ、一センチ四方。
光ではない。焦げでもない。紙の表面が、そこだけ少し押されたように、角度を変えると薄く見える。
「MICA」
「録画ノイズ候補を提示します」
「肉眼でも見える」
「表示残り、紙の凹み、指先接触、照明角度を候補に追加します」
「触ってない」
「肉眼観測です」
「録画を見る」
録画の中で、仮想キーは確かに消えていた。
白い点も消えていた。
だが、その後のフレームで、レシートの上にだけ、押した位置が薄く残っている。
空中キーは消えている。
それなのに、押した場所だけが、紙の上に残っていた。
■ 技術メモ
【入力イベント】
入力イベントは、キーを押した、マウスを動かした、ボタンを押した、といった操作をプログラムへ伝える通知です。
作中では、物理キーボードではなく、机上の空中キーから専用エディタへ一文字だけ入力しています。
【当たり判定】
当たり判定は、ある位置が決めた範囲に入ったかを調べる処理です。
今回なら、白い点と指先の反応が、一センチ四方の枠の中で起きたときだけ入力として扱っています。
【デバウンス】
デバウンスは、短時間に何度も起きる反応を一回にまとめる処理です。
ボタンを一度押したつもりなのに複数回入力される問題を避けるために使われます。
【入力先の制限】
未知の入力を試すときは、入力先を空ファイルや専用画面に限定すると被害を抑えやすくなります。
作中では、ネットワークや外部アプリを切り離し、送信や削除につながる操作を避けています。




