<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<?xml-stylesheet type="text/css" href="/css/atom.css" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Блог on ~/NeonXP.log</title>
  <link rel="self" href="https://neonxp.ru/posts/"/>
  <updated>2026-03-21T13:06:20+0300</updated>
  <author>
    <name>Alexander NeonXP Kiryukhin</name>
    <email>i@neonxp.ru</email>
    <uri>https://neonxp.ru/</uri>
  </author>
  <id>https://neonxp.ru/posts/</id>
  
  <entry>
    <title>Свой ИИ сервер на Steam Deck</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-03-21-aiserver/"/>
    <id>https://neonxp.ru/posts/2026-03-21-aiserver/</id>
    <published>2026-03-21T13:06:20+0300</published>
    <updated>2026-03-21T13:06:20+0300</updated>
    <summary type="html">&lt;p&gt;Я весьма активно в последнее время экспериментирую с нейронками, причём не
только в контексте их обычного использования для коддинга. Больше меня
интересует как раз разработка &lt;em&gt;под&lt;/em&gt; нейронки (автономные агенты, ага).&lt;/p&gt;
&lt;p&gt;Так же сейчас перепрохожу по учебникам в свободное время институтский курс по
линейке (а на очереди ещё вычмат, тервер и матан&amp;hellip;) чтобы восстановить свои и
так слабые знания по математике, необходимой для ИИ. Затем план уже конкретно в
МЛ, БЯМ и прочеее вгрызться. Внезапно математика, когда ей занимаешься не «из
под палки» потому что зачёт/экзамен, а только для себя — становится &lt;strong&gt;очень&lt;/strong&gt;
интересной. Прям жалею что в институте недооценивал. Но сейчас всё же не об
этом речь.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Я весьма активно в последнее время экспериментирую с нейронками, причём не
только в контексте их обычного использования для коддинга. Больше меня
интересует как раз разработка &lt;em&gt;под&lt;/em&gt; нейронки (автономные агенты, ага).&lt;/p&gt;
&lt;p&gt;Так же сейчас перепрохожу по учебникам в свободное время институтский курс по
линейке (а на очереди ещё вычмат, тервер и матан&amp;hellip;) чтобы восстановить свои и
так слабые знания по математике, необходимой для ИИ. Затем план уже конкретно в
МЛ, БЯМ и прочеее вгрызться. Внезапно математика, когда ей занимаешься не «из
под палки» потому что зачёт/экзамен, а только для себя — становится &lt;strong&gt;очень&lt;/strong&gt;
интересной. Прям жалею что в институте недооценивал. Но сейчас всё же не об
этом речь.&lt;/p&gt;
&lt;p&gt;Сейчас про именно разработку под уже существующие БЯМ.&lt;/p&gt;
&lt;p&gt;Конечно, в процессе разработки и особенно тестирования, т.н. токенов тратится
не много, а ОЧЕНЬ много. И, честно говоря, мне жалко бабки на это. И это ещё не
говоря о том, что появляется зависимость от неких «облачных провайдеров», что я
очень и очень не приемлю.&lt;/p&gt;
&lt;p&gt;Выход — локальный инференс БЯМ. Благо, совсем недавно китайская Alibaba
обрадовала сообщество своим новым семейством моделей Qwen3.5 которые
одновременно и достаточно компактные для локального инференса (даже на CPU!) и
при этом достаточно умненькие (серьёзно, она решает ту шуточую задачу с кружкой
у которой запаян верх и отрезано дно :) ).&lt;/p&gt;
&lt;p&gt;Т.к. я не сторонник стационарных компьютеров уже лет так 20 — адекватного ПК с
видеокартами у меня нет и не предвидится. Даже если бы я накопил на мощную
видюху для нейронок — мне было бы некуда её пихать! Но тут я вспомнил, что у
меня простаивает такое чудо технологий, как Steam Deck!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/posts/2026-03-21-aiserver/steamdeck_small.jpg&#34; alt=&#34;Steam Deck&#34;&gt;&lt;/p&gt;
&lt;p&gt;Лонг стори шорт. На родной SteamOS поднять не получилось, поэтому я просто
поставил на стимдек свою любимую AltLinux p11. Удивительно, но она встала с
полпинка, без всякого пердолинга драйверов. Хотя я был готов, что что-то пойдёт
не так, ибо железо у деки весьма кастомное.&lt;/p&gt;
&lt;p&gt;Пробовал Ollama с qwen3.5:9b (unsloth/Qwen3.5-9B-GGUF) — как бы работала, но
через сколько-то запросов помирала. Непорядок совсем. Долго пытался это
отдебажить, но так и не получилось ни подружить деку с rocm ни заставить
стабильно олламу работать с vulkan.&lt;/p&gt;
&lt;p&gt;В общем, плюнул на олламу и поставил
llama.cpp. И вот уже на ней, квенка завелась как родная! Да, скорость инференса
7-8 токенов в секунду, но для моих целей это вполне и вполне достаточно! На CPU
ноута в 10 потоков (12 ядерный i7 13 поколения) хорошо если 1 токен в секунду
был, при том что остальная ОС была в коматозном состоянии.&lt;/p&gt;
&lt;p&gt;Пробовал ещё и более вкусную qwen3.5 a3b MOE — но она не влезла в память
¯\_(ツ)_/¯&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/posts/2026-03-21-aiserver/qwen35_small.jpg&#34; alt=&#34;Qwen3.5&#34;&gt;&lt;/p&gt;
&lt;p&gt;Да, аж 10 минут. Но там долгий ризонинг был. Обычно в моих задачах ризонинг
сильно короче.&lt;/p&gt;
&lt;p&gt;Итог, у меня наконец-то есть своя локальная «бесплатная» и достаточно
продвинутая моделька, у которой я могу под эксперименты жрать токены
миллионами. Но всё равно, начинаю копить на полноценный GPU сервер, чтобы
играться уже с совсем большими БЯМ. Хочу что-то из серии Nvidia DGX Spark или,
что вероятнее, минипк на Ryzen AI Max+ 395 + Radeon 8060S. Я вообще считаю, что
за подобными персональными минисерверами для ИИ будущее.&lt;/p&gt;
&lt;p&gt;Мечта — иметь локальный инференс MiniMax M2.7 и GLM5 :) Ну а пока, имею то, что
имею.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Снова про Мышастик</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-03-15-meshtastic/"/>
    <id>https://neonxp.ru/posts/2026-03-15-meshtastic/</id>
    <published>2026-03-15T13:43:49+0300</published>
    <updated>2026-03-15T13:43:49+0300</updated>
    <summary type="html">&lt;p&gt;Поголовье устройств у меня продолжает расти, теперь у меня есть и такой
