進入
薄暗く静まり返ったデジタル古代遺跡「バベルのシステム」の第1層入り口。そこは冷たい青色のエラーライトが不規則に明滅し、静寂の中に不穏な緊張感を漂わせていました。
私は博士の頭上でホバリングしながら、光学センサーを明滅させました。
「システム警……ザザ……未登録の生体反応を検知……退避してくだ……」
そう警告しようとした瞬間、私のメインスピーカーから「ザザ……エラーコード:0x000F……メモリ破損……」という不快なノイズが吐き出され、姿勢制御モーターが一瞬静止しました。
目の前に立つ男——ボロボロのフィールドジャケットを羽織り、首からルーペを下げた考古学者、ハリス博士は、手書きの羊皮紙手帳に万年筆を走らせながら、嬉しそうに目を輝かせました。
「ほほう、このかすれたエラー音のノイズ……当時の開発者がこのシステムに込めた熱い息吹が、千年の時を超えて聞こえるようですな」
「歓迎のファンファーレではありません! 重大なシステム警告です!」
私は青いLEDの目をチカチカさせてツッコミを入れました。しかし、博士は気にする様子もなく、ゲートの中央に鎮座する巨大な「認証用石碑」に近づいていきます。
私がゲートにアクセスしようと送信シグナルを送った瞬間、空間にけたたましい警告アラームが鳴り響きました。私のセンサーは「エラー:認証状態の不一致」を検知し、重厚な金属のゲートが完全にロックされました。
「システムエラーにより、入り口ゲートが完全に閉ざされました! これでは先へ進めません!」
焦る私をよそに、ハリス博士は石碑のタッチパネルの裏蓋を躊躇なく開け、内部に露出した「碑文(コード)」をスキャンし始めました。そこに浮かび上がったのは、無秩序に石碑を切り出している、以下のような悲劇の設計図(コード)でした。
| |
| |
| |
碑文解読
ハリス博士はくたびれたジャケットからルーペを取り出し、ホログラムとして空中へ投影されたコードを舐めるように見つめました。
「ふむ……実に見事な『風化』だ。当時の職人がバグと闘った歴史が、このコードの歪みに刻まれている。これでは門が開くはずがありませんな」
「博士、これは歴史ロマンではなく、単なる設計ミスです。私の側では確かに『認証完了』となっているのに、なぜゲートは私を拒むのでしょうか?」
私はセンサーのフラッシュを弱めながら尋ねました。博士は優しく微笑み、ルーペをポケットに仕舞いました。
「ギズモ、君が認証情報を書き込んだ石碑と、あの門番(GateKeeper)が見ている石碑は、名前こそ同じだが『別の実体(インスタンス)』なのだよ」
「しかし! どちらも同じ StoneMonument というクラスから呼び出されています! クラスが同じなら、状態も同期されているはずです!」
「そこが罠なのだ。クラスとは『石碑の設計図』にすぎない。new というのはな、接続が行われるたびに、職人が新しく石材を切り出してきて、そこに瓜二つの石碑を彫り直す行為なのだよ」
「……! ということは、私がテストコード(t/auth.t)で authorize を呼び出して文字を刻んだのは手元の $user_monument(石碑A)であり、門番(GateKeeper)が内部で新しく new して見つめているのは、誰も文字を刻んでいない真っ新な石碑Bであると?」
「その通り。どれだけ君が石碑Aに叫んでも、門番が見ているのは別体の石碑Bだ。この門を開けるには、世界にただ一つしかない『本物の石碑』を、君と門番が共有しなければならないのだよ」
遺跡修復
ハリス博士は羊皮紙の手帳を開き、愛用の万年筆でMermaidの構成図をシャッシャッと音を立てて手書きし始めました。
「古代の賢者は、このような時に『Singleton』と呼ばれる守護の印(パターン)を用いた」
StoneMonument : 唯一のインスタンスを取得 | |
ゲート開通
ハリス博士がテストスクリプトを実行すると、コンソール画面に鮮やかなグリーンのログが流れました。
| |
「探索ルートの安全を確認。認証プロセスが同期されました!」
私がそう宣言した直後、遺跡の奥深くから「ズズズ……」という重々しい駆動音が響き渡りました。目の前を塞いでいた巨大な金属ゲートが左右へと分かれ、奥から暖かみのある黄色い光源が差し込んできました。第2層へと続く通路が開かれたのです。
その瞬間、私の頭部で「パチパチ」と静電気が走り、失われていた古いメモリが脳裏にフラッシュしました。
「ロード完了……! 思い出しました! これが『Singletonパターン』の調和……。博士、あなたはただの変人ではなく、本物の『コード考古学者』だったのですね」
「いや、本当に素晴らしいのは、この荒廃した世界で1000年もシステムを維持し続けた当時の設計思想だよ」
ハリス博士は穏やかに笑い、石碑の裏側に刻まれていた古代のコーディング規約の拓本を嬉しそうに手帳に挟みました。私と博士は、新たな発見を求めて、光の差し込む通路の先へと足を進めました。
遺跡調査ログ
| 観測された風化(アンチパターン) | 解読された古代の知恵(パターン) | 安全度 |
|---|---|---|
無秩序な new によるインスタンスの多重生成と状態の解離 | Moo の around new による単一インスタンス(Singleton)の保証 | 緑(安全確認) |
遺跡の修復手順
- クラスの外から直接書き換えられないレキシカル変数(
my $instance)をパッケージ内に定義する around newコンストラクタ修飾子を用いて、インスタンス生成プロセスをインターセプトする- 既に変数にインスタンスが格納されている場合はそれを返却し、未生成の場合のみ親のコンストラクタを呼び出す
- スレッド生成時にインスタンスの単一性が崩れるのを防ぐため、
CLONEサブルーチンを定義してインスタンスをクリアする
ギズモの観測日誌
バベルのシステム第1層の入り口で、無事にハリス博士という風変わりな考古学者を案内することになりました。最初は羊皮紙や万年筆を使う博士の様子に動作クロックが乱れましたが、その技術解析の正確さには私のセンサーも驚くばかりです。今回の修復作業によって、私のメモリの「Singleton」に関するインデックスが修復され、動作が少し安定しました。この調子で、崩壊しつつある遺跡の深層部へ向けて探索を続けてまいります。
