4-1ディレクトリとパス
水曜の閉店後、ミナトはレジ横のパソコンで店の共有フォルダを開きました。いちばん上の段に「レシピ_最新」「レシピ_最新2」「レシピ_本当の最終」「レシピ_最終(店長)」が並び、その下には予約の表や仕入れの請求書、チラシの写真が名前の順に何十個も続いています。店長に聞いても「どれが今のだったかな。先週、食パンの水の量を変えたのは確かなんだけど」と首をひねるばかりです。整理を引き受けたミナトは、名前からいちばん新しそうに見えた「レシピ_本当の最終」の中身を写して「レシピ_最終(店長)」に上書き保存し、残りの3つを消しました。翌朝、仕込みの前にレシピを開いた店長が手を止めます。先週変えたはずの水の量が、元の数字に戻っていたのです。いちばん新しかったのは、上書きした「レシピ_最終(店長)」のほうでした。ミナトは相棒に打ち込みました。「上書きしたファイルって、元に戻せるのかな」
相棒は、戻せるかどうかの前に、置き方の話から始めました。「レシピが4つに増えたのは、置き場所と名前に決まりがなかったからだよね」。パソコンの中のデータは、ファイルという単位で保存されます。ファイルをまとめて入れておく入れ物がディレクトリで、WindowsやmacOSの画面ではフォルダと呼ばれています。ディレクトリの中には、ファイルだけでなく別のディレクトリも入れられます。
ディレクトリの中にディレクトリを入れ、その中にまたディレクトリを入れていくと、全体は1本の幹から枝分かれする木の形になります。このように、ディレクトリを親子関係でつないだ木構造でファイルを整理して管理する方式を階層型ファイルシステムといいます。木のいちばん上、すべてのディレクトリとファイルをたどっていった根元にあるディレクトリがルートディレクトリです。UNIX系のOSでは「/」1文字で表します。
ミナトは、ルートの下に「店」を作り、その下に「レシピ」「予約」「仕入れ」の3つを並べることにしました。レシピは「レシピ」の中に、パンの名前ごとに1つずつ置きます。こうしておけば、同じ食パンのレシピが2か所に増えることはありません。
木の形にすると、ファイルの場所を道順で書けるようになります。この道順をパスといい、書き方は2通りあります。1つは、ルートディレクトリから目的のファイルまでを省かずにすべて書く絶対パス(絶対パス指定)です。食パンのレシピなら「/店/レシピ/食パン.txt」となります。どこで作業していても、同じファイルは同じ書き方で指せます。
ただ、毎回ルートから書くのは長くなります。そこで、利用者やプログラムが今まさに作業の対象にしているディレクトリを起点にする方法があります。この今いるディレクトリをカレントディレクトリといい、そこから目的のファイルまでの道順を書くのが相対パス(相対パス指定)です。相対パスでは、1つ上の親ディレクトリを「..」、カレントディレクトリ自身を「.」と書きます。
| 書き方 | カレントディレクトリ | パス |
|---|---|---|
| 絶対パス | どこでも同じ | /店/レシピ/食パン.txt |
| 相対パス | /店/レシピ | 食パン.txt(または ./食パン.txt) |
| 相対パス | /店 | レシピ/食パン.txt |
| 相対パス | /店/予約 | ../レシピ/食パン.txt |
表の最後の行は、「予約」から「..」で1つ上の「店」へ上がり、そこから「レシピ」へ下りています。同じファイルでも、相対パスはカレントディレクトリが変わると書き方が変わります。反対に、絶対パスはカレントディレクトリに左右されません。
ここから基本情報!ログインしたときの出発点
複数の人が同じコンピュータを使うOSでは、利用者ごとに自分専用のディレクトリが用意されます。これをホームディレクトリといい、ログインした直後のカレントディレクトリになります。UNIX系のOSでは「/home/minato」のような場所にあり、「~」1文字で自分のホームディレクトリを表せます。個人の下書きはホームディレクトリに、店のみんなで使うものは共有のディレクトリに、と分けておくと、誰のファイルかで迷いません。
基本情報の範囲ここまで
置き場所と並んで、名前の付け方にも決まりがあります。ファイル名の最後の「.」から後ろに付ける、ファイルの種類や形式を表す文字列を拡張子といいます。「食パン.txt」の「txt」は文字だけのテキストファイル、「12月.csv」の「csv」はカンマで区切った表のデータ、「チラシ.jpg」の「jpg」はJPEG形式の画像を表します。OSは拡張子を見て、ファイルをどのアプリで開くかを決めています。
ここから基本情報!ファイルを探す
ファイルが増えると、場所を覚えていなくても探し出せる方法が要ります。基本情報のシラバスは、ディレクトリ管理の用語例に検索手法を挙げていますが、中身を詳しくは書いていません。ファイル管理の場面で使える手法としては、名前の一部で探す方法、「*」(任意の文字の並び)や「?」(任意の1文字)のワイルドカードで「*.csv」のように型で探す方法、更新した日時や大きさで絞り込む方法があります。
同じ「検索」の語は、たくさんのデータの中から目的のレコードを探し出すアルゴリズムの意味でも使われます。先頭から順に調べる線形探索、並んだデータを半分ずつに絞る二分探索、キーから置き場所を計算するハッシュ探索などです。暗記カードはこちらの意味で説明しています。どちらの意味かは、問われている場面で決まります。
基本情報の範囲ここまで
4-2リンクとアクセス権
木曜の朝、店長は厨房のタブレットで食パンのレシピを開こうとして、ミナトを呼びました。「レジのパソコンにしか無いの?前はUSBメモリに写して持ってきてたけど」。ミナトは、写しを持ち歩いたことこそ、レシピが4つに増えた始まりだったと気づきます。ただ、どこからでも開けるようにすると、誰でも書き換えられるようにもなってしまいます。
写しを配る代わりに、1か所に置いたファイルを、ネットワークを通じて何台もの機器や何人もの人で使う方法があります。これをファイル共有といいます。実体は1つなので、厨房のタブレットで開いてもレジのパソコンで開いても、同じ最新のレシピが表示されます。USBメモリで写しを運んでいたころは、写した先で直した内容が元のファイルに戻らず、別の版として増えていきました。
共有すると、今度は「誰が何をしてよいか」を決めなければなりません。水曜の上書きは、ミナトが書き換えられる場所にレシピがあったから起きました。ファイルやディレクトリごとに、誰に読むことだけを許し、誰に書き換えまで許すかを設定しておきます。こむぎ堂では、「レシピ」は店長だけが書き換えられ、ミナトとほかのアルバイトは読むだけにしました。予約の表は、受付をするミナトも書き換えられるようにしておきます。
ここから基本情報!誰に何を許すか
ファイルに対する読み取り・書き込み・実行などの操作を、利用者やグループの単位で許したり禁じたりする設定をファイルアクセス権といいます。UNIX系のOSでは、読み取りをr、書き込みをw、実行をxで表し、ファイルの所有者、所有者が属するグループ、それ以外の利用者の3者それぞれに、どれを許すかを決めます。
店長が所有する食パンのレシピを「rw-r--r--」にすると、先頭の3文字が所有者の店長で読み書きでき、続く3文字のグループと最後の3文字のそれ以外は読むことだけができます。実行の権限xは、プログラムやスクリプトのファイルで使います。ディレクトリに付けたxは、そのディレクトリの中へ入れるかどうかを表します。
権限の設定とは別に、ファイルや記憶媒体そのものに書き込みや消去を禁じる印を付けて、誤った操作や不正な使用からデータを守る機能をファイルプロテクトといいます。ファイルの「読み取り専用」の属性や、SDカードの側面にある書き込み禁止のつまみがその例です。似た名前のコピープロテクトは、不正な複製を防ぐための仕組みで、目的が違います。
基本情報の範囲ここまで
厨房のタブレットからは、レシピを読むことはできても、書き換えることはできなくなりました。店長が水の量を変えたいときは、レジ横のパソコンから店長のアカウントで直します。
ここから基本情報!実体を指す小さなファイル
店長は、タブレットのホーム画面から食パンのレシピを一度で開きたいと言いました。「/店/レシピ/食パン.txt」までフォルダを毎回たどるのは手間です。そこで、レシピの実体は動かさずに、その置き場所だけを書いた小さなファイルを、すぐ手の届く所に置きます。この小さなファイルが持っている、実体の場所を示す情報を参照情報といいます。参照情報を持つファイルを開くと、OSはそこに書かれた場所をたどり、実体のファイルを開きます。
同じ考え方の仕組みが、OSごとに別の名前で用意されています。UNIX系のOSで、別のファイルやディレクトリへのパスを中に記録した特殊なファイルがシンボリックリンクです。Windowsで、実体の場所を示す情報を持ち、デスクトップなど別の場所からすぐに開くためのアイコンがショートカットです。macOSでは、同じ働きをするものをFinderのエイリアスと呼びます。エイリアス(alias)はもともと「別名」の意味で、UNIX系のOSのコマンド入力の画面では、長いコマンドに短い別名を付ける機能もエイリアスといいます。
どれも、持っているのは場所の情報だけで、中身は持っていません。だから、ショートカットを消してもレシピの実体は消えません。反対に、実体を別のディレクトリへ移したり消したりすると、参照情報の指す先に何も無くなり、開けなくなります(リンク切れ)。シンボリックリンクは、指す先が存在しなくても作ること自体はできます。
基本情報の範囲ここまで
4-3ファイルシステムの種類
金曜の夕方、店長が古いUSBメモリを持ってきました。新しく雇うアルバイトのために、成形の手順を撮った動画を入れておきたいそうです。動画は5GBで、USBメモリには20GBの空きがあります。ところが、コピーを始めると「ファイルが大きすぎます」と表示されて止まりました。
空きは足りているのに入らない。原因はUSBメモリの容量ではなく、そのUSBメモリにファイルを記録している決まりのほうにありました。ディスクやUSBメモリの中身は、そのままではただの記録の場所の並びです。その領域を、OSや利用者がファイルとディレクトリとして使えるように管理する仕組みがファイルシステムで、どの場所にどのファイルのどの部分が入っているか、空いている場所はどこかを記録しています。
ファイルシステムを作って管理する単位になる、論理的なディスクの領域をボリュームといいます。1台のディスクを分けて複数のボリュームにすることも、反対に複数のディスクをまとめて1つのボリュームにすることもできます。Windowsの「C:」や「D:」のドライブは、それぞれが1つのボリュームです。ボリュームごとに、どの種類のファイルシステムを使うかを選べます。
ファイルシステムには種類があり、OSごとに標準のものが違います。種類が違えば、1つのファイルの大きさの上限や、アクセス権を記録できるかどうかといった決まりも変わります。店長のUSBメモリで動画が入らなかったのは、そのファイルシステムが、1つのファイルの大きさに5GBより小さい上限を持っていたからでした。
ここから基本情報!代表的なファイルシステム
古くから使われてきたのがFAT(File Allocation Table)ファイルシステムです。ディスクの領域をクラスタという一定の大きさの区画に分け、ファイルがどのクラスタをどの順につないで使っているかを、ファイル割り当て表(FAT)に記録します。構造が単純なので、WindowsでもmacOSでもデジタルカメラでも読み書きでき、USBメモリやSDカードによく使われます。その一方で、FAT32では1つのファイルの大きさが4GB未満に限られ、ファイルごとのアクセス権も記録できません。店長のUSBメモリは、このFAT32でした。
Windows NTの系統のOSで標準になっているのがNTFSです。ファイルやディレクトリごとにアクセス権を設定でき、大きなファイルも扱えます。また、ファイルシステムの管理情報(メタデータ)を書き換える前に、その手順をログに記録しておくジャーナリングの機能を持ちます。書き込みの途中で電源が切れても、次に起動したときにログをもとにファイルシステムの整合性を取り戻せます。ただし、ログに残すのは管理情報の変更だけなので、ファイルの中身まで元に戻るわけではありません。
Apple社のMacintoshで使われてきた階層型のファイルシステムがHFS(Hierarchical File System)です。後継のHFS+を経て、いまのmacOSではAPFSが標準になっています。
店長の動画は、USBメモリをexFAT(FAT32の後継で、4GB以上のファイルも扱える形式)に初期化し直して入れることにしました。初期化すると中のファイルは消えるので、その前に中身をパソコンへ移しておきます。
基本情報の範囲ここまで
ファイルシステムが空いた場所にファイルを書き込むとき、まとまった空きがいつも見つかるとは限りません。ファイルの作成と削除をくり返すと、空いた場所はあちこちに小さく散らばっていきます。大きなファイルは、その小さな空きに分けて書かれます。このように、ファイルのデータや空き領域がディスク上で連続せず、ばらばらに分かれてしまう状態をフラグメンテーション(断片化)といいます。
断片化が進むと、1つのファイルを読むのに、磁気ディスクのヘッドがあちこちへ動き回ることになり、読み書きが遅くなります。ばらばらになったデータを並べ直して連続させる作業を、デフラグメンテーション(デフラグ)といいます。
4-4ファイル編成とアクセス手法
土曜の昼、電話が鳴りました。「12月24日のシュトーレン、予約番号5634で取ってあるはずなんだけど」。予約のファイルには、この1年で3,000件の予約がたまっています。ミナトが上から順に画面をめくっていくあいだ、お客さんは電話の向こうで待ち続けました。
予約の1件ぶん、つまり予約番号・名前・受け取り日・品物のひとまとまりを、レコードといいます。予約のファイルはレコードの集まりです。レコードをファイルの中にどういう順に並べて記録するかをファイル編成といい、並べ方によって、目的の1件を見つける速さや、新しい1件を足す手間が変わります。
並べ方の1つに、1つのファイルの中を複数の部分に区切り、それぞれに名前を付けて使えるようにする方法があります。区切った1つ1つをメンバといい、ファイルの先頭に、どのメンバがどこにあるかを示す目次(ディレクトリ)を置きます。このファイル編成を区分編成といいます。パンの名前ごとにメンバを分けた1冊のレシピ集のようなもので、目次で「食パン」の位置を調べれば、そのメンバだけを取り出せます。主に大型のコンピュータで、プログラムを機能ごとに分けて1つのファイルに保管する用途に使われてきました。
ここから基本情報!レコードの読み方
レコードの読み方、つまりアクセス手法には3つあります。ファイルの先頭から、記録されている順にレコードを1件ずつ読んでいく方式が順次アクセスです。ミナトが画面をめくったのは、この読み方でした。全件を集計するときには無駄がありませんが、3,000件目に目的の1件があれば、その前の2,999件も読むことになります。磁気テープのように、先頭から順にしか読めない媒体はこの方式に向いています。
先頭からたどらずに、目的のレコードの格納位置を指定していきなり読み書きする方式が直接アクセスです。位置は、先頭から何件目かという相対位置や、予約番号のようなキーから計算して求めます。そして、1つのプログラムの中で、順次アクセスと直接アクセスを必要に応じて切り替えて使う方式が動的アクセスです。「12月24日の最初の予約」の位置へ直接アクセスで飛び、そこから24日の分を順次アクセスで読み進める、という使い方になります。
基本情報の範囲ここまで
ここから基本情報!ファイル編成の種類
読み方に合わせて、並べ方も選びます。レコードを記録した順に物理的に並べ、先頭から順に読み書きするのが順編成です。構造は最も単純で、磁気テープでも使えます。新しいレコードは末尾に足していくので、途中に1件差し込むには、ファイル全体を書き直すことになります。
レコードのキーから格納位置を計算し、その位置に直接記録するのが直接編成です。こむぎ堂の数字で試してみます。格納位置を100か所用意し、「予約番号を100で割った余り」を格納位置にすると決めます。予約番号5634なら、5634 ÷ 100 = 56 余り 34 なので、34番の位置に入れます。電話で番号を聞いたら、同じ計算で34番を読めば一度で見つかります。ただし、予約番号1234も余りが34になり、同じ位置を取り合います。このように同じ格納位置になるレコードどうしをシノニムといい、後から来たほうは別に用意した場所へ入れます。
順編成のように順に読むこともでき、索引を使って直接読むこともできるようにしたのが索引順編成です。レコードはキーの順に並べて基本域に記録し、別の索引域に「予約番号1〜1000はここから、1001〜2000はここから」という索引を作っておきます。キー順に並んだ基本域の途中に後から1件差し込む余地はないので、基本域に入らなくなった追加のレコードはあふれ域に記録し、基本域からあふれ域へのつながりをたどれるようにします。追加が続いてあふれ域が長くなると読む速さが落ちるので、ときどきファイルを作り直して基本域に並べ直します。
IBMの大型のコンピュータでは、順編成・索引順編成・直接編成にあたる形式を1つの仕組みで統一的に扱うアクセス方式が使われてきました。これをVSAM編成(Virtual Storage Access Method)といいます。
基本情報の範囲ここまで
電話のお客さんを待たせたのは、ミナトの手際よりも、3,000件を1件ずつ見るしかない並べ方のほうでした。いまの予約システムの多くは、データベースの仕組みの上に作られています。それでも、予約番号から置き場所を計算しておく、目次のような索引を作っておく、という考え方はデータベースの中でもそのまま使われています。
4-5バックアップ
日曜の朝、ミナトは水曜に上書きしたレシピのことをまだ考えていました。相棒の返事は短いものでした。「上書きされたファイル自体は、もう前の中身を持っていない。戻せるかどうかは、上書きする前の写しがどこかにあるかで決まるよ」。共有フォルダを置いている小さなファイルサーバの設定画面を開くと、買ったときに業者が入れていった「毎晩2時に写しを取る」という項目が見つかりました。
誤った操作や機器の故障、ウイルスによってファイルが破損したり消えたりしたときに元へ戻せるよう、あらかじめデータの写しを別の場所に取っておくことをバックアップといいます。写しは、元のデータとは別の媒体に置きます。同じディスクの中に写しを置くと、ディスクが故障したときに元と写しが一緒に失われるからです。
写しが1つだけでは足りない場面もあります。水曜の夜に写しを取っていたら、その写しには上書きした後のレシピが入ってしまい、先週の水の量は戻りません。そこで、写しを取るたびに古い写しを消さず、何回分かを残しておきます。この考え方を世代管理といいます。たとえば3世代を残すなら、新しい写しを取るたびにいちばん古いものを消し、最新・1つ前・2つ前の3つを手元に置きます。上書きに気づくのが数日遅れても、それより前の世代が残っていれば戻せます。
写しを取るとき、たくさんのファイルを1つずつ運ぶのは手間で、取りこぼしも起きます。複数のファイルやディレクトリを、ディレクトリの構造ごと1つのファイルにまとめたものをアーカイブといいます。ZIP形式のファイルがその代表で、まとめるときに圧縮して容量を小さくすることも多くあります。また、日々は使わないが消さずに取っておくデータを、長期の保管のために別の場所へ移すこともアーカイブと呼びます。
ここから基本情報!まとめるソフトウェアと、写しの取り方
アーカイブを作ったり、そこから元のファイルを取り出したりするソフトウェアをアーカイバといいます。多くは圧縮と展開(解凍)の機能も備えています。
写しの取り方には3つの方式があります。対象のデータを、前回の結果にかかわらず毎回すべて写すのがフルバックアップです。戻すときは1回分の写しだけで済みますが、毎回の時間と容量がいちばん大きくなります。直前のフルバックアップ以降に変わったデータを、毎回すべて写すのが差分バックアップです。直前のバックアップ(フルでも増分でも)以降に変わったデータだけを写すのが増分バックアップです。
こむぎ堂の共有フォルダは全部で40GBあり、毎日1GBずつ、日によって違うファイルが書き換わるとします。月曜にフルバックアップを取り、火曜から金曜まで毎晩写しを取ったとき、2つの方式は次のように違います。
| 項目 | 差分バックアップ | 増分バックアップ |
|---|---|---|
| 火曜の夜に写す量 | 1GB(月曜からの変更) | 1GB(月曜からの変更) |
| 水曜の夜に写す量 | 2GB(月曜からの変更) | 1GB(火曜からの変更) |
| 木曜の夜に写す量 | 3GB | 1GB |
| 金曜の夜に写す量 | 4GB | 1GB |
| 火〜金の合計 | 1+2+3+4=10GB | 1+1+1+1=4GB |
| 金曜の状態に戻すのに要る写し | 月曜のフル+金曜の差分の2つ | 月曜のフル+火・水・木・金の増分の5つ |
差分は日がたつほど毎晩の写しが大きくなりますが、戻すのは2つで済みます。増分は毎晩の写しが小さい代わりに、戻すときはフルに増分を古い順にすべて重ねなければならず、途中の1つが読めなければ、そこから先は戻せません。どちらを選ぶかは、写しに使える時間と容量、戻すときにかけられる手間で決めます。
写しの置き場所も分けておきます。同じバックアップのデータを、複数の媒体や複数の場所に重ねて持つ方式を多重バックアップといいます。店のファイルサーバの写しを、さらに外付けのディスクにも取って店長の家に置いておけば、店が火事や水害にあっても、どちらかの写しが残ります。
基本情報の範囲ここまで
ファイルサーバの写しは、7日分が残っていました。ミナトは、上書きする前の火曜の夜の写しから「レシピ_最終(店長)」を取り出し、「/店/レシピ/食パン.txt」として置き直します。店長が開くと、水の量は先週変えたとおりの数字に戻っていました。
写しがあったのは、店の誰も知らないうちに、業者が毎晩の写しを設定しておいてくれたからでした。運がよかったとも言えます。そこでミナトは、運に頼らない決まりを店長と作りました。日曜の夜に共有フォルダ全体の写しを取り、ほかの曜日は日曜から変わった分だけを写す。写しは4週分を残し、月に一度は外付けのディスクにも写して店長の家に置く。レシピは店長だけが書き換えられ、ほかの人は読むだけにする。
木の形に並べ直した共有フォルダには、パンの名前のファイルが1つずつ並んでいます。店長が一つだけ気にしているのは、写しを毎晩取るファイルサーバそのものが、いつか古くなることです。その日に備えて何を確かめておけばよいかは、ミナトにもまだ分かりません。