はじめての道具箱 — 壊さない・消さない
— 空に見えた一覧が、本物を消してしまう —
道具を開いたら、データが「0件」と表示された。そんなとき、データは本当に空なのでしょうか。実は、ファイルが読めなかっただけのことがあります。この記事では、読めなかったことを空と同じに扱うと、次の保存で本物のデータを失う理由と、それを防ぐ作りを、はじめての人向けに説明します。
この記事を読むとできること
想定している使い方
ブラウザで開くチャット型の AI(Gemini や ChatGPT など)にコードを書いてもらい、 それを自分の Mac に保存して動かす使い方です。この記事の操作や画面の説明は、すべて Mac を前提にしています。
読む目安:約8分 ・ 道具箱の項目 D3(壊さない・消さない)・ 図3枚
「読めなかった」は「中身が空だった」とは別のことです。読めなかったときに空の一覧を返すと、道具は0件を本当の状態だと信じ、次の保存で本物のデータを丸ごと上書きしてしまいます。
道具は、データの入ったファイルを読んで画面に出し、変更があれば同じファイルに書き戻します。たとえばお気に入りの一覧を覚えておく道具は、開くときにお気に入りのファイルを読み、☆を押すたびにそのファイルへ書き戻します。
ファイルを読んだ結果は、実は2種類あります。ひとつは「読めて、中身が空だった」で、本当にまだ何も入っていない状態です。もうひとつは「読めなかった」で、中身があるのか無いのか、道具には分からない状態です。作りが雑だと、この2つをどちらも「空の一覧(0件)」として扱ってしまいます。
画面に「0件」と出るだけなら、見間違いで済みます。本当に困るのは、そのあとです。0件を信じたまま、利用者が1件だけ新しいデータを足して保存すると、道具は「1件だけの一覧」を、本物のファイルに上書きします。もとの数百件は、その時点で消えます。
エラーを無視して空の一覧で先へ進むコードは、見た目にはよく動きます。だから「読めなかったときは、空とは別の扱いにして」と先に伝えます。
図の見方:上の段は、読めなかったのに「空」と答える作りで、0件の画面から保存すると本物が1件に上書きされます。下の段は、「読めなかった」と別の結果で答える作りで、保存が断られるので本物は残ります。
ファイルを読んだ結果は、3通りに分けて考えます。1つ目は、読めて中身がある場合で、一覧を出します。2つ目は、読めて中身が空の場合です。これは本当に0件なので、「まだ何もありません」と出して構いません。3つ目が、読めなかった場合です。このときだけは、0件とは言わず「読めませんでした」と知らせます。見分ける目印は、中身の件数ではなく、読む作業が成功したか失敗したかです。
読めなくなる原因の例が、iCloud Drive(Apple のクラウド保存サービス。Mac や iPhone のあいだで同じファイルをそろえる「同期」という仕組みがあります)に置いたファイルです。Mac は、ファイルの名前だけを手元に置き、中身をまだ取り寄せていない状態にすることがあります。名前は見えるので「ファイルはある」と判定されますが、プログラムから開こうとするとエラーになることがあります。
ほかにも、ファイルの中身が壊れていた場合など、読めない理由はいろいろあります。理由が何であっても、「読めなかった」は「0件」ではありません。なお、ファイルがまだ無い(初めて使う)場合は、空で始めて構いません。
たとえば、お気に入りの動画の一覧を iCloud Drive の中のファイルに覚えておく動画の管理道具では、コードを見直したところ、このファイルが読めなかったときに、エラーを黙って握りつぶして空の一覧を返す作りになっていると分かりました。そのままだと、久しぶりに開いた Mac で「お気に入り0件」と出た画面で☆を1つ押しただけで、本物が1件の一覧で上書きされ、同期で別の Mac にも広がります。実際に消える前に、読めなかったときは空を返さず、読めていない間は保存を断る作りに直しました。この見直しは、のちにエージェント型コーディング(AI が Mac の中で直接作業するやり方)に移ってからのことです。
作りとしては、4つのことをします。1つ目は、読む前に、中身を手元に取り寄せることです。iCloud Drive のファイルなら、読む前にダウンロードを頼みます。
2つ目は、それでも読めなければ、空の一覧ではなく「読めなかった」という別の結果を返すことです。プログラムの世界では、これを例外(エラーが起きたことを知らせる仕組み)を投げる、と言います。
3つ目は、読めていない間は、保存を断ることです。ここが一番大切です。画面で保存ボタンを止めるだけでなく、ファイルへ書き込む部分でも断る二重の歯止めにしておけば、画面の作りを変えても本物は上書きされません。
4つ目は、画面に理由を出すことです。「通信エラー」とだけ出ると、利用者は同じ操作をやり直し、二重に実行されることがあります。操作は成功したのに一覧の読み直しだけ失敗したときは、「操作は成功しました。一覧の更新だけ失敗しました」のように、分けて伝えます。
起きていることから探してください。
| 起きていること | 原因 | どうするか |
|---|---|---|
| 久しぶりに開いたら「0件」と出た。前は何百件もあったはず | ファイルが読めなかったのに、空の一覧として表示している可能性がある | その画面では、追加も保存もしません。データのファイルの場所を確認し、「読めなかったときは空ではなくエラーにして」と頼みます |
| 別の Mac で開いたときだけ、一覧が空になる | クラウド(インターネット上の保存場所)の同期が終わらず、ファイルの中身がまだその Mac に届いていない | 同期が終わるのを待ってから開き直します。作りとしては、読む前に中身を取り寄せるようにしてもらいます |
| 1件追加したら、一覧が1件だけになった | 読めていないのに空だと思い込んだまま保存し、本物を上書きした | それ以上、道具を使いません。保存前の控え(バックアップ)が残っていないか探します。今後は「読めていないときは保存を断る」作りにしてもらいます |
| エラー表示を出すように直したら、本当に空のときも怒られる | 「読めなかった」と「中身が空」を区別せず、どちらもエラーにしている | 「読めて空なら0件として扱い、読めなかったときだけ知らせて」と頼みます |
※ この道具箱は対話型コーディング(ブラウザの画面でチャットの AI と文章をやりとりして、コードを書いてもらうやり方)の前提です。 チャットの AI はあなたの Mac を見られないので、頼むのは「コードを書いて」、困ったら出た文字を貼って伝えます。 コツは、「読めなかった」と「中身が空」を別のものとして頼むことと、読めなかったときに保存を断ってもらうことです。 下の文は、そのまま写すためのものではなく、言い方の見本です。
① データのファイルを読む道具を頼むとき
「お気に入りの一覧をファイルに保存して、開くときに読む道具を作って。ファイルが読めなかったときは、空の一覧を返さないで。『読めなかった』ことが分かる別の結果にして、画面に『読めません』と理由を出して。読めていない間は、保存の操作を断って。ファイルが読めて中身が空のときだけ、『まだ何もありません』と出して。コードを書いて」
② すでに作ってもらったコードを見直すとき
「このコードの中で、ファイルが読めなかったときに、エラーを無視して空の一覧を返している所をすべて教えて。それぞれ、『読めなかった』と『中身が空』を区別する作りに直して。直したコードを全部書いて」
③ 保存の安全を確かめたいとき
「読み込みに失敗した状態のまま、保存の操作をしたらどうなるか教えて。もし本物のファイルを上書きしてしまうなら、読めていないときは保存しない作りに直して。コードを書いて」
うまくいかないとき
「久しぶりに開いたら、一覧が0件になっていた。画面に出ている文字は:(ここに貼る)。ファイルが読めていないのに空として表示していないか調べて、原因を教えて、直して」
試すのは、本物のデータではなく、そのコピーだけにします。先にデータのファイルを別の場所へコピーし(場所が分からないときは AI に尋ねるか、ファイル・フォルダ・パスの項目を見ます)、道具がコピーのほうを読むように、AI に切り替えを頼んでおきます。切り替えが効いているかは、AI に「いま読んでいるファイルの場所を画面に出して」と頼んで確かめます。次の3つを順に確かめます。
いつも通り、一覧が出るのを見る。まず、何も変えずに道具を開き、一覧が出ることを確かめます。ここで出ないなら、読めない状態とは別の原因があるので、先にそちらを直します。
読めない状態にして、開き直す。ファイルを無くす方法は、初めて使う場合と区別できないので使いません。代わりに、Finder(Mac でファイルを見るためのアプリ)でコピーのファイルを右クリックして「情報を見る」を開き、「共有とアクセス権」の自分の権限を「アクセス権なし」にします。ファイルはあるのに開けない状態です。そのあと、道具を開き直します。「0件」ではなく「読めません」のような表示が出れば成功です。「0件」と出るなら、読めなかったことが空として扱われています。権限は次の手順でも使うので、まだ戻しません。
読めないまま、保存の操作を試す。権限を外したままの状態で、☆を押す、1件追加するなど、保存が起きる操作をします。「読めないので保存しません」のような理由が出れば成功です。理由が出ずに「保存しました」と出る、または何も表示されない場合は、読めていないことを伝えない作りなので、直してもらいます。確かめ終わったら、権限を「読み/書き」に戻します。