+++
title = "Obsidian"
description = ""
date = 2024-11-17T22:30:37+03:00
categories = [ "Без рубрики" ]
tags = ['it', 'joplin', 'obsidian']
location = "Казань"
image = "logo.webp"
+++
Некоторое время назад я [писал](/posts/2024-07-13-joplin/) про заметочник
Joplin.
С тех пор мои вкусы несколько поменялись и я открыл для себя его величество
[Obsidian](https://obsidian.md/).
В целом он такой же заметочник, с ± тем же функционалом, но имеет для меня одну
особенность, которая буквально переворачивает всё. Это мощнейшая система
плагинов. Серьёзно, я нашел плагины которые покрывают для меня всё, кроме одного
(но об этом позже).
# Что такое Obisidian?
Obsidian представляет собой приложение для ведения персональных баз данных,
основанное на принципах локальных файлов Markdown. Это значит, что ваши данные
хранятся в виде обычных текстовых файлов, что обеспечивает максимальную гибкость
и независимость от облачных сервисов.
Приложение работает на операционных системах: Windows, macOS, Linux, iOS,
Android.
<!--more-->
# Основные функции и преимущества
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"
```
```
мы получим все выполненные.
Язык запросов очень мощный[^1], в нём сто́ит разобраться.
[^1]: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.webp "Заметка из шаблона")
## Остальные плагины
Остальные тоже крутые, но я их приведу просто списком:
- [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, так и
планами на пет-проекты, что ещё надо-то?
Если что, пишите комментарии. Лучше всего здесь, но можно и во всяких
телеграмах-вкшках.