macOSのLaunchpadのアイコン配置を保存して復元するには
2020-05-15
azblob://2022/11/11/eyecatch/2020-05-15-macos-launchpad-000.png

はじめに

FIXER名古屋事業所の笹尾です。
今日はAutomatorアプリを利用してLaunchpadのアイコン配置を保存して、後から再利用することをしてみたいと思います。

※ 今回の記事はmacOS Catalina (10.15)で記載しています。

なぜそんな努力が必要か

僕がはFIXERに入社して以来ずっと困っていることがあります。
それはMacBook Proを再起動するたびに結構な頻度でLaunchpadのアイコン配置が変わってしまうことです。
入社した日に会社から支給されたMacBook Proもそうでしたが、先月自分で購入してBYODで利用しているMacBook Pro 16inchもLaunchpadのアイコン配置が崩れてしまうのです。
おそらくMicrosoft IntuneのDevice managementの何かが悪さをしている気がしますが、証拠を掴んでいないのでクレームも出せません。
自分専用のMacBook Pro 15inchを去年購入して使うまではあまり使っていなかったLaunchpadも、気がつけばよく利用していた様で日に日にストレスが溜まってきていました。
何より、せっかく自分の作業環境を良くするために24回ローンまで組んで購入したMacの使い心地が悪いまま過ごす自分自身を許せません。

結論を先に

Launchpadのアイコン配置を初期化したり、列数やアイコンの大きさを変えるやり方はインターネットで検索すると結構簡単に見つかりました。
ところがアイコンの配置を覚えて再利用する方法はなかなか見つからないんです。
なので自分で作って上手く行きました。
真似するためには多少の技術と若干のリスクはありますが、詳しく解説するので個人が利用する分には皆さんも利用できると思います。

最初にやっていた方法

最初に思いついたのはアイコンの配置が変わったらさっさと初期化して同じ配置に慣れることでした。
基本GUI操作しかしない僕は、インターネットで見つけた下記のアイコン配置を初期化するシェルスクリプトをAutomatorアプリに仕込んで起動する方法でした。

defaults write com.apple.dock ResetLaunchPad -bool true
killall Dock

でもね、アプリが増えてくると覚えられないし、同じアプリの仲間でもアイコンは隣に並んでくれないんですよ。
と言うわけで、ここからが今日の本題です。

Launchpadアイコン配置の実体を探せ

通常macOSを再起動してもLaunchpadのアイコン配置は正しく記憶されています。と言うわけで、macOSがLaunchpadのアイコン配置を記憶している実体を探します。

はい。ありました!

『/private/var/folders/{??}/{ハッシュ値?}/0/com.apple.dock.launchpad/db/』
フォルダーです。
この中にある「db」「db-shm」「db-wal」の3つすべてがLaunchpadアイコンの配置を保存しています。
問題はパスの中にある『{??}/{ハッシュ値?}』の部分ですね。
ここはおそらくユーザー固有の文字列なので、自分のフォルダーを探すしかありません。
自分専用のmacならフォルダーの数は大した事ないので、すぐに見つかるのではないでしょうか?
見つけるコツは、『0/com.apple.dock.launchpad』があるか?ないか?、見れるか?見れないか?です。
『private』フォルダは不可視フォルダですが以下のコマンドでFinderで開くことができます。

open /private/var/folders/

『0/com.apple.dock.launchpad』があって中のファイルが見える場合

『0/com.apple.dock.launchpad』があっても見れない場合(自分のではない)

問題はここからだ

先ほど見つけた3つのファイル。
「db」「db-shm」「db-wal」はSQLiteのデータベースファイルなのです。
なので、ただコピーしても正しくアイコンの位置を復元できるかわかりません。

そもそもなぜファイルが3つもあるかと言うと、、、
(この部分は難しいので読み飛ばしてもOK)
データベースにはトランザクションという概念があって、この3つは元データとトランザクションデータとコミットログのファイルが分かれているんですね。」Sqlliteではjournal_modeでWALを指定すると「db-shm」にトランザクションのデータが、「db-wal」にはコミットしたデータが書きこまれているらしいです。

というわけでなんとか元データとなる「db」ファイルだけでアイコンの配置を管理したいですよね。

データとまとめる

「db-shm」自体はトランザクションデータなので失くしても大きな問題にはならないでしょうが、「db-wal」にはコミットしたデータ(実際のアイコンの配置)が入っているので無くしてしまったらアウトです。
「db-wal」のデータもいずれ「db」に入るはずなのでSQLiteの資料を調べてみると、データベースへのコネクションを切断する時にデータをマージしてるみたいですね。
そのタイミングって、、、何回か試したらOSをシャットダウンする時みたい。
てことは、再起動してログインするとアイコンの配置崩れている可能性があるので利用できませんね。
試しにLaunchpad(Dock)を下記のコマンドで再起動しても無駄でした。

killall Dock

ならば自分でデータをまとめよう

自分で接続して切断すればいけるんじゃない?

はいあたり!
それなら、こんな簡単なコマンドでいけました。

sqlite3 ${TEMP}/db/db .tables

このコマンドはTEMPディレクトリ予めDBフォルダごとコピーしたDBファイルをSQLiteで開き、テーブルの一覧を参照してすぐに接続を閉じています。

この魔法の1行で「db-wal」のファイルサイズは0に!

後はGUIで動かす様にするだけ

まずはテンプレートのファイルを自動で作る

