[HOME]

   空ディスクの冒険
The Adventure of the Blank Disk #2

〜 後編 〜
   DOS事件簿
"You can file it in our archives,Watson."
「ワトスン。この事件は、我々のアーカイブにファイルしておけるよ」
『隠退した絵具屋』より



 所属しているテニスクラブで快適な夕方を過ごし、再びベーカー街に戻ったときには、9時近くになっていた。扉を開けたときの印象は、まさに火事であった。机の上の98の画面かかすむほど、煙が部屋に立ちこめていたからである。もやを通して、黒い陶製のパイプをくわえ、紫色の化粧着にくるまり、肘掛椅子で思索にふけっているホームズの姿が見えた。
「おめでとう、ワトスン君。ローズウォール先生とのシングルスの対戦に勝ったようだね」
ホームズは葉巻の箱を投げてよこしながら言った。
「ホームズ、どうしてわかるんだい?」
「市内にごく親しい友人がいない紳士が、夕方、時間をつぶすために街に出たとしよう。趣味といえば、散歩とテニス。彼は、午後のうちに散歩をすませている。しかも、髪の毛がきれいに整っているところをみると、シャワーを使ったことがわかる。床屋に行った可能性も考慮しなくてはいけないが、ネクタイの結び目が出かけたときと変わっていることを考えると、まずシャワーを使ったと考えていいだろう。となると、彼はいったいどこに行っていたのか。所属しているテニスクラブ以外に考えられるかい。その彼が、にこにこしながら帰ってきたとすると、テニスのゲームに勝ったということが推測できる。今日は木曜日だ。すると、試合の相手は、木曜日の夕方はテニスクラブに顔を出せる人物で、しかも技量的には彼の好敵手ということになる。いつでも勝てる相手に勝ってもうれしくはないだろうからね。そこから、木曜日を休診日にしているローズウォール先生と対戦し、君が勝ったという結論が導きだされても不思議はないだろう。さらに、君の顔が火照っていて、たぶんワインを飲んできたことがわかる。君はローズウォール先生とゲームをするときにはワインを1本賭ける習慣があることからも、僕の推理が正しいことが裏付けられるというわけだ」
「うん、確かにね」
私は、ホームズの方法にはずいぶん憤れているつもりなのだが、毎回こうやって驚かされるのである。


夕方、テニスクラブに顔を出した私は、ローズウォール先生と対戦して勝利をおさめたのであった。

「ところで、クラスター嬢の問題はどうなったんだい?」
 私は、ホームズから受けとった葉巻に火をつけながら開いた。
「愛用の98Tと1ポンドの刻みたばこのおかげで、じつに順調だよ。もう少し待っていてくれるかい」
 ホームズは再び98に向い、込み入った研究にとりかかった。それから2時間というもの、彼は仕事に夢中のあまり、私がそばにいることを忘れてしまったかのようであった。作業がうまくいっているときにはキーボードを打ち続けながら口笛を吹いたり、鼻歌を歌ったりしたが、ときには途方にくれた様子で額に深いしわをよせ、ひとしきりじっと考え込んでしまうこともあった。こうした繰り返しの後で、ついには満足の声を上げて椅子から立ち上がり、私を振り向いて言った。
「ワトスン君。ずいぶん君を退屈させてしまったかもしれないが、まだ寝るまでに間があるのなら、これから30分あまりを有益に過ごすことができるんじゃないかと思う。君も知っているように、僕は暗号のあらゆる形式に通じていて、つまらぬものながらこの問題に関する論文で160種もの暗号を分析している。けれども、正直なところ今回のMS-DOSの分析はまったく初めての経験で、最初はずいぶん手こずったよ」
 ホームズは、肘掛椅子に座りなおして、満足そうにパイプを一服すうと、キーボードを引き寄せ、両手をこすりあわせた。
