Системы хранения заметок - достаточно интересная категория программ. Я до сих пор не нашёл идеальной программы, но постепенно движусь в этом направлении. 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, и я отложил исследование.