Системы хранения заметок – достаточно интересная категория программ. Я до сих пор не нашёл идеальной программы, но постепенно движусь в этом направлении. Evernote не нравится сохранением web-страниц, Together – странной дисковой активностью, Yojimbo – отсутствием программы под iPhone.
Недавно в комментариях к статье “Синхронизация данных Yojimbo через Dropbox” мы с 8bituser обсуждали достоинства и недостатки двух систем хранения заметок (Together и Yojimbo). Я приведу его аргументы в пользу Together, они очень полезны:
А я с Yojimbo кое-как переполз на Together. У меня файл базы был 140мб, каждый бэкап тайммашины…
И потом хотелось как-то на айфоне иметь доступ ко всему этому. В Together всё хранится не в базе, а открыто. Сделал его базу прямо в стандартной папке Documents (по дефолту в папке Together, которая в Documents, так не очень удобно и не красиво показалось), скрыл то, что мне не надо (там порядка 8 папок и файл Together.lock, теперь имею там каталоги Notes, Documents, Web Pages, Images и их симлинкаю на дропбокс, и таким образом всё есть на айфоне, причем быстро, не 140мб каждый раз пересылать туда-сюда, а только новые или измененные файлы.
Ну и достаточно удобно к этим папкам доступ из Stacks в режиме List могу открыть любой файл даже без открытого самого Together.
Плюс когда в Together кидаешь кусочек чего-то со страницы, он запоминает линк страницы и можно даже этот кусочек подредактировать удалив что-то или добавив.
Смартфолдеры тоже есть, с тэгами тоже не особо складывается, разве что для тех же смартфолдеров они нужны помимо раскрашивания.
Из минусов только то, что кусочки с веб-страниц кидать нужно в Shelf, а не прямо на иконку в доке, но уже привык, а всё остальное очень похоже, чуть больше удобности и гибкости. Причем у этого Shelf очень удобно быстро заметку написать или скопипастить в него.
Одни плюсы вобщем, переходи, чем дальше с Yojimbo тем болезненней переход :))
Да, Yojimbo невозможно использовать на iPhone, и это его большой минус. Я до сих пор ещё не определился, оставаться ли на Yojimbo или переходить на Together. Мне больше нравится первый. Но пока я стараюсь вести заметки в обеих системах. Сравнительный анализ – это тема отдельной статьи.
Сейчас же я хочу показать, как можно обойти главную проблему Yojimbo, а именно то, что данные хранятся в базе данных SQLite3 в едином файле и малейшее изменение приводит к необходимости записи в Time Machine всего файла. Для небольших баз это несущественно, но если ваши данные занимают сотни мегабайт, то это становится уже ощутимой проблемой.
Идея проста – нужно разместить данные в SparseBundle Image. Этот образ представляет собой набор 8-ми мегабайтных файлов (band’ов), и при изменении его содержимого меняются далеко не все band’ы, что даёт возможность уменьшить объём данных, записываемых в бекап Time Machine.
Подготовка SparseBundle Image
Создать образ можно или через программу Disk Utility, или в консоли через hdiutil. Через графический интерфейс для меня сложнее, поэтому именно этот метод я и рассмотрю :-)
Запускаем Disk Utility (/Applications/Utilities/Disk Utility), создаём образ:
Я решил разместить образ в каталоге Documents, но вы его можете расположить там, где вам удобно. Параметры такие:
Мне достаточно пока 100 MB, формат файловой системы стандартный “Mac OS X Extended (Journaled)”, схему разделов я привычно поменял с “Apple Partition Map” на “GUID Partition Map“. Самое главное – поставить формат образа “sparse bundle disk image”.
Если вы хотите секретности, то можно создать образ с шифрацией AES (128 бит вполне достаточно, но у вас могут быть другие соображения):
Ту же самую операция можно выполнить и через консоль:
$ hdiutil create -size 100m -type SPARSEBUNDLE -imagekey \ sparse-band-size=4096 -fs JHFS+X -volname Yojimbo -layout GPTSPUD \ ~/Documents/Yojimbo
Так даже лучше поступить, так как можно изменить размер band’а со стандартных 8 MB до 2 MB (4096 512-байтовых блока) или даже до минимального значения 1 MB (2048 512-байтовых блока).
Увеличение размера образа
Размер образа я поставил 100 MB. При необходимости можно его увеличить. Через Disk Utility мне это сделать не удалось (система рапортовала, что размер изменён, затем о том, что образ не изменён):
2010-03-12 17:33:14 +0200: Growing partition 0 of “Yojimbo.sparsebundle” from 100 MB to 500 MB. 2010-03-12 17:33:14 +0200: Resizing “Yojimbo.sparsebundle” was successful. 2010-03-12 17:33:26 +0200: Image “Yojimbo.sparsebundle” will not be changed.
Поэтому я вернулся в любимую консоль и там это сделал быстро и логично.
Если образ уже примонтирован, то нужно его отмонтировать:
$ hdiutil eject /Volumes/Yojimbo
Увеличение максимального размера образа до 500 MB (обратите внимание, что размер образа увеличивается по необходимости, а не выделеятся весь заявленный размер):
$ hdiutil resize -size 500m ~/Documents/Yojimbo.sparsebundle
Если в образе было много изменений, то можно его сжать (но для данного случая это почти бессмысленно, предварительно нужно сделать vacuum на базу данных SQLite, и только потом сжимать образ):
$ hdiutil compact ~/Documents/Yojimbo.sparsebundle
Монтирование образа:
$ hdiutil mount ~/Documents/Yojimbo.sparsebundle
Образ также можно примонтировать, открыв его в Finder.
Я заодно меняю иконку для этого образа, перетаскивая png-файл, найденный в Google на иконку в Get Info:
Затем меняю иконку и для смонтированного образа:
Теперь всё красиво.
Автоподключение образа при старте системы
Воспользуемся небольшим трюком – для автоподключения образа нужно его поместить в Login Items пользователя. Заходим в “System Preferences/Accounts/Login Items”. Рядом открываем окно Finder с папкой Documents. Перетаскиваем образ Yojimbo.sparsebundle в список Login Items:
Теперь после старта системы образ будет смонтирован в точку /Volumes/Yojimbo. Если вы выбрали шифрацию, то лучше поставить автозапоминание пароля в KeyChain, иначе придётся каждый раз этот пароль вводить (но это опять-таки “up to you” – достаточно сомнительное решение вводить шифрацию, и по сути обходить эту шифрацию, ставя автоввод пароля).
Перенос данных Yojimbo в SparseBundle
Перед этой операцией данные уже должны быть, для чего нужно хотя бы раз запустить Yojimbo. Дальнейшие операции лучше проводить в терминале, “Alias” в Finder – это далеко не unix symbolic link. Да, из Yojimbo нужно выйти.
$ cd ~/Library/Application\ Support
Делаем резервную копию данных:
$ mv Yojimbo Yojimbo.backup
Создаём символический линк, говорящий, что все данные будут располагаться в смонтированном образе:
$ ln -s /Volumes/Yojimbo . $ ls -al Yojimbo lrwxr-xr-x 1 ctrld staff 16 Mar 12 18:18 Yojimbo -> /Volumes/Yojimbo
Копируем все файлы, включая скрытые, начинающиеся с “.”. Сейчас перечень такой, но в других версиях он может поменяться, поэтому команду копирования возможно придётся адаптировать
$ ls -a Yojimbo.backup/
.ContentIndex.version ContentIndex.skindex Database.sqlite State.plist
SyncState.plist
$ cp Yojimbo.backup/{.[A-Z]*,[A-Z]*} /Volumes/Yojimbo/
$ ls -a Yojimbo/
.ContentIndex.version .fseventsd Database.sqlite SyncState.plist
.Trashes ContentIndex.skindex State.plist
Символический линк сделан. Запускаем Yojimbo, убеждаемся, что все данные на месте.
Но не беспокойтесь, если что-то пошло не так – старые данные есть в каталоге ~/Library/Application\ Support/Yojimbo.backup. Откат:
$ cd ~/Library/Application\ Support $ rm Yojimbo $ cp -r Yojimbo.backup Yojimbo
Эффект от перехода на SparseBundle Image
Как определить, что band поменялся? Достаточно посмотреть на время его модификации. Я сейчас покажу данные, которые я собрал для старого образа, в котором размер band был 8 MB.
После изменения одного комментария в 11:55 поменялись два файла – 0 и 1:
$ ls -al ~/Documents/Yojimbo.sparsebundle/bands -rw-r--r-- 1 ctrld staff 8388608 Mar 11 11:55 0 -rw-r--r-- 1 ctrld staff 8388608 Mar 11 11:55 1 -rw-r--r-- 1 ctrld staff 8388608 Mar 11 11:26 2 -rw-r--r-- 1 ctrld staff 5386240 Mar 11 11:43 3 -rw-r--r-- 1 ctrld staff 2437120 Mar 10 20:51 5 -rw-r--r-- 1 ctrld staff 913408 Mar 9 16:21 6 -rw-r--r-- 1 ctrld staff 8388608 Mar 9 16:21 b -rw-r--r-- 1 ctrld staff 1757184 Mar 9 16:21 c
Это значит, что в Time Machine будет помещены два файла суммарным размером 16 MB, но не весь файл базы данных 25.7 MB, как было бы без SparseBundle:
$ ls -al /Volumes/Yojimbo/Database.sqlite -rw-r--r--@ 1 ctrld staff 26961920 Mar 11 11:50 Database.sqlite
Если уменьшить размер band до 2 MB, то количество файлов может уменьшиться. Конечно же, чем больше база данных, тем больше эффект.
Копируются ли данные в Time Machine из открытого образа SparseBundle Image?
Проделаю эксперимент. Запускаю Yojimbo и меняю один комментарий.
$ ls -al /Volumes/Yojimbo/Database.sqlite -rw-r--r--@ 1 ctrld staff 26961920 Mar 11 12:00 Database.sqlite $ ls -al ~/Documents/Yojimbo.sparsebundle/bands -rw-r--r-- 1 ctrld staff 8388608 Mar 11 12:01 0 -rw-r--r-- 1 ctrld staff 8388608 Mar 11 12:01 1 -rw-r--r-- 1 ctrld staff 8388608 Mar 11 11:26 2 -rw-r--r-- 1 ctrld staff 5386240 Mar 11 12:00 3 -rw-r--r-- 1 ctrld staff 2437120 Mar 10 20:51 5 -rw-r--r-- 1 ctrld staff 913408 Mar 9 16:21 6 -rw-r--r-- 1 ctrld staff 8388608 Mar 9 16:21 b -rw-r--r-- 1 ctrld staff 1757184 Mar 9 16:21 c
Поменялись три файла – 0, 1 и 3.
С помощью dtrace смотрю за файлами, которые обрабатывает демон backupd Time Machine:
open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/3 open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/0 open:entry backupd /Users/ctrld/Documents/Yojimbo.sparsebundle/bands/1
Да, при открытом образе данные помещаются в бекап (в отличие от домашнего каталога в FileVault без выхода из системы).
Восстановление данных из бекапа
А вот здесь моего терпения не хватило, продолжу в другой раз :-) Могу сказать, что первая попытка восстановления из бекапа прошла безупречно, но когда я начал повторять процесс, у меня возникли сложности с dtrace, и я отложил исследование.