「では、最初の問題を解いてみよう」
「というと、第3のシステムファイル、つまりMSDOS.SYSとIO.SYS以外のもうひとつのファイルは何かということだね」
「この問題を解くには、MS-DOS5.0を使えばいい。まず、MS-DOS3.3DのCHKDSKコマンドを実行してみよう」
 ホームズは、キーボードからコマンドを打ち込んだ。彼は、普段はMS-DOS3.3Dを愛用しているのである。

 A:¥CHKDSK C:                     
 ディスクTESTは 1992-6-13 23:35 に作成されました.
 
 1250304 バイト : 全ディスク容量
  95232 バイト : 3 個のシステムファイル
  25600 バイト : 1 個のユーザーファイル
 1129472 バイト : 使用可能ディスク容量
 
  655360 バイト : 全メモリ
  37600 バイト : 使用可能メモリ
 
 A:¥>

 つぎにホームズは、リセットスイッチを押してMS-DOS5.0を起動しなおしCHKDSKコマンドを実行した。

 A:¥CHKDSK C:                     
 ディスクTESTは 1992-6-13 23:35 に作成されました.
 
 1250304 バイト : 全ディスク容量
  95232 バイト : 2 個の隠しファイル
  25600 バイト : 1 個のユーザーファイル
 1129472 バイト : 使用可能ディスク容量
 
  1024 バイト : クラスタサイズ
  1221 個 : 全クラスタ
  1103 個 : 使用可能クラスタ
 
 655360バイト : 全メモリ
 287760バイト : 使用可能メモリ
 
 A:¥>

「どうだい? 違いがわかるかい」
「表示内容が変わったことは分かるけど、それが今回の謎にどう関係するのかはさっぱりだよ」
「全体の印象にとらわれるのではなく、もっと網かい点に集中力を向けるのだ。CHKDSKコマンドは、バージョンアップに伴って表示内容が変更されたが、ここではクラスタやメモリの表示の違いは無視したまえ」
「“3個のシステムファイル”というのが“2個の隠しファイル”になったね」
「その通りだ。システムファイルとして数えると3個だが、隠しファイルとして数えると2個という点に、我々の注意を向けようじゃないか」
「どういうことだい」
「この点を理解するには、MS-DOSのファイル属性について知っておく必要がある。詳しい説明は省くが、隠し属性のついているファイルは、この前も話したように、DIRコマンドを実行しても表示されない。第3のファイルに隠し属性がついていないということから、二つの可能性が考えられるんだ。ひとつは、ファイルではない何かがシステムファイルと偽って存在している場合で、もうひとつの可能性は、システムファイルではあるが、何等かの理由で隠しファイルとなっていない場合だ。当然、第ニの可能性のほうが高いので、僕は最初、捜査の方向をそちらに絞ろうとした」
「賢明な判断だと思うよ」
 ホームズは、私の相槌に対して皮肉な笑いを浮かべながら続けた。
「そのとき天啓のようにある考えが浮かんだのだ。問題のファイルは、隠しファイルではないのだから、我々はそのファイルを見ているはずということさ。そう推理することは間違いじゃあるまい?」
「しかし、実際には、見えていないじゃないか」
「それこそ観察力の不足というものたよ。それじゃあ聞くが、君は、98Tのキーボードを何度も見ているはずだね」
 ホームズは、キーボードを後ろに隠すように立ち上がりながら言った。
「ああ、何度も見ているよ」
「何度くらい?」
「さあ、何百回となく見ているだろう」
「じゃあ、ファンクションキーの並んでいる最上段のキーは何個ある?」
「何個だって? そりゃ知らないよ」
「そうだろう。君は見るだけで、観察していないからさ。言いたいのはそこなんだよ。僕は16個あることを知っている。見るだけではなく、観察しているからだ」
「ああ、わかったよ。じゃあ、僕は見ているだけで気付かなかったけど、君が観察して発見したことを教えてくれないかい」
 私は、やや鼻白みながら言った。
「いや。けっして君のことを馬鹿にしているのではないのだ。僕自身も、その時点では、ただ見ているだけで観察していなかったのだから。すまないが、気を取り直して新しくフロッピーディスクをフォーマットしてくれないかい。システムは転送するが、ボリュームラベルはつけないでくれたまえ」
 ホームズに言われたとおりに、私は、FORMATコマンドを使って新しくフロッピーディスクをフォーマットした。
「さて。MS-DOS3.3DのCHKDSKコマンドを実行してみたまえ。結論が表示されるはずだよ」

 A:¥CHKDSK C:                     
 ディスクTESTは 1992-6-13 23:55 に作成されました.
 
 1250304 バイト : 全ディスク容量
  95232 バイト : 2 個のシステムファイル
  25600 バイト : 1 個のユーザーファイル
 1129472 バイト : 使用可能ディスク容量
 
  655360 バイト : 全メモリ
  37600 バイト : 使用可能メモリ
 
 A:¥>