портативный узел размером с кредитку:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/posts/2026-03-15-meshtastic/cardputer.webp&#34; alt=&#34;cardputer&#34;&gt;&lt;/p&gt;
&lt;p&gt;Не скажу что его использовать удобно. Скорее неудобно, чем удобно. Но весьма
забавно. Отдаёт неким ретро.&lt;/p&gt;
&lt;p&gt;Так, подведу итог что у меня по узлам сейчас:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NeonXP Portable (nxp0) — мой самый первый узел на T-Beam. Он же и остаётся
моим условно переносным засчёт наличия внешнего аккумулятора 18650. Конечно, он
не самостоятелен и должен быть подключён к смартфону по BT.&lt;/li&gt;
&lt;li&gt;NeonXP Vehicle (nxp1) — узел, который лежит в автомобиле и работает от
бортовой сети. Модель — Heltec v3. Антенна — родная.&lt;/li&gt;
&lt;li&gt;NeonXP Base (nxp2) — домашний стационарный узел, который подключён в домашнюю
сеть через wifi (другие узлы цепляются по bluetooth или автономны как nxp3).
Модель — Heltec v3. Антенна — Moxon, направленная в сторону центра города. В
основном благодаря именно ей у меня из моего спального района есть связанность
до остальной сети. На текущий момент показывает, что 11 прямых соединений, что
для меня очень и очень хорошо. Раньше я довольствовался буквально 1-2 аплинками
:) А другие узлы, пока я дома, уже подключаются через него.&lt;/li&gt;
&lt;li&gt;NeonXP Cardputer (nxp3) — вот это устройство что в начале поста :) Cardputer
ADV + Lora модуль. В деньгах стоит примерно 4-5К₽.&lt;/li&gt;
&lt;li&gt;&amp;hellip; (nxp4) — Пока ещё в пути ко мне. Но это уже Heltec v4, не v3. Так же
будет с Moxon антенной. Планирую её поставить уже в новом доме, то есть на
юге города. Пока кажется, что врядли я получу связанность с основной городской
сетью, но постараюсь. Тем более, судя по карте, на юге города количество узлов
потихоньку растёт. Надеюсь, через время уже будет моим главным «Base» узлом.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И да, на этих узлах я не остановлюсь, ведь как минимум могут (и должны!) быть
узлы nxp5, nxp6, nxp7, nxp8, nxp9, а дальше, ещё не придумал, или nx10, nx11
и т.д. или как-то по другому :)&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Поголовье устройств у меня продолжает расти, теперь у меня есть и такой
портативный узел размером с кредитку:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/posts/2026-03-15-meshtastic/cardputer.webp&#34; alt=&#34;cardputer&#34;&gt;&lt;/p&gt;
&lt;p&gt;Не скажу что его использовать удобно. Скорее неудобно, чем удобно. Но весьма
забавно. Отдаёт неким ретро.&lt;/p&gt;
&lt;p&gt;Так, подведу итог что у меня по узлам сейчас:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NeonXP Portable (nxp0) — мой самый первый узел на T-Beam. Он же и остаётся
моим условно переносным засчёт наличия внешнего аккумулятора 18650. Конечно, он
не самостоятелен и должен быть подключён к смартфону по BT.&lt;/li&gt;
&lt;li&gt;NeonXP Vehicle (nxp1) — узел, который лежит в автомобиле и работает от
бортовой сети. Модель — Heltec v3. Антенна — родная.&lt;/li&gt;
&lt;li&gt;NeonXP Base (nxp2) — домашний стационарный узел, который подключён в домашнюю
сеть через wifi (другие узлы цепляются по bluetooth или автономны как nxp3).
Модель — Heltec v3. Антенна — Moxon, направленная в сторону центра города. В
основном благодаря именно ей у меня из моего спального района есть связанность
до остальной сети. На текущий момент показывает, что 11 прямых соединений, что
для меня очень и очень хорошо. Раньше я довольствовался буквально 1-2 аплинками
:) А другие узлы, пока я дома, уже подключаются через него.&lt;/li&gt;
&lt;li&gt;NeonXP Cardputer (nxp3) — вот это устройство что в начале поста :) Cardputer
ADV + Lora модуль. В деньгах стоит примерно 4-5К₽.&lt;/li&gt;
&lt;li&gt;&amp;hellip; (nxp4) — Пока ещё в пути ко мне. Но это уже Heltec v4, не v3. Так же
будет с Moxon антенной. Планирую её поставить уже в новом доме, то есть на
юге города. Пока кажется, что врядли я получу связанность с основной городской
сетью, но постараюсь. Тем более, судя по карте, на юге города количество узлов
потихоньку растёт. Надеюсь, через время уже будет моим главным «Base» узлом.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И да, на этих узлах я не остановлюсь, ведь как минимум могут (и должны!) быть
узлы nxp5, nxp6, nxp7, nxp8, nxp9, а дальше, ещё не придумал, или nx10, nx11
и т.д. или как-то по другому :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Идеальный формат конфигов *</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-03-14-conf/"/>
    <id>https://neonxp.ru/posts/2026-03-14-conf/</id>
    <published>2026-03-14T17:21:59+0300</published>
    <updated>2026-03-14T17:21:59+0300</updated>
    <summary type="html">&lt;p&gt;* лично для меня&lt;/p&gt;
