+++ title = "Obsidian" description = "" date = 2024-11-17T22:30:37+03:00 categories = [ "Без рубрики" ] tags = ['it', 'joplin', 'obsidian'] location = "Казань" +++ Некоторое время назад я [писал](/posts/2024-07-13-joplin/) про заметочник Joplin. С тех пор мои вкусы несколько поменялись и я открыл для себя его величество [Obsidian](https://obsidian.md/). ![Obsidian logo](/posts/2024-11-17-obsidian/logo.png) В целом он такой же заметочник, с ± тем же функционалом, но имеет для меня одну особенность, которая буквально переворачивает всё. Это мощнейшая система плагинов. Серьёзно, я нашел плагины которые покрывают для меня всё, кроме одного (но об этом позже). ## Что такое Obisidian? Obsidian представляет собой приложение для ведения персональных баз данных, основанное на принципах локальных файлов Markdown. Это значит, что ваши данные хранятся в виде обычных текстовых файлов, что обеспечивает максимальную гибкость и независимость от облачных сервисов. Приложение работает на операционных системах: Windows, macOS, Linux, iOS, Android. ## Основные функции и преимущества 1. **Граф связей** — да, он есть уже много где, но нельзя его не упомянуть. 2. **Markdown** — очень приятно, что все заметки хранятся в Markdown, что обеспечивает максимальную интероперабельность и переносимость 3. **Плагины** — плагины пишутся на JS/TS и их много. Даже не так, их **МНОГО**. Что приятно, они скачиваются и лежат в той же директории что и основное хранилище, а это важно для следующего пункта 4. **Синхронизация** — она есть. Но вроде как платная. Но мне это и не интересно, я использую Syncthing. Просто шарю через него директорию хранилища по схеме оба ноутбука <-> NAS <-> Android. При этом синкаются все плагины и настройки. 5. **Скорость** — не смотря на то, что он написан на проклятом электроне, работает достаточно шустро, претензий нет. 6. **Доска для рисования** — мелочь, конечно, но удобно, когда надо на скорую руку накидать небольшую схемку. В конце этого поста как раз есть пример такой схемки. ## Минусы 1. **Проприетарность** — Obsidian хоть и в целом бесплатный, но он не свободный и даже не opensource. Да, это серьёзный минус, но он компенсируется тем, что хотябы вся база данных не в проприетарном формате. И в случае чего можно будет с наименьшими проблемами свалить куда-нибудь. 2. **Electron** — ну это скорей мой личный пунктик. Но при этом приходиться смиряться с электроном что на Obsidian что на VSCode (VSCodium, конечно же), потому что лучше-то и нет. Это только то, что сейчас пришло в голову. ## А теперь самое вкусное Не помню, я упоминал что у него много плагинов? :) Так вот, поехали, мои самые любимые: ### Dataview https://blacksmithgu.github.io/obsidian-dataview/ Ну это просто must-have плагин, который позволяет обращаться с вашими заметками именно как с базой данных, не меньше. Например, можно создать новый документ, написать в него ``` ```dataview TASK WHERE status = " " ``` ``` и волшебным образом вместо этого блока появятся все невыполненные задачи, а вот так ``` ```dataview TASK WHERE status = "x" ``` ``` мы получим все выполненные. Язык запросов [очень мощный](https://blacksmithgu.github.io/obsidian-dataview/queries/structure/), в нём сто́ит разобраться. Ещё есть возможность делать однострочные запросы, например, в домашней заметке (которая у меня открывается по умолчанию) у меня есть ссылка на именно сегодняшнюю заметку ежедневного журнала. Сделано вот так: ``` `=link(dateformat(date(today), "yyyy.MM.dd"))` ``` ### Templater https://silentvoid13.github.io/Templater/ Этот плагин позволяет мне задать некоторым директориям умолчальный шаблон. Например, вот такой у меня шаблон для ежедневных журналов: ``` <%* try { // Получаем имя текущей ежедневной заметки const noteName = tp.file.title; // Разбиваем полученное имя на компоненты даты const [year, month, day] = noteName.split('.').map(Number); // Создаём объект Date на основе поученных компонентов const currentNoteDate = new Date(year, month - 1, day); // Вычисляем предыдущий и следующий день let previousDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() - 1)); let nextDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() + 2)); // Форматируем дату обратно в "DD-MM-YYYY" const formatDate = (date) => { const dd = String(date.getDate()).padStart(2, '0'); const mm = String(date.getMonth() + 1).padStart(2, '0'); const yyyy = date.getFullYear(); return `${yyyy}.${mm}.${dd}`; }; const previousDay = formatDate(previousDayDate); const nextDay = formatDate(nextDayDate); // Формируем ссылки const baseFolder = tp.file.folder(true); const previousNotePath = `${baseFolder}/${previousDay}.md`; const nextNotePath = `${baseFolder}/${nextDay}.md`; // Выводим даты в виде ссылок tR += `← [[${previousNotePath}|${previousDay}]] | [[${nextNotePath}|${nextDay}]] →`; } catch (error) { console.error("Templater Error:", error); } %> ## Задачи ___ <% `- [ ]` %> ## Заметки ___ ``` и переходя к сегодняшней заметке я сразу получаю такую заготовку: ![Заметка из шаблона](/posts/2024-11-17-obsidian/templater.png "Заметка из шаблона") ### Остальные плагины Остальные тоже крутые, но я их приведу просто списком: - [tasks](https://publish.obsidian.md/tasks/Introduction) — помогает более богато управлять задачами. В частности, у меня проставляет дату завершения задачи, и проставляет даты дедлайна и прочее. - [reminder](https://uphy.github.io/obsidian-reminder/) — трекает и напоминает про задачи - [calendar](https://github.com/liamcain/obsidian-calendar-plugin) — просто миникалендарь в боковой панели - [homepage](https://github.com/mirnovov/obsidian-homepage) — позволяет задать произвольную заметку "домашней" - [icon-folder](https://github.com/timolins/obsidian-icon-folder) — позволяет задавать директориям и заметкам произвольные иконки. Пример есть как раз на скриншоте выше. - [pomodoro-timer](https://github.com/eatgrass/obsidian-pomodoro-timer) — думаю, из названия и так понятно - [kanban](https://publish.obsidian.md/kanban/) — шикарнейший канбан плагин ### А что же мне не хватает? Я упомянул выше что мне кое чего не хватает. А именно, постить заметку в мой блог по протоколу [Micropub](https://indieweb.org/Micropub). Только из-за Obsidian и того, что он использует Markdown я опять [вернулся на Hugo](/posts/2024-11-15-hugo/), который так же рендерится из Markdown. «Но Hugo это же генератор статичных сайтов, куда ты ему будешь отправлять заметку для публикации?» — можешь спросить меня ты. А я отвечу что у меня вот такой план: ```mermaid graph TB b1["Заметка в Obsidian"] b2["Плагин obsidian-micropub"] b3["micropub сервер на моем сервере"] b4["вызов hugo"] b5["Загрузка или копирование результата на веб сервер"] b1 --> |Publish в контекстном меню| b2 b2 --> |POST neonxp.ru/micropub| b3 b3 --> |Запись в директорию content блога| b4 b4 --> |hugo рендерит markdown -> html| b5 style b1 fill:#28252e, stroke:#754fcc style b2 fill:#2e2121, stroke:#c81319 style b3 fill:#2e2121, stroke:#c81319 style b4 fill:#222c2c, stroke:#20acaa style b5 fill:#222c2c, stroke:#20acaa ``` То что выделено красным — ещё не существует в природе. micropub сервер для hugo я уже начал писать. Да, есть nanopub сервер, но у него есть два серьёзных недостатка, это PHP и то что его сделал не я. micropub плагин для obsidian я вижу сделать на основе существующего плагина rest-publish. Ну или как пойдёт. В общем, меня ждёт ещё очень много весёлого дрочева с этим всем. ## Закругляюсь Пожалуй, пока на этом всё. Поделился как радостью использования Obsidian, так и планами на пет-проекты, что ещё надо-то? Если что, пишите комментарии. Лучше всего здесь, но можно и во всяких телеграмах-вкшках.