「どうだい。何か気付いたかい?」
「システムファイルの数が2個に減っているね」
「そうだ。バイト数を比較してみたまえ」
「おや。95232バイトで、3個あったときと変わりがないね!」
「そう。我々が求めていた第3のファイルは、0バイトということさ」
「0バイトのファイルなんてあるのかい?」
「存在しないわけではないが、通常は、そんなものを作成することはないだろう」
「ますます訳がわからなくなってきだよ」
「ボリュームラベルさ」
彼は、パイプの煙をくゆらしながら言った。
「第3のシステムファイルが存在するフロッピーディスクと、先ほど作成したフロッピーディスクの違いは何だい?」
「そうか、思い出したぞ。昼間、フォーマットしたフロッピーディスクは、君に言われてボリュームラベルをつけたんだ。しかし、いくらなんでも、ボリュームラベルがシステムファイルということはないだろう」
「常々言っているように、いかにありそうもないことでも、他の可能性を消去して残ったものがあれば、それが真実なんだ。まあ、ボリュームラベルはファイルではないが、少なくともMS-DOSの内部ではファイルと同じように扱われているようだね。この点は、サブディレクトリも同様だ。もっとも、CHKDSKコマンドを実行した際にボリュームラベルがシステムファイルとして表示されるのは常識から外れているわけだから、MS-DOS 5.0の新しいバージョンのCHKDSKコマンドでは改良されたというのが真相だろう」
「素晴らしいよ、ホームズ。じゃあ、残りの問題はどうなんだい?」
「192個以上のファイルが保存できないという件は、まだ君に説明できる段階ではない。ただ:僕のささやかな調査によって、事件を解決に導くための材料はたっぷり仕込むことはできた。あとは、その中から必要な材料を吟味して一本の鎖につないでいけばいいんだ。明朝までには解決しているはずだよ。おやすみ、ワトスン君」


翌朝、居間のの扉を開けると、ホームズはディスプレイに向かっていた。

 私は、ベッドに入った後も、自分なりにこの問題について考えてみようとしたが、テニスによる疲れと、ワインの心地好い酔いの助けもあって、いつのまにか眠り込んでしまった。翌朝、目を覚まして居間の扉を閉けるとホームズディスプレイに向かっていた。
「おはよう、ワトスン君」
「ああ、おはよう。徹夜だったのかい?」
 ホームズは、未解決の問題が気にかかると、何日も休まずに取り組むのが常であったから、私は、別段驚かずに聞いだ。
「そうなんだ。僕はなんという大馬鹿者だったのだろう。解決のための糸口はいくらでもあったのに、こんなに時間がかかってしまうなんて」
「というと、解決したんだね」
「もちろんだよ。今朝方、クラスター嬢にメールを出しておいたから、まもなく君たちの前で真相を語ってあげることができると思うよ。さあ、彼女が現れる前に、朝食をすませておきたまえ。今朝のハムエッグはなかなかいけるよ」
 ホームズは、すでに朝食をすませたらしく、あとかたづけの済んでいない皿が食卓の上に並んでいた。私が、トーストとコーヒーの朝食にとりかかっていると、家主の主婦に案内されて、クラスター嬢が我々の部屋に入ってきた。
「おはようございます。ホームズ様」
「おはようございます、クラスターさん。朝早くからお呼び立てして申し訳ありません。よいニュースは一刻でも早くお知らせするべきだと思いましてね」
「解決したのですね」
 依頼人は、瞳を輝かせながら聞いた。
「もちろんです。大きな障害が二つありましたが、少なくとも1,000通ほどのメールは保存できます。順を追って説明しましょう」
 ホームズは、98の置いてある机の横の椅子を依頼人に勧めながら言った。
「最初に注意したいのは、メールを保存するフロッピーディスクにシステムを転送する必要はないということです。データディスクとして使うだけでしたら、システムの転送は容量の無駄遣い以外の何ものでもありませんから」
 ホームズは、新しいフロッピーディスクを98にセットした。
