3 ポイント 投稿者 GN⁺ 2023-09-24 | 1件のコメント | WhatsAppで共有
  • iCloud Driveの隠れたファイル競合のため、最近書いた段落やコードの変更分が消え、バックアップに保存される前に損失が発生
  • 競合はMacとiPhoneに同じファイルの別バージョンがあると判断された状況だったが、問題のファイルはiPhoneで開かれたことがなかった
  • Dropboxは競合ファイルを別に残すが、iCloud Driveはファイルシステム上に表示しないため、競合処理対応エディタでのみ選択ポップアップを見られる
  • Textifier、Xcode、Obsidianのように競合処理がないエディタでは、iCloudが保存するバージョンを選び、時間が経つと正しいバージョンがバックアップで上書きされる可能性がある
  • 重要なデータはiCloud Driveの外に置き、重要ファイルはGitリポジトリで変更を監視するほうが安全であり、iCloudに残さなければならないファイル向けのCloud Cubも開発中

iCloud Driveの隠れたファイル競合

  • 文書作成中に今入力したばかりの段落が消え、アプリ開発中にはXcodeがそれまで問題なかったコードに複数のエラーを表示
    • 複数ファイルの最近の変更が消えた状態だった
    • 損失はTime MachineやBackblazeが保存する前に発生した
  • 原因はiCloud Driveが検出したファイル競合だった
    • iCloud DriveはMacとiPhoneに同じファイルの別バージョンがあり、自動マージできないと判断
    • しかし影響を受けたファイルはiPhoneで開かれたことがなかった
    • MacのDocumentsフォルダをiCloudに移していたため、そのファイル群がiCloud上にあった
  • Dropboxではバージョン競合が起きると、“(John Doe’s conflicted copy)”のような名前を付けた競合ファイルも一緒に保存する
  • iCloud Driveは同じ競合をファイルシステム上に表示しない
    • 競合処理をサポートするエディタでファイルを開くと、どのバージョンを保持するかを尋ねるポップアップが表示される
    • Textifier、Xcode、Obsidianのように競合処理がないエディタでは、iCloudがディスクとバックアップに保存するバージョンを決める

復旧条件と対処方法

  • 時間が経って新しいバックアップが、正しいバージョンを含んでいた以前のバックアップを上書きすると、コンテンツが永久に失われる可能性がある
  • 復旧するには、競合解決をサポートするエディタでそのファイルを開く必要がある
    • 例として使われたエディタはiA Writer
    • ファイルをiCloud Driveの外へ移した後は、この方法も役に立たない
    • テストでは、変更していないファイルを再びiCloudへ移すと競合バージョンのポップアップが再表示されたが、ファイルが編集されていたりコピーで作業を続けていた場合は、そうならない可能性がある
  • バージョン競合を隠す方式はユーザーフレンドリーに見えるかもしれないが、重要な文書を何年後かに再び開くまでデータ損失に気付かない可能性がある
  • iCloud Driveがファイルシステム上、またはアクセスしやすい中央の場所にバージョン競合を公開するようになるまでは、重要なデータをiCloud Driveの外へ移すほうが安全
  • iCloud Driveに残さなければならないファイル向けに、隠れた同期競合を検出して解決するCloud Cubを作成中

