ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

ハローサマー、グッドバイ(34) 再起動

»

 「やれやれ」谷少尉は穏やかな笑みを浮かべた。「そんなうさんくさい話に乗ると、本気で思ってるんですか?」

 「思ってませんよ」ボリスもあっさり返した。「あなたは仲間を見捨てられる人じゃない。他の隊員さんたちも同じでしょう。でも、他の民間人の人たちはどうでしょうね。島崎さん、胡桃沢さん、どうですか?仕事とはいえ命までかけられますか?」

 島崎さんと胡桃沢さんは視線を交わした。島崎さんは迷いを浮かべていたし、胡桃沢さんも考え込んでいる。それに力を得たのか、ボリスはぼくに顔を向けた。

 「そこのプログラマはどうだ?」口元に薄笑いを浮かべていたが、その口調は意外なほど真剣だった。「お前が予想に反して優秀なプログラマだということはわかった。何ならハウンドへの就職の口を利いてやってもいい。私には、お前をハウンドのどこの支部にでも、エンジニアとして迎え入れるだけの力がある。どうだ。世界有数の巨大企業で、プログラマとして自由にシステム開発をしたくはないか?予算やスケジュールの心配をすることなしにだ」

 迷わなかったと言えばウソになる。ボリスのあてにもならない再就職の口約束を信じたわけではない。自分の殺害に、あれだけの手間をかけた人間を信じるほど世間知らずでもない。ただ、仕事に命をかけるなどという心境にはほど遠いぼくにとって、この場所から連れ出してくれる、という提案が魅力的だったのだ。すでにオペレーションMM は当初の予定を大きく逸脱している。脱出する手段を失い、水も食料も少ない状態で、Zに囲まれて孤立することなど誰も想定していなかったのだ。しかもハウンドはマーカーのデータ収集を目的として、オペレーションの意図的な妨害行為までしたのだ。今さら「聞いてないよ」と言いたいわけではないが、たとえ戦線離脱したとしても、ここにいるバンド隊員たちを含めて、何人たりともぼくを非難することはできないだろう。

 だが1 つ問題がある。今、ここで1 人だけ脱出して、ブラウンアイズや谷少尉たちが生還しなかったとしたら、ぼくは毎晩、彼らの顔を夢に見て、冷たい汗にまみれて飛び起きることになるだろう。妻と息子の顔が悪夢から思い出に変わるまで1 年を要した。それはとてもつらい1 年間だったのだ。もう一度、同じ思いを耐えるのはゴメンだ。

 「せっかくのラブコールだけど遠慮しとく。ぼくにもプログラマとしてのプライドの切れ端みたいなもんがあって、やりかけの仕事を放り出していくことを拒むんだよ。それに、正直なところ、あんたに命を預ける気にはなれない。同じ預けるならJSPKF の方を選ぶよ」

 「そうか」ボリスは顔を歪めた。「バカな奴だ。もうリトライのチャンスはないからな。佐分利のお二人は?」

 胡桃沢さんはすぐに首を横に振った。島崎さんは、もう少し長く逡巡した後、やはり申し出を断った。それを見たボリスは吐き捨てた。

 「日本人ってのは、どいつもこいつも。好きにすればいいさ」

 「サンキスト」谷少尉が言った。「ミスター・ボリスの持ち物を調べてみろ」

 サンキストは言われた通りに、ボリスの所持品を床に並べた。タブレットが2 台とデイパックだ。タブレットはどちらも電源が落ちている。

 「これはどっちもソリスト操作用の標準仕様ですね」電源を入れたサンキストは、少し失望したように言った。「中身は詳しく見てみないとわかりませんが」

 ぼくは指揮車両が破壊される前に判明した、大量のデータ送受信のことを思い出した。同時にボリスが常にタブレットを手元から離さなかったことも。Zに打ち込んだマーカーから収集したデータを蓄積していたに違いない。自分の推測を口にすると、谷少尉が同意した。

 「そんなところでしょうね。サンキスト、1 台貸せ。調べてみる」

 デイパックの中には、もう少し興味深い物が入っていた。小型の無線機らしい機器と複数のバッテリーだ。

 「お、AN/PRC-152 か。最高レベルのデジタル暗号通信可能、NSA のお墨付き。SATCOM 経由でMIDS-J にリンク可能なやつだ。こいつでヘリに連絡するつもりだったんでしょうね」

 ボリスは顔をそむけた。谷少尉は苦労してレジカウンターから立ち上がると、ボリスに近づいて穏やかな声で話しかけた。

 「通信手順は?」

 「言うわけないでしょう」ボリスは鼻で笑った。「だいたい聞いてどうするんですか?」

 「あなたとデータを人質にして、全員を脱出させるように交渉できないかと思いまして」

 「はあ?」

 ボリスは笑い飛ばそうとしたが、相手が真顔なのを見て口をつぐんだ。

 「そんな交渉、できるわけが......」

 「まず、あなたの膝を撃ち抜いて」谷少尉は淡々と続けた。「次に右手の甲、左足の甲、右耳、左耳。どれぐらいで交渉が成立するか試してみましょうか」

 「......」

 本気で言っているとは思いたくなかったが、谷少尉が任務達成のためには手段を選ばない人であることは、身を持って知らされている。今回のメンバーの中で、一番腹黒いのは、実はこの人なのかもしれない。

 「冗談ですよ」谷少尉はニコリともせずに言うと、またレジカウンターに座った。「ま、こっちにはそういう選択肢もあるってことを、どっかにメモしておいた方がいいですよ」

 「谷少尉」胡桃沢さんが呼びかけた。「ソリストの方はどう進めればいいんですか?」

 「島崎さん」谷少尉は横を向いた。「ドローンをここに呼ぶだけなら、どれぐらい無線をオープンにしておけばいいですか?」

 「2 分というところです」島崎さんはすぐに答えた。「距離的には近いですが、着陸を確認するまで誘導シグナルを出さなければならないので」

 「わかりました。胡桃沢さん、鳴海さん、予定通りセットアップを続けてください。ドローンを操作する目処が立ったら教えてくれますか」

 「D 型の件は?」

 「そこは賭けるしかないですね。お願いします」谷少尉は隊員たちに向き直った。「全員、交代で休憩とコントローラの充電を終えておけ。遅くとも、明日の午前中には脱出するぞ。ここで夜を過ごすのは、今晩を最後にしたいからな」

 隊員たちは、それぞれ了解の合図をすると、持ち場に散っていった。ブラウンアイズは近くの床にごろりと横になった。

 「ここで寝てるけど、何かあったらすぐに起こして」

 「わかった」ぼくは胡桃沢さんと顔を見合わせた。「じゃ、続きをやりますか」

 「何とかなりそう?」島崎さんが訊いた。「何か手伝う?」

 「いえ、大丈夫です。ありがとう」

 島崎さんは、よろしく、とでも言うように片手を上げると、またボリスの近くに戻った。申し訳なさそうな顔で話しかけている。表だってボリスの味方こそしないが、無事に帰還したとき、ハウンドから睨まれたくはないのだろう。胡桃沢さんは、そんな同僚の姿に一瞬だけ嫌悪の表情を浮かべたが、すぐに目を逸らした。

 「よし、続けよう。早めに終わって、ゆっくり休息を取りたいもんだ。明日、脱出するならなおさらだ」

 「そうですね」ぼくは心から同意した。

 あいにく、休息時間はほとんど確保できなかった。

◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

 「ダメだ」胡桃沢さんは小さく罵った。「落ちた。一度、全部止めろ」

 「はい」

 ぼくはBIAC を通して、視覚野に投影された6 つの仮想モニタで、それぞれshutdown コマンドを実行した。同じ処理を、もうかれこれ10 回以上は繰り返している。

 5 台のラズベリーパイに対するソリストのセットアップは、思ったよりスムーズに進んだ。秘かに心配していたSSD 2 台へのUSB 給電も、特に問題は発生せず、Pidora で正常に認識されている。root ディレクトリをSSD に移動するのも成功した。ソリスト環境の構築も、胡桃沢さんのUSB メモリからコピーしたインストーラを実行するだけだ。

 全てのラズベリーパイにソリスト実行環境ができた時点で、指揮車両から回収してきたサーバを接続し、データの同期化を実行する。これには少し時間がかかった。シンクロナイザ自体はPidora 上でも正常に動作したが、ラズベリーパイのCPU とメモリ、それにSSD のアクセス速度が遅いために、同期処理が何度かタイムアウトになってしまったのだ。仕方なく、サーバ側の処理速度を遅くすることで対応した。ここで時間を費やしてしまい、最終的にデータの同期化が完了したのは、22 時過ぎだった。

 味よりも栄養価を考慮した携行食糧で簡素な夕食を済ませた後、ぼくたちはソリストの起動に取りかかった。最初に2 台を再起動し、手動でソリストサービスをスタートする。2 台ともソリストが稼働したのを確認したら、コンソールから管理メニューを通して、ロールの割り振りを実行。それぞれのロールに応じたデータの再構築が開始される。そのはずだったのだが......

 2 台構成だと、再構築を開始して770 ミリ秒後にリソースを食いつぶしてしまった。1 台で引き受けなければならないサービスが多すぎたのだ。3 台構成、4 台構成でも同じだ。5 台めを参加させて、ようやく再構築が進み出したが、カメの歩みのようにのろい。進行率が1% になるのに、8 分以上かかった。このペースだと、再構築が完了するのは約13 時間後になる。

 「そんなに待ってられんな」胡桃沢さんは腕を組んだ。「オートに任せて再構築してから、不要なサービスを落とすつもりだったんだが」

 「どうします?」

 「マニュアルでやるしかないな」

 胡桃沢さんはそう言うと、マジックを拾ってきて、テーブルの上に構成を書き始めた。6 個の長方形を作ると、順にモジュール名を入れていく。ある程度記述したところで顔を上げた。

 「いいか」胡桃沢さんは、モジュール名を示した。「ソリストのモジュールは、どれも単体で完結するような設計になっている。ただ、通常はメインモジュールの子プロセスとして実行する想定だから、不要な子プロセスが実行されてしまい、リソースを圧迫してしているのが現状だ。パッケージ単位で実行する方法しか用意されていないからな」

 「なるほど」

 「そこで、プログラマの出番だ。各モジュールの機能は損なわずに、子プロセスとしてではなく、単体のプロセスとして実行するように、モジュールを改造するんだ。できるか?」

 「ちょっと待ってください」

 ぼくはソース群を検索し、胡桃沢さんが最初に書いたモジュールのソースを探した。それらしいソースが見つかったので開いてみると、確かにpublic なメソッドはあるが、main() に該当する入り口がない。親モジュールを見ると、CommonWidget というインターフェースをimplement している。どうやら単にpublic static void main() をかぶせてやればいいというわけではなく、CommonWidget インターフェースの具象クラスとして作成する必要があるようだ。

 「はい、何とかなると思います」

 「ここに書いたのは、たぶん、1 つの処理系内で実行する必要があるだろうと思われるグループだ。これ以外が実行されないように、設定ファイルを変更する必要がある。リソースが潤沢にあれば、全部まとめて実行して、不要なプロセスは使用しなければいいだけなんだが」

 「その設定ファイルはどこにあるんですか?」

 「確か、/etc の下だったと思うが、ファイル名まではわからん。探してみてくれ」

 ぼくは頷いた。手でやるとしたら、ファイルの一覧を表示し、それらしいファイルを1 つずつ開いていくしかないが、今のぼくは頭の中だけで、それができるからそれほど手間ではない。

 「じゃあ、始めてくれ」そういうと胡桃沢さんは床に転がった。「すまんが、少し仮眠を取らせてもらう。終わったら起こしてくれ」

 返事をしたときには、すでに胡桃沢さんは眠りに落ちていた。ぼくは残り少なくなってきた水を飲み、ブラウンアイズが差し入れてくれたチョコレートのかけらを口に放り込んで脳にブドウ糖を供給すると、モジュールの改変を開始した。

 視覚野へのプロジェクションモードだと、デバッグツールのウィンドウを大きく開くことができる。ノートPC だと1920×1080 だが、仮想モニタだと4 倍の面積にすることが可能だ。いくつものウィンドウを渡り歩いても、目が疲れたり、首が痛くなったりすることもない。しかも、複数開いたソースに対して、変更を加え、保存し、コンパイルし、テストを実行するという動作を並行して行うことができる。ぼくがこれまで手にした中で、最高のプログラミング環境だった。

 とはいえ、胡桃沢さんの指示通りにソースを修正するには、2 時間以上を要した。いくら最高のプログラミング環境があったとしても、結局、ぼくの脳は1 個しかなく、マルチタスクで動かすことはできない。CommonWidget は、18 個のメソッドが定義されていて、それぞれの実装を準備するのは、予想外に手間がかかった。蒸し暑さから来る不快感もブレーキになったし、建物内をうろつき回るZの呻き声と物音にも注意力を削がれた。設定ファイルの変更まで終わったときには、とっくに日付が変わっていた。

 「胡桃沢さん」ぼくは疲れた頭と首を軽く回しながら、胡桃沢さんを揺り起こした。「終わりました」

 「ん、あ?」胡桃沢さんはすぐに目を覚ました。「ああ、わかった。設定も変えたんだな?」

 「はい。確認しました。5 台に分散して起動するはずです。もう起動していいんでしょうか」

 「いや、まだだ。最後に自己診断ルーチンを実行しなければ。ノートPC にUSB を挿して......」

 胡桃沢さんの指示で自己診断ルーチンを実行したところ、4 つのモジュールに矛盾が発見された。

 「エラーが出てるぞ」胡桃沢さんは水を飲みながら指摘した。「メッセージがメインコンソールの方に出てないか?」

 「出てます。でも......」

 「直ったら起こしてくれ」そう言うと、胡桃沢さんはまたゴロリと横になった。「オートだったら不要なんだが、マニュアルの場合、それが通らないと起動しても落ちる」

 「でも、これ、メッセージだけで、エラー箇所も何も出てないんですが。しかも英語だし......」

 「ソースから探し......ああ、いや、違う。全メッセージはリソースファイルに定義してあるから、そこから探せ。おやすみ」

 「......」

 そもそもマニュアルでモジュールを配置することなど、ほとんど想定されていなかったのだろう。ぼくは不親切極まりないメッセージから、リソースファイル、ソースを探して、不具合箇所を修正していった。4 つとも、同じCPU で実行されている想定で定義されたモジュールが発見できないことが原因で発生していた。モジュールをコピーしてくればエラーは消えるだろうが、リソース不足で落ちるに違いない。ぼくは、CommonWidget インターフェースから最小限度の具象クラスを作成し、少しずつメソッドの中身をコピーしていき、一部はダミーの値を返すように変更して、自己診断ルーチンをパスするように修正していった。

 バンド隊員たちは交代で仮眠を取っていたし、ボリスでさえ縛られたまま眠っていたが、交代要員がいないぼくは、アドレナリンを最大限に活用してソースの修正を続けた。肉体的な体力はほとんど使わなかったが、代わりに精神的なそれを酷使した。何時間も続けていると、脳の中心部から鈍い痛みが拡大していくような疲労感が残り、しかも消えなかった。通常ならハウンドなり佐分利なりの優秀なエンジニア集団が、何日もかけて適用する類の修正作業を、たった一人でやっているのだ。

 「こりゃあ、よっぽどボーナスをはずんでもらわないと」

 ぼくは呟いた。近くにいたブラウンアイズが、ちらりとぼくの顔を見るのがわかった。

 ようやく全ての修正作業が完了したのは、午前5 時過ぎ、日が昇り始めた時刻だった。頭痛、目のかすみ、喉の渇き、疲労からくる倦怠感で、全身がボロ雑巾のようだ。胡桃沢さんを起こして状況を説明すると、ようやくソリスト起動の許可が出た。ぼくは谷少尉を呼んで、各隊員のソリストコントローラを起動してもらった。谷少尉はリーフを呼んで、屋上にいるスナイパー班にも同じことを伝えさせた。

 「じゃ、いきます」

 メインコンソールからソリスト起動コマンドを実行した。5 台のラズベリーパイは、それぞれ微調整を繰り返した成果のソリストを実行し、ネットワーク間をパケットが飛び交い、そして......

 「来た」ブラウンアイズが静かに言った。「ソリストが通常モードで起動」

 「こっちも来ました」谷少尉が青ざめた顔で微笑んだ。「助かりました。ドローンを呼べますか?」

 すでにハイゲインアンテナは接続してある。胡桃沢さんが手を伸ばしてスイッチを入れた。仮想モニタの1 つが開き、Wi-Fi が広域モードに変更されたことを告げた。

 「よし、こっちでやろう」サンキストがやってきた。「フライボーイ1、フライボーイ2 からのレスポンスを確......」

 『おっと』 Sound Only - user041(MSG callsign:sunkist) とタイトルの付いた仮想モニタが開き、サンキストの発言の続きがスーパーインポーズされた。『もう声に出さなくていいんだったか。フライボーイ1、フライボーイ2 からのレスポンスを確認。帰投コマンドを送信した』

 新たに2 つの仮想モニタが開き、以前にドローンのテストを行ったときに見たCG が表示された。2 機のドローンは無事に飛行モードに移行し、ベースキャンプに向かっている。

 『屋上』谷少尉が呼びかけた。『D 型に警戒』

 『了解』レインバードが応じた。『空が白んで来てる。今のところ、周辺にD 型の姿はなし』

 『フライボーイ1 のETA は40 秒後、2 は53 秒後』

 「あと60 秒」谷少尉が口に出して言った。

 待つ間に、ぼくは視界の隅の方でしつこく点滅しているエラーメッセージに注意を向けた。出ているのは知っていたが、とりあえずソリストの再起動は成功したので無視していたのだ。仮想管理コンソールから内容を確認する。

 「おっと」ぼくは思わず口に出した。「メモリリークだ」

 ラズパイ2 でモジュールの1 つがメモリリークで落ちている。胡桃沢さんに心配ない、と合図しておいてから対応に取りかかった。ソースを開いて該当箇所を確認、ユニットテストを書いてテスト、コンパイルされたバイナリファイルをHotDeploy 機能で再配置した。ソリストを再起動した事で、行きに発生していた数々の不具合はまとめて解決している。HotDeploy 機能もその1 つだ。モジュールのメモリマッピング情報の管理もできるので、動的にモジュールのロード位置をずらして、リソースの空きを作ることもできる。

 『少しだけリソースを確保したんだけど』ぼくはバンド隊員たちに呼びかけた。『火器管制関係で有効にした方がいい機能あるかな?Z用のターゲットセレクタとか』

 一斉にブーイングの応答が返ってきた。ぼくは――仮想空間で――肩をすくめた。

 『わかった。必要になったら言ってくれ』

 さらに細かい調整を続けようとしたとき、現実世界で小さな叫び声が聞こえた。とうとうZが上がってきたか、と思って顔を上げると、島崎さんが床に倒れる瞬間が目に映った。何だ、と思う間もなく、ブラウンアイズがぼくの目の前に現れ、UTS-15J を構える。サンキストも銃を持ち直したが、その動作は、投げかけられた声によって妨げられた。

 「全員、フリーズだ」

 ブラウンアイズの銃口の先にはボリスがいた。いつの間にか拘束を解いて立っている。右手に小型のハンドガンを持ち、左手には無線機。ハンドガンは、床で寝ている臼井大尉の顔面をまっすぐ狙っていた。

