Здравствуйте, уважаемые читатели!
Я хотел бы рассказать про такой интересный проект, как Tagsistant. Это ориентированная на теги файловая система в пользовательском пространстве (FUSE) для Linux и, возможно, других операционных систем с поддержкой этой технологии.
Tagsistant является свободным программным обеспечением с открытым исходным кодом: любой желающий может использовать или модифицировать его согласно лицензии, указанной автором.
Что-что?
Tagsistant работает в пользовательском пространстве и с пользовательскими правами. Это возможно с помощью специального модуля ядра — FUSE. Таким же образом построены такие файловые системы, как sshfs и encfs.
Отличия от традиционных файловых систем
Tagsistant отличается тем, что акцент здесь делается не на иерархию директорий, а на теги — метки, назначенные файлу. Если в «классической» иерархии между файлами и директориями используется отношение «много файлов к одной директории, файл принадлежит директории», то в Tagsistant реализовано отношение «у файла много тегов, у тега много файлов».
Для чего это всё?
Tagsistant позволяет взглянуть на организацию архивов документов, фото и видео совершенно с другой стороны, предоставляет гибкий способ упорядочивания данных.
Например, я хочу найти все фотографии с родителями и сестрой на море. Как насчёт решить такую задачу в традиционных файловых системах? «Ручками»?
С tagsistant'ом я просто указываю: мне, пожалуйста, всё, что помечено тегами photo, parents, sister и sea.
Это, конечно, требует заранее указать, что такие-то файлы принадлежат к таким-то тегам, но создание иерархии директорий в традиционной файловой системе тоже требует действий, при этом проигрывая в удобстве дальнейшего пользования.
Демонстрация
Запускаем в первый раз:
dfyz@alice ~ $ /opt/tagsistant/bin/tagsistant --repository=~/tagsistant-test.repo/ ~/tagsistant-test/ *** saving repository in ~/tagsistant-test.repo/ Tagsistant (tagfs) v.0.6 Build: 20130519.000 FUSE_USE_VERSION: 26 (c) 2006-2013 Tx0 <tx0@strumentiresistenti.org> For license informations, see /opt/tagsistant/bin/tagsistant -h Using default plugin dir: /opt/tagsistant/lib/ Loaded plugin: text/html -> libtagsistant_html-0.1.so Loaded plugin: audio/mpeg -> libtagsistant_mp3-0.1.so Loaded plugin: image/jpeg -> libtagsistant_jpeg-0.1.so Loaded plugin: application/ogg -> libtagsistant_ogg-0.1.so Loaded plugin: */* -> libtagsistant_generic-0.1.so dfyz@alice ~ $ df -h ~/tagsistant-test Filesystem Size Used Avail Use% Mounted on tagsistant 35G 24G 9.6G 72% /home/dfyz/tagsistant-test
Получаем такую структуру:
dfyz@alice ~ $ ls tagsistant-test archive relations stats tags
Никаких тегов пока ещё нет:
dfyz@alice ~ $ ls tagsistant-test/tags/ dfyz@alice ~ $
Создаём теги:
dfyz@alice ~ $ mkdir tagsistant-test/tags/warhammer40000 dfyz@alice ~ $ mkdir tagsistant-test/tags/photos
Наполняем их — добавляем файлы:
dfyz@alice ~ $ cp WarpTalon.jpg tagsistant-test/tags/warhammer40000/ cp: cannot create regular file ‘tagsistant-test/tags/warhammer40000/WarpTalon.jpg’: Read-only file system dfyz@alice ~ $ cp WarpTalon.jpg tagsistant-test/tags/warhammer40000/@ dfyz@alice ~ $ cp photo/buOk8LSSnNM.jpg tagsistant-test/tags/photos/@
Здесь первый вызов cp провалился — я забыл указать @ в конце пути. Этот каталог используется для обозначения, что warhammer40000 — последний тег в цепочке запросов. Зачем это сделано — можно увидеть ниже.
Посмотрим теперь на наши теги:
dfyz@alice ~ $ ls tagsistant-test/tags image photos warhammer40000
Заметно, что появился третий тег, которого мы не создавали — image. Это свою работу делают зачатки автоматического тегирования — tagsistant определил, что наши файлы — изображения.
dfyz@alice ~ $ ls tagsistant-test/tags/image/@ buOk8LSSnNM.jpg WarpTalon.jpg
Что, если мы хотим увидеть все изображения, относящиеся к Вархаммеру?
dfyz@alice ~ $ ls tagsistant-test/tags/image/warhammer40000/@ WarpTalon.jpg
Под капотом
На самом деле, каждый смонтированный экземпляр имеет бэкэнд — репозиторий. Объекты хранятся в директории «archive» — используя нижележащую, реальную файловую систему.
Все метаданные — теги, отношения файлов к тегам, тегов к тегу — хранятся в SQL-базе. В случае SQLite — в файле tags.sql, в случае MySQL — в базе «tagsistant».
Версия 0.6
Не так давно вышла версия 0.6. В ней реализована дедупликация, что позволяет файловой системе занимать как можно меньше места, изменился синтаксис (на мой взгляд — в лучшую сторону), улучшена сеть отношений между тегами, а переход на libDBI открывает возможности по использованию других SQL-бекэндов в будущем.
Что дальше?
В данный момент Tagsistant всё ещё развивается. В качестве возможного направления развития автор рассматривает автоматическую расстановку тегов. Цитаты из переписки:
Если захочешь углубиться, в транке SVN есть версия 0.7, которая использует libextractor для получения метаданных из файлов и наконец-то имеет настоящий, рабочий стек плагинов для автоматических меток.
Вот небольшая дискуссия об автоматических тегах на форуме:
www.tagsistant.net/kunena/wish-list/29-machine-tags
If you want to go a bit further, in the SVN trunk you'll find the 0.7 release which uses libextractor to fetch metadata from files and finally implements a real, working stack of autotagging plugins.
Some discussion has started on the forum about machine tags, also known as faceted tags:
www.tagsistant.net/kunena/wish-list/29-machine-tags
Из второго письма:
Пока что, в 0.7 плагины автомаркировки создают теги вида «ключ: значение».
Например, JPEG-изображение может быть помечено как year:2010 и exposure:1_30.
Это засоряет директорию с тегами.С машинными тегами у тебя будет пространство имён EXIF:/ с предиктатами
вроде year/ и apertrue/, а уже внутри них значения 2010/ и 1_30/ соответственно.
Директория тегов будет содержать только EXIF:/ кроме обычных тегов.
Гораздо чище и удобнее!
So far in 0.7, autotagging plugins create tags like «key:value/». For example
a JPEG image could be tagged as year:2010/ and exposure:1_30/.
This is ending in a clogged-up tags/ folder.With machine tags you would have an EXIF:/ name space with predicate
tags like year/ and aperture/ and only inside year/ the value
2010/, and only inside aperture/ the value 1_30/.The tags/ folder would contain just EXIF:/ beside your usual flat
tags. Much much cleaner and usable!
Автор: ivan_kolmycheck