1件のコメント

 
GN⁺ 2023-09-24
Hacker Newsの意見
  • 似たようなことを経験した。妻のiPhoneのNotesでクラウド同期がオンになっていて、必要なさそうだと思ってオフにしたら、妻に「私のノートは全部どこに行ったの? 何をしたの?」と言われた
    冷や汗をかいたが、同期済みのNotesアプリが入っているiPadのことを思い出し、すぐに開いてWiFiを切り、ノートを「保全」した
    Appleに電話したところ、サポート担当者が、各ノートを新しいフォルダにコピー&ペーストすれば削除されないようにできる、という方法を見つけてくれた
    数時間かなりストレスだったし、Appleはこうした操作の全体的な影響について、もっと警告やポップアップを出すべきだったと思う
    ついでに、Appleのテクニカルサポートが、実質的にスマートフォンへ「VNC」のように接続して、見たり設定を変えたりできることも知った。権限リクエストが出て「承認」を押したのだと思うが、実際に見るまではそんな機能があるとは知らなかった

    • この問題を擁護するつもりはないが、Appleの担当者がNotes同期の問題を電話で手伝い、復旧までしてくれたというのは驚きだ
      しかも原因は本人のミスに見えたのに手伝ってくれた。うちの会社はGoogle製品にかなりのお金を払っているが、Googleがこういうことを電話で手伝ってくれる可能性はほとんどない
      以前、アクセス制御のような件では担当者と話したことがあるが、Keepのノートが消えたときに助けを求めたら、丁寧に失せろと言われそうだ。実際、Keepのノートも時々消える
    • 考えている状況がその通りなら、単に同期を再びオンにすればすべてのノートが戻ってきたのではないかと思う
    • 記憶では、同期をオフにするときに「続けますか? すべてのiCloudノートがiPhoneから削除されます」という確認が出る
      奥さんの問題はAppleよりも、iOSデバイスを管理した人の側にあったように思う
    • Appleのテクニカルサポートがスマートフォンに「VNC」のように入り込んで内容を見たり設定を変えたりできるというのは、潜在的なセキュリティ脆弱性のように見える。これを恒久的にオフにする方法があるのか気になる
    • その「VNC」機能について詳しく知りたい。iPad専用なのかiOSでも使えるのか、承認リクエストはシステムのポップアップだったのか、名前のあるアプリが開いたのか、画面上で実際に何をしているか見えたのか、どこかに文書化されたことがあるのか気になる
  • 本当に百万回同意する。ただ、これはiCloudだけの問題ではなく、Appleソフトウェア全般の根本的な性向のように見える
    BooksでPDFにハイライトを付けるときにも繰り返し経験している。時々PDFを開き直すと、最近マークした複数ページが消えている
    作業中はずっと保存されているように見えるのに、理由は不明だが11:45の版ではなく11:35の版を最新の主版だと判断する
    Appleが新しい内容を古いバージョンで黙って上書きしてしまう問題は、少なくとも10年は続いている
    こうした致命的な欠陥がそもそもどうやってシステムに入り込み、いまだに修正されていないのか理解できない

    • ソフトウェアで最も難しい2つの問題は、キャッシュの無効化、命名、オフバイワンエラー、配列インデックスの強制欠如によるバッファオーバーフローだ
    • macOS標準ソフトでハイライトや注釈を付けるときにも、いろいろ奇妙なことを経験したが、Skimはかなり優れた代替だった
      無料でBSDライセンスだが、他のアプリでも変更内容を見たいなら注釈入りPDFとして書き出す必要がある点は覚えておくべきだ
      Appleのコントラストを殺すオレンジがかった背景や、本物の黄色いハイライトがないことに疲れた人なら試す価値がある。関係者ではなく、存在してくれてありがたいだけだ
      https://skim-app.sourceforge.io/
    • 興味深い点だ。Appleコンピュータを行ったり来たりしながら使ってきて、最近では2015年から今年初めまで使っていたが、哲学の問題という言い方には一理あるように見える
      ハードウェア側でも、フロッピーディスク、光学ドライブ、CPUアーキテクチャ全体を3度もかなり容赦なく切り捨てたことを覚えている
      iCloudでは、その態度がファイルにも適用されているように思う。全部が悪いとは言わないが、年を取るほど自分の好みからはだんだん離れていく
    • iCloudインフラの大部分はCassandraインスタンス上に構築されている。関連する良い論文があるのだが、今は見つけられない
    • 11:35の版を最新と判断したなら、一部サーバーの時計がずれていたのだろうか?
  • 投稿者はgitの利用を提案しているが、gitはiCloud Driveと相性がよくない
    以前、iCloud Driveに数百個のgitリポジトリを置いていたが、大きなコミットをすると、数百GBあるiCloud Drive全体がAppleのサーバーと再同期されることがあり、1日かかった
    Appleサポートでかなり上位までエスカレーションして解決しようとしたが、結局解決しなかった。今はgitリポジトリをiCloud Driveの外に置いている
    最後の大きな変更の同期が終わる前に、数百個のファイルを素早く同時に変更すると、この現象が引き起こされるようだ

    • gitのようなバージョン管理システムと、iCloud、OneDrive、Google Driveのようなクラウドドライブのクラウドベースのバージョン管理を混ぜてはいけない、というのはほとんど常識だと思っていた
      両者は相性が悪く、特に複数のデバイスが同じクラウドドライブに同期されていると、あらゆる奇妙で予想外の動作が起きる余地がある
    • 元記事の著者です。共有してくれてありがとう
      問題は、必ず使わなければならないアプリが他の同期方法をサポートしていないため、重要なファイルの一部ではiCloud Driveを使う必要があることだ
      gitがなければ、どのファイルが変わったのかすら突き止められなかっただろう。gitがあっても全部捕捉できたとは確信できない。iCloudの同期競合でgitの内容も変わりうる気がする
    • gitはそもそも大きなバイナリオブジェクトとも相性がよくない
    • 重要なiCloud Driveフォルダは自動プロセスでどこかにrsyncし、その先でGitやDropboxなどで自動バージョン管理する方式を主に使っている
      非常に大きなデータには向かないだろうが、iCloud Drive上にありつつ積極的にバージョン管理したいものはほとんどがテキストか小さいものなので、2セット持つ負担はほぼない
    • 参考までに、Dropboxでも似た理由でgitがかなり奇妙に失敗することがある。以前Dropboxをgitサーバーのように使おうとしてgit-remote-dropboxを使ったことがある
      [1] https://github.com/anishathalye/git-remote-dropbox
  • iCloud Driveを使うべきでない、より大きな理由は、エンドツーエンド暗号化がデフォルトではない点だと思う。
    そこに保存したものはすべて、Appleのシステム管理者、サポート担当者、そしてAppleに要求できる人々、たとえば現在は令状なしでも可能な米国政府が読める。
    エンドツーエンド暗号化でないサービスは使わないほうがいい。
    現在iCloudには任意のエンドツーエンド暗号化があるにはあるが、デフォルトではオフで、設定の奥深くに埋もれているため、ほとんど誰も使っていない。
    私はSyncthingを使って、すべてのデバイスでファイルを維持している。エンドツーエンド暗号化され、自由ソフトウェアで、競合処理とバージョンバックアップも合理的だ。
    平文を決して見られない、信頼しない同期専用デバイスにも対応しているので、VPSや外部の場所にノードを安全に置ける。

    • 「エンドツーエンド暗号化でないサービスは使うな」と言いながら「iCloudにも任意のエンドツーエンド暗号化がある」と言うのは互いに矛盾している。iCloudもエンドツーエンド暗号化できる。
      友人や家族にメニューを2回押して有効にするよう説得するのは簡単だが、複数のデバイスにSyncthingをインストールして設定するよう説得するのは簡単ではない。
      Syncthingを擁護するのはいいが、平均的なユーザーがキーを失うとすべてのデータを失いかねない設定をデフォルトで有効にしていないからといって、iCloud Driveが悪いと言うのは少し滑稽だ。
      おばあちゃんなら、デフォルトでより安全であることより、パスワードを忘れたときにAppleに電話して幼いJohnnyの写真を取り戻せることを、はるかに望むはずだと断言できる。
    • エンドツーエンド暗号化に対する現実的な反論もある。大多数の人にとっては、管理者や政府にデータが漏れることより、暗号化キーを忘れたり失くしたりしてすべてのデータを失う可能性のほうがはるかに高い。
      私もエンドツーエンド暗号化を有効にしたいが、キーを失くさないほど自分を信用できない。
    • iCloudのエンドツーエンド暗号化を手動で有効にすることと、エンドツーエンド暗号化を標準でサポートするプロバイダを自分で探して使うことが、どう違うのか分からない。
      メッセージングのように、相手側もエンドツーエンド暗号化を有効にしなければならない状況でもない。
    • クラウドストレージプロバイダを丸ごと乗り換えるより、iCloudでボタンを1つ押してエンドツーエンド暗号化を有効にするほうが、当然ずっと簡単に見える。
    • iCloudアカウント設定の高度なデータ保護で、エンドツーエンド暗号化を有効にできる。
      https://support.apple.com/en-ca/HT212520
  • 私もこの件でかなり腹が立っている。CalibreライブラリをDocumentsフォルダに置いていた。ほかにどこに置くというのか、無料バックアップも含まれているのだから。
    ところが少し前、ライブラリ内のいくつかの本フォルダが、本来なら実際のepubファイルを含んでいるはずなのに空になっているのを見つけた。
    ディレクトリ構造とデータベース項目はあるのに、本のファイルだけが消えていた。全部ではなく、ランダムに約40%ほどだった。
    結論としては、大事なものをiCloud Driveに保存するな、特に本はなおさらダメだということだ。

    • 冗談めいた助言だが、おそらくLibgenで再入手できるだろう。
  • 「競合処理に対応したエディタでファイルを開くと、どのバージョンを保持するか尋ねるポップアップが表示される。Textifier、Xcode、Obsidianのように競合処理のないエディタでは、iCloudがディスクとバックアップにどのバージョンを保存するかを決める」という部分については、iCloud対応を入れながら競合処理メカニズムを追加しなかったアプリ開発者にも一部責任があると思う。
    しかしApple自身のアプリであるXcodeが、なぜ競合処理をサポートしていないのか。Appleのソフトウェアがサードパーティ開発者の基準を示すべきだ。
    Appleでさえバージョン競合を処理しないなら、当然ほかの開発者もしないだろう。

    • 元記事の筆者です。少し誤解を招く書き方をしたようだ。要点は、エディタとは無関係だということ。
      競合処理に対応したエディタを使っても、内容を失う可能性がある。
      何かを書いて保存したあと、エディタを閉じて再度開かないと仮定すると、iCloudがそのファイル内容を差し替えることがあり、ユーザーには知る方法がない。
      データを失わない唯一の方法は、Gitリポジトリを作るか、重要なすべてのファイルを競合処理に対応したエディタで定期的に開くことだ。
    • アプリが機能を実装していないからといって、システムAPIが重要なデータをひっそり削除してよいわけではない。
      これはXcodeのバグではなく、iCloudのバグだ。
  • iCloud Driveにファイルを置くと、iPhoneはいつでもローカルコピーを削除できる。
    ファイルを同期しつつ、ローカルコピーが100%存在すると確信したいなら、同じファイルをiCloud Driveと「このiPhone内」フォルダの両方に置く必要がある。
    Apple Books、Numbers、そしてiCloud Driveを使うすべてのアプリがローカルコピーを削除し続ける理由がこれだ。
    iCloud Driveを利用する簡単なメモアプリを作ったことがあるが、アプリを閉じるとiCloudは2KBのtxtファイルでさえ貪欲に削除した。たまに削除しないこともあり、かなりランダムだった。
    ストレージ容量が大量に残っていても関係なく、iCloudは使い続けているファイルのローカル版も削除できる。
    Appleの開発者サポートは、できることはないと言っていた。開発者側にも、ファイルを絶対に削除しないよう指定する方法はない。
    公式ドキュメントでAppleは実際、ユーザーのすべてのファイルをiCloud Driveに保存し、「このiPhone内」にはコピーを置かないよう推奨している。

  • Contactsが消える似たような問題を経験した。しばらく発生していたが、最初は自分のミスだと思っていた。
    ある朝、前夜にメッセージをやり取りしていた友人の連絡先が消えているのを見て、問題はiCloudだと気づいた。
    Appleサポートに連絡し、基本的な案内をすべて試したあと、担当者はこれが既知の問題だが根本原因は分かっておらず、解決策もないと認めた。
    削除がいつ起きるか分かるよう連絡先を監視してほしいと言われたが、数分単位の範囲で知らせる必要があるとのことだった。
    「iPhoneは大量のログを作るため、正確にいつ起きたかを特定できないとエンジニアが確認できない」という理由だった。
    8時間の範囲までバグを絞れたのでも十分だと思ったが、担当者はエンジニアがそう言っているとして、数分単位の精度を求めた。
    結局、Appleサポートに難しい問題を任せるたびにそうだったように、担当者は折り返し連絡すると言ったものの二度と電話してこず、何も起きなかった。
    連絡先をGoogleに移して、そのまま忘れることにした。

  • この問題を調べてみた。Appleはユーザーを競合であまり煩わせないように、特定の条件下でユーザーデータを失う同期戦略を選んでいた
    競合したリビジョンを保存できたはずの、はるか昔からある手法を使わないことにしたということ
    まとめはこちら
    https://www.youtube.com/watch?v=q8k1q6kf1W0

    • ユーザーの邪魔にならないようにするなら、重複ファイルを競合フォルダのような場所に入れることもできたはず
      そうすれば人々は「Appleは私のファイルに何をしたのか?」と検索して、復旧方法を見つけられたかもしれない
      邪魔しないという話で言えば、iOSがあるアップデートで私の通話設定をこっそり変更し、一部の発信者からの電話が鳴らないようにしていた
      一種の心を落ち着かせるためのくだらない機能だったが、NHSの性質上、かけ直してもらうのが難しいがん外科医からの電話を逃してしまい、かなり不安になった
  • 私の場合、iCloud Driveはときどき単に同期されず、何かに引っかかっている。FinderのiCloud Driveアイコンで同期状態を確認できる
    macOSとiOSのすべてのアプリを閉じて killall bird を実行すると、ときどき解決する。bird はiCloud同期サービス