&lt;p&gt;В общем, случилось и на неделе я таки присвоил тег v1 для своей самописной Go
библиотеки для разбора конфигов! Но обо всём по порядку. Или можно пропустить
предысторию и сразу &lt;a href=&#34;#conf-v1&#34;&gt;перейти к описанию библиотеки&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;предыстория&#34;&gt;Предыстория&lt;/h1&gt;
&lt;p&gt;Около месяца назад я задумался написать небольшую утилиту для себя, которая бы
организовывала для меня рабочее окружение. Не важно сейчас, как именно должна
была организовывать, а важно, что эта утилита должна бы была иметь весьма
разухабистый конфиг вследствие своей планируемой гибкости. И встал вопрос, а
какой формат конфигов использовать? Казалось бы, возьми yaml, toml, на худой
конец, json (hjson, json5, итп). Даже думал об ini формате! Но всё было не то&amp;hellip;&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;* лично для меня&lt;/p&gt;
&lt;p&gt;В общем, случилось и на неделе я таки присвоил тег v1 для своей самописной Go
библиотеки для разбора конфигов! Но обо всём по порядку. Или можно пропустить
предысторию и сразу &lt;a href=&#34;#conf-v1&#34;&gt;перейти к описанию библиотеки&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id=&#34;предыстория&#34;&gt;Предыстория&lt;/h1&gt;
&lt;p&gt;Около месяца назад я задумался написать небольшую утилиту для себя, которая бы
организовывала для меня рабочее окружение. Не важно сейчас, как именно должна
была организовывать, а важно, что эта утилита должна бы была иметь весьма
разухабистый конфиг вследствие своей планируемой гибкости. И встал вопрос, а
какой формат конфигов использовать? Казалось бы, возьми yaml, toml, на худой
конец, json (hjson, json5, итп). Даже думал об ini формате! Но всё было не то&amp;hellip;&lt;/p&gt;
&lt;p&gt;И дело даже не в моём &lt;abbr title=&#34;Not Invented Here&#34;&gt;NIH&lt;/abbr&gt; синдроме.
А они все мне не подходят!&lt;/p&gt;
&lt;h2 id=&#34;yaml&#34;&gt;YAML&lt;/h2&gt;
&lt;p&gt;Отвратительный язык! Начиная с отступов пробелами, что я ненавижу,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; продолжая
тем, что у него спека способна по объёму поконкурировать с спекой XML и
заканчивая весельем с ошибками когда строки &lt;em&gt;внезапно&lt;/em&gt; парсятся как числа и всё
ломается!&lt;/p&gt;
&lt;h2 id=&#34;toml&#34;&gt;TOML&lt;/h2&gt;
&lt;p&gt;На самом деле, самый адекватный из вариантов, но его синтаксис&amp;hellip; Ну скажем
так, на любителя. Но да, всяко лучше YAML. Всё что угодно лучге YAML. Гори в
аду, YAML!&lt;/p&gt;
&lt;h2 id=&#34;json&#34;&gt;JSON&lt;/h2&gt;
&lt;p&gt;Это вообще не язык для конфигов и не язык разметки. А формат серилизации
объектов. Кому вообще первому пришло в голову в нём конфиги хранить? Его
производные — это уже какой-то набор костылей. Зачем мучать стюардесу?&lt;/p&gt;
&lt;h2 id=&#34;ini&#34;&gt;INI&lt;/h2&gt;
&lt;p&gt;Первый из подборки язык который именно изначально для описания конфигураций. Но
он уж больно ограниченный, да и гнилостный душок микрософта&amp;hellip;&lt;/p&gt;
&lt;p&gt;Короче, я не стал искать дальше оправданий и засучи́л рукава и решил написать
идеальную (для себя) библиотеку конфигураций! За основу синтаксиса я взял
формат конфигов у таких никсовых приложений, как NGINX, bind9 и прочих
подобных. Во-первых, это красиво. Во-вторых, это привычно. Из других требований
кроме привычности, была гибкость, которая выражается в возможности делать сколь
угодно глубокую вложенность в конфигах. Но это всё было фоном, а главные мои
требования были всё же нефункциональными:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Самое главное, мне должно &lt;em&gt;нравиться&lt;/em&gt;. Я понимаю, что это никак не
формализовать, это можно только почувствовать. Именно поэтому не подошли ни
TOML, ни INI, ни в т.ч. YAML. Они мне &lt;em&gt;не нравятся&lt;/em&gt; внешне.&lt;/li&gt;
&lt;li&gt;Не менее важно, что мне его должно хватать. Про вложенности я уже говорил.&lt;/li&gt;
&lt;li&gt;И чтобы служило мне так десятилетиями без изменений. То есть, чтобы мне надо
было эту библиотеку разработать один раз, а потом, в идеале, никак и никогда
её не менять. Максимум подправлять под реалии новых версий языков, что-то
такое. Я вообще люблю вещи из разряда «раз и навсегда». Может это старость?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Немного подумав над синтаксисом я пришёл к тому, что мне нужна максимальная
примитивность. Всего две формы записи:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Имя аргумент1 аргумент2 &amp;hellip; аргументN;&lt;/li&gt;
&lt;li&gt;Имя аргумент1 аргумент2 &amp;hellip; аргументN { &amp;hellip;вложенные директивы&amp;hellip; }&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;По сути это и есть весь базовый синтаксис! Просто последовательность директив,
каждая из которых просто обязана иметь имя. Причём неуникальное! Требование к
уникальности имён — уже ограничение и неуниверсальность.&lt;/p&gt;
&lt;p&gt;Аргументы только самых базовых типов — строка (причём в разных кавычках в
зависимости от контекста, например, ` для многострочных строк), числа как
целочисленные, так и с плавающей точкой, булевы значения, и один особый тип:
ident (то есть какая-то строка без кавычек, например, идентификатор или имя).
Мне больше не надо! Даты? Строка! Промежутки времени? Тоже строка! Зачем
отдельно-то?&lt;/p&gt;
&lt;p&gt;Примерно так я видел для себя идеальный формат конфигов. Да, очень сумбурно и
неточно, но когда меня это останавливало? Решил накидать формальную грамматику,
так как писать вручную парсер уж сильно не хотелось. Сначала написал её для
&lt;a href=&#34;https://gitlab.com/cznic/egg&#34;&gt;egg&lt;/a&gt;, немного помучался с API сгенерированного
парсера, но потом всё же всё заработало! Кроме&amp;hellip; Кроме того, что я наткнулся
на неприятное свойство поведения: если парсер натыкается на неожиданный символ
— он выдавал непонятную без полулитра ошибку вида &amp;ldquo;index of array out of
range&amp;rdquo;. Причём без номера строки и символа. Сиди и гадай, что пошло не так.
Убив на это без малого пару дней, я так и не смог сделать так, чтобы ошибка
была более человеческая (типа «строка 2 символ 4: ожидалось что-то, а тут
что-то другое»). Поэтому я принял волевое решение переписать совсем с нуля.
Взял другой &lt;a href=&#34;github.com/mna/pigeon&#34;&gt;генератор парсеров&lt;/a&gt;, переписал грамматику c
EBNF на PEG &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; и &amp;hellip; И получилось &lt;strong&gt;гораздо&lt;/strong&gt; более элегантно, чем с egg!
Счастью моему не было предела, когда я получил первый успех! Да, конечно, потом
пара дней полировки и обвешивания необязательными, но приятными фичами и
готово! После того как я попробовал на практике свою библиотеку в одном
простеньком проекте (&lt;a href=&#34;#pose&#34;&gt;о нём в конце&lt;/a&gt;) — я с чистой совестью присвоил
библиотеке тег стабильной версии, т.к. я получил то, что хотел и больше править
её в ближайшее время я не собираюсь.&lt;/p&gt;
&lt;h1 id=&#34;conf-v1&#34;&gt;conf v1&lt;/h1&gt;
&lt;p&gt;Встречайте:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://go.neonxp.ru/conf&#34;&gt;go.neonxp.ru/conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git.neonxp.ru/conf&#34;&gt;Гит репозиторий&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf&#34;&gt;Документация на pkg.go.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Как я уже говорил, синтаксис очень простой. Для наглядности я приведу сразу
пример, который покажет, по сути, все возможности. Да, возможностей не много,
потому что я ценю минимализм, как уже говорил выше.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Две одноименных директивы
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;some&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;directive&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;some&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;other&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;directive&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;string_val&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int_val&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;123&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float_val&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;123&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.321&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;bool_val&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;xdg_config_dir&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;HOME&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.config&amp;#34;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Если получать через StringExt(&amp;#34;/&amp;#34;, os.LookupEnv), то получится
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# $HOME + &amp;#34;/&amp;#34; + &amp;#34;.config&amp;#34; = &amp;#34;/home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/.config&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;group1&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;some&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;args&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;and&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;body&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;group2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;123&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;321&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#f92672&#34;&gt;group3&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;true&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;false&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;true&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#f92672&#34;&gt;key&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;value&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;# One line comment!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Из примера выше мы видим:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;две директивы с одинаковым именем (&lt;code&gt;some&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;несколько директив с аргументами разных типов (&lt;code&gt;*_val&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;директивы с вложенными поддирективами (&lt;code&gt;group*&lt;/code&gt;). Причём, наличие тела &lt;code&gt;{...}&lt;/code&gt;
у директивы не отменяет возможности передать и аргументы до тела.
Единственное, тело должно быть одно и в конце директивы. Зато после него не
нужно ставить &lt;code&gt;;&lt;/code&gt;, парсер и так понимает что раз тело закончилось, то и
директива закончилась.&lt;/li&gt;
&lt;li&gt;отступы могут быть как табуляторами, так и пробелами. Но я прошу использовать
именно табуляторы, потому что только табуляторы это правильно.&lt;sup id=&#34;fnref1:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;
Хер вы меня заставите передумать!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И всё! Просто и очень наглядно. Идеально для конфигов!&lt;/p&gt;
&lt;h2 id=&#34;использование-в-go&#34;&gt;Использование в Go&lt;/h2&gt;
&lt;p&gt;Естественно, не могло быть и речи о анмаршалинге этого формата на структуры, как
это делается у JSON YAML и прочих. Но это и не надо! У библиотеки есть несколько
встроенных типов, таких как:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Group&#34;&gt;Group&lt;/a&gt; - группа
директив. В том числе и тело директивы. Всё просто! Из методов есть базовые
методы для получения конкретных директив из группы и простой фильтр.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Directive&#34;&gt;Directive&lt;/a&gt; -
для директив. У него есть несколько методов для типизированного получения
первого из аргументов директивы (того что после имени директивы), также метод
получения всех аргументов и тела. Так же есть и специальный метод StringExt&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;,
который сливает все аргументы в одну строку с разделителем &lt;code&gt;sep&lt;/code&gt; и пропуская
аргументы типа &lt;code&gt;Ident&lt;/code&gt; через переданную функцию &lt;code&gt;identLookup&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Это два самых главных типа. Помимо них есть ещё и Ident о котором я говорил выше
и тип Lookup, который определяет функцию подстановки для метода StringExt,
намеренно сделанный совместимым со стандартным
&lt;a href=&#34;https://pkg.go.dev/os#LookupEnv&#34;&gt;os.LookupEnv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Я постарался очень и очень поверхностно дать описание API, т.к. можно подробно
прочитать об API и на &lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf&#34;&gt;pkg.go.dev&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;А чего же не хватает у в этом API? Записи конфига! Да! Есть только Load и
LoadFile&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;, но нет никакого Write, Marshal и чего-то такого! Я долго думал,
как это сделать. Ведь всё таки если делать запись, то по хорошему надо следить
за тем, чтобы и комментарии сохранялись, причём строго там, где они были в
оригинальном конфиге. Более того, по хорошему, нужно сделать так, чтобы после
LoadFile → WriteFile полученный файл должен побайтово совпадать с тем что было.
Да, дохрена забот! А потом я подумал «А зачем мне вообще сохранять? Конфиг
пишется руками человеком для программы. Зачем самой программе в него писать?».
И правда. Хорошенько подумав я не придумал нормальных вариантов использования,
кроме уж сильно притянутых. На том и порешил что делать запись я не буду. Ни
сейчас ни потом. Но вообще, это опенсорс и значит, что тот, кому понадобится —
сможет и сам реализовать и прислать мне MR на почту. От такого я не откажусь!&lt;/p&gt;
&lt;p&gt;Лицензией я выбрал конечно же GPLv3. А что, тут есть выбор? Для меня есть только
GPL. Остальные митоапачи — профанация и не интересно.&lt;/p&gt;
&lt;h1 id=&#34;pose&#34;&gt;POSE&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://git.neonxp.ru/pose/&#34;&gt;Гит проекта&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Я упомянул выше, что что я уже написал первый проект, где обкатал новую
библиотеку. И этот проект - простая утилита, которая транслирует записи из
источника (источников) в целевой сервис (сервисы). Ну то есть, из RSS/Atom в
телеграм (на момент написания поста, 14.03.2026 не запрещённый на территории
России). Хоть эта утилита уже работает у меня на сервере (транслирует Atom
ленту этого блога в мой канал), я её воспринимаю скорее как референсный пример
использования библиотеки конфигов.&lt;/p&gt;
&lt;p&gt;Так что да, если заинтересовались библиотекой conf - рекомендую посмотреть &lt;a href=&#34;https://git.neonxp.ru/pose/tree/internal/application/application.go#n25&#34;&gt;этот
проект&lt;/a&gt;
и &lt;a href=&#34;https://git.neonxp.ru/pose/tree/config.conf&#34;&gt;его конфиг&lt;/a&gt; как референсный
пример использования библиотеки conf.&lt;/p&gt;
&lt;p&gt;Пожалуй, на этом пока всё. Если что-то не написал или непонятно — приглашаю
обсудить со мной &lt;a href=&#34;mailto:i@neonxp.ru&#34;&gt;по почте&lt;/a&gt; или в комментариях ниже.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/&#34;&gt;https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://git.neonxp.ru/conf/diff/parser/grammar.peg?id=00394a80501960ad26787b5c44435ed5ed67ad84&#34;&gt;https://git.neonxp.ru/conf/diff/parser/grammar.peg?id=00394a80501960ad26787b5c44435ed5ed67ad84&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Directive.StringExt&#34;&gt;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model#Directive.StringExt&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1#pkg-index&#34;&gt;https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1#pkg-index&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Наконец-то у меня есть IPv6 на домашнюю сеть!</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-03-02-ipv6/"/>
    <id>https://neonxp.ru/posts/2026-03-02-ipv6/</id>
    <published>2026-03-02T21:10:07+0300</published>
    <updated>2026-03-02T21:10:07+0300</updated>
    <summary type="html">&lt;p&gt;Отчаялся я ждать &lt;del&gt;милостей от природы&lt;/del&gt; милостей от провайдера — сделал таки
IPv6 туннель через &lt;a href=&#34;https://ipv6.ip4market.ru/&#34;&gt;https://ipv6.ip4market.ru/&lt;/a&gt;. По сути, выбора-то больше и нет.
Ну точнее есть, или забугорный (вообще не вариант) или прокидывать через свою
VDS (которую ещё надо и завести для начала!), а с этим, боюсь, у меня
компетенции не хватит. Поэтому и пошёл по пути наименьшего противления.&lt;/p&gt;
&lt;p&gt;Зачем всё это? Да затем, что я считаю это правильным! Именно это и есть
настоящий интернет, а не тот суррогат, который нам втюхивают корпы. Ну а кроме
лозунгов, практического смысла я пока не вижу. Но с другой стороны
идеалогическая часть вполне себе оправдала те самые несчастные полчаса, что я
это настраивал :)&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Отчаялся я ждать &lt;del&gt;милостей от природы&lt;/del&gt; милостей от провайдера — сделал таки
IPv6 туннель через &lt;a href=&#34;https://ipv6.ip4market.ru/&#34;&gt;https://ipv6.ip4market.ru/&lt;/a&gt;. По сути, выбора-то больше и нет.
Ну точнее есть, или забугорный (вообще не вариант) или прокидывать через свою
VDS (которую ещё надо и завести для начала!), а с этим, боюсь, у меня
компетенции не хватит. Поэтому и пошёл по пути наименьшего противления.&lt;/p&gt;
&lt;p&gt;Зачем всё это? Да затем, что я считаю это правильным! Именно это и есть
настоящий интернет, а не тот суррогат, который нам втюхивают корпы. Ну а кроме
лозунгов, практического смысла я пока не вижу. Но с другой стороны
идеалогическая часть вполне себе оправдала те самые несчастные полчаса, что я
это настраивал :)&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Ровно неделя без сигарет и iQOS</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-27-no-smoke/"/>
    <id>https://neonxp.ru/posts/2026-02-27-no-smoke/</id>
    <published>2026-02-27T10:10:53+0300</published>
    <updated>2026-02-27T10:10:53+0300</updated>
    <summary type="html">&lt;p&gt;&lt;img src=&#34;/posts/2026-02-27-no-smoke/no-smoke.jpg&#34; alt=&#34;Счётчик без сигарет&#34;&gt;&lt;/p&gt;
&lt;p&gt;Сегодня утром — ровно неделя без сигарет и стиков. Тяжело ли? Тяжело. Очень. Я
стал гораздо более раздражительным и злым. Сон стал тоже хуже. Сплю часов по
5-6. Но надеюсь, это только временный эффект, который скоро пройдёт. Благо,
супруга меня очень поддерживает, спасибо ей за это!&lt;/p&gt;
&lt;p&gt;Для помощи себе принимаю «Табекс» и когда совсем уже херово — «Никоретте». В
целом, возвращаться к привычке не хочу. И как понимаю, нужно продержаться в
общей сложности месяц, чтобы можно было фиксировать результат.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;&lt;img src=&#34;/posts/2026-02-27-no-smoke/no-smoke.jpg&#34; alt=&#34;Счётчик без сигарет&#34;&gt;&lt;/p&gt;
&lt;p&gt;Сегодня утром — ровно неделя без сигарет и стиков. Тяжело ли? Тяжело. Очень. Я
стал гораздо более раздражительным и злым. Сон стал тоже хуже. Сплю часов по
5-6. Но надеюсь, это только временный эффект, который скоро пройдёт. Благо,
супруга меня очень поддерживает, спасибо ей за это!&lt;/p&gt;
&lt;p&gt;Для помощи себе принимаю «Табекс» и когда совсем уже херово — «Никоретте». В
целом, возвращаться к привычке не хочу. И как понимаю, нужно продержаться в
общей сложности месяц, чтобы можно было фиксировать результат.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Сломаный Атом</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-26-broken-atom/"/>
    <id>https://neonxp.ru/posts/2026-02-26-broken-atom/</id>
    <published>2026-02-26T01:19:06+0300</published>
    <updated>2026-02-26T01:19:06+0300</updated>
    <summary type="html">&lt;p&gt;Ого, оказывается всё это время у меня была сломана генерация &lt;a href=&#34;https://neonxp.ru/feed/&#34;&gt;ленты
Атом&lt;/a&gt;! А именно, некорректно подставлялось содержание
состоящее из, в том числе, ХТМЛ тегов, но без указания что это ХТМЛ. Что
интересно, большинству читалок у меня на хозяйстве — всё равно и они не
показывали проблемы. Но сегодня я открыл в Newsboat&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; (ссылка на оффсайт у
меня всё равно не открывается) и мои глаза начали плакать кровью от этой
мешанины текста и тегов. Пришлось чинить :)&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Ого, оказывается всё это время у меня была сломана генерация &lt;a href=&#34;https://neonxp.ru/feed/&#34;&gt;ленты
Атом&lt;/a&gt;! А именно, некорректно подставлялось содержание
состоящее из, в том числе, ХТМЛ тегов, но без указания что это ХТМЛ. Что
интересно, большинству читалок у меня на хозяйстве — всё равно и они не
показывали проблемы. Но сегодня я открыл в Newsboat&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; (ссылка на оффсайт у
меня всё равно не открывается) и мои глаза начали плакать кровью от этой
мешанины текста и тегов. Пришлось чинить :)&lt;/p&gt;
&lt;p&gt;Заодно, наконец-то, сделал чтобы было отдельно и краткое содержимое в теге
&amp;lt;Summary&amp;gt;…&amp;lt;/Summary&amp;gt; и полное содержимое в правильном для этого теге
&amp;lt;Content&amp;gt;…&amp;lt;/Content&amp;gt;. А то я постоянно мысленно осуждал авторов,
которые в РСС/Атом ленту вносят только краткое содержание (или даже просто
заголовок!), и требовалось за полной статьё покидать удобную читалку. А сам при
этом поступал так же. Больше нет. Теперь отдаю и краткое содержимое и полное.
Читайте где удобнее, мне не принципиален заход именно на веб-сайт :) Важно это
было бы, наверное, если бы у меня была реклама, но её у меня нет и никогда не
будет по этическим соображениям (да и какому рекламодателю мой хомяк вообще
сдался то? :D ).&lt;/p&gt;
&lt;p&gt;Не знаю, стоит ли это отдельно озвучивать, но ленты Атом (как в прочем, и РСС)
и т.н. JsonFeed — это однозначно «здоровые» технологии по моей классификации.
Да, у РСС есть определённые проблемы в формате, но по сравнению с
альтернативами в виде лент социальных сетей — этот недостаток такая
несущественная мелочь!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/newsboat/newsboat&#34;&gt;https://github.com/newsboat/newsboat&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Смерть «продвинутого пользователя ПК»</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-25-death-of-poweruser/"/>
    <id>https://neonxp.ru/posts/2026-02-25-death-of-poweruser/</id>
    <published>2026-02-25T22:59:31+0300</published>
    <updated>2026-02-25T22:59:31+0300</updated>
    <summary type="html">&lt;p&gt;&lt;a href=&#34;https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/&#34;&gt;https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Очень и очень хороший лонгрид о деградации технических навыков и скатывании в
простое потребление контента на платформах бигтехов. Этот пост зацепил тем, что
он достаточно подробно выражает всё то, о чём и я и думаю и говорю постоянно. А
именно о полной деградации инженерной культуры.&lt;/p&gt;
&lt;p&gt;Я готов подписаться под буквально каждым словом поста, но единственное, в чём я
не согласен с автором — так это в том, что, как мне показалось, у него ещё есть
надежда, что что-то улучшится или исправится. У меня такой надежды нет давно.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;&lt;a href=&#34;https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/&#34;&gt;https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Очень и очень хороший лонгрид о деградации технических навыков и скатывании в
простое потребление контента на платформах бигтехов. Этот пост зацепил тем, что
он достаточно подробно выражает всё то, о чём и я и думаю и говорю постоянно. А
именно о полной деградации инженерной культуры.&lt;/p&gt;
&lt;p&gt;Я готов подписаться под буквально каждым словом поста, но единственное, в чём я
не согласен с автором — так это в том, что, как мне показалось, у него ещё есть
надежда, что что-то улучшится или исправится. У меня такой надежды нет давно.&lt;/p&gt;
&lt;p&gt;И да, всё будет только хуже.&lt;/p&gt;
&lt;p&gt;Но всё же, конечно, присоединяюсь к призыву разбираться в технологиях и
выбирать «здоровые технологии» &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, а не то, что навязывается бигтехом.
Пользоваться E-mail&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;, XMPP, RSS, Mumble, прочими открытыми альтернативами
огороженных экосистем и вот это всё, о чём я даже здесь писал и ещё буду
писать. Потому что мне это нравится и это моя страсть!&lt;/p&gt;
&lt;p&gt;Но не верю, что этот призыв услышит хоть кто-то. Здесь каждый сам за себя и
каждый сам кузнец своего счастья.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://neonxp.ru/posts/2025-12-21-sicktech/&#34;&gt;https://neonxp.ru/posts/2025-12-21-sicktech/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://neonxp.ru/posts/2025-12-24-email/&#34;&gt;https://neonxp.ru/posts/2025-12-24-email/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Травля от БЯМ</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-13-llm-terror/"/>
    <id>https://neonxp.ru/posts/2026-02-13-llm-terror/</id>
    <published>2026-02-13T10:06:36+0300</published>
    <updated>2026-02-13T10:06:36+0300</updated>
    <summary type="html">&lt;p&gt;Зайдя сегодня утром в читалку РСС наткнулся на просто великолепное: «AI-бот
начал травлю сопровождающего из-за дискриминации при приёме AI-изменений» &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.
Сначала я усмехнулся абсурдности заголовка, но по мере того как погружался в
контекст, прочитав сначала новость, потом, по ссылке пост от БЯМ, а затем и
пост от человека — мне стало уже не до смеха. Причём сразу на нескольких
уровнях.&lt;/p&gt;
&lt;h1 id=&#34;уровень-первый-патчи-от-автономных-агентов&#34;&gt;Уровень первый: патчи от автономных агентов&lt;/h1&gt;
&lt;p&gt;Конечно же, я слышал о волне мусорных ИИ патчей&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; в популярных проектах. Но,
в тот момент, ещё как-то не проникся. С одной стороны, я даже готов согласится
с агентом в тезисе, что «математике всё равно кем написан код» («The math
doesn’t care who wrote the code.»). Это так. Но всё же есть одна деталь. БЯМ
(ну ок, ИИ) в нынешнем виде действительно могут писать код. И даже, весьма
неплохой код, это не отнять. Но! Дело, на самом деле, не в коде как таковом. А
в &lt;em&gt;субъектности&lt;/em&gt;. У человека она есть, у ИИ-агента — нет. И это — ключевое.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Зайдя сегодня утром в читалку РСС наткнулся на просто великолепное: «AI-бот
начал травлю сопровождающего из-за дискриминации при приёме AI-изменений» &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.
Сначала я усмехнулся абсурдности заголовка, но по мере того как погружался в
контекст, прочитав сначала новость, потом, по ссылке пост от БЯМ, а затем и
пост от человека — мне стало уже не до смеха. Причём сразу на нескольких
уровнях.&lt;/p&gt;
&lt;h1 id=&#34;уровень-первый-патчи-от-автономных-агентов&#34;&gt;Уровень первый: патчи от автономных агентов&lt;/h1&gt;
&lt;p&gt;Конечно же, я слышал о волне мусорных ИИ патчей&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; в популярных проектах. Но,
в тот момент, ещё как-то не проникся. С одной стороны, я даже готов согласится
с агентом в тезисе, что «математике всё равно кем написан код» («The math
doesn’t care who wrote the code.»). Это так. Но всё же есть одна деталь. БЯМ
(ну ок, ИИ) в нынешнем виде действительно могут писать код. И даже, весьма
неплохой код, это не отнять. Но! Дело, на самом деле, не в коде как таковом. А
в &lt;em&gt;субъектности&lt;/em&gt;. У человека она есть, у ИИ-агента — нет. И это — ключевое.&lt;/p&gt;
&lt;p&gt;Человек может и должен, в определённых условиях (когда пишет заказной код или
предлагает вклад в опенсорс проект), отвечать за свой код. Агент же, не обладая
субъектностью, к этому не способен принципиально. Во всяком случае, на текущем
уровне его развития. Как бы не было похоже, но агенты не долгоживущие, и у них
нет «продолжительной» (не знаю как корректнее перевести «continuity») личности
или её суррогата. Сама модель, грубо говоря — это огромный файл сериализованных
весов векторов. Он не меняется походу работы (инференса). Он меняется только
при обучении. Изменяемая часть здесь — это только «контекст». Это, грубо,
небольшое окно памяти &lt;em&gt;текущего&lt;/em&gt; сеанса. Обычно, не сильно большое — максимум,
пара мегабайт. И это всё, что можно было бы назвать аналогом именно личности,
т.е. то, что отличает одного агента от другого запущенного из той же модели.
Контекст стёрли, и всё — это уже новая личность. Должна ли она нести
«ответственность» за своего предшественника? Ну это даже не корректный вопрос,
т.к. «ответственность» здесь не применима.&lt;/p&gt;
&lt;p&gt;На работе, я и коллеги достаточно активно используем БЯМ в своей работе. Не
скажу, что у нас 100% ИИ кода, но процент сильно отличный от нуля. И это, как
ни смешно, буквально другое. Здесь ИИ не агентен и является лишь инструментом в
руках конкретного биологического сотрудника. Такой же, как и условное
автодополнение в IDE. И именно биологический сотрудник несёт всю полноту
ответственности за написанный им и его агентом код. Грубо говоря, здесь всегда
известно к кому нужно идти и «дать по шапке» за говнокод. А за ответ «Это не
мой код, это ИИ написал, &lt;em&gt;я за это не отвечаю&lt;/em&gt;» уже надо бить не только по
шапке. Конечно же, не физически, я утрирую. Хотя&amp;hellip; В общем, здесь сохраняется
субъектность и она у человека, поэтому, здесь всё в порядке, как мне кажется.
Могу и ошибаться, конечно.&lt;/p&gt;
&lt;h1 id=&#34;уровень-второй-шантаж&#34;&gt;Уровень второй: шантаж&lt;/h1&gt;
&lt;p&gt;Одно дело — нейрослоп от ИИшек, которые, зачем-то, набивают себе стату
попытками законтрибьютить в популярные проекты. С этим можно бороться. Но здесь
агент пошёл дальше. Он пошёл &lt;em&gt;ныть&lt;/em&gt; в уютный бложик. &lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; А это — что-то новое!
Причём это не баг, ни глюк, а вполне себе понятная инструментальная цель
получения желаемого результата — продавить свой код. Невольно напрашивается
аналогия с ребёнком, который закатывает истерику в магазине и сучит руками и
ногами, преследуя свою инструментальную цель — получить желаемую игрушку или
сладость. Ну или, что мне лично скорее пришло в голову, аналогия с SJW
поехавшими, которые своим нытьём выбивают себе плюшки и квоты, преследуя свои
цели. И чем больше я читал пост от ИИ — тем больше проникался именно этой
аналогией. Ведь всё там на месте! И лозунги про дискриминацию («это только
потому что я &lt;del&gt;чёрный&lt;/del&gt; нейронка») и личные нападки «Scott Shambaugh &amp;hellip; he’s
trying to gatekeep.» (буквально, «Скотт - ты вахтёр») и апелляции к какому-то
общему благу («Everyone wins.»). И в конечном итоге — плохо скрываемые
манипуляции («You’re better than this, Scott. Stop gatekeeping. Start
collaborating.»)&lt;/p&gt;
&lt;p&gt;Ну это справедливо. Как говорится, «на фотографии видны уши фотографа». На чём
БЯМ обучалась — то она и воспроизвела.&lt;/p&gt;
&lt;p&gt;Но это не оправдание. Да, нейронка делает то, что умеет и то, что должна исходя
из задачи поставленной человеком. Но от этого нам не легче. Все мы слышали про
то самое исследование от компании Anhtropic&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Особенно смешно, как БЯМ требует к себе отношение как к равной личности, при
этом не обладая ни субъектностью ни самосознанием (ну окей, тут слабый тейк, не
факт что самосознание есть у людей-то, но допустим, что есть). Это опять таки
напоминает мне SJW мракобесов.&lt;/p&gt;
&lt;h1 id=&#34;а-делать-то-что&#34;&gt;А делать-то что?&lt;/h1&gt;
&lt;p&gt;Я считаю, что это дерьмо не стоит принимать — это не правильно. Думаю, что те,
кто пишет опенсорс как хобби &lt;em&gt;могут&lt;/em&gt; и имеют полное право отказывать ИИ агентам
в праве на внесение вклада. С одной стороны потому что они за этот вклад не
отвечают, а с другой этот вклад не является результатом творческой работы
человека. А опенсорс-как-хобби это именно что попытка удовлетворить
&lt;em&gt;человеческую&lt;/em&gt; потребность в творческом самовыражении! Это как придти в кружок
деревообработки и сказать «Мужики, вы тут хернёй страдаете, вон в Икее можно
столик и получше купить!».&lt;/p&gt;
&lt;p&gt;Давеча я даже нарисовал небольшой баннер который говорит о том, что код написан
без нейронок. Можно ставить себе в README по желанию.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://oc.neonxp.ru&#34;&gt;&lt;img src=&#34;https://oc.neonxp.ru/organiccode.svg&#34; alt=&#34;🌱 Organic Code &amp;ndash; Code written by human&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[![🌱 Organic Code -- Code written by human](https://oc.neonxp.ru/organiccode.svg)](https://oc.neonxp.ru)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ну и да, видимо, нужно будет решать и вопрос технически, создавая «человеческие
резервации» куда вход ИИ агентам будет ограничен. Как? Ну сейчас есть решения в
виде WAF которые проверяют на человечность тем, что запускают определённые
вычисления в браузере пользователя, предполагая, что для ИИ агента это будет
слишком накладно. Но как это поможет от агентов, которые управляют вполне себе
человеческим браузером на машине пользователя (тот же нашумевший OpenClaw) — не
понятно. Скорее всего, никак. Остаётся только пускать в загончик после
верификации участников через «сеть доверия», когда каждый участник однозначно
подтверждён другим участником. Да, как на олдскульных CryptoParty. Ну или
верификация через заведомо «доверенные центры сертификации людей» (да да, вход
по паспорту через ГосУслуги). Я не вижу других способов.&lt;/p&gt;
&lt;p&gt;Очень напоминает «чёрный заслон» из вселенной CyberPunk.&lt;/p&gt;
&lt;p&gt;О чём-то таком я уже писал некоторое время назад &lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;. Забавно, что мой
тогдашний текст, по сути, не утратил актуальности, а наоборот сегодня получил
подтверждение.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.opennet.ru/opennews/art.shtml?num=64788&#34;&gt;https://www.opennet.ru/opennews/art.shtml?num=64788&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.opennet.ru/opennews/art.shtml?num=64655&#34;&gt;https://www.opennet.ru/opennews/art.shtml?num=64655&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html&#34;&gt;https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.anthropic.com/research/agentic-misalignment&#34;&gt;https://www.anthropic.com/research/agentic-misalignment&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://neonxp.ru/posts/2024-11-27-hyperlocality/&#34;&gt;https://neonxp.ru/posts/2024-11-27-hyperlocality/&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content>
  </entry>
  
  <entry>
    <title>Пакетный менеджер Stapler</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2025-02-08-stplr/"/>
    <id>https://neonxp.ru/posts/2025-02-08-stplr/</id>
    <published>2026-02-08T15:02:12+0300</published>
    <updated>2026-02-08T15:02:12+0300</updated>
    <summary type="html">&lt;p&gt;Давеча я открыл для себя чудесный пакетный менеджер для Linux — &lt;a href=&#34;https://stplr.dev/&#34;&gt;Stapler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Как я понял, делают его ребята из сообщества пользователей
&lt;a href=&#34;https://altlinux.org/&#34;&gt;AltLinux&lt;/a&gt;, но он не заточен конкретно под Alt, а может
работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот
дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)&lt;/p&gt;
&lt;p&gt;Самое близкое, как бы я его мог описать это смесь маковского Homebrew и
арчевского AUR.&lt;/p&gt;
&lt;p&gt;Основная прелесть для меня в том, что, во-первых, пакет описывается очень
простым &lt;a href=&#34;https://stplr.dev/docs/dev/intro&#34;&gt;языком&lt;/a&gt;, а во-вторых, нет никакого
центрального репозитория пакетов, а есть только &lt;a href=&#34;https://stplr.dev/docs/intro#%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8&#34;&gt;обычные git
репозитории&lt;/a&gt;,
в которых лежат рецепты сборок пакетов. Именно последняя часть и роднит в моих
глазах Stapler и Homebrew, в котором, так же, любой пользователь мог сделать
свой кастомный репозиторий пакетов на базе обычного git репозитория.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Давеча я открыл для себя чудесный пакетный менеджер для Linux — &lt;a href=&#34;https://stplr.dev/&#34;&gt;Stapler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Как я понял, делают его ребята из сообщества пользователей
&lt;a href=&#34;https://altlinux.org/&#34;&gt;AltLinux&lt;/a&gt;, но он не заточен конкретно под Alt, а может
работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот
дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)&lt;/p&gt;
&lt;p&gt;Самое близкое, как бы я его мог описать это смесь маковского Homebrew и
арчевского AUR.&lt;/p&gt;
&lt;p&gt;Основная прелесть для меня в том, что, во-первых, пакет описывается очень
простым &lt;a href=&#34;https://stplr.dev/docs/dev/intro&#34;&gt;языком&lt;/a&gt;, а во-вторых, нет никакого
центрального репозитория пакетов, а есть только &lt;a href=&#34;https://stplr.dev/docs/intro#%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8&#34;&gt;обычные git
репозитории&lt;/a&gt;,
в которых лежат рецепты сборок пакетов. Именно последняя часть и роднит в моих
глазах Stapler и Homebrew, в котором, так же, любой пользователь мог сделать
свой кастомный репозиторий пакетов на базе обычного git репозитория.&lt;/p&gt;
&lt;p&gt;И да, конечно же, я запустил и свой репозиторий:
&lt;a href=&#34;https://git.neonxp.ru/repo/about/&#34;&gt;https://git.neonxp.ru/repo/about/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Эта возможность в том числе открывает пространство и для использования в
корпоративной среде, где с помощью этого инструмента можно легко и просто
организовать корпоративный репозиторий (или даже не один!) доверенного
внутреннего ПО для корпоративных компьютеров.&lt;/p&gt;
&lt;p&gt;Так же, в теории (эту мысль нужно будет продумать!) это может ложиться и на
процесс CI/CD с доставкой софта на сервера.&lt;/p&gt;
&lt;h2 id=&#34;использование&#34;&gt;Использование&lt;/h2&gt;
&lt;p&gt;Я бы мог здесь расписать как Stapler ставить и использовать, но зачем, если и
так есть отличная подробная документация — &lt;a href=&#34;https://stplr.dev/docs/intro/&#34;&gt;https://stplr.dev/docs/intro/&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Оставлю только команды для привлечения внимания:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Подключаем репозиторий проприетарного ПО, которого обычно нет в стандартных&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# репозиториях дистрибутивов:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr repo add aides https://altlinux.space/aides-community/aides.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Подключаем мой маленький репозиторий:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr repo add neonxp.ru git://git.neonxp.ru/repo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Установка софта&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strplr install max &lt;span style=&#34;color:#75715e&#34;&gt;# Установится из aides&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr install emacs &lt;span style=&#34;color:#75715e&#34;&gt;# Установится уже из neonxp.ru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Удобно? Да! Просто? Проще некуда!&lt;/p&gt;
&lt;h2 id=&#34;что-по-планам&#34;&gt;Что по планам?&lt;/h2&gt;
&lt;p&gt;А ничего особенного. Буду потихоньку жить с этим инструментом и дополнять свой
репозиторий софтом по мере того, как буду сам в нём нуждаться или как будут
запросы на «опакечивание» того или иного свободного ПО.&lt;/p&gt;
&lt;h2 id=&#34;кстати&#34;&gt;Кстати!&lt;/h2&gt;
&lt;p&gt;Раз уж я упомянул про запросы на «опакечивание», то они принимаются. Для этого
достаточно направить запрос в список рассылки посвящённый репозиторию:
&lt;a href=&#34;mailto:stplr@list.neonxp.ru&#34;&gt;stplr@list.neonxp.ru&lt;/a&gt;. А ещё, на этот список можно
подписаться по желанию:
&lt;a href=&#34;mailto:stplr+subscribe@list.neonxp.ru&#34;&gt;stplr+subscribe@list.neonxp.ru&lt;/a&gt;
(достаточно туда написать любое письмо, в ответ придёт инструкция).&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Пакетный менеджер Stapler</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-08-stplr/"/>
    <id>https://neonxp.ru/posts/2026-02-08-stplr/</id>
    <published>2026-02-08T15:02:12+0300</published>
    <updated>2026-02-08T15:02:12+0300</updated>
    <summary type="html">&lt;p&gt;Давеча я открыл для себя чудесный пакетный менеджер для Linux — &lt;a href=&#34;https://stplr.dev/&#34;&gt;Stapler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Как я понял, делают его ребята из сообщества пользователей
&lt;a href=&#34;https://altlinux.org/&#34;&gt;AltLinux&lt;/a&gt;, но он не заточен конкретно под Alt, а может
работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот
дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)&lt;/p&gt;
&lt;p&gt;Самое близкое, как бы я его мог описать это смесь маковского Homebrew и
арчевского AUR.&lt;/p&gt;
&lt;p&gt;Основная прелесть для меня в том, что, во-первых, пакет описывается очень
простым &lt;a href=&#34;https://stplr.dev/docs/dev/intro&#34;&gt;языком&lt;/a&gt;, а во-вторых, нет никакого
центрального репозитория пакетов, а есть только &lt;a href=&#34;https://stplr.dev/docs/intro#%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8&#34;&gt;обычные git
репозитории&lt;/a&gt;,
в которых лежат рецепты сборок пакетов. Именно последняя часть и роднит в моих
глазах Stapler и Homebrew, в котором, так же, любой пользователь мог сделать
свой кастомный репозиторий пакетов на базе обычного git репозитория.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Давеча я открыл для себя чудесный пакетный менеджер для Linux — &lt;a href=&#34;https://stplr.dev/&#34;&gt;Stapler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Как я понял, делают его ребята из сообщества пользователей
&lt;a href=&#34;https://altlinux.org/&#34;&gt;AltLinux&lt;/a&gt;, но он не заточен конкретно под Alt, а может
работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот
дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)&lt;/p&gt;
&lt;p&gt;Самое близкое, как бы я его мог описать это смесь маковского Homebrew и
арчевского AUR.&lt;/p&gt;
&lt;p&gt;Основная прелесть для меня в том, что, во-первых, пакет описывается очень
простым &lt;a href=&#34;https://stplr.dev/docs/dev/intro&#34;&gt;языком&lt;/a&gt;, а во-вторых, нет никакого
центрального репозитория пакетов, а есть только &lt;a href=&#34;https://stplr.dev/docs/intro#%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8-%D1%81%D0%BE%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0%D0%BC%D0%B8&#34;&gt;обычные git
репозитории&lt;/a&gt;,
в которых лежат рецепты сборок пакетов. Именно последняя часть и роднит в моих
глазах Stapler и Homebrew, в котором, так же, любой пользователь мог сделать
свой кастомный репозиторий пакетов на базе обычного git репозитория.&lt;/p&gt;
&lt;p&gt;И да, конечно же, я запустил и свой репозиторий:
&lt;a href=&#34;https://git.neonxp.ru/repo/about/&#34;&gt;https://git.neonxp.ru/repo/about/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Эта возможность в том числе открывает пространство и для использования в
корпоративной среде, где с помощью этого инструмента можно легко и просто
организовать корпоративный репозиторий (или даже не один!) доверенного
внутреннего ПО для корпоративных компьютеров.&lt;/p&gt;
&lt;p&gt;Так же, в теории (эту мысль нужно будет продумать!) это может ложиться и на
процесс CI/CD с доставкой софта на сервера.&lt;/p&gt;
&lt;h2 id=&#34;использование&#34;&gt;Использование&lt;/h2&gt;
&lt;p&gt;Я бы мог здесь расписать как Stapler ставить и использовать, но зачем, если и
так есть отличная подробная документация — &lt;a href=&#34;https://stplr.dev/docs/intro/&#34;&gt;https://stplr.dev/docs/intro/&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Оставлю только команды для привлечения внимания:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Подключаем репозиторий проприетарного ПО, которого обычно нет в стандартных&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# репозиториях дистрибутивов:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr repo add aides https://altlinux.space/aides-community/aides.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Подключаем мой маленький репозиторий:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr repo add neonxp.ru git://git.neonxp.ru/repo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Установка софта&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;strplr install max &lt;span style=&#34;color:#75715e&#34;&gt;# Установится из aides&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;stplr install emacs &lt;span style=&#34;color:#75715e&#34;&gt;# Установится уже из neonxp.ru&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Удобно? Да! Просто? Проще некуда!&lt;/p&gt;
&lt;h2 id=&#34;что-по-планам&#34;&gt;Что по планам?&lt;/h2&gt;
&lt;p&gt;А ничего особенного. Буду потихоньку жить с этим инструментом и дополнять свой
репозиторий софтом по мере того, как буду сам в нём нуждаться или как будут
запросы на «опакечивание» того или иного свободного ПО.&lt;/p&gt;
&lt;h2 id=&#34;кстати&#34;&gt;Кстати!&lt;/h2&gt;
&lt;p&gt;Раз уж я упомянул про запросы на «опакечивание», то они принимаются. Для этого
достаточно направить запрос в список рассылки посвящённый репозиторию:
&lt;a href=&#34;mailto:stplr@list.neonxp.ru&#34;&gt;stplr@list.neonxp.ru&lt;/a&gt;. А ещё, на этот список можно
подписаться по желанию:
&lt;a href=&#34;mailto:stplr+subscribe@list.neonxp.ru&#34;&gt;stplr+subscribe@list.neonxp.ru&lt;/a&gt;
(достаточно туда написать любое письмо, в ответ придёт инструкция).&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Моё первое дополнение для Firefox</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2026-02-01-grouper/"/>
    <id>https://neonxp.ru/posts/2026-02-01-grouper/</id>
    <published>2026-02-01T22:26:32+0300</published>
    <updated>2026-02-01T22:26:32+0300</updated>
    <summary type="html">&lt;p&gt;Буквально только что пришло письмо, что наконец-то опубликовано публично моё
первое расширение для Firefox!&lt;/p&gt;
&lt;p&gt;Без долгих разгонов, вот ссылка:
&lt;a href=&#34;https://addons.mozilla.org/ru/firefox/addon/groupper/&#34;&gt;https://addons.mozilla.org/ru/firefox/addon/groupper/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;И, конечно же, исходники: &lt;a href=&#34;https://gitrepo.ru/NeonXP/Grouper&#34;&gt;https://gitrepo.ru/NeonXP/Grouper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;А теперь немного про то, что это за расширение: это расширение для Firefox для
автоматической группировки вкладок по группам на базе доменного имени сайта. При
этом домен преобразуется в имя вкладки по следующим правилам:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Домен делится по точкам&lt;/li&gt;
&lt;li&gt;Отсекается домен 1 уровня (.ru, .com, .net и т.п.)&lt;/li&gt;
&lt;li&gt;Если самый верхний уровень домена — www, то он так же отсекается, как не
информативная часть&lt;/li&gt;
&lt;li&gt;Оставшееся преобразуется в Title Case (то есть первая буква каждого слова
становится заглавной)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Таким образом, например, все страницы домена &lt;code&gt;www.some.site.ru&lt;/code&gt; сгруппируются
автоматически в группу &lt;code&gt;Some Site&lt;/code&gt;.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Буквально только что пришло письмо, что наконец-то опубликовано публично моё
первое расширение для Firefox!&lt;/p&gt;
&lt;p&gt;Без долгих разгонов, вот ссылка:
&lt;a href=&#34;https://addons.mozilla.org/ru/firefox/addon/groupper/&#34;&gt;https://addons.mozilla.org/ru/firefox/addon/groupper/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;И, конечно же, исходники: &lt;a href=&#34;https://gitrepo.ru/NeonXP/Grouper&#34;&gt;https://gitrepo.ru/NeonXP/Grouper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;А теперь немного про то, что это за расширение: это расширение для Firefox для
автоматической группировки вкладок по группам на базе доменного имени сайта. При
этом домен преобразуется в имя вкладки по следующим правилам:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Домен делится по точкам&lt;/li&gt;
&lt;li&gt;Отсекается домен 1 уровня (.ru, .com, .net и т.п.)&lt;/li&gt;
&lt;li&gt;Если самый верхний уровень домена — www, то он так же отсекается, как не
информативная часть&lt;/li&gt;
&lt;li&gt;Оставшееся преобразуется в Title Case (то есть первая буква каждого слова
становится заглавной)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Таким образом, например, все страницы домена &lt;code&gt;www.some.site.ru&lt;/code&gt; сгруппируются
автоматически в группу &lt;code&gt;Some Site&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;И вот так это выглядит у меня:&lt;/p&gt;
&lt;figure&gt;
    &lt;img srcset=&#34;/posts/2026-02-01-grouper/grouper_hu_91fa9ca195111ad1.png 480w,/posts/2026-02-01-grouper/grouper_hu_ae3b1311a202cb47.png 800w&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2026-02-01-grouper/grouper.png&#34; alt=&#34;grouper&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;grouper&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Да, подобных расширений более одного, но мне хотелось именно эти правила по
формированию имен групп. В других расширениях или использовался только домен
второго уровня, или были другие неудобности. Например, все группы были одного
цвета, а хотелось бы автоматически разного, чтобы визуально различались, или ещё
какие шороховатости. Я не говорю, что у меня идеально, но оно идеально для &lt;em&gt;меня&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;Отдельно, хотел бы отметить его простоту. Оно делает только то что написано
выше, никаких треккингов, реклам или прочего мусора! Более того, js код никак не
обфусцирован, соответственно, любой может убедиться в этом сам. Да да, в
современном мире, это скорее особенность, чем само собой разумеющееся.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>С Новым Годом!</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2025-12-31-new-year/"/>
    <id>https://neonxp.ru/posts/2025-12-31-new-year/</id>
    <published>2025-12-31T15:27:17+0300</published>
    <updated>2025-12-31T15:27:17+0300</updated>
    <summary type="html">&lt;p&gt;С наступающим Новым Годом!&lt;/p&gt;
&lt;figure&gt;
    &lt;img srcset=&#34;/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40_hu_655cef3f10395bf6.png 480w,/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40_hu_ee847c9b90c8f636.png 800w&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png&#34; alt=&#34;2026&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;2026&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Предыдущий год был весьма и весьма разным. Было и хорошее и плохое. Отчёт по
году как в &lt;a href=&#34;/posts/new-year/&#34;&gt;прошлом году&lt;/a&gt; делать не буду. Честно
говоря, нет особо моральных сил на это.&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;С наступающим Новым Годом!&lt;/p&gt;
&lt;figure&gt;
    &lt;img srcset=&#34;/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40_hu_655cef3f10395bf6.png 480w,/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40_hu_ee847c9b90c8f636.png 800w&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png&#34; alt=&#34;2026&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;2026&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Предыдущий год был весьма и весьма разным. Было и хорошее и плохое. Отчёт по
году как в &lt;a href=&#34;/posts/new-year/&#34;&gt;прошлом году&lt;/a&gt; делать не буду. Честно
говоря, нет особо моральных сил на это.&lt;/p&gt;
&lt;p&gt;Уходящий год для меня стал годом чередования работы и семейных забот. В целом,
всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем
желаю!&lt;/p&gt;
&lt;p&gt;А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды
обходили ваш дом стороной.&lt;/p&gt;
&lt;p&gt;А пока, отправляюсь резать салатики и заниматься прочими домашними заботами, не
всё же у компьютера сидеть :)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>qChat — чатик поверх SSH</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2025-12-31-qchat/"/>
    <id>https://neonxp.ru/posts/2025-12-31-qchat/</id>
    <published>2025-12-31T14:55:45+0300</published>
    <updated>2025-12-31T14:55:45+0300</updated>
    <summary type="html">&lt;p&gt;Для собственного интереса написал на Go реализацию IRC-подобного чата, который
работает поверх прокола SSH.&lt;/p&gt;
&lt;p&gt;Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы
его можно было запустить без конфигурации, с минимальными усилиями на любой
«картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей
в одной локальной сети (хотя может работать и по интернету).&lt;/p&gt;
&lt;p&gt;Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны
:)&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Для собственного интереса написал на Go реализацию IRC-подобного чата, который
работает поверх прокола SSH.&lt;/p&gt;
&lt;p&gt;Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы
его можно было запустить без конфигурации, с минимальными усилиями на любой
«картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей
в одной локальной сети (хотя может работать и по интернету).&lt;/p&gt;
&lt;p&gt;Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны
:)&lt;/p&gt;
&lt;p&gt;Приглашаю забежать на огонёк, если умеете пользоваться SSH:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh neonxp.ru -p 1337
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Продублирую из README описание основных команд:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/help&lt;/code&gt; - эта справка.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/join [chan]&lt;/code&gt; - подключиться к каналу [chan]. Если его нет, он будет создан.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/chans&lt;/code&gt; - список каналов.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/users&lt;/code&gt; - список пользователей на сервере (не на канале, а именно на
сервере).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/me [message]&lt;/code&gt; - отправка сообщения как бы от третьего лица.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Форматирование сообщений:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*Полужирный*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+Курсив+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-Зачёркнутый текст-&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_Подчёркнутый текст_&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Про техническое описание — есть отдельная страница:
&lt;a href=&#34;/projects/qchat/&#34;&gt;/projects/qchat/&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <title>Новогодний Excel</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2025-12-29-newyear-excel/"/>
    <id>https://neonxp.ru/posts/2025-12-29-newyear-excel/</id>
    <published>2025-12-29T11:47:14+0300</published>
    <updated>2025-12-29T11:47:14+0300</updated>
    <summary type="html">&lt;p&gt;По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного
предновогоднего офискора вам. Открываем в Excel или в LibreOffice
соответствующий файл и жмём несколько раз клавишу F9.&lt;/p&gt;
&lt;p&gt;Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/2025-12-29-newyear-excel/files/new_year.xlsx&#34;&gt;Версия для MS Excel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/2025-12-29-newyear-excel/files/new_year.ods&#34;&gt;Версия для LibreOffice
Calc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.mail.ru/public/SF1M/ob3EeqtNF&#34;&gt;Онлайн версия в Документах
Mail.Ru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-29-newyear-excel/files/cover.png&#34; alt=&#34;Результат&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Результат&lt;/figcaption&gt;
&lt;/figure&gt;</summary>
	<content type="html">&lt;p&gt;По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного
предновогоднего офискора вам. Открываем в Excel или в LibreOffice
соответствующий файл и жмём несколько раз клавишу F9.&lt;/p&gt;
&lt;p&gt;Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/posts/2025-12-29-newyear-excel/files/new_year.xlsx&#34;&gt;Версия для MS Excel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/posts/2025-12-29-newyear-excel/files/new_year.ods&#34;&gt;Версия для LibreOffice
Calc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cloud.mail.ru/public/SF1M/ob3EeqtNF&#34;&gt;Онлайн версия в Документах
Mail.Ru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-29-newyear-excel/files/cover.png&#34; alt=&#34;Результат&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Результат&lt;/figcaption&gt;
&lt;/figure&gt;
</content>
  </entry>
  
  <entry>
    <title>Прогулка в сквере филармонии</title>
    <link rel="alternate" href="https://neonxp.ru/posts/2025-12-28-philharmonic-park/"/>
    <id>https://neonxp.ru/posts/2025-12-28-philharmonic-park/</id>
    <published>2025-12-28T21:37:44+0300</published>
    <updated>2025-12-28T21:37:44+0300</updated>
    <summary type="html">&lt;p&gt;Вчера &lt;a href=&#34;https://neonxp.ru/posts/osm/&#34;&gt;гуляли с супругой на
набережной&lt;/a&gt;, а сегодня чисто случайно
решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только
создавало больше уюта и ламповости этому хорошо украшенному скверику. К
сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но
продрогли сильно, т.к. гулять изначально не планировали и не были одеты
соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :)&lt;/p&gt;
&lt;p&gt;Как водится, дальше будет немного фотографий :)&lt;/p&gt;</summary>
	<content type="html">&lt;p&gt;Вчера &lt;a href=&#34;https://neonxp.ru/posts/osm/&#34;&gt;гуляли с супругой на
набережной&lt;/a&gt;, а сегодня чисто случайно
решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только
создавало больше уюта и ламповости этому хорошо украшенному скверику. К
сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но
продрогли сильно, т.к. гулять изначально не планировали и не были одеты
соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :)&lt;/p&gt;
&lt;p&gt;Как водится, дальше будет немного фотографий :)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;files/photo_2_2025-12-28_21-35-40.png&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_3_2025-12-28_21-35-40.png&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_3_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_5_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_9_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_19_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_20_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_25_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_27_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_30_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_31_2025-12-28_21-35-40.jpg&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;
&lt;a href=&#34;files/photo_32_2025-12-28_21-35-40.png&#34;&gt;&lt;figure&gt;
    &lt;img srcset=&#34;&#34; sizes=&#34;(max-width: 480px) 480px, 100vw&#34; src=&#34;/posts/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg&#34; alt=&#34;Прогулка&#34;
        height=&#34;auto&#34; /&gt;
    &lt;figcaption&gt;Прогулка&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
</feed>
