Я снова решила переделать свой подход к публикации заметок на сайте.
Как я уже упоминала, я пишу свои посты в Obsidian и публикую их с помощью плагина. Но раньше я держала свои заметки для публикации в одном хранилище с моими личными заметками. Поначалу мне это казалось удобным, потому что можно написать заметку и при желании её тут же опубликовать. Но чем дальше, тем больше меня раздражали некоторые проблемы с таким подходом:
На самом деле я никогда не публикую обычные заметки из своего хранилища. Большая часть моих записей для себя не подходят для публикации, и если я хочу поделиться какой-то информацией на сайте, то всё равно пишу новый пост с нуля, заметки используются только как референсный материал.
Мне не нравится, что опубликованные заметки путаются с личными заметками, хотя я и стараюсь их разделить, всё равно есть ощущение беспорядка в хранилище.
Все опубликованные заметки остаются в хранилище, чтобы посты можно было в будущем отредактировать. Из-за этого у меня возникает нежелание лишний раз писать что-то на сайт, чтобы не захламлять хранилище. В особенности это касается записей, которые описывают текущее положение дел и могут утратить актуальность со временем (как, например, этот пост).
Я всё время боюсь изменить что-то в хранилище, потому что это может случайно повлиять на отображение заметок на сайте.
Кроме того я боюсь нечаянно опубликовать что-нибудь не то.
По всем этим причинам я решила создать отдельное хранилище для заметок, предназначенных для публикации. Это может создать определённые неудобства из-за необходимости переключаться между хранилищами, но в целом сделает процесс чище и понятнее.
Кроме того, я полагаю, в таком формате мне будет комфортнее писать посты с текущими новостями, подобные этому, и в целом я буду чувствовать себя свободнее публиковать больше постов.
Я использую Обсидиан уже два года, и постоянно пробую в нём что-то новое. В этом посте буду собирать список рандомных заметок о том, что для меня работает, а что нет, и других кратких наблюдений по опыту использования.
Читать дальше...
Дашборды красивые, я сделала несколько очень крутых дашбордов, и с датавью, и попроще, но в итоге я их практически никогда не использую.
Для навигации чаще всего использую поиск по названию и алиасам. Можно делать это с помощью Quick Switcher-а но я чаще использую поисковую строку в плагине Home tab.
Typing transformer использую постоянно, один из самых полезных плагинов, о которых никто не говорит.
Ежедневные заметки использую постоянно в качестве инбокса. Позволяют не думать, куда записать мысль.
В ежедневных заметках нет никакой структуры, пишу всё подряд в виде списка. Когда пробовала делать структуру, поняла, что не использую её.
Одно время пыталась вести задачи в Обсидиане. Даже выстроила неплохую систему, но потом поняла, что пытаюсь в этой системе эмулировать всё то, что уже есть в специальных приложениях для задач из коробки, только в них оно работает проще и лучше. Плюнула и перенесла задачи в Ticktick.
Держу в Обсидиане списки задач по проектам без срока исполнения или формата «может быть когда-нибудь». Всё, что с датой, идёт в TickTick.
Коллекции книг, фильмов и т.п., с табличками с всем таким, красивые, но довольно бесполезные. Но красивые.
Пробовала обойтись без папок, не понравилось. Но папок должно быть немного, и деление по папкам не по темам, а по типам или сферам использования.
Пробовала несколько существующих плагинов для отслеживания писательского прогресса. Ни один не понравился. Пишу свой плагин.
Навострилась писать скрипты для dataviewjs, фигачу их везде. Обычный dataview уже не помню, как использовать.
Настройка css — бесконечный процесс, приводящий к прокрастинации. Написала свою тему, но всё равно есть ещё куча сниппетов, которые постоянно допиливаю.
Много раз пыталась встроить в свою систему тэги, но ничего не получается. Предпочитаю свойства и ссылки.
Поиск по тексту не очень удобный, поэтому стараюсь так выстраивать систему, чтобы приходилось его использовать по минимуму.
Пробовала использовать несколько хранилищ. Для постоянного использования не очень удобно. В любой момент может возникнуть необходимость сделать рандомную заметку, и непонятно, в какое хранилище её добавлять. Не хочу забыть, где что лежит. Плюс неудобно переключаться между хранилищами на телефоне.
Пришла к системе трёх хранилищ:
Основное (все актуальные заметки)
Архивное (все заметки, которые уже неактуальны, но удалять жалко)
Тестовое (чтобы пробовать новые плагины, системы и т.п.)
Написала скрипт для автоматического переноса заметки из основного хранилища в архивное по команде.
Выяснила, что Обсидиан хорошо работает с большим количеством заметок, если нет плагинов. Наличие плагинов (особенно датавью) здорово замедляет большие хранилища. Особенно заметно на телефоне. Поэтому стараюсь ограничивать количество заметок в основном хранилище, а всё отработанное переносить в архив.
Работа Обсидиана на телефоне очень зависит от количества памяти. Я купила новый телефон с большой оперативкой, и теперь Обсидиан летает.
В приложении Obsidiian есть встроенный сервис Publish, который позволяет создать свой сайт и публиковать заметки в интернете в один клик. Но у него есть как плюсы, так и минусы.
Читать дальше...
Плюсы:
минимум настроек, всё работает из коробки;
поддерживается весь основной функционал Обсидиана.
Минусы:
он платный (и довольно дорогой);
ограниченные возможности настройки сайта.
К счастью, есть бесплатные альтернативы, которые, вдобавок, дают гораздо больше контроля над внешним видом и функционалом сайта. Минусом этих альтернатив можно считать то, что придётся изрядно повозиться с настройкой.
Этот мой сайт сделан совершенно бесплатно (я только заплатила сто рублей за домен, но даже это было необязательно). Он хостится на Github Pages и создан при помощи генератора статических сайтов Hugo. Но главное — новые страницы публикуются напрямую из Обсидиана, одной командой. В этой статье я расскажу, как можно сделать подобный сайт самостоятельно.
Общая информация
Генерация сайта происходит в два этапа. Во-первых, нужно отправить заметку из Обсидиана в репозиторий на гитхабе. Во-вторых, добавленные Markdown-файлы нужно преобразовать в Html-страницы и собрать из них сайт. Для первого этапа нам понадобится установить плагин для Обсидиана Github Publisher. За второй будет отвечать специальный шаблон, который мы разместим в репозитории. Шаблон будет применяться автоматически каждый раз при добавлении нового файла.
Начать настройку сайта лучше всего с выбора шаблона. Шаблон — это набор правил, по которым кучка маркдаун-файлов преобразуется в сайт. Он определяет внешний вид и функционал сайта: расположение элементов, меню и иконки, стили, скрипты и т. п., а также правила, по которым синтаксис Markdown преобразуется в Html. В интернете можно найти огромное количество шаблонов для статических сайтов, но не все они поддерживают специфический синтаксис Обсидиана, поэтому лучше всего выбирать шаблон, специально заточенный под Обсидиан. Популярным вариантом является Quartz. Ещё можно попробовать Mkdocs или Amethyst. Мой сайт сделан на основе шаблона Amethyst, но его я не рекомендую, потому что он сильно устаревший, и мне пришлось его очень здорово переписать под себя. Может быть, когда-нибудь я напишу и опубликую документацию к собственному шаблону (пока что он сыроват).
В целом любые шаблоны устанавливаются и работают примерно одинаково, но могут иметь небольшие отличия в настройках, поэтому придётся читать документацию к конкретному выбранному шаблону. Я опишу установку на примере шаблона Quartz, хотя сама его не использую, но он наиболее актуальный из доступных.
Создание и настройка сайта на базе Quartz
Установка шаблона на Github Pages
Вот самый простой способ быстро создать сайт на базе Quartz:
Зарегистрироваться на Github (если ещё нет аккаунта).
Открыть репозиторий шаблона и нажать кнопку «Use this template». Создать новый публичный репозиторий.
Перейти на страницу Settings —> Pages и выбрать Source —> Github Actions.
Перейти на страницу Settings —> Environments — удалить все.
В папке content создать файл index.md. Он обязательно должен содержать фронтмэттер со свойством title, содержащим заголовок для главной страницы.
Снова перейти на страницу Settings —> Pages. Там появится ссылка на ваш новый сайт.
Настройка сайта
Теперь для настройки сайта необходимо отредактировать файл quartz.config.ts. В нём нужно изменить следующие свойства:
pageTitle — указать своё название сайта;
locale — поменять на "ru-RU";
baseUrl — здесь нужно указать свой адрес сайта (без "https://");
theme — здесь можно заменить шрифты и цвета на какие вам хочется.
Дополнительно можно поменять внешний вид сайта:
отредактировав файл quartz.layout.ts— можно поменять расположение элементов на сайте;
отредактировав scss-файлы в папке quartz/styles.
Больше о настройках можно узнать в документации Quartz
Для добавления новых страниц на сайт Markdown-файлы должны добавляться в папку content. При этом каждый Markdown-файл должен как минимум содержать свойство title. Далее мы настроим, чтобы эти файлы туда добавлялись автоматически из Обсидиана.
Локальная копия сайта
Редактировать файлы сайта можно прямо на гитхабе (что не очень удобно и медленно, но зато не нужно ничего скачивать и устанавливать). Либо можно скопировать их на свой компьютер с помощью Git и редактировать локально.
Чтобы запустить локальную копию сайта для отладки:
Установите Node (после установки требуется перезагрузить компьютер).
В своём репозитории скопируйте адрес для клонирования (Code —> HTTPS —> копировать)
Откройте терминал и введите команду:
git clone <скопированный адрес>
После этого все файлы с гитхаба скопируются в папку с названием репозитория на вашем компьютере, где их можно будет удобно редактировать. Когда всё скопируется, введите команды:
cd <название скопированной папки>npx quartz build --serve
Эта команда запускает сайт на локальном сервере. В браузере откройте адрес http://localhost:8080/. Это локальная версия сайта, где будут сразу отображаться все изменения, которые вы сделаете в скопированных файлах.
После того, как настройка закончена, можно отправить отредактированные файлы обратно на гитхаб с помощью команд:
git add --agit commit -m "My cool new changes"git push origin main
Собственный домен
По умолчанию адрес сайта на Github Pages отображается в формате <имя аккаунта>.github.io/<название репозитория>, но если вы хотите адрес покрасивее, то можно купить и настроить свой собственный домен. Как это сделать, я рассказывать не буду, потому что нашла очень доступную и внятную статью об этом.
Настройка Gihub Publisher
Теперь, когда сайт готов, нужно добавить возможность публиковать новые страницы напрямую из Обсидиана. Для этого нужно будет настроить в Обсидиане плагин Gihub Publisher.
Установливаем плагин
На гитхабе переходим на страницу Settings — Developer settings — Personal access tokens — Fine-grained tokens — Generate new token. Придумываем название токена, указываем продолжительность действия и репозитории, к которым он применяется (лучше указать только репозиторий сайта). Затем указываем разрешения для репозитория. Их очень много, и они непонятные, поэтому лично я просто выставляю максимальные разрешения на всё. После генерации токен обязательно нужно где-то сохранить, потому что второй раз вам его не покажут.
Открываем настройки Github Publisher и указываем следующие данные:
Вкладка Github config:
Имя своего аккаунта на гитхабе.
Название репозитория.
Токен.
Вкладка File paths:
Default folder — content.
Root folder — content.
Вкладка Content:
Internals links — да.
Convert internal links pointing to unpublished notes — да.
Wikilinks to MDlinks — нет.
Attachment & embeds:
Send linked files — нет.
Transfer attachments — да.
Остальные настройки указываются по желанию. Дополнительно о возможностях плагина можно почитать в документации.
Публикация заметок
Теперь можно публиковать заметки. Нужно создать заметку и добавить к ней свойство share: true, а также свойство title для заголовка. Можно добавить и другие свойства (в соответствии с настройками плагина и встроенными свойствами, указанными в документации Quartz), но эти обязательные. После этого в палитре команд вызываем команду Upload single current active note.
Если всё настроено правильно, то появится сообщение, что заметка опубликована. Для проверки можно зайти в репозиторий и убедиться, что заметка добавилась в папку content. Обычно после этого нужно с полминуты подождать прежде чем страница отобразится на сайте.
Если заметка добавилась на гитхаб, но на сайте не появляется, можно открыть в репозитории вкладку Actions и посмотреть, какие процессы там происходят. Если последний процесс отображается с красным крестиком, значит, при генерации сайта произошла ошибка, и там можно прочитать, что именно пошло не так.
Заключение
Надеюсь, это будет кому-нибудь полезно! Я сама не использую Quartz, потому что узнала о нём только после того, как практически написала собственный шаблон на Hugo, но я его тестировала, и он выглядит очень неплохо. Вдобавок, по тому же принципу можно настроить любой другой шаблон, будь то Hugo, Jekyll и так далее. Я перепробовала несколько разных вариантов, и, когда усвоишь общую идею, разница невелика.
Я сама не очень-то программист, и мне пришлось местами поломать голову, разбираясь во всех нюансах настройки, несмотря на наличие документации. Поэтому я постаралась расписать весь процесс максимально подробно, но при этом не вдаваясь в лишние дебри, чтобы инструкция была понятна даже людям, не слишком разбирающимся в гитхабе и прочих технологиях.
Иногда код dataviewjs получается слишком большим, или один и тот же кусок кода нужно использовать несколько раз в разных местах. Поэтому хочется не писать его весь в заметке, а часть кода вынести в отдельный модуль. Теоретически это можно сделать при помощи стандартного метода require, но проблема в том, что он не работает на мобильном.
Читать дальше...
Раньше я использовала для этого плагин CustomJS, но теперь выяснила, как можно обойтись стандартным функционалом Dataview.
Для этого используется функция dv.view().
Сначала создаём файл с расширением .js, например, my_сode.js, и кладём его в любое место в своём хранилище Обсидиана. Для примера положим его в папку scripts. Пишем в нём весь код, который хотим переиспользовать. Например, напишем там следующий код:
dv.paragraph("Hello world!")
Затем в заметке в блоке dataviewjs пишем:
await dv.view("scripts/my_code")
При этом весь код, содержащийся в файле my_code.js автоматически исполняется и рендерится. Но что если мы не хотим ничего сразу рендерить, а хотим вернуть какие-то функции или переменные, которые можно использовать позже? Это можно сделать следующим образом.
Подобным же образом можно переиспользовать любые функции или переменные.
Замечание: При таком способе все функции и переменные присваиваются глобальному объекту window, что не очень безопасно, потому что можно случайно перезаписать какие-то существующие свойства или методы. Кажется, что безопаснее было бы использовать промежуточный объект.
У объекта myObject должно быть уникальное имя, не совпадающее ни с одним из свойств объекта window, но с одним объектом это легче проконтролировать, чем со множеством функций и переменных, которые мы можем использовать.
Можно также использовать класс вместо объекта. В файле my_code.js пишем:
this.myClass = class myClass { myFunc() { dv.paragraph("Hello world!") }}
И в заметке в блоке dataviewjs пишем:
await dv.view("scripts/my_code")const newClass = new myClassnewClass.myFunc()
Плагин для Обсидиана QuickAdd позволяет автоматически создавать заметки, но ещё его можно использовать в качестве запускалки скриптов.
Читать дальше...
Javascript
Создать файл в формате js и сохранить его в любом месте хранилища.
В файле написать код:
module.exports = async (params) => { /Мой код. В нём можно использовать API Обсидиана и самого плагина./}
В настройках QuickAdd создать макрос и в настройках макроса выбрать созданный скрипт.
Не забыть отметить значок молнии рядом с названием макроса, чтобы активировалась команда. Потом эту команду можно подвязать на хоткей или добавить кнопочку с помощью плагина Commander.
Другие языки и прочие файлы
QuickAdd не может сам исполнять код на других языках, но может открывать файлы в программе по умолчанию, что позволяет нам запускать, например, shell-скрипты или любые другие файлы, для которых у нас установлена соответствующая программа.
Нужно добавить файл, который мы хотим запустить, в хранилище. Например, это может быть bash-файл, который коммитит и пушит заметки на гитхаб.
Создать js-скрипт и макрос по инструкции выше.
В js-файле написать код:
module.exports = async (params) => { let scriptPath = "\\scripts\\myFile.sh" /Здесь вместо моего примера надо указать путь к файлу, который мы хотим запустить. Путь указывается относительно хранилища. Обязательно надо эскейпить обратные слэши/ let cmd = this.app.vault.adapter.basePath + scriptPath const { promisify } = require('util'); const exec = promisify(require('child_process').exec); await exec(cmd);}
Этот скрипт запускает файлы на Windows. В других системах код может отличаться, в частности, путь будет записываться прямыми слэшами, но может, есть и другие нюансы, не знаю. Поскольку мы не прописываем напрямую путь к хранилищу, а находим его с помощью кода, этот скрипт может работать на разных устройствах.
Запрашивать подтверждение перед выполнением скрипта
Это может быть полезно, если скрипт делает что-то опасное, или если мы используем автоматизированный запуск скрипта, но иногда хотим от него отказаться. Например, у меня настроен скрипт, который делает пул с гитхаба каждый раз при запуске программы, но иногда я закрываю и открываю Обсидиан несколько раз в течение рабочего дня и не вижу смысла каждый раз пулить.
module.exports = async (params) => { const { quickAddApi: { yesNoPrompt } } = params; const runScript = await yesNoPrompt("Выполнить скрипт?"); if (runScript) { /Здесь пишем код, который будет выполняться при подтверждении/ }}
Вызывать системные команды Обсидиана изнутри скрипта
Вообще-то QuickAdd может сам вызывать команды через макрос, безо всяких скриптов. Но иногда нам может понадобиться обернуть команду в какой-то код, и для этого нам поможет такой скрипт:
module.exports = async (params) => { /Какой-то код/ await app.commands.executeCommandById(id) /где id — это id конкретной команды/ /Какой-то код/}
Чтобы узнать id команды, можно открыть консоль и написать код:
console.log(app.commands.commands)
Это выведет список всех доступных на данный момент команд, включая команды из установленных плагинов, где указаны их названия и id.
Пример — скрипты для обновления вкладок
В качестве бонуса — парочка маленьких полезных скриптов, который могут пригодиться.
Обновление вкладок может быть полезно при использовании некоторых плагинов, например Dataview и Supercharged Links, потому что они не всегда обновляют вид в реальном времени.