「それでは、システムを転送していないフロッピーディスクに、ファイルを作成していきましょう。私が作ったささやかなプログラムを実行すると、数バイトのファイルを可能な限り作っていきます」
 ホームズは、N88-日本語BASIC(MS-DOS版)を起動すると、ファイル作成プログラムを呼び出し、プログラムリストを依頼人に見せてから実行した。

 1000 ' ファイルの自動作成               
 1010 '
 1020 *MK.FILE
 1030   I=I+1
 1040   I$=RIGHT$(STR$(I),LEN(STR$(I))-1)
 1050   OPEN "C:"+I$ F0R OUTPUT AS #1
 1060     PRINT I$,
 1070     PRINT #1,I$;
 1080   CL0SE
 1090 GOTO *MK.FILE

 しばらくして「192」というファイル番号が表示されると、「Path/File access error in l050」というエラーが発生し、処理が中断しだ。「このように、1.2Mバイトのフロッピーディスクでは、通常、192個のファイルしか作成できないのです」
 ホームズは、DIRコマンドを実行しながら説明した。

 A:¥>DIR C:                      
 
 ドライブ C: のディスクのボリュームラベルはありません.
 ディレクトリは C:¥
 
 1         2 92-06-14 08:08
 2         2 92-06-14 08:08
 3         2 92-06-14 08:08
 〜〜〜〜〜〜〜〜                  
          〜〜〜〜〜〜〜〜         
                   〜〜〜〜〜〜〜〜
 187        4 92-06-14 08:10
 188        4 92-06-14 08:10
    192 個のファイルあります.
  1053698 バイトが使用可能です.
 
 A:¥>

「しかし、サブディレクトリを作成して、その下にファイルを保存していけば、1,000個以上のファイルを保存できるのです。試してみましょう。新しく用意フロッピーディスクに、MDコマンドでサブディレクトリ¥MAILを作成し、その下にファイルを作っていってみます。プログラムは1050行を修正して、サブディレクトリ¥MAILの下にファイルを作成するようにします」

 1000 ' ファイルの自動作成               
 1010 '
 1020 *MK.FILE
 1030   I=I+1
 1040   I$=RIGHT$(STR$(I),LEN(STR$(I))-1)
 1050   OPEN "C:¥MAIL¥"+I$ F0R OUTPUT AS #1
 1060     PRINT I$,
 1070     PRINT #1,I$;
 1080   CL0SE
 1090 GOTO *MK.FILE

 ホームズは、プログラムを修正すると、新しくフォーマットしたフロッピーディスクをセットしてから、サブディレクトリ¥MAILを作ると、再びプログラムを実行した。
「今度は、1,000個以上のファイルを作成しますから、作業が終わるまでに時間がかかるはずです。この時間を利用して、事件の真相を説明しましょう。クラスターさん、朝食はおすみですか? では、お茶はいかがです。ワトスン君、すまないが、お嬢さんにお茶をすすめてくれないかい」
 ホームズは再び説明を始めた。
「今回の事件を解くには、MS-DOSの内部的な知識がいささか必要となりますが、なるべく簡単に説明することにしましょう。MS-DOSのファイルやサブディレクトリ、ボリュームラベルは、ディレクトリエントリと呼ばれる領域で管理されています。そのため、ディスクそのものに空きがあっても、ディレクトリエントリの領域がいっぱいになると、ファイルを作成できなくなってしまうのです。たとえば1.2Mバイトのフロッピーディスクでは、ディレクトリエントリの領域が6144バイト(1024バイト×6)用意されています。1個のファイルを管理するのに32バイトの領域を使うため、6144÷32=192個という計算値から理解できるように、ディレクトリエントリは192個以上のファイルを管理できないのです。ところが、ディレクトリエントリの領域が固定しているのはルートディレクトリのみという事実があります。つまりサブディレクトリの場合は任意の領域にディレクトリエントリを書き込んでいくことができます。サブディレクトリをひとつ作ることにより、その下にいくらでもファイルやディレクトリを作っていくことができるのです」
 ホームズは、その後でフロッピーディスクの読み書きのしくみや、クラスタやらセクタといった専門用語を分かりやすく依頼人に時間をかけて説明したが、それでも98は延々とファイルの作り続けていたので、彼が数年前に秘密裏に探検してきたモンゴルの大草原の話や、幸せをもたらすという伝説に彩られた“テカテー”という新大陸の珍酒の話など、面白おかしく聞かせてくれた。私もクラスター嬢も、時のたつのを忘れて彼の話に引き込まれていると、突然、98のエラー音が鳴って我々を今回の問題に引き戻した。画面を見ると、「1184」のファイル番号のに続いて「Disk full in 1080」というエラーメッセージが表示されていた。
