Tagsistant: тег-ориентированная файловая система

в 17:51, , рубрики: fuse, linux, nix, tag, будущее здесь, метки: , , ,

Логотип
Здравствуйте, уважаемые читатели!

Я хотел бы рассказать про такой интересный проект, как 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 

Получилось вот так (Скриншот):

image

Под капотом

На самом деле, каждый смонтированный экземпляр имеет бэкэнд — репозиторий. Объекты хранятся в директории «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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js