2021年6月4日の投稿

/ver/folders/

 先日Macをスリープから解除したら、問題が発生したからと再起動を始めました。滅多にあることではないので普段は気にしないのですが、問題は再起動後、XCodeを立ち上げてDesktopShowアプリをbuild and runさせたらデータ読み込みができず初期状態に戻ってしまったことです。開発のさなか、動作テストの時にアプリのクラッシュに出くわすわけですが、アプリを再起動した際保存データが飛んでいて初期状態に戻ってしまうのが、開発中ずっと懸念事項でした。当アプリはイベントループの最後に大抵データ保存の処理をするのですが、アプリがクラッシュするのはビュー操作の過程であって、データアクセスの工程ではないのになぜデータが破損するのか、実はこのメカニズムが今でも掌握できていません。この一連の流れは全てメインスレッドで処理しているので、ビューがクラッシュした時点でデータ保存のルーチンまでは処理は進まないと思うのですが、実際はイベントループは最後まで処理され、ビューがクラッシュした時点でデータに不整合が生じているので、その状態でデータ書き込みが行われると、次回起動時にデータのデコードに失敗するのではないかと推察しています。
 一つわかっているのは、このままでは困るということです。ビュー周りは大変複雑で、完璧にバグがないように作り込むことは不可能に近く、クラッシュは起こりうるものなので、何らかの対処法が必要と以前から考えていました。そこでビューの更新が行われないタイミングでデータのバックアップを取っておいて、クラッシュ後の起動時で正規のデータのデコードに失敗した場合、バックアップデータを読み込むという仕様をVer.1.5で加えました。実際開発作業中この方法でアプリのクラッシュに対処できることを確認しています。
 そしてVer1.5をリリースした翌日に前述の事態に遭遇しました。もう呪われているのか、よりいいステップに進むきっかけに遭遇できたとポジティブに捉えるべきか、精神が試されます。システムが落ちたのは、おそらくXCodeが原因だと想像しているのですが、問題はアプリが正常に復帰できなかったことです。システムを巻き込むトラブルが発生した場合、今のやり方でもまだデータを失う可能性があることがわかりました。次回のアップデートの時には手動でデータを読み込む機能を追加しようと考えています。それ自体は以前から考えていた機能ですが、Ver1.5で実装した方法でその必要性はなくなったと思ったのですが、この問題は根が深く更なる探求が必要のようです。

 今回アプリが正常にデータの復帰ができなかった際、コンソールに気になるメーっセージが出力されていました。こんなメーセージに遭遇するのは今回が初めてで、内容は/ver/以下のディレクトリにあるファイルへのアクセスに失敗したというものです。調べてみると/verはUNIXにおいて、雑多な物置的に使われているディレクトリのようで、アップルは/verに/ver/folders/という独自のディレクトリを追加して様々なアプリがこのディレクトリをキャッシュ領域として使っているようです。このディレクトリの中の方を覗くと~ユーザー名/Library/Containers/の中のように、様々なアプリのディレクトリがあり、その中に私のアプリのディレクトリcom.kissdgw.DesktopShowもありました。コンソールに出力されていたのはこの中の何ちゃら.plistが読めなかったというものです。ここまでの記述でお分かりかと思いますが、アプリ制作者はこんなコード書いてません。/ver/folders/なんてディレクトリの存在は今回初めて知りました。これらはシステム側がやっていることです。今回の原因がアプリではなく、システムもしくはXCodeと考える根拠です。でもまぁそんなことはどうでもいいのです。アプリ制作側は自分のするべきことをするだけです。とは言え、現在のOSはアプリ側が手の出せない領域が多くて複雑です。仮に手が出せたとして手を出す技量もないですし。

 /ver/folders/ディレクトリで気になったのは、私のMacはその時このディレクトリが6GBもの容量を食っていたことです。そのうち実に5.9GB、ほとんどをcom.apple.desktoppictureすなわちシステムがデスクトップピクチャを表示しているプロセスが、表示した画像のコピーを書き込むことで消費していました。何という無駄なことをやっているんでしょう。ストレージ容量が256BG以下のMacだったら馬鹿にならない容量です。こんなところでストレージ容量を圧迫されているなんて一般のユーザーは誰も知らないでしょう。私も知りませんでいた。またこの仕様自体釈然としないものがあります。なぜ今更UNIXの領域なんかキャッシュに使っているのでしょうか。各アプリに標準で割り当てられている~ユーザー名/Library/Containers/でいいじゃないかと思うのですが。というか壁紙の画像なんかコピーしたってキャッシュとして何の意味もないでしょう。(正確にはjpegの実ファイルをpngに変換して書き込んでいるので、実ファイルの3倍以上容量増しになってます。壁紙として表示する画像なんかキャッシュする意味がそもそもないし。)

 以上、今回遭遇した事件簿でした。

コメントする

※ 匿名希望の場合は空欄で構いません。


コメントを追加する キャンセル

▼ 記事の選択 ▼

最近の投稿