「CHKDSKコマンドを実行して、ディスクの状態を確認してみましょう」

 A:¥>CHKDSK C:                     
 
 1250304 バイト : 全ディスク容量
  38912 バイト : 1 個のディレクトリ
 1211392 バイト : 1184 個のユーザーファイル
    0 バイト : 使用可能ディスク容量
 
  655360 バイト : 全メモリ
  67776 バイト : 使用可能メモリ
 
 A:¥>

「合計で1184個のファイルを作成できたことがわかりますね。たとえば、¥MAILのようなサブディレクトリを作って、そこにメールを保存すれば、メールのサイズにもよりますが1,000通以上を保存することができるわけです」
「ホームズ様。でも…」
「そう…」依頼人の言葉をさえぎって、ホームズは言った。「あなたの計算では、500バイト前後のメールであれば2,000通のメールが保存できるはずでしたね。それに、今回のプログラムで作成したファイルは、いずれも数バイトという小さなものです。単純に計算すれば数千個のファイルを保存できるのではないかという疑問が生じるわけです。このことをお知りになりたいのですね」
「ええ」
「最初に、二つの障壁があるというお話しをしたかと思いますが、まさに、それこそ第ニの障壁なのです。第一の障壁は、サブディレクトリの下にファイルを保存することによって乗り越えられましたが、第ニの障壁はなかなかやっかいです。MS-DOSではファイルの読み書きは、クラスタと呼ばれる単位で行います。一般に、1.2Mバイトのフロッピーディスクのクラスタサイズは1024バイトです。これは、MS-DOS 5.0のCHKDSKコマンドを実行すればわかります」

 A:¥CHKDSK C:                     
 ボリュームシリアル番号は19DD-1CF4
 
 1250304 バイト : 全ディスク容量
  38912 バイト : 1 個のディレクトリ
 1211392 バイト : 1184 個のユーザーファイル
    0 バイト : 使用可能ディスク容量
 
   1024 バイト : クラスタサイズ
     1221 個 : 全クラスタ
      0 個 : 使用可能クラスタ
 
  655360 バイト : 全メモリ
  67776 バイト : 使用可能メモリ
 
 A:¥>

「実際に1.2Mバイトのフロッピーディスクを使って、ファイルがクラスタ単位で扱われていることを確認してみましょう。ワトスン君。新しいフロッピーディスクをフォーマットして、DIRコマンドでディレクトリをとってくれないかい。ああ、そうだ。システムは転送してくれたまえ」

 A:¥>DIR C:                      
 
ドライブ C: のディスクのボリュームラベルはありません.
 ディレクトリは C:¥
 
 COMMAND COM 24931 91-11-08 0:00
      1 個のファイルあります.
 1129472バイトが使用可能です.
 
 A:¥>

「今度は、CHKDSKコマンドでファイル容量を確認してみます」

 A:¥CHKDSK C:                     
 ボリュームシリアル番号は19DD-1CF4
 
 1250304 バイト : 全ディスク容量
  95232 バイト : 2 個のシステムファイル
  25600 バイト : 1 個のユーザーファイル
 1129472 バイト : 使用可能ディスク容量
 
  655360 バイト : 全メモリ
  499872 バイト : 使用可能メモリ
 
 A:¥>

「さぁ、COMMAND.COMのファイル容量に注目してください。DIRコマンドで調べたCOMMAND.COMファイルのサイズが2万4931バイト。一方、CHKDSKコマンドで調べたユーザーファイルの使用状況は2万5600バイトです。もちろん、このユーザーファイルとはCOMMAND.COMのことです。この差こそ、1.2Mバイトのフロッピーディスクが1024バイト単位でファイルが扱われている証拠なのです。クラスターさん、2万5600を1024で割ってみてください」
「ええと」
「そう、25です。ただし、ここでは重要なのは25ではなく、1024で割り切れるということです。つまり、DIRコマンドで表示された2万4931バイトはCOMMAND.COMの実際のファイルサイズであり、CHKDSKコマンドで表示された2万5600バイトは、COMMAND.COMが使用しているクラスタのサイズです。COMMAND.COMは25クラスタを使用しているということです。簡単な実験でこれを実証してみましょう。MS-DOSのリダイレクト機能を使って、TESTという10バイトのファイルを作ってみます」

 A:¥COPY CON C:TEST                  
 0123456789^Z
  1 個のファイルをコピーしました.
 
 A:¥>

