Картотека художников в Obsidian

16 января 2023

Я довольно давно начал практику формирования картотеки произведений искусства и их авторов (см, например Формирование базы знаний по проектам ).  Настоящая статья рассказывает о том, как создать картотеку зацепивших работ в 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        ```

```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, который, как обещают, будет еще быстрее и еще удобнее.