Вчера вышел iBank 4.1. Из полезных для меня изменений в программу добавили новые типы отчётов. Я радостно добавил отчёт Expense Timeline, успел один раз восхититься, перешёл на другой отчёт, вернулся, и тут iBank завис. Намертво. До «Force Quit».
Повторно запустил программу — да, запомнился последний выбранный элемент, снова открылся этот отчёт и снова iBank завис. Я пытался переключиться на другой счёт или отчёт разными способами — результат нулевой.
Можно было восстановиться из бекапа за прошлый день, но сегодня я сводил баланс и сделал достаточно много изменений. Повторять это с самого начала — нет уж. Я попал в тупик.
Пришло время анализа данных программы. Я решил, что стоит найти файл, в котором сохраняется информация, какой счёт или отчёт открывать при старте, затем его поменять и этим реализовать обходной способ решения проблемы.
Для тестирования создал новую базу probe1, там сделал один счёт и один отчёт. Выбрал отчёт, вышел из iBank. Скопировал базу в probe2. Открыл probe2, выбрал счёт, вышел. Получил две идентичные базы, различающиеся только выбранным объектом, в probe2 выбран счёт, а в probe1 — отчёт.
Путь к последней открытой базе можно найти командой:
$ defaults read com.iggsoftware.iBank4 NSNavLastCurrentDirectory ~/Documents/Personal/Finances
Перехожу в ~/Documents/Personal/Finances, сравниваю базы:
$ diff -r probe1.ibank probe2.ibank Binary files probe1.ibank/settings.data and probe2.ibank/settings.data differ
Какой формат у файла? Apple binary property list:
$ file probe1.ibank/settings.data probe1.ibank/settings.data: Apple binary property list
Для поиска различий конвертирую в xml:
$ plutil -convert xml1 -o - probe1.ibank/settings.data > probe1.plist $ plutil -convert xml1 -o - probe2.ibank/settings.data > probe2.plist
Сравниваю. Различий много, меня заинтересовало это:
$ diff -u probe1.plist probe2.plist @@ -52,7 +52,7 @@ <key>sourceListSelectedItemId</key> <dict> <key>CF$UID</key> - <integer>9</integer> + <integer>0</integer> </dict>
Предполагаю, что если в probe1 поменять sourceListSelectedItemId c 9 на 0, то вместо report выберется account.
Делаю резервную копию (!).
$ cd probe1 $ cp settings.data settings.data.dist
Можно использовать Property List Editor, добавив суффикс .plist, но я предпочитаю править xml вручную.
Конвертирую binary plist в xml
$ plutil -convert xml1 -o - settings.data > settings.data.plist
Открываю в редакторе, нахожу sourceListSelectedItemId и правлю значение 9 на 0:
$ vim settings.data.plist
Возвращаю в бинарный формат:
$ plutil -convert binary1 -o - settings.data.plist > settings.data
Запустил iBank, нужный счёт не выбрался, но эффект достигнут — злополучный отчёт уже не открывается при старте. Проблема не решена — отчёт я использовать не могу, однако могу продолжить работу с iBank и дождаться устранения.
Будьте осторожны с iBank и перед испытанием новых функций лучше сделайте резервную копию базы.