「もう一度、DIRコマンドでディレクトリを調べてみましょう」

 A:¥>DIR C:                      
 
 ドライブ C: のディスクのボリュームラベルはありません.
 ディレクトリは C:¥
 
 COMMAND COM 24931 91-11-08 0:00
 TEST 10 92-06-14 8:20
   2 個のファイルあります.
 1128448バイトが使用可能です.
 
 A:¥>

「同様に、CHKDSKコマンドを実行してみます」

 A:¥CHKDSK C:                     
 ボリュームシリアル番号は19DD-1CF4
 
 1250304 バイト : 全ディスク容量
  95232 バイト : 2 個のシステムファイル
  26624 バイト : 2 個のユーザーファイル
 1128448 バイト : 使用可能ディスク容量
 
  655360 バイト : 全メモリ
  499872 バイト : 使用可能メモリ
 
 A:¥>

「DIRコマンドの結果を見ると、TESTファイルの実際のサイズは10バイト。ところがCHKDSKコマンドの結果を見ると、“2個のユーザーファイル”の合計は2万6624バイトです。COMMAND.COMファイルが2万5600バイトでしたから、その差は1024バイトです。つまり、10バイトのTESTファイルの保存に1024バイトが使われていることがわかります。これで、ファイルが1024バイト単位で管理されていることがわかっていただけたと思います」
「どんなに小さなファイルでも1024バイトのサイズになるということですね」
「じつは、特殊なプログラムを用いれば、1クラスタのサイズを小さくすることが可能なようです。そうやってフォーマットしたフロッピーディスクを使えは、さらに多くのメールを保存することもできますが、通常のフォーマットのフロッピーディスクと混用すると実用性の点でいくつかの問題が生じるので、あまりお薦めはできませんね」
「ホームズ様、どうもありがとうございました。それにワトスン博士も。1,000通あまりのメールを保存できれば問題はありませんし、何よりも謎が解けて気分がすっきりしましたわ」
「お役に立てて何よりです」ホームズは、扉に依頼人を誘いながら言った。「ごきげんよう、クラスターさん。近いうちに、ワトスン博士からメールが届くかもしれませんよ」
 ホームズは、クラスター嬢を見送ると、使い古したクレーパイプをパイプ立てからとりあげて火をつけ、満足そうに深々と椅子に腰をおろした。
「ワトスン君。今回の事件は単純ながら興味深い点がいくつかあったから、我々の事件簿にアーカイブしておいてもいいんじゃないかな」
 クラスター嬢が乗った馬車が走り去るのを窓から乗り出すようにして眺めていた私は「いつもながら、じつに見事な推理だったよ」と慌ててこたえた。
 ホームズは肩をすくめると「おかげで退屈しのぎにはなったし、DOSの知識を蓄積することもできたからね。君も知っているように、MS-DOSについて正確な知識を持つことが、僕の趣味のひとつなのさ。なによりも2HDのフロッピーディスクでは、ルートディレクトリに最大192個のファイルしか保存できないということを知り得たのが最大の収穫だったよ。こうした事件を持ち込まれでもしない限り、一枚のフロッピーディスクに最大何個のファイルが保存できるか調べることはなかっただろうからね」
 ホームズは、上着を着ながら言った。「さあ、ワトスン。帽子をかぶって外出の用意をしたまえ。DOSは、確かに僕の興味の対象のひとつではあるが、ディスプレイを見てばかりいると真の世界から乖離してしまうからね」
 かくして、美しい依頼人によって持ち込まれた事件の解決は、ホームズのDOS諮問探偵としての名声をさらに高め、私にとっても人生に大きな転機をもたらすことになったのである。(おわり)
[HOME]



E-mail: support@matsuda-pa.com