(続)

Comment(10)

コメント

通りすがりの愛読者

誤:実はこの人なんじゃなのかもしれない。
正:実はこの人なのかもしれない。

あいおー

まさか島崎さんが…
ナルミンもお人好しですね、この状況で島崎さんがボリスと話していたなら疑うべきだったのに。
でも再起動でそれどころじゃなかったし、作戦開始時からただ1人親身にしてくれた相手を疑うなんてできなかったでしょうね。

ああああ

島崎さんがあとあと裏切る複線かな思っていたら、もうボリスが動いてる。
やっぱり島崎さんが関与してるのか。それとも引っ掛けか。
来週も眼が離せない

通りすがりの愛読者、ご指摘ありがとうございます。

p

まあラブコールに答えなくても、鳴海さんはもうJSPKFに予約されてる感じがしますけどね…。
アットホームな雰囲気で隊員同士も(脳内で会話するくらい)仲がよく、(死なないように)やる気にあふれた仲間たちと最高のプログラミング環境(脳内マイクロマシン注射、自己責任)で仕事ができる、なんだJSPKFっていい会社じゃん!就職しよう!(なお生死の保証はない)

be

大量のデータ送信の伏線が回収された。あ、そういうことか。

最後あたりの時間経過よくわからないけどメモリリーク出てからの対処クッソ早いっすね。ドローンってまだ到着してないと思うんだけど60秒でデプロイまでしちゃうなんて。ユニットテストまで書いて。さすがに到着はしてるんかな。その辺りの描写がなかっただけか。

be

chrome mobileで読むと拡大しなきゃならないし少し読みづらいのだけど、みなさんはどうやって読んでるのかな

とりすがり

>>beさん
iPad Air

>>beさん
iOS chromeです。
左上の3本線をクリックして、横長で読んでいます。

be

みなさんありがとう

コメントを投稿する