Картотека художников в Obsidian
Я довольно давно начал практику формирования картотеки произведений искусства и их авторов (см, например Формирование базы знаний по проектам ). Настоящая статья рассказывает о том, как создать картотеку зацепивших работ в Obsidian с помощью плагина DataView. Рассказа об установке плагина не будет - рассмотрим другие интересные вопросы.
NoSQL базы данных
Базы данных формируются на базе ИТ с момента создания компьютеров. Последнее время они в основном были представлены таблицами регулярной реляционной структуры, куда заносится четко определенная информация. Однако развитие и расширение применений компьютеров привело к формированию нового класса баз данных более свободной формы, названной NoSQL. Под этим термином скрывается много различных архитектур. На базе Obsidian реализована архитектура ключ -> значение. Строка внешнего вида "field: value" или "field:: какой-то текст" и есть один из конструктивных элементов такой базы. Все пары поле-значение записываются в текст заметки и заметка начинает представлять строку таблицы данных.
В заметке Obsidian с помощью плагина DataView могут быть сохранены пары двух типов. В самом верху заметки между двух строчек из "---" (три знака минус) может быть сохранена шапка (frontmatter), назначение которой состоит в сохранении метаинформации о заметке - пар "поле-значение". Примерами полей могут быть "name: Vasily Kandinsky" или "year: 1565". Все это текстовые поля и только текстовые поля.
Кроме шапки поля могут располагаться и по всему тексту заметки после второй строки с "---". В этом случае поля должны иметь чуточку необычный вид "field::" c двумя двоеточиями. Стоит отметить, что хорошая практика формирования имен полей состоит в использовании латинских букв и первая буква маленькая. А вот если поле состоит как бы из двух и более слов - первая буква второго слова может быть большой, например "famousWork::". Такая схема наименования получила название "верблюд" (camel) по аналогии с верблюдом у которого из спины торчит один или два горба.
Поля в теле заметки могут в первую очередь эффективно использоваться для связей. Текст `image:![[IMG-1575.jpg]]` позволяет вставить в текст заметки и показать картинку в большом размере. Текст `[[Kandinsky Vasily.md|Василий Кандинский]]` позволяет вставить ссылку на заметку с именем художника и указать Имя и Фамилию художника на другом языке.
Схема данных в основе картотеки
В основе любой базы данных лежит ее схема - названия полей, типы информации и так далее. NoSQL база на основе Obsidian в этом плане не исключение.
Сначала о месте хранения и названии файлов. У меня в основном хранилище сделана папка "2 Base" в которой хранится персональная база знаний. Внутри этой папки сделаны вложенные папки Artists и Artworks для хранения заметок по художникам и фотографам, а также по произведениям искусства. Файлы заметок по художникам называются "Фамилия Имя.md" в латинской транскрипции. Файлы заметок по произведениям искусства начинаются с номера года, когда создано произведение и имеют вид "YYYY Краткое наименование на английском.md". Так получается меньше ошибок при обработке.
Также существуют два шаблона. Шаблон заметки о художнике:
```dataview
---
date: {{date:YYMMDD}}-{{time:HHmm}}
name: {{title}}
aliases:
tags: artist
life:
nationality:
style:
media:
---
# {{title}}
portrait::
famousWork::
web site:
# Bio
# Works ```
В шаблоне следует отметить следующие поля:
- name - показывает имя художника в прямой записи, например Vasily Kandinsky. Я вывожу это имя в таблицу художников.
- aliases - позволяет ввести другие написания имени художника - В.Кандинский, Василий Кандинский и так далее. Это поле нужно для простоты формирования ссылки на заметку в удобном виде.
- tags - позволяет указать необходимые теги. Это всегда artist для всех художников, artist photographer для всех фотографов. Сюда можно добавить и другие теги для удобства отбора.
- `# Bio` - раздел для биографии, если есть желание что-то записать.
- `# Works` - раздел для списка работ.
Шаблон заметки о произведении имеет более сложную структуру:
``` dataview
---
date: {{date:YYMMDD}}-{{time:HHmm}}
title: {{title}}
aliases:
tags: artwork
year: style:
media:
---
image::
название:: _{{title}}_
artist::
project::
representation::
concept::
values::
punctum::
link:
promotions::
# Description
```
В этом шаблоне имеет смысл отметить следующие поля:
- title - полное название работы на выбранном языке, будет выводиться в таблицу.
- aliases: - названия работы на других языках, например на русском и оригинальном, применяется для удобства представления ссылки.
- tags - artwork - обязательно, если это фотография - пишется artwork photography. Получается составной индекс - так как заметок с тэгом photography может быть много больше, чем заметок по конкретным работам.
- artist - ссылка на файл заметки о художнике или строка с его Фамилией и именем. Завожу карточку на художника и ставлю сюда ссылку в том случае, если в картотеке хранится информация о больше чем одной работе художника. -
- representation, concept, values, punctum - специальные поля для семантического анализа произведения - что изображено, что означает, какие ценности пропагандирует, чем меня зацепило.
- # Description` - раздел для пространного описания работы
Удобство NoSQL базы состоит в том, что информации может быть удобное количество. Можно выкинуть ненужные поля - чтобы они не занимали лишнее место. Пример файла с информацией о картине:
``` dataview
---
date: 230106-1501
aliases:
- Обнаженная спускающаяся по лестнице №2
- Nude Descending a Staircase
- Nu descendant un escalier n°2
tags: cubism artwork
title: Nude Descending a Staircase №2
year: 1912
style: Cubism
media: Painting
---
# Обнаженная, спускающаяся по лестнице
artist:: [[Duchamp Marcel]]
image::![[Pasted image 20230106150532.png]]
Oil on canvas. 57 7/8" x 35 1/8". Philadelphia Museum of Art.
```
Видно, что значительная часть полей удалена - но это никак не сказывается на работе картотеки.
Сбор информации из картотеки
После создания некоторого количества файлов заметок о произведениях и художниках можно начинать вынимать информацию из картотеки. Первый пример - посмотреть в заметке о художнике все работы этого художника. Здесь есть два пути: - можно в разделе `# Works` перечислить списком все заметки с работам данного автора, - можно в том же разделе `# works` написать запрос, который будет собирать информацию из картотеки динамически.
Второй вариант выглядит более симпатично за счет возможности использовать другую информацию из заметок о работах. Но его нельзя использовать при отсутствии установленного плагина dataview на мобильном устройстве или при просмотре из другой программы.
На копии экрана выше представлены оба варианта для примера файла с информацией о художнике Питере Брейгеле Старшем. У меня в картотеке пока сохранена информация о 4х его картинах. Для формирования такой таблички используется довольно простой код запроса:
``` dataview
TABLE
embed(link(image,"100")) as Image
FROM [[]] AND `#artwork`
SORT file.name ASC
```
Разберем его.
- Первая строчка запроса - три обратных апострофа и текст dataview - это начало запроса к dataview.
- Последняя строчка - три обратных апострофа. Все пространство между ними интерпретируется как код запроса и немедленно исполняется.
- Строка TABLE - указание на формирование таблицы, первым столбцом которой будет информация со ссылками - именами файлов, извлеченных запросом из картотеки. Вариант TABLE WITHOUT ID используется в случае, если нужно сформировать таблицу без такого первого столбца - например сделать этот столбец последним. Такой столбец хорош тем, что можно по клику мыши открыть нужный файл без дополнительных поисков в папке с файлами.
- Строка `embed(link(image,"100")) as Image` формирует еще один столбец в таблице. При этом для каждой заметки из поля `image::` вытаскиваются ссылки на картинки и ужимаются до размера 100 пикселей по ширине. Окончание строки `as Image` указывает наименование столбца в таблице. Если нужно больше столбцов - можно добавить через запятую еще строки, например `year as Year` добавит столбец с информацией о годе создания произведения.
- Строка `FROM [[]] AND #artwork` описывает источник заметок для сбора информации. Сочетание `[[]]` описывает подмножество всех заметок, которые ссылаются на текущую. Понятно, что на текущую заметку могут ссылаться как заметки с информацией по произведениям, так и просто заметки с упоминанием художника. Необходимо отфильтровать часть информации, оставив только заметки с тэгом `#artwork` что и делается сочетанием `AND #artwork`
- Строка `SORT file.name ASC` определяет порядок сортировки по имени каждого отобранного файла. Заметки с описанием более ранних произведений будут впереди.
Еще немного о внешнем виде. Я использую в Obsidian Minimal Theme. Первоначально она мне понравилась из-за лаконичного внешнего вида. Оказывается она содержит довольно много удобных настроек управления внешним видом. Симпатичное чередование обычных и слегка затененных строк получается путем добавления строки `cssClass: row-alt`.
Итак - Obsidian позволил в рамках одной заметки создать как форму для ввода информации по художнику с различным содержанием полей от заметки к заметке, так и запрос к картотеке для вытаскивания информации о всех работах данного художника, занесенных в картотеку.
Более сложные запросы
Minimal Theme для Obsidian содержит много удобных параметров настройки для получения симпатичных перечней содержимого. Один из таких режимов представления - карточки (cards). Таблицу, сформированную запросом dataview можно вывести в виде таблицы с заданным количеством столбцов, где в каждой ячейке будет выводиться картинка, и какая-то минимальная информация по извлеченной заметке - например ее имя и какое-то поле из нее.
В примере выше сформирована сетка из 4х столбцов с квадратными картинками, именем файла заметки, совпадающего с фамилией и именем художника, и его годами жизни. Имя файла заметки позволяет ее легко открыть в соседней закладке. Для ее получения необходимо в шапке указать строку `cssClass: cards, cards-cover, cards-1-1, table-max, cards-cols-4` и ввести текст запроса:
``` dataview
TABLE
life as Life,
famousWork as famousWork
FROM `#artist` AND `!#photographer`
SORT file.name ASC
```
Достойны комментария две строки этого запроса:
- `famousWork as famousWork` позволяет просто вывести картинку самой известной работы в ячейку без принудительного указания размера картинки в пикселях.
- `FROM #artist AND !#photographer` указывает что надо выбрать все заметки с тэгом artist и без тэга photographer - художников но не фотографов.
Еще один пример представляет результаты семантического анализа современных фотографических проектов. Для запуска этого запроса необходимо в шапке указать строку `cssClass: table-max, row-alt, table-wrap` и в параметрах настройки темы Minimal указать, что строки не обрезаются (truncate), а делается перенос по словам (wrap). Я также в параметрах указал максимальную ширину строки в 95% от ширины доступного пространства окна.
Текст запроса выглядит так: '
``` dataview
TABLE WITHOUT ID
embed(link(image,"110")) as Image,
artist as Artist,
title as Title,
concept as Concept,
representation as "Visual Representation",
values as Values,
file.link as Files
FROM #photography AND #artwork
SORT artist, file.link ASC
```
Здесь используется вариант запроса `TABLE WITHOUT ID` для переноса имени файла работы вправо. Самый левый столбец картинка с шириной 110 пикселей. Достойны комментария еще две строки:
- `FROM #photography and #artwork ` позволяет в качестве источника использовать заметки с тэгами artwork и photography одновременно. Если в дальнейшем у меня появятся заметки про фотографии без такого анализа - придется еще добавить тэг conceptual в шапку каждой заметки с анализом и в условие источника.
- `SORT artist, file.link ASC` позволяет отсортировать сначала по алфавиту по фамилии каждого художника (фотографа), а затем по названию (году производства) его проекта.
Ограничение возможностей Dataview
Из предыдущего рассказа могло сложиться впечатление безграничных возможностей плагина Dataview. Однако ограничение есть, и очень существенное. Плагин воспринимает только файлы с расширением `*.md`, и не понимает файлы с расширением `*.jpg` или `*.png`. Из него не сделаешь простое средство просмотра и каталогизации картинок, если только картинки не упакованы в файл заметки, внутри которого содержится ссылка на файл с картинкой. Но если написать простенькую программу генерации файла заметки по файлу картинки - но уже с такими файлами можно делать аналог дорогого Lightroom.
Второе ограничение - односторонняя связь между заметками и обзором их содержимого. Если необходимо поправить текст в каком то поле заметки - то надо открывать эту заметку и править исходный текст. Это может быть неудобно и плагин Database Folder (надстройка на DataView) позволяет редактировать таблицу непосредственно в самой таблице. Это существенно снижает порог вхождения в построение таблиц. Рассказывают, что автор плагина Dataviiew как раз работает над его следующей инкарнацией - плагином Datacore, который, как обещают, будет еще быстрее и еще удобнее.