diff options
Diffstat (limited to 'content/posts')
39 files changed, 448 insertions, 48 deletions
diff --git a/content/posts/2021-02-13-jsonnet/index.md b/content/posts/2021-02-13-jsonnet/index.md index d5b51a6..1a5c02c 100644 --- a/content/posts/2021-02-13-jsonnet/index.md +++ b/content/posts/2021-02-13-jsonnet/index.md @@ -3,10 +3,10 @@ title: Jsonnet date: "2021-02-13T22:08:19Z" tags: - go - - it - разное categories: - - Без рубрики + - IT + - Golang --- Редко такое бывает, что случайно натыкаешься на какую-то технологию и она diff --git a/content/posts/2021-05-13-цифровая-гигиена/index.md b/content/posts/2021-05-13-цифровая-гигиена/index.md index 29dfe7c..844d31a 100644 --- a/content/posts/2021-05-13-цифровая-гигиена/index.md +++ b/content/posts/2021-05-13-цифровая-гигиена/index.md @@ -2,9 +2,8 @@ title: Немного о цифровой гигиене date: "2021-05-13T15:37:01Z" categories: - - Без рубрики + - Размышления tags: - - it - паранойя - разное --- diff --git a/content/posts/2022-05-30-возрождение/index.md b/content/posts/2022-05-30-возрождение/index.md index ad0b936..70f3a12 100644 --- a/content/posts/2022-05-30-возрождение/index.md +++ b/content/posts/2022-05-30-возрождение/index.md @@ -2,7 +2,7 @@ title: Возрождение? date: "2022-05-30T23:37:00Z" categories: - - Без рубрики + - Без категории tags: - блог - моё diff --git a/content/posts/2022-05-31-golang-1/index.md b/content/posts/2022-05-31-golang-1/index.md index f1e464f..d4049e5 100644 --- a/content/posts/2022-05-31-golang-1/index.md +++ b/content/posts/2022-05-31-golang-1/index.md @@ -2,10 +2,9 @@ title: Golang подборка 1 date: "2022-05-31T01:00:00Z" categories: - - Без рубрики + - Golang tags: - - go - - it + - Go --- Просто собираю подборку интересных ссылок по гошке на почитать потом. diff --git a/content/posts/2023-01-12-gitrepo/index.md b/content/posts/2023-01-12-gitrepo/index.md index b483e09..90290e3 100644 --- a/content/posts/2023-01-12-gitrepo/index.md +++ b/content/posts/2023-01-12-gitrepo/index.md @@ -2,9 +2,9 @@ title: GitRepo.ru date: "2023-01-12T20:22:00Z" categories: + - IT - Мои проекты tags: - - it - моё --- diff --git a/content/posts/2023-05-26-gist/index.md b/content/posts/2023-05-26-gist/index.md index 4e36c69..5e81d26 100644 --- a/content/posts/2023-05-26-gist/index.md +++ b/content/posts/2023-05-26-gist/index.md @@ -2,9 +2,8 @@ title: Импортозамещение Gist date: "2023-05-26T17:40:21Z" categories: - - Мои проекты + - IT tags: - - it - моё --- diff --git a/content/posts/2023-07-24-tls/index.md b/content/posts/2023-07-24-tls/index.md index 7fe4890..83f0a2a 100644 --- a/content/posts/2023-07-24-tls/index.md +++ b/content/posts/2023-07-24-tls/index.md @@ -2,9 +2,8 @@ title: Немного мыслей о TLS (HTTPS) в России date: "2023-07-24T20:04:17Z" categories: - - Без рубрики + - IT tags: - - it - Россия - TLS --- diff --git a/content/posts/2023-12-29-переезд/index.md b/content/posts/2023-12-29-переезд/index.md index 419a19f..ab40436 100644 --- a/content/posts/2023-12-29-переезд/index.md +++ b/content/posts/2023-12-29-переезд/index.md @@ -2,7 +2,7 @@ title: Переезд и проблемы обновления date: "2023-12-29T00:15:44Z" categories: - - Без рубрики + - Без категории tags: - блог - разное diff --git a/content/posts/2024-01-03-архив/index.md b/content/posts/2024-01-03-архив/index.md index 0e5c99e..658b3ca 100644 --- a/content/posts/2024-01-03-архив/index.md +++ b/content/posts/2024-01-03-архив/index.md @@ -2,7 +2,7 @@ title: Архив date: "2024-01-03T17:28:40Z" categories: - - Без рубрики + - Жизнь tags: - блог draft: true @@ -12,4 +12,4 @@ draft: true блогов. В основном, кринжовые, конечно, но это моя жизнь, как она была в то время. Так что пусть будут. -[Архив блога](https://neonxp.ru/archive/) +[Архив блога](https://neonxp.ru/pages/archive/) diff --git a/content/posts/2024-02-21-tls/index.md b/content/posts/2024-02-21-tls/index.md index 31e55fc..b8f7886 100644 --- a/content/posts/2024-02-21-tls/index.md +++ b/content/posts/2024-02-21-tls/index.md @@ -2,9 +2,8 @@ title: Конфигурация HTTPS с сертификатом от Минцифры date: "2024-02-21T21:51:29Z" categories: - - Без рубрики + - IT tags: - - it - Россия - TLS --- diff --git a/content/posts/2024-06-01-вам-не-нужны-пуши/index.md b/content/posts/2024-06-01-вам-не-нужны-пуши/index.md index 14e5a3c..6f2718e 100644 --- a/content/posts/2024-06-01-вам-не-нужны-пуши/index.md +++ b/content/posts/2024-06-01-вам-не-нужны-пуши/index.md @@ -2,10 +2,10 @@ title: Вам не нужны пуши! date: "2024-06-01T21:05:55Z" categories: - - Без рубрики + - Жизнь tags: - - it - - разное + - IT + - Разное --- Я не шучу. Серьёзно. diff --git a/content/posts/2024-07-13-joplin/index.md b/content/posts/2024-07-13-joplin/index.md index 62e9e4f..3cc1882 100644 --- a/content/posts/2024-07-13-joplin/index.md +++ b/content/posts/2024-07-13-joplin/index.md @@ -2,10 +2,9 @@ title: Заметочник Joplin date: "2024-07-13T20:49:12Z" categories: - - Без рубрики + - IT tags: - - it - - joplin + - Joplin --- Просто хочу поделиться отличным приложением для заметок, вместо популярного diff --git a/content/posts/2024-09-26-hugo-wordpress/index.md b/content/posts/2024-09-26-hugo-wordpress/index.md index 0fcef25..bb497da 100644 --- a/content/posts/2024-09-26-hugo-wordpress/index.md +++ b/content/posts/2024-09-26-hugo-wordpress/index.md @@ -2,9 +2,9 @@ title: Hugo → WordPress date: "2024-09-26T19:05:00Z" categories: - - Без рубрики + - Блог tags: - - блог + - Блог --- Поменял в блоге движок с модного Hugo на немодный бумерский WordPress. Почему? diff --git a/content/posts/2024-10-06-цитатник-рунета/index.md b/content/posts/2024-10-06-цитатник-рунета/index.md index 66e2468..f4f46a0 100644 --- a/content/posts/2024-10-06-цитатник-рунета/index.md +++ b/content/posts/2024-10-06-цитатник-рунета/index.md @@ -4,8 +4,6 @@ date: "2024-10-06T12:00:11Z" categories: - Мои проекты tags: - - go - - it - моё --- diff --git a/content/posts/2024-11-15-hugo/index.md b/content/posts/2024-11-15-hugo/index.md index 7c210d7..35e3cda 100644 --- a/content/posts/2024-11-15-hugo/index.md +++ b/content/posts/2024-11-15-hugo/index.md @@ -2,7 +2,7 @@ title: Hugo date: "2024-11-15T01:11:49+03:00" categories: - - Без рубрики + - Блог tags: - разное --- diff --git a/content/posts/2024-11-17-obsidian/index.md b/content/posts/2024-11-17-obsidian/index.md index 8cc0aaf..f03780b 100644 --- a/content/posts/2024-11-17-obsidian/index.md +++ b/content/posts/2024-11-17-obsidian/index.md @@ -2,11 +2,11 @@ title: Obsidian date: "2024-11-17T22:30:37+03:00" categories: - - Без рубрики + - Без категории tags: - - it - - joplin - - obsidian + - IT + - Joplin + - Obsidian --- Некоторое время назад я [писал](/posts/joplin/) про заметочник diff --git a/content/posts/2024-12-15-conditional-operator-go/index.md b/content/posts/2024-12-15-conditional-operator-go/index.md index 08214f2..53f8a07 100644 --- a/content/posts/2024-12-15-conditional-operator-go/index.md +++ b/content/posts/2024-12-15-conditional-operator-go/index.md @@ -2,7 +2,7 @@ title: Тернарник в Go date: "2024-12-15T23:47:08+03:00" categories: - - Без рубрики + - Golang tags: - IT - Go diff --git a/content/posts/2024-12-17-infra/index.md b/content/posts/2024-12-17-infra/index.md index c10be71..0b8253f 100644 --- a/content/posts/2024-12-17-infra/index.md +++ b/content/posts/2024-12-17-infra/index.md @@ -1,6 +1,6 @@ --- categories: - - Мета + - IT date: "2024-12-17T21:07:53+03:00" draft: true tags: diff --git a/content/posts/2024-12-30-irc/index.md b/content/posts/2024-12-30-irc/index.md index 7071fa0..248a61c 100644 --- a/content/posts/2024-12-30-irc/index.md +++ b/content/posts/2024-12-30-irc/index.md @@ -1,6 +1,6 @@ --- categories: - - Без рубрики + - IT date: "2024-12-30T14:54:08+03:00" draft: true image: irc_logo.webp diff --git a/content/posts/2024-12-31-new-year/index.md b/content/posts/2024-12-31-new-year/index.md index 4d1f561..e4fc22d 100644 --- a/content/posts/2024-12-31-new-year/index.md +++ b/content/posts/2024-12-31-new-year/index.md @@ -2,9 +2,9 @@ title: С Новым Годом! date: "2024-12-31T15:48:25+03:00" categories: - - Без рубрики + - Жизнь tags: - - разное + - Новый Год --- Ну что же, друзья, с наступающим! diff --git a/content/posts/2025-12-21-sicktech/index.md b/content/posts/2025-12-21-sicktech/index.md index 45f6cd9..e09a79b 100644 --- a/content/posts/2025-12-21-sicktech/index.md +++ b/content/posts/2025-12-21-sicktech/index.md @@ -2,11 +2,11 @@ title: Про здоровые и нездоровые технологии date: "2025-12-21T18:40:26+03:00" tags: - - it - - sicktech + - IT + - Sicktech categories: - - размышления - - лонгрид + - Размышления + - Лонгрид --- Я заметил, что часто стал в речи употреблять словосочетания «здоровая diff --git a/content/posts/2025-12-28-philharmonic-park/index.md b/content/posts/2025-12-28-philharmonic-park/index.md index cf8046b..778733f 100644 --- a/content/posts/2025-12-28-philharmonic-park/index.md +++ b/content/posts/2025-12-28-philharmonic-park/index.md @@ -3,6 +3,7 @@ title: Прогулка в сквере филармонии date: "2025-12-28T21:37:44+03:00" categories: - Прогулки + - Жизнь --- Вчера [гуляли с супругой на diff --git a/content/posts/2025-12-29-newyear-excel/index.md b/content/posts/2025-12-29-newyear-excel/index.md index df0e523..345be7e 100644 --- a/content/posts/2025-12-29-newyear-excel/index.md +++ b/content/posts/2025-12-29-newyear-excel/index.md @@ -2,9 +2,9 @@ title: Новогодний Excel date: "2025-12-29T11:47:14+03:00" tags: - - разное + - Новый Год categories: - - Без рубрики + - Без категории --- По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного diff --git a/content/posts/2025-12-31-new-year/index.md b/content/posts/2025-12-31-new-year/index.md index 109c190..ed0bd37 100644 --- a/content/posts/2025-12-31-new-year/index.md +++ b/content/posts/2025-12-31-new-year/index.md @@ -2,9 +2,9 @@ title: С Новым Годом! date: "2025-12-31T15:27:17+03:00" tags: - - разное + - Новый Год categories: - - Без рубрики + - Жизнь --- С наступающим Новым Годом! diff --git a/content/posts/2025-02-08-stplr/index.md b/content/posts/2026-02-08-stplr/index.md index 31056c2..17e7ad8 100644 --- a/content/posts/2025-02-08-stplr/index.md +++ b/content/posts/2026-02-08-stplr/index.md @@ -2,7 +2,7 @@ title: Пакетный менеджер Stapler date: "2026-02-08T15:02:12+03:00" tags: - - Разное + - Stplr categories: - IT --- diff --git a/content/posts/2026-02-25-death-of-poweruser/index.md b/content/posts/2026-02-25-death-of-poweruser/index.md index 435ee15..b6fcd54 100644 --- a/content/posts/2026-02-25-death-of-poweruser/index.md +++ b/content/posts/2026-02-25-death-of-poweruser/index.md @@ -2,7 +2,7 @@ title: Смерть «продвинутого пользователя ПК» date: 2026-02-25T22:59:31+03:00 tags: ["IT", "Sicktech"] -categories: ["Размышления"] +categories: ["Размышления", "IT"] --- https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/ @@ -28,4 +28,5 @@ https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/ каждый сам кузнец своего счастья. [^1]: https://neonxp.ru/posts/2025-12-21-sicktech/ + [^2]: https://neonxp.ru/posts/2025-12-24-email/ diff --git a/content/posts/2026-02-26-broken-atom/index.md b/content/posts/2026-02-26-broken-atom/index.md new file mode 100644 index 0000000..7ab540e --- /dev/null +++ b/content/posts/2026-02-26-broken-atom/index.md @@ -0,0 +1,34 @@ +--- +title: Сломаный Атом +date: 2026-02-26T01:19:06+03:00 +tags: ["Блог"] +categories: + - IT +--- + +Ого, оказывается всё это время у меня была сломана генерация [ленты +Атом](https://neonxp.ru/feed/)! А именно, некорректно подставлялось содержание +состоящее из, в том числе, ХТМЛ тегов, но без указания что это ХТМЛ. Что +интересно, большинству читалок у меня на хозяйстве — всё равно и они не +показывали проблемы. Но сегодня я открыл в Newsboat[^1] (ссылка на оффсайт у +меня всё равно не открывается) и мои глаза начали плакать кровью от этой +мешанины текста и тегов. Пришлось чинить :) + +[^1]: https://github.com/newsboat/newsboat + +Заодно, наконец-то, сделал чтобы было отдельно и краткое содержимое в теге +<Summary>…</Summary> и полное содержимое в правильном для этого теге +<Content>…</Content>. А то я постоянно мысленно осуждал авторов, +которые в РСС/Атом ленту вносят только краткое содержание (или даже просто +заголовок!), и требовалось за полной статьё покидать удобную читалку. А сам при +этом поступал так же. Больше нет. Теперь отдаю и краткое содержимое и полное. +Читайте где удобнее, мне не принципиален заход именно на веб-сайт :) Важно это +было бы, наверное, если бы у меня была реклама, но её у меня нет и никогда не +будет по этическим соображениям (да и какому рекламодателю мой хомяк вообще +сдался то? :D ). + +Не знаю, стоит ли это отдельно озвучивать, но ленты Атом (как в прочем, и РСС) +и т.н. JsonFeed — это однозначно «здоровые» технологии по моей классификации. +Да, у РСС есть определённые проблемы в формате, но по сравнению с +альтернативами в виде лент социальных сетей — этот недостаток такая +несущественная мелочь! diff --git a/content/posts/2026-02-27-no-smoke/index.md b/content/posts/2026-02-27-no-smoke/index.md new file mode 100644 index 0000000..c4152db --- /dev/null +++ b/content/posts/2026-02-27-no-smoke/index.md @@ -0,0 +1,18 @@ +--- +title: Ровно неделя без сигарет и iQOS +date: 2026-02-27T10:10:53+03:00 +tags: ["Курение"] +categories: + - Жизнь +--- + + + +Сегодня утром — ровно неделя без сигарет и стиков. Тяжело ли? Тяжело. Очень. Я +стал гораздо более раздражительным и злым. Сон стал тоже хуже. Сплю часов по +5-6. Но надеюсь, это только временный эффект, который скоро пройдёт. Благо, +супруга меня очень поддерживает, спасибо ей за это! + +Для помощи себе принимаю «Табекс» и когда совсем уже херово — «Никоретте». В +целом, возвращаться к привычке не хочу. И как понимаю, нужно продержаться в +общей сложности месяц, чтобы можно было фиксировать результат. diff --git a/content/posts/2026-02-27-no-smoke/no-smoke.jpg b/content/posts/2026-02-27-no-smoke/no-smoke.jpg Binary files differnew file mode 100644 index 0000000..3897fcc --- /dev/null +++ b/content/posts/2026-02-27-no-smoke/no-smoke.jpg diff --git a/content/posts/2026-03-02-ipv6/index.md b/content/posts/2026-03-02-ipv6/index.md new file mode 100644 index 0000000..b5d56b4 --- /dev/null +++ b/content/posts/2026-03-02-ipv6/index.md @@ -0,0 +1,19 @@ +--- +title: Наконец-то у меня есть IPv6 на домашнюю сеть! +date: 2026-03-02T21:10:07+03:00 +tags: ["ipv6"] +categories: + - Без категории +--- + +Отчаялся я ждать ~~милостей от природы~~ милостей от провайдера — сделал таки +IPv6 туннель через https://ipv6.ip4market.ru/. По сути, выбора-то больше и нет. +Ну точнее есть, или забугорный (вообще не вариант) или прокидывать через свою +VDS (которую ещё надо и завести для начала!), а с этим, боюсь, у меня +компетенции не хватит. Поэтому и пошёл по пути наименьшего противления. + +Зачем всё это? Да затем, что я считаю это правильным! Именно это и есть +настоящий интернет, а не тот суррогат, который нам втюхивают корпы. Ну а кроме +лозунгов, практического смысла я пока не вижу. Но с другой стороны +идеалогическая часть вполне себе оправдала те самые несчастные полчаса, что я +это настраивал :) diff --git a/content/posts/2026-03-14-conf/index.md b/content/posts/2026-03-14-conf/index.md new file mode 100644 index 0000000..75236b8 --- /dev/null +++ b/content/posts/2026-03-14-conf/index.md @@ -0,0 +1,220 @@ +--- +title: Идеальный формат конфигов * +date: 2026-03-14T17:21:59+03:00 +tags: ["go", "conf"] +category: + - IT + - Мои проекты +--- + +\* лично для меня + +В общем, случилось и на неделе я таки присвоил тег v1 для своей самописной Go +библиотеки для разбора конфигов! Но обо всём по порядку. Или можно пропустить +предысторию и сразу [перейти к описанию библиотеки](#conf-v1). + +# Предыстория + +Около месяца назад я задумался написать небольшую утилиту для себя, которая бы +организовывала для меня рабочее окружение. Не важно сейчас, как именно должна +была организовывать, а важно, что эта утилита должна бы была иметь весьма +разухабистый конфиг вследствие своей планируемой гибкости. И встал вопрос, а +какой формат конфигов использовать? Казалось бы, возьми yaml, toml, на худой +конец, json (hjson, json5, итп). Даже думал об ini формате! Но всё было не то... + +И дело даже не в моём <abbr title="Not Invented Here">NIH</abbr> синдроме. +А они все мне не подходят! + +## YAML + +Отвратительный язык! Начиная с отступов пробелами, что я ненавижу,[^1] продолжая +тем, что у него спека способна по объёму поконкурировать с спекой XML и +заканчивая весельем с ошибками когда строки _внезапно_ парсятся как числа и всё +ломается! + +## TOML + +На самом деле, самый адекватный из вариантов, но его синтаксис... Ну скажем +так, на любителя. Но да, всяко лучше YAML. Всё что угодно лучге YAML. Гори в +аду, YAML! + +## JSON + +Это вообще не язык для конфигов и не язык разметки. А формат серилизации +объектов. Кому вообще первому пришло в голову в нём конфиги хранить? Его +производные — это уже какой-то набор костылей. Зачем мучать стюардесу? + +## INI + +Первый из подборки язык который именно изначально для описания конфигураций. Но +он уж больно ограниченный, да и гнилостный душок микрософта... + +Короче, я не стал искать дальше оправданий и засучи́л рукава и решил написать +идеальную (для себя) библиотеку конфигураций! За основу синтаксиса я взял +формат конфигов у таких никсовых приложений, как NGINX, bind9 и прочих +подобных. Во-первых, это красиво. Во-вторых, это привычно. Из других требований +кроме привычности, была гибкость, которая выражается в возможности делать сколь +угодно глубокую вложенность в конфигах. Но это всё было фоном, а главные мои +требования были всё же нефункциональными: + +1. Самое главное, мне должно _нравиться_. Я понимаю, что это никак не + формализовать, это можно только почувствовать. Именно поэтому не подошли ни +TOML, ни INI, ни в т.ч. YAML. Они мне _не нравятся_ внешне. +2. Не менее важно, что мне его должно хватать. Про вложенности я уже говорил. +3. И чтобы служило мне так десятилетиями без изменений. То есть, чтобы мне надо + было эту библиотеку разработать один раз, а потом, в идеале, никак и никогда +её не менять. Максимум подправлять под реалии новых версий языков, что-то +такое. Я вообще люблю вещи из разряда «раз и навсегда». Может это старость? + +Немного подумав над синтаксисом я пришёл к тому, что мне нужна максимальная +примитивность. Всего две формы записи: + +1. Имя аргумент1 аргумент2 ... аргументN; +2. Имя аргумент1 аргумент2 ... аргументN { ...вложенные директивы... } + +По сути это и есть весь базовый синтаксис! Просто последовательность директив, +каждая из которых просто обязана иметь имя. Причём неуникальное! Требование к +уникальности имён — уже ограничение и неуниверсальность. + +Аргументы только самых базовых типов — строка (причём в разных кавычках в +зависимости от контекста, например, \` для многострочных строк), числа как +целочисленные, так и с плавающей точкой, булевы значения, и один особый тип: +ident (то есть какая-то строка без кавычек, например, идентификатор или имя). +Мне больше не надо! Даты? Строка! Промежутки времени? Тоже строка! Зачем +отдельно-то? + +Примерно так я видел для себя идеальный формат конфигов. Да, очень сумбурно и +неточно, но когда меня это останавливало? Решил накидать формальную грамматику, +так как писать вручную парсер уж сильно не хотелось. Сначала написал её для +[egg](https://gitlab.com/cznic/egg), немного помучался с API сгенерированного +парсера, но потом всё же всё заработало! Кроме... Кроме того, что я наткнулся +на неприятное свойство поведения: если парсер натыкается на неожиданный символ +— он выдавал непонятную без полулитра ошибку вида "index of array out of +range". Причём без номера строки и символа. Сиди и гадай, что пошло не так. +Убив на это без малого пару дней, я так и не смог сделать так, чтобы ошибка +была более человеческая (типа «строка 2 символ 4: ожидалось что-то, а тут +что-то другое»). Поэтому я принял волевое решение переписать совсем с нуля. +Взял другой [генератор парсеров](github.com/mna/pigeon), переписал грамматику c +EBNF на PEG [^2] и ... И получилось **гораздо** более элегантно, чем с egg! +Счастью моему не было предела, когда я получил первый успех! Да, конечно, потом +пара дней полировки и обвешивания необязательными, но приятными фичами и +готово! После того как я попробовал на практике свою библиотеку в одном +простеньком проекте ([о нём в конце](#pose)) — я с чистой совестью присвоил +библиотеке тег стабильной версии, т.к. я получил то, что хотел и больше править +её в ближайшее время я не собираюсь. + +[^2]: https://git.neonxp.ru/conf/diff/parser/grammar.peg?id=00394a80501960ad26787b5c44435ed5ed67ad84 + +# conf v1 + +Встречайте: +- [go.neonxp.ru/conf](https://go.neonxp.ru/conf) +- [Гит репозиторий](https://git.neonxp.ru/conf) +- [Документация на pkg.go.dev](https://pkg.go.dev/go.neonxp.ru/conf) + +Как я уже говорил, синтаксис очень простой. Для наглядности я приведу сразу +пример, который покажет, по сути, все возможности. Да, возможностей не много, +потому что я ценю минимализм, как уже говорил выше. + +```nginx +# Две одноименных директивы +some directive; +some other directive; + +string_val "value"; +int_val 123; +float_val 123.321; +bool_val true; + +xdg_config_dir HOME ".config" +# Если получать через StringExt("/", os.LookupEnv), то получится +# $HOME + "/" + ".config" = "/home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/.config" + +group1 "some" "args" "and" "body" { + group2 123 321 { + group3 true false true { + key value; # One line comment! + } + } +} +``` + +Из примера выше мы видим: +- две директивы с одинаковым именем (`some`) +- несколько директив с аргументами разных типов (`*_val`) +- директивы с вложенными поддирективами (`group*`). Причём, наличие тела `{...}` + у директивы не отменяет возможности передать и аргументы до тела. + Единственное, тело должно быть одно и в конце директивы. Зато после него не + нужно ставить `;`, парсер и так понимает что раз тело закончилось, то и + директива закончилась. +- отступы могут быть как табуляторами, так и пробелами. Но я прошу использовать + именно табуляторы, потому что только табуляторы это правильно.[^1] + Хер вы меня заставите передумать! + +И всё! Просто и очень наглядно. Идеально для конфигов! + +[^1]: https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/ + +## Использование в Go + +Естественно, не могло быть и речи о анмаршалинге этого формата на структуры, как +это делается у JSON YAML и прочих. Но это и не надо! У библиотеки есть несколько +встроенных типов, таких как: + +- [Group](https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Group) - группа +директив. В том числе и тело директивы. Всё просто! Из методов есть базовые +методы для получения конкретных директив из группы и простой фильтр. +- [Directive](https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Directive) - +для директив. У него есть несколько методов для типизированного получения +первого из аргументов директивы (того что после имени директивы), также метод +получения всех аргументов и тела. Так же есть и специальный метод StringExt[^3], +который сливает все аргументы в одну строку с разделителем `sep` и пропуская +аргументы типа `Ident` через переданную функцию `identLookup`. + +[^3]: https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Directive.StringExt + +Это два самых главных типа. Помимо них есть ещё и Ident о котором я говорил выше +и тип Lookup, который определяет функцию подстановки для метода StringExt, +намеренно сделанный совместимым со стандартным +[os.LookupEnv](https://pkg.go.dev/os#LookupEnv). + +Я постарался очень и очень поверхностно дать описание API, т.к. можно подробно +прочитать об API и на [pkg.go.dev](https://pkg.go.dev/go.neonxp.ru/conf). + +А чего же не хватает у в этом API? Записи конфига! Да! Есть только Load и +LoadFile[^4], но нет никакого Write, Marshal и чего-то такого! Я долго думал, +как это сделать. Ведь всё таки если делать запись, то по хорошему надо следить +за тем, чтобы и комментарии сохранялись, причём строго там, где они были в +оригинальном конфиге. Более того, по хорошему, нужно сделать так, чтобы после +LoadFile → WriteFile полученный файл должен побайтово совпадать с тем что было. +Да, дохрена забот! А потом я подумал «А зачем мне вообще сохранять? Конфиг +пишется руками человеком для программы. Зачем самой программе в него писать?». +И правда. Хорошенько подумав я не придумал нормальных вариантов использования, +кроме уж сильно притянутых. На том и порешил что делать запись я не буду. Ни +сейчас ни потом. Но вообще, это опенсорс и значит, что тот, кому понадобится — +сможет и сам реализовать и прислать мне MR на почту. От такого я не откажусь! + +Лицензией я выбрал конечно же GPLv3. А что, тут есть выбор? Для меня есть только +GPL. Остальные митоапачи — профанация и не интересно. + +[^4]: https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1#pkg-index + +# POSE + +[Гит проекта](https://git.neonxp.ru/pose/) + +Я упомянул выше, что что я уже написал первый проект, где обкатал новую +библиотеку. И этот проект - простая утилита, которая транслирует записи из +источника (источников) в целевой сервис (сервисы). Ну то есть, из RSS/Atom в +телеграм (на момент написания поста, 14.03.2026 не запрещённый на территории +России). Хоть эта утилита уже работает у меня на сервере (транслирует Atom +ленту этого блога в мой канал), я её воспринимаю скорее как референсный пример +использования библиотеки конфигов. + +Так что да, если заинтересовались библиотекой conf - рекомендую посмотреть [этот +проект](https://git.neonxp.ru/pose/tree/internal/application/application.go#n25) +и [его конфиг](https://git.neonxp.ru/pose/tree/config.conf) как референсный +пример использования библиотеки conf. + +Пожалуй, на этом пока всё. Если что-то не написал или непонятно — приглашаю +обсудить со мной [по почте](mailto:i@neonxp.ru) или в комментариях ниже. diff --git a/content/posts/2026-03-15-meshtastic/cardputer.jpg b/content/posts/2026-03-15-meshtastic/cardputer.jpg Binary files differnew file mode 100644 index 0000000..530f2f6 --- /dev/null +++ b/content/posts/2026-03-15-meshtastic/cardputer.jpg diff --git a/content/posts/2026-03-15-meshtastic/cardputer.webp b/content/posts/2026-03-15-meshtastic/cardputer.webp Binary files differnew file mode 100644 index 0000000..304b3af --- /dev/null +++ b/content/posts/2026-03-15-meshtastic/cardputer.webp diff --git a/content/posts/2026-03-15-meshtastic/index.md b/content/posts/2026-03-15-meshtastic/index.md new file mode 100644 index 0000000..0d3819d --- /dev/null +++ b/content/posts/2026-03-15-meshtastic/index.md @@ -0,0 +1,41 @@ +--- +title: Снова про Мышастик +date: 2026-03-15T13:43:49+03:00 +tags: ["meshtastic"] +category: + - Без категории +--- + +Поголовье устройств у меня продолжает расти, теперь у меня есть и такой +портативный узел размером с кредитку: + + + +Не скажу что его использовать удобно. Скорее неудобно, чем удобно. Но весьма +забавно. Отдаёт неким ретро. + +Так, подведу итог что у меня по узлам сейчас: + +- NeonXP Portable (nxp0) — мой самый первый узел на T-Beam. Он же и остаётся +моим условно переносным засчёт наличия внешнего аккумулятора 18650. Конечно, он +не самостоятелен и должен быть подключён к смартфону по BT. +- NeonXP Vehicle (nxp1) — узел, который лежит в автомобиле и работает от +бортовой сети. Модель — Heltec v3. Антенна — родная. +- NeonXP Base (nxp2) — домашний стационарный узел, который подключён в домашнюю +сеть через wifi (другие узлы цепляются по bluetooth или автономны как nxp3). +Модель — Heltec v3. Антенна — Moxon, направленная в сторону центра города. В +основном благодаря именно ей у меня из моего спального района есть связанность +до остальной сети. На текущий момент показывает, что 11 прямых соединений, что +для меня очень и очень хорошо. Раньше я довольствовался буквально 1-2 аплинками +:) А другие узлы, пока я дома, уже подключаются через него. +- NeonXP Cardputer (nxp3) — вот это устройство что в начале поста :) Cardputer + ADV + Lora модуль. В деньгах стоит примерно 4-5К₽. +- ... (nxp4) — Пока ещё в пути ко мне. Но это уже Heltec v4, не v3. Так же + будет с Moxon антенной. Планирую её поставить уже в новом доме, то есть на +юге города. Пока кажется, что врядли я получу связанность с основной городской +сетью, но постараюсь. Тем более, судя по карте, на юге города количество узлов +потихоньку растёт. Надеюсь, через время уже будет моим главным «Base» узлом. + +И да, на этих узлах я не остановлюсь, ведь как минимум могут (и должны!) быть +узлы nxp5, nxp6, nxp7, nxp8, nxp9, а дальше, ещё не придумал, или nx10, nx11 +и т.д. или как-то по другому :) diff --git a/content/posts/2026-03-21-aiserver/index.md b/content/posts/2026-03-21-aiserver/index.md new file mode 100644 index 0000000..c7c8f7c --- /dev/null +++ b/content/posts/2026-03-21-aiserver/index.md @@ -0,0 +1,74 @@ +--- +title: Свой ИИ сервер на Steam Deck +date: 2026-03-21T13:06:20+03:00 +tags: + - ИИ +category: + - ИИ +--- + +Я весьма активно в последнее время экспериментирую с нейронками, причём не +только в контексте их обычного использования для коддинга. Больше меня +интересует как раз разработка *под* нейронки (автономные агенты, ага). + +Так же сейчас перепрохожу по учебникам в свободное время институтский курс по +линейке (а на очереди ещё вычмат, тервер и матан...) чтобы восстановить свои и +так слабые знания по математике, необходимой для ИИ. Затем план уже конкретно в +МЛ, БЯМ и прочеее вгрызться. Внезапно математика, когда ей занимаешься не «из +под палки» потому что зачёт/экзамен, а только для себя — становится **очень** +интересной. Прям жалею что в институте недооценивал. Но сейчас всё же не об +этом речь. + +Сейчас про именно разработку под уже существующие БЯМ. + +Конечно, в процессе разработки и особенно тестирования, т.н. токенов тратится +не много, а ОЧЕНЬ много. И, честно говоря, мне жалко бабки на это. И это ещё не +говоря о том, что появляется зависимость от неких «облачных провайдеров», что я +очень и очень не приемлю. + +Выход — локальный инференс БЯМ. Благо, совсем недавно китайская Alibaba +обрадовала сообщество своим новым семейством моделей Qwen3.5 которые +одновременно и достаточно компактные для локального инференса (даже на CPU!) и +при этом достаточно умненькие (серьёзно, она решает ту шуточую задачу с кружкой +у которой запаян верх и отрезано дно :) ). + +Т.к. я не сторонник стационарных компьютеров уже лет так 20 — адекватного ПК с +видеокартами у меня нет и не предвидится. Даже если бы я накопил на мощную +видюху для нейронок — мне было бы некуда её пихать! Но тут я вспомнил, что у +меня простаивает такое чудо технологий, как Steam Deck! + + + +Лонг стори шорт. На родной SteamOS поднять не получилось, поэтому я просто +поставил на стимдек свою любимую AltLinux p11. Удивительно, но она встала с +полпинка, без всякого пердолинга драйверов. Хотя я был готов, что что-то пойдёт +не так, ибо железо у деки весьма кастомное. + +Пробовал Ollama с qwen3.5:9b (unsloth/Qwen3.5-9B-GGUF) — как бы работала, но +через сколько-то запросов помирала. Непорядок совсем. Долго пытался это +отдебажить, но так и не получилось ни подружить деку с rocm ни заставить +стабильно олламу работать с vulkan. + +В общем, плюнул на олламу и поставил +llama.cpp. И вот уже на ней, квенка завелась как родная! Да, скорость инференса +7-8 токенов в секунду, но для моих целей это вполне и вполне достаточно! На CPU +ноута в 10 потоков (12 ядерный i7 13 поколения) хорошо если 1 токен в секунду +был, при том что остальная ОС была в коматозном состоянии. + +Пробовал ещё и более вкусную qwen3.5 a3b MOE — но она не влезла в память +¯\\\_(ツ)_/¯ + + + +Да, аж 10 минут. Но там долгий ризонинг был. Обычно в моих задачах ризонинг +сильно короче. + +Итог, у меня наконец-то есть своя локальная «бесплатная» и достаточно +продвинутая моделька, у которой я могу под эксперименты жрать токены +миллионами. Но всё равно, начинаю копить на полноценный GPU сервер, чтобы +играться уже с совсем большими БЯМ. Хочу что-то из серии Nvidia DGX Spark или, +что вероятнее, минипк на Ryzen AI Max+ 395 + Radeon 8060S. Я вообще считаю, что +за подобными персональными минисерверами для ИИ будущее. + +Мечта — иметь локальный инференс MiniMax M2.7 и GLM5 :) Ну а пока, имею то, что +имею. diff --git a/content/posts/2026-03-21-aiserver/qwen35.png b/content/posts/2026-03-21-aiserver/qwen35.png Binary files differnew file mode 100644 index 0000000..8af7a29 --- /dev/null +++ b/content/posts/2026-03-21-aiserver/qwen35.png diff --git a/content/posts/2026-03-21-aiserver/qwen35_small.jpg b/content/posts/2026-03-21-aiserver/qwen35_small.jpg Binary files differnew file mode 100644 index 0000000..3322391 --- /dev/null +++ b/content/posts/2026-03-21-aiserver/qwen35_small.jpg diff --git a/content/posts/2026-03-21-aiserver/steamdeck.jpg b/content/posts/2026-03-21-aiserver/steamdeck.jpg Binary files differnew file mode 100644 index 0000000..277aee2 --- /dev/null +++ b/content/posts/2026-03-21-aiserver/steamdeck.jpg diff --git a/content/posts/2026-03-21-aiserver/steamdeck_small.jpg b/content/posts/2026-03-21-aiserver/steamdeck_small.jpg Binary files differnew file mode 100644 index 0000000..109c60a --- /dev/null +++ b/content/posts/2026-03-21-aiserver/steamdeck_small.jpg |