Macにアプリを追加したり削除するたびに毎回手作業でコマンド打つのは嫌なので、Automatorアプリを作ってしまいます。
Automatorアプリを開き、新規でアプリケーションを作成し3つのアクションを設定するだけですみました。

  • 指定されたFinder項目を取得
    一つ目のはテンプレート化するDBの保存先です。
    この保存先のフォルダの下に日時フォルダを作ってテンプレートとなる配置を保存できる様にします。
    このアクションだけはオプションで『このアクションの入力を無視』にチェエックを入れることをお勧めします。
    僕の場合はこんな感じで指定しています。
~/Documents/Launchpad/Database/New
  • 指定されたFinder項目を取得
    2つ目のは現在システムが利用しているLaunchpadのDBの場所です。
    こんな感じですね。
/private/var/folders/{??}/{ハッシュ値?}/0/com.apple.dock.launchpad/db/
  • シェルスクリプトを実行
    大切なことは全部ここでやっちゃいます。
    「シェル」は『bin/bash』を選んでください。
    とても大切なのが、アクションの右上にある「入力の引き渡し方法」を『引数として』にしてください。
    引数を取れないと、指定したフォルダが使えません。
    実際のシェルの内容はこんな感じです。
set -e -o pipefail

SYSTEM_LAUNCHPAD_DB_DIRECTLY="$1"
USER_LAUNCHPAD_DB_DIRECTLY="$2"

TEMP="${USER_LAUNCHPAD_DB_DIRECTLY}/"`date +%Y%m%d_%H-%M-%S`
mkdir -p ${TEMP}
CP -f -r ${SYSTEM_LAUNCHPAD_DB_DIRECTLY} ${TEMP}/
sqlite3 ${TEMP}/db/db .tables
rm ${TEMP}/db/db-*

テンプレートのファイルで配置を復元する

ログインした時もし配置が崩れていたらすぐに直せるよう、復元もAutomatorアプリで作ります。
こちらもAutomatorアプリを開き、新規でアプリケーションを作成します。
4つのアクションで構成できます。

  • 指定されたFinder項目を取得
    一つ目のはテンプレート化したDBファイルです。
    このアクションだけはオプションで『このアクションの入力を無視』にチェエックを入れることをお勧めします。
    僕の場合はこんな感じで指定しています。この項目だけはファイルを直に指しているので注意してください。
~/Documents/Launchpad/Database/db
  • 指定されたFinder項目を取得
    2つ目のは現在システムが利用しているLaunchpadのDBの場所です。
    ここは毎回同じなのでこんな感じですね。
/private/var/folders/{??}/{ハッシュ値?}/0/com.apple.dock.launchpad/db/
  • 指定されたFinder項目を取得
    3つ目は念のためにバックアップするDBの保存先です。
    この保存先のフォルダの下に日時フォルダを作って保存します。
    僕の場合はこんな感じで指定しています。
~/Downloads/launchpad-backups
  • シェルスクリプトを実行
    大切なことは全部ここでやっちゃいます。
    「シェル」は『bin/bash』を選んでください。
    とても大切なのが、アクションの右上にある「入力の引き渡し方法」を『引数として』にしてください。
    引数を取れないと、指定したフォルダが使えません。
    実際のシェルの内容はこんな感じです。
set -e -o pipefail

SAVE_SYSTEM_DB="$1"
SYSTEM_LAUNCHPAD_DB_DIRECTLY="$2"
USER_LAUNCHPAD_DB_FILE="$3"

BACKUPS="${SAVE_SYSTEM_DB}/"`date +%Y%m%d_%H-%M-%S`
mkdir -p ${BACKUPS}
mv -f ${SYSTEM_LAUNCHPAD_DB_DIRECTLY} ${BACKUPS}
mkdir -p ${SYSTEM_LAUNCHPAD_DB_DIRECTLY}
cp -f ${USER_LAUNCHPAD_DB_FILE}  ${SYSTEM_LAUNCHPAD_DB_DIRECTLY}

killall Dock

実際にこんなことして問題ないのか?

何回か試してみた感じでは大きな問題はありませんでした。
特にアプリのインストール中や削除中に作成したAutomatorアプリを起動しなければ問題ないと思います。
復元前にインストールしたアプリがテンプレートのデータに入っていなくても、Launchpadを表示する際に空いている場所に表示される様です。
ただし、ユーザーやマシンなど異なる環境にテンプレートを使い回すのはやめた方がいいと思います。
また、作りが若干甘いので実行時は指定したファイルやフォルダは必ず存在している必要があります。

想定している利用方法

アプリをインストールや削除した場合、アイコンの配置を直した場合は、必ずテンプレート用のファイルを作成して最新のテンプレートファイルを利用する様にして下さい。

クレームは受け付けません

多分問題はないというレベルです。記事を読んで同じことをしても僕や僕の関係者は一切責任を持ちません。
なぜ、アイコンの保存先が不可視なのかきちんと考えて行動できる人だけ、自分の責任で試してみてください。

まとめようと思ったのに

ここまで書いて気がついたんですが、、、
もしTime Machine使っているならこんなコマンドでログイン前のファイルに戻してもよかったかも知れません。
ただ、この方法でも戻した後にLaunchpad(Dock)の再起動の必要があると思いますし、上手く「db-wal」のデータが読み込めない可能性もあり、今回作成したAutomatorアプリの方が便利だと思います。

open /private/var/folders/{??}/{ハッシュ値?}/0/com.apple.dock.launchpad/db/
open -b com.apple.backup.launcher

まとめ

今日は僕の自己満足のお話でした。
でも自己満足はとても大切で、作業環境にストレスがあると仕事の成果は大きく変わります。
もしLaunchpadのアイコン配置が崩れて困っているのであれば、試してみてはいかがでしょうか?