<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru-ru">
  <title>~/NeonXP.log</title>
    <link rel="self" type="application/atom+xml" hreflang="ru-ru" href="https://neonxp.ru/feed.xml" />
    <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/" />
    <link rel="alternate" type="application/rss+xml" hreflang="ru-ru" href="https://neonxp.ru/index.xml" /><id>/</id>
  <updated>2026-05-02T21:40:51Z</updated>
  <author>
    <name></name>
    
    
  </author><generator>Hugo 0.155.1</generator>
  <entry>
    <title><![CDATA[Смартфон - OnePlus 10T (рутованный)]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/pages/setup/pda/" />
    <id>https://neonxp.ru/pages/setup/pda/</id>
    <updated>2026-05-03T12:33:38Z</updated>
    <summary type="html"><![CDATA[<p>Бо́льшая часть гуглоговна удалена или отключена. В основном, стараюсь использовать софт из F - Droid.</p>
<p>В основном, стараюсь держать минимально необходимый набор софта — банковские приложения, навигацию, коммуникационные приложения, читалки, да пару простеньких игрушек для скрашивания досуга.</p>
<p>Самое главное — по максимуму отключаю всевозможные уведомления. Ничего не должно меня тревожить. Всё так же остаюсь сторонником идеи что пуши не нужны, а что - то <em>действительно</em> важное — и так придёт на e - mail. Единственное исключение — jabber и рабочий мессенджер. Первый — это этакий бонус узкому элитарному кругу пользователей джаббера, а второй — поскольку рабочие обязанности важнее моих заморочек.</p>]]></summary><content type="html"><![CDATA[<p>Бо́льшая часть гуглоговна удалена или отключена. В основном, стараюсь использовать софт из F - Droid.</p>
<p>В основном, стараюсь держать минимально необходимый набор софта — банковские приложения, навигацию, коммуникационные приложения, читалки, да пару простеньких игрушек для скрашивания досуга.</p>
<p>Самое главное — по максимуму отключаю всевозможные уведомления. Ничего не должно меня тревожить. Всё так же остаюсь сторонником идеи что пуши не нужны, а что - то <em>действительно</em> важное — и так придёт на e - mail. Единственное исключение — jabber и рабочий мессенджер. Первый — это этакий бонус узкому элитарному кругу пользователей джаббера, а второй — поскольку рабочие обязанности важнее моих заморочек.</p>
<p>Из интересного:</p>
<ul>
<li>ntodotxt - тудушник, который отлично работает с Todo.txt.</li>
<li>Conversations - jabber.</li>
<li>syncthing - синхронизация.</li>
<li>DAVx5 - приложение для синхронизации календарей и контактов с NAS.</li>
<li>DS File, DS Get - приложения для работы с NAS.</li>
<li>OSMand и OrganicMaps - оффлайн навигация. Ни раз выручала, когда онлайновый   карты приказывали долго жить без интернетов.</li>
<li>AntennaPod - ИМХО лучшее приложение для подкастов.</li>
<li>AIMP - замечательный аудио плеер для локальной музыки.</li>
<li>VLC - отличный видеоплеер.</li>
<li>KDE Connect - стоит исключительно для быстрого перебрасывания файлов на   компьютер.</li>
</ul>
<p>Вроде, из самого интересного — всё. Буду дописывать, если что ещё вспомню.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:33:38Z</published></entry>
  <entry>
    <title><![CDATA[Ноутбук]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/pages/setup/laptop/" />
    <id>https://neonxp.ru/pages/setup/laptop/</id>
    <updated>2026-05-03T12:33:38Z</updated>
    <summary type="html"><![CDATA[<p>Уже достаточно давно я сторонник исключительно ноутбуков и никак не воспринимаю стационарные компьютеры. При этом, я считаю, что ноутбук должен быть одновременно и мощным, мобильным и, что важно, ремонтопригодным, даже в домашних условиях. Понимаю, что на практике это практически не осуществимо. Но самым близким к этому для меня стал Lenovo Thinkpad T14 Gen4, версия на intel (это важно, т.к. только intel версия поддерживает расширение ОЗУ). ОЗУ я в нем добил до 48Гб, пока мне хватает.</p>]]></summary><content type="html"><![CDATA[<p>Уже достаточно давно я сторонник исключительно ноутбуков и никак не воспринимаю стационарные компьютеры. При этом, я считаю, что ноутбук должен быть одновременно и мощным, мобильным и, что важно, ремонтопригодным, даже в домашних условиях. Понимаю, что на практике это практически не осуществимо. Но самым близким к этому для меня стал Lenovo Thinkpad T14 Gen4, версия на intel (это важно, т.к. только intel версия поддерживает расширение ОЗУ). ОЗУ я в нем добил до 48Гб, пока мне хватает.</p>
<p>Вот основное что на нём установлено:</p>
<ul>
<li>ОС: AltLinux p11.</li>
<li>DE: Gnome 48</li>
<li>Эмулятор терминала: Ghostty.</li>
<li>Оболочка: zsh.</li>
<li>Текстовый редактор: Neovim/VSCodium</li>
<li>Браузер: Яндекс Браузер.</li>
<li>Коммуникации: Thunderbird/Neomutt (e - mail), Dino (jabber), telegram desktop   (будь он неладен).</li>
<li>Музыка: Rhythmbox.</li>
<li>Видео: VLC.</li>
<li>Книги: лежат на NAS + сразу достаточно много загрузил в читалку. Была calibre,   но я так и не оценил от неё плюсов и дропнул.</li>
<li>Основной язык: golang (удивительно).</li>
<li>Синхронизация: с помощью syncthing синхронизирую ноутбук < - > NAS < - > смартфон   только одну директорию: Документы. По сути, не считая директории с исходниками   проектов, это моя самая важная директория на компьютере.</li>
<li>Хранилище знаний: <del>[Obsidian](/posts/2024 - 11 - 17 - obsidian/)</del> пока   присматриваюсь к ZK или к обычным текстовым файлам</li>
</ul>
<p>Это база, остальное не столько важно.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:33:38Z</published></entry>
  <entry>
    <title><![CDATA[NAS - Synology DS420+]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/pages/setup/nas/" />
    <id>https://neonxp.ru/pages/setup/nas/</id>
    <updated>2026-05-03T12:33:38Z</updated>
    <summary type="html"><![CDATA[<p>Это, наверное, одно из лучших моих вложений денег. Мой личный суверенитет от облаков.</p>
<p>Основные функции:</p>
<ul>
<li>Собственно, синхронизация той самой важной для меня директории «Документы».   Потому что её потерю я точно не смогу восполнить.</li>
<li>Инкрементальный бекап ноутбука через rsync, как я где - то уже писал, вроде в   телеге (может стоит и здесь оставить заметку на всякий случай?).</li>
<li>Календарь / контакты по webdav. Просто приятно. Хорошая альтернатива облакам.</li>
<li>Торрентокачалка. Пиратство морально оправдано. Точка.</li>
<li>Медиасервер. В основном чтобы просматривать трофейный контент на смарт тв.</li>
<li>TT - RSS. Читаю RSS ленты на смартфоне и ноутбуке, а TT - RSS позволяет   синхронизировать уже прочитанное.</li>
</ul>
<p>Утерянный или недоделанный функционал:</p>]]></summary><content type="html"><![CDATA[<p>Это, наверное, одно из лучших моих вложений денег. Мой личный суверенитет от облаков.</p>
<p>Основные функции:</p>
<ul>
<li>Собственно, синхронизация той самой важной для меня директории «Документы».   Потому что её потерю я точно не смогу восполнить.</li>
<li>Инкрементальный бекап ноутбука через rsync, как я где - то уже писал, вроде в   телеге (может стоит и здесь оставить заметку на всякий случай?).</li>
<li>Календарь / контакты по webdav. Просто приятно. Хорошая альтернатива облакам.</li>
<li>Торрентокачалка. Пиратство морально оправдано. Точка.</li>
<li>Медиасервер. В основном чтобы просматривать трофейный контент на смарт тв.</li>
<li>TT - RSS. Читаю RSS ленты на смартфоне и ноутбуке, а TT - RSS позволяет   синхронизировать уже прочитанное.</li>
</ul>
<p>Утерянный или недоделанный функционал:</p>
<ul>
<li>Синхронизация подкастов по протоколу gpodder (AntennaPod на смартфоне и в   автомобиле + Kasts на ноутбуке). Раньше синкал через Nextcloud, отказался от   него. Пилю синхронизацию в свободное время. Когда допилю — расскажу в этом   блоге.</li>
<li>Медиастримминг музыки с NAS на смартфон / компьютер / автомобиль. Пока не   дошли руки наладить. Обхожусь дедовскими способами — на каждом устройстве   просто локальная медиатека.</li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:33:38Z</published></entry>
  <entry>
    <title><![CDATA[Мелкие PWA]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/pwa/" />
    <id>https://neonxp.ru/projects/pwa/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p>Мои маленькие навайбкоженные PWA (Progressive Web Applications).</p>
<ul>
<li><a href="https://days.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://days.neonxp.ru/</a> - счётчик дней от даты или до даты</li>
<li><a href="https://calm.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://calm.neonxp.ru/</a> - помощник по техникам дыхания</li>
</ul>]]></summary><content type="html"><![CDATA[<p>Мои маленькие навайбкоженные PWA (Progressive Web Applications).</p>
<ul>
<li><a href="https://days.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://days.neonxp.ru/</a> - счётчик дней от даты или до даты</li>
<li><a href="https://calm.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://calm.neonxp.ru/</a> - помощник по техникам дыхания</li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[stplr репозиторий свободного ПО]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/stplr/" />
    <id>https://neonxp.ru/projects/stplr/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p>В этом репозитории три основных группы софта:</p>
<ol>
<li>GNU софт</li>
<li>Софт который я использую в повседневной жизни и он мне нужен</li>
<li>Софт который пишу я (на Golang)</li>
</ol>
<p>При этом, я не вижу проблемы добавлять пакеты нужные другим людям. Но это должен быть исключительно свободный софт и приоритетно под лицензией семейства GPL.</p>
<p>Для заказа нужного вам пакета - пишите в группу рассылки репозитория: <a href="mailto:stplr@list.neonxp.ru">mailto:stplr@list.neonxp.ru</a></p>
<p>Для подписки на список рассылки репозитория отправьте любое письмо на адрес <a href="mailto:stplr+subscribe@list.neonxp.ru">mailto:stplr+subscribe@list.neonxp.ru</a>, а дальше, следуйте присланной инструкции.</p>]]></summary><content type="html"><![CDATA[<p>В этом репозитории три основных группы софта:</p>
<ol>
<li>GNU софт</li>
<li>Софт который я использую в повседневной жизни и он мне нужен</li>
<li>Софт который пишу я (на Golang)</li>
</ol>
<p>При этом, я не вижу проблемы добавлять пакеты нужные другим людям. Но это должен быть исключительно свободный софт и приоритетно под лицензией семейства GPL.</p>
<p>Для заказа нужного вам пакета - пишите в группу рассылки репозитория: <a href="mailto:stplr@list.neonxp.ru">mailto:stplr@list.neonxp.ru</a></p>
<p>Для подписки на список рассылки репозитория отправьте любое письмо на адрес <a href="mailto:stplr+subscribe@list.neonxp.ru">mailto:stplr+subscribe@list.neonxp.ru</a>, а дальше, следуйте присланной инструкции.</p>
<h2 id="установка-репозитория">Установка репозитория</h2>
<ol>
<li>
<p>Сначала нужно установить пакетный менеджер Stapler —    <a href="https://stplr.dev/docs/intro"target="_blank" rel="noopener noreferrer">https://stplr.dev/docs/intro</a></p>
</li>
<li>
<p>Добавление этого репозитория в Stapler:</p>
<p><code>    stplr repo add neonxp.ru git://git.neonxp.ru/repo    </code></p>
</li>
</ol>
<h2 id="установка-приложений">Установка приложений</h2>
<p>После добавления репозитория, установка любого приложения заключается в простой команде</p>
<p><code>stplr install имя_приложения</code></p>
<p>Например,</p>
<p><code>stplr install recutils</code></p>
<h2 id="ссылки">Ссылки</h2>
<ul>
<li>Пост в блоге про Stapler и этот репозиторий: [https://neonxp.ru/posts/2025 - 02 - 08 - stplr/](https://neonxp.ru/posts/2025 - 02 - 08 - stplr/)</li>
<li>Сайт Stapler: <a href="https://stplr.dev"target="_blank" rel="noopener noreferrer">https://stplr.dev/</a></li>
<li>Репозиторий Aides: <a href="https://aides.space/"target="_blank" rel="noopener noreferrer">https://aides.space/</a></li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[qChat - quick chat]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/qchat/" />
    <id>https://neonxp.ru/projects/qchat/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p>Репозиторий: <a href="https://gitrepo.ru/NeonXP/qChat"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/qChat</a></p>
<p>Очень маленький и минималистичный чат, который реализует собой чат поверх SSH.</p>
<hr>
<p>Внешних зависимостей нет, должен работать на любой картошке.</p>
<p>Подключение к демонстрационному чату:</p>
<p><code>ssh neonxp.ru - p 1337</code></p>]]></summary><content type="html"><![CDATA[<p>Репозиторий: <a href="https://gitrepo.ru/NeonXP/qChat"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/qChat</a></p>
<p>Очень маленький и минималистичный чат, который реализует собой чат поверх SSH.</p>
<hr>
<p>Внешних зависимостей нет, должен работать на любой картошке.</p>
<p>Подключение к демонстрационному чату:</p>
<p><code>ssh neonxp.ru - p 1337</code></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[PICO - 8 - Мои небольшие игрушки на прекрасном движке PICO - 8]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/games/" />
    <id>https://neonxp.ru/projects/games/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/projects/games/bubblebreaker.p8.png"
        alt="bubblebreaker.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/gameof15.p8.png"
        alt="gameof15.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/lines.p8.png"
        alt="lines.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/snake.p8.png"
        alt="snake.p8.png"/></p>
<hr>
<p>И на всякий случай дистрибутивы самих приложений. Ведь их больше не купить у нас в стране, а значит это не пиратство, а корсарство! Яррр!</p>
<h1 id="pico---8">PICO - 8</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>[Скачать](/files/pico - 8_0_2_6b_amd64.zip)</td>
          <td>[Скачать](/files/pico - 8_0_2_6b_osx.zip)</td>
          <td>[Скачать](/files/pico - 8_0_2_6b_windows.zip)</td>
      </tr>
  </tbody>
</table>
<h1 id="picotron">Picotron</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/files/picotron_0_1_0g_amd64.zip">Скачать</a></td>
          <td><a href="/files/picotron_0_1_0g_osx.zip">Скачать</a></td>
          <td><a href="/files/picotron_0_1_0g_windows.zip">Скачать</a></td>
      </tr>
  </tbody>
</table>
<h1 id="voxatron">Voxatron</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/files/voxatron_0_3_5b_amd64.zip">Скачать</a></td>
          <td><a href="/files/voxatron_0_3_5b_osx.zip">Скачать</a></td>
          <td><a href="/files/voxatron_0_3_5b_windows.zip">Скачать</a></td>
      </tr>
  </tbody>
</table>]]></summary><content type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/projects/games/bubblebreaker.p8.png"
        alt="bubblebreaker.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/gameof15.p8.png"
        alt="gameof15.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/lines.p8.png"
        alt="lines.p8.png"/> <img loading="lazy"  src="/files/blog/projects/games/snake.p8.png"
        alt="snake.p8.png"/></p>
<hr>
<p>И на всякий случай дистрибутивы самих приложений. Ведь их больше не купить у нас в стране, а значит это не пиратство, а корсарство! Яррр!</p>
<h1 id="pico---8">PICO - 8</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>[Скачать](/files/pico - 8_0_2_6b_amd64.zip)</td>
          <td>[Скачать](/files/pico - 8_0_2_6b_osx.zip)</td>
          <td>[Скачать](/files/pico - 8_0_2_6b_windows.zip)</td>
      </tr>
  </tbody>
</table>
<h1 id="picotron">Picotron</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/files/picotron_0_1_0g_amd64.zip">Скачать</a></td>
          <td><a href="/files/picotron_0_1_0g_osx.zip">Скачать</a></td>
          <td><a href="/files/picotron_0_1_0g_windows.zip">Скачать</a></td>
      </tr>
  </tbody>
</table>
<h1 id="voxatron">Voxatron</h1>
<table>
  <thead>
      <tr>
          <th>Linux</th>
          <th>macOS</th>
          <th>Windows</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/files/voxatron_0_3_5b_amd64.zip">Скачать</a></td>
          <td><a href="/files/voxatron_0_3_5b_osx.zip">Скачать</a></td>
          <td><a href="/files/voxatron_0_3_5b_windows.zip">Скачать</a></td>
      </tr>
  </tbody>
</table>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[Jabber]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/jabber/" />
    <id>https://neonxp.ru/projects/jabber/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p>А ещё у меня есть мой маленький Jabber сервер!</p>
<h2 id="быстрое-вкатывание">Быстрое вкатывание</h2>
<ol>
<li>Регистрация через клиент (если есть проблемы - пишите мне на почту <a href="mailto:i@neonxp.ru">i@neonxp.ru</a> или куда угодно, я помогу!)</li>
<li>Быстрее всего использовать веб клиент: <a href="https://neonxp.ru/chat"target="_blank" rel="noopener noreferrer">https://neonxp.ru/chat</a> или можно использовать клиент из списка ниже</li>
<li>Добавить в список меня <a href="xmpp:i@neonxp.ru">i@neonxp.ru</a> и войти в общий чат сервера<br>
<a href="xmpp:main@conf.neonxp.ru?join">main@conf.neonxp.ru</a></li>
</ol>
<h2 id="возможности-сервера">Возможности сервера</h2>
<ul>
<li>Аудио и видео звонки (есть свой turn - сервер)</li>
<li>Обмен файлами через сервер (300 мб на файл, 10 гб на пользователя. Пока так, нужно будет больше - подниму лимиты)</li>
<li>Полная совместимость с современными стандартами: <a href="https://compliance.conversations.im/server/neonxp.ru/"target="_blank" rel="noopener noreferrer">https://compliance.conversations.im/server/neonxp.ru/</a></li>
<li>Мощный, быстрый и, главное, ненагруженый сервер!</li>
</ul>
<h2 id="современные-нативные-клиенты">Современные нативные клиенты:</h2>
<ul>
<li>Gajim для PC/Mac/Linux <a href="https://gajim.org/download/"target="_blank" rel="noopener noreferrer">Ссылка</a> - на текущий момент мой выбор</li>
<li>Dino.im для PC/Mac/Linux <a href="https://dino.im/#download"target="_blank" rel="noopener noreferrer">Ссылка</a></li>
<li>Monocles chat для Android [Ссылка](https://f - droid.org/packages/de.monocles.chat) - на текущий момент мой выбор</li>
<li>Conversations для Android [Ссылка](https://f - droid.org/packages/eu.siacs.conversations/)</li>
<li>Another.IM для Android [Ссылка](https://f - droid.org/packages/im.narayana.another/)</li>
<li>Monal IM для iOS/Mac [Ссылка](https://monal - im.org/)</li>
<li>Siskin IM для iOS/Mac <a href="https://siskin.im/"target="_blank" rel="noopener noreferrer">Ссылка</a></li>
</ul>]]></summary><content type="html"><![CDATA[<p>А ещё у меня есть мой маленький Jabber сервер!</p>
<h2 id="быстрое-вкатывание">Быстрое вкатывание</h2>
<ol>
<li>Регистрация через клиент (если есть проблемы - пишите мне на почту <a href="mailto:i@neonxp.ru">i@neonxp.ru</a> или куда угодно, я помогу!)</li>
<li>Быстрее всего использовать веб клиент: <a href="https://neonxp.ru/chat"target="_blank" rel="noopener noreferrer">https://neonxp.ru/chat</a> или можно использовать клиент из списка ниже</li>
<li>Добавить в список меня <a href="xmpp:i@neonxp.ru">i@neonxp.ru</a> и войти в общий чат сервера<br>
<a href="xmpp:main@conf.neonxp.ru?join">main@conf.neonxp.ru</a></li>
</ol>
<h2 id="возможности-сервера">Возможности сервера</h2>
<ul>
<li>Аудио и видео звонки (есть свой turn - сервер)</li>
<li>Обмен файлами через сервер (300 мб на файл, 10 гб на пользователя. Пока так, нужно будет больше - подниму лимиты)</li>
<li>Полная совместимость с современными стандартами: <a href="https://compliance.conversations.im/server/neonxp.ru/"target="_blank" rel="noopener noreferrer">https://compliance.conversations.im/server/neonxp.ru/</a></li>
<li>Мощный, быстрый и, главное, ненагруженый сервер!</li>
</ul>
<h2 id="современные-нативные-клиенты">Современные нативные клиенты:</h2>
<ul>
<li>Gajim для PC/Mac/Linux <a href="https://gajim.org/download/"target="_blank" rel="noopener noreferrer">Ссылка</a> - на текущий момент мой выбор</li>
<li>Dino.im для PC/Mac/Linux <a href="https://dino.im/#download"target="_blank" rel="noopener noreferrer">Ссылка</a></li>
<li>Monocles chat для Android [Ссылка](https://f - droid.org/packages/de.monocles.chat) - на текущий момент мой выбор</li>
<li>Conversations для Android [Ссылка](https://f - droid.org/packages/eu.siacs.conversations/)</li>
<li>Another.IM для Android [Ссылка](https://f - droid.org/packages/im.narayana.another/)</li>
<li>Monal IM для iOS/Mac [Ссылка](https://monal - im.org/)</li>
<li>Siskin IM для iOS/Mac <a href="https://siskin.im/"target="_blank" rel="noopener noreferrer">Ссылка</a></li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[grouper - Дополнение для Firefox]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/projects/grouper/" />
    <id>https://neonxp.ru/projects/grouper/</id>
    <updated>2026-05-03T12:32:34Z</updated>
    <summary type="html"><![CDATA[<p>Ссылка на Addons Mozilla: <a href="https://addons.mozilla.org/ru/firefox/addon/groupper/"target="_blank" rel="noopener noreferrer">https://addons.mozilla.org/ru/firefox/addon/groupper/</a></p>
<p>Репозиторий: <a href="https://gitrepo.ru/NeonXP/Grouper"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/Grouper</a></p>
<p>Расширение для Firefox для автоматической группировки вкладок по группам на базе доменного имени сайта.</p>
<hr>
<p>При этом домен преобразуется в имя вкладки по следующим правилам:</p>
<ol>
<li>Домен делится по точкам</li>
<li>Отсекается домен 1 уровня (.ru, .com, .net и т.п.)</li>
<li>Если самый верхний уровень домена — www, то он так же отсекается, как не    информативная часть</li>
<li>Оставшееся преобразуется в Title Case (то есть первая буква каждого слова    становится заглавной)</li>
</ol>
<p>Таким образом, например, все страницы домена <code>www.some.site.ru</code> сгруппируются автоматически в группу <code>Some Site</code>.</p>]]></summary><content type="html"><![CDATA[<p>Ссылка на Addons Mozilla: <a href="https://addons.mozilla.org/ru/firefox/addon/groupper/"target="_blank" rel="noopener noreferrer">https://addons.mozilla.org/ru/firefox/addon/groupper/</a></p>
<p>Репозиторий: <a href="https://gitrepo.ru/NeonXP/Grouper"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/Grouper</a></p>
<p>Расширение для Firefox для автоматической группировки вкладок по группам на базе доменного имени сайта.</p>
<hr>
<p>При этом домен преобразуется в имя вкладки по следующим правилам:</p>
<ol>
<li>Домен делится по точкам</li>
<li>Отсекается домен 1 уровня (.ru, .com, .net и т.п.)</li>
<li>Если самый верхний уровень домена — www, то он так же отсекается, как не    информативная часть</li>
<li>Оставшееся преобразуется в Title Case (то есть первая буква каждого слова    становится заглавной)</li>
</ol>
<p>Таким образом, например, все страницы домена <code>www.some.site.ru</code> сгруппируются автоматически в группу <code>Some Site</code>.</p>
<p>И вот так это<img loading="lazy"  src="blog/!%5B%5Bblog/projects/grouper/grouper.png"
        alt="blog/![[blog/projects/grouper/grouper.png"/>ouper.png]]</p>
<p>Да, подобных расширений более одного, но мне хотелось именно эти правила по формированию имен групп. В других расширениях или использовался только домен второго уровня, или были другие неудобства. Например, все группы были одного цвета, а хотелось бы автоматически разного, чтобы визуально различались, или ещё какие шороховатости. Я не говорю, что у меня идеально, но оно идеально для <em>меня</em>!</p>
<p>Отдельно, хотел бы отметить его простоту. Оно делает только то что написано выше, никаких треккингов, реклам или прочего мусора! Более того, js код никак не обфусцирован, соответственно, любой может убедиться в этом сам. Да да, в современном мире, это скорее особенность, чем само собой разумеющееся.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:32:34Z</published></entry>
  <entry>
    <title><![CDATA[Я читаю]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/pages/books/" />
    <id>https://neonxp.ru/pages/books/</id>
    <updated>2026-05-03T12:23:57Z</updated>
    <summary type="html"><![CDATA[<p>Что я читаю</p>
<hr>
<ul>
<li>[ ] Как изобрести все. Создай цивилизацию с нуля. 2-е издание | Норт Райан <a href="https://www.ozon.ru/product/kak-izobresti-vse-sozday-tsivilizatsiyu-s-nulya-2-e-izdanie-nort-rayan-2964689874/"target="_blank" rel="noopener noreferrer">Ozon</a></li>
<li>[ ] Стоицизм. Зенон, Марк Аврелий, Эпиктет | Эпиктет <a href="https://www.ozon.ru/product/stoitsizm-zenon-mark-avreliy-epiktet-epiktet-1117819818/"target="_blank" rel="noopener noreferrer">Ozon</a></li>
<li>[ ] TBA</li>
</ul>]]></summary><content type="html"><![CDATA[<p>Что я читаю</p>
<hr>
<ul>
<li>[ ] Как изобрести все. Создай цивилизацию с нуля. 2-е издание | Норт Райан <a href="https://www.ozon.ru/product/kak-izobresti-vse-sozday-tsivilizatsiyu-s-nulya-2-e-izdanie-nort-rayan-2964689874/"target="_blank" rel="noopener noreferrer">Ozon</a></li>
<li>[ ] Стоицизм. Зенон, Марк Аврелий, Эпиктет | Эпиктет <a href="https://www.ozon.ru/product/stoitsizm-zenon-mark-avreliy-epiktet-epiktet-1117819818/"target="_blank" rel="noopener noreferrer">Ozon</a></li>
<li>[ ] TBA</li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:23:57Z</published></entry>
  <entry>
    <title><![CDATA[Обо мне...]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/pages/me/" />
    <id>https://neonxp.ru/pages/me/</id>
    <updated>2026-05-03T12:23:57Z</updated>
    <summary type="html"><![CDATA[<div class="h - card">     <h1 class="p - name">         <span class="p - given - cname">Александр</span> <span class="p - nickname">NeonXP</span> <span class="p - family - name">Кирюхин</span>     </h1>     <ul>         <li>E - mail: <a href="mailto:i@neonxp.ru" rel="me" class="u - email">i@neonxp.ru</a></li>         <li>Jabber: <a href="xmpp:i@neonxp.ru" rel="me" class="u - jabber">i@neonxp.ru</a></li>         <li>PGP: <a href="https://neonxp.ru/files/0x96BF11A67E3C75F6.asc" rel="pgpkey" class="u - key">9E49 0BBE 2F1F 82C9 15F8 F440 96BF 11A6 7E3C 75F6</a></li>         <li>             <span class="p - locality">Казань</span>,             <abbr class="p - region" title="Республика Татарстан">РТ</abbr>,             <span class="p - country - name">Российская Федерация</span>         </li>         <li>             <a rel="me" href="https://neonxp.ru/" class="u - url">Веб - сайт</a>         </li>         <li>             <a rel="me" href="https://neonxp.ru/files/vcard.vcf" class="u - url">Моя визитка с RSS</a>         </li>         <li class="p - note">             Golang разработчик         </li>     </ul>     <img src="https://neonxp.ru/files/photo.webp" class="u - photo rounded border shadow" width="600" /> </div>
<p>Другие ссылки</p>
<ul>
<li><a href="https://gitrepo.ru/neonxp/"target="_blank" rel="noopener noreferrer">Мой git</a></li>
<li><a href="https://go.neonxp.ru/"target="_blank" rel="noopener noreferrer">Мои Go пакеты</a></li>
<li><a href="https://t.me/neonxplog"target="_blank" rel="noopener noreferrer">Telegram Канал</a></li>
</ul>]]></summary><content type="html"><![CDATA[<div class="h - card">     <h1 class="p - name">         <span class="p - given - cname">Александр</span> <span class="p - nickname">NeonXP</span> <span class="p - family - name">Кирюхин</span>     </h1>     <ul>         <li>E - mail: <a href="mailto:i@neonxp.ru" rel="me" class="u - email">i@neonxp.ru</a></li>         <li>Jabber: <a href="xmpp:i@neonxp.ru" rel="me" class="u - jabber">i@neonxp.ru</a></li>         <li>PGP: <a href="https://neonxp.ru/files/0x96BF11A67E3C75F6.asc" rel="pgpkey" class="u - key">9E49 0BBE 2F1F 82C9 15F8 F440 96BF 11A6 7E3C 75F6</a></li>         <li>             <span class="p - locality">Казань</span>,             <abbr class="p - region" title="Республика Татарстан">РТ</abbr>,             <span class="p - country - name">Российская Федерация</span>         </li>         <li>             <a rel="me" href="https://neonxp.ru/" class="u - url">Веб - сайт</a>         </li>         <li>             <a rel="me" href="https://neonxp.ru/files/vcard.vcf" class="u - url">Моя визитка с RSS</a>         </li>         <li class="p - note">             Golang разработчик         </li>     </ul>     <img src="https://neonxp.ru/files/photo.webp" class="u - photo rounded border shadow" width="600" /> </div>
<p>Другие ссылки</p>
<ul>
<li><a href="https://gitrepo.ru/neonxp/"target="_blank" rel="noopener noreferrer">Мой git</a></li>
<li><a href="https://go.neonxp.ru/"target="_blank" rel="noopener noreferrer">Мои Go пакеты</a></li>
<li><a href="https://t.me/neonxplog"target="_blank" rel="noopener noreferrer">Telegram Канал</a></li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-03T12:23:57Z</published></entry>
  <entry>
    <title><![CDATA[Попытка вести блог из Obsidian 2]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-05-03-obsidian-2/" />
    <id>https://neonxp.ru/posts/2026-05-03-obsidian-2/</id>
    <updated>2026-05-03T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Ну, вроде, получилось. Почти автоматически даже. Ладно, пока поживу так.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/obsidian.svg"
        alt="obsidian.svg"/></p>
<p>Даже картинки удобно прикладывать просто через drag-n-drop!</p>
<p>Что дальше?</p>
<p>А дальше буду писать о трёх вещах, в которые я сейчас погружён:</p>
<ul>
<li>БЯМ (LLM, ИИ) эта тема меня захватила и не отпускает! Погружаюсь глубже и глубже</li>
<li>Математика! С института прошло уже больше 15 лет и помню я практически ничего. А сейчас вот понадобилось. Буду вести свои конспекты здесь, наверное.</li>
<li>Философия. Вот уж внезапно, но тема увлекла.</li>
</ul>
<p>Ну и, возможно, по мелочи из жизни - прогулки, 3Д печать и так далее.</p>]]></summary><content type="html"><![CDATA[<p>Ну, вроде, получилось. Почти автоматически даже. Ладно, пока поживу так.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/obsidian.svg"
        alt="obsidian.svg"/></p>
<p>Даже картинки удобно прикладывать просто через drag-n-drop!</p>
<p>Что дальше?</p>
<p>А дальше буду писать о трёх вещах, в которые я сейчас погружён:</p>
<ul>
<li>БЯМ (LLM, ИИ) эта тема меня захватила и не отпускает! Погружаюсь глубже и глубже</li>
<li>Математика! С института прошло уже больше 15 лет и помню я практически ничего. А сейчас вот понадобилось. Буду вести свои конспекты здесь, наверное.</li>
<li>Философия. Вот уж внезапно, но тема увлекла.</li>
</ul>
<p>Ну и, возможно, по мелочи из жизни - прогулки, 3Д печать и так далее.</p>
<p>Проверка математической нотации:</p>
<div>
$$
\begin{vmatrix}
a & b \\
c & d
\end{vmatrix}
=
ad-bc
$$
</div>
<p>Проверка Mermaid диаграмм:</p>
<pre class="mermaid">
  
sequenceDiagram

Алиса->>+Иван: Привет Иван, как ты?

Алиса->>+Иван: Иван, ты меня слышишь?

Иван-->>-Алиса: Привет Алиса, я тебя слышу!

Иван-->>-Алиса: Я чувствую себя отлично!
</pre>
<details>
  <summary>Mermaid</summary>
  <pre>
sequenceDiagram

Алиса->>+Иван: Привет Иван, как ты?

Алиса->>+Иван: Иван, ты меня слышишь?

Иван-->>-Алиса: Привет Алиса, я тебя слышу!

Иван-->>-Алиса: Я чувствую себя отлично!</pre>
</details>
<p>Проверка отображения GeoJson:</p>
<div class="geojson-map" style="height: 400px;" id="geojson-map-map-1"></div>

<details>
    <summary>GeoJSON</summary>
    <pre>{
	"type": "FeatureCollection",
	"features": [
		{
			"type": "Feature",
			"properties": {},
			"geometry": {
				"coordinates": [
					[
						[
							49.20216304733199,
							55.70304554824898
						],
						[
							49.38822095495627,
							55.79243338206362
						],
						[
							49.34825883129855,
							55.885020047008936
						],
						[
							49.182140856838004,
							55.9375351056604
						],
						[
							48.89477606222229,
							55.927736062961486
						],
						[
							48.76092934284381,
							55.81833799427619
						],
						[
							48.929778768757075,
							55.71509640435036
						],
						[
							49.09218861665573,
							55.690347399926935
						],
						[
							49.20216304733199,
							55.70304554824898
						]
					]
				],
				"type": "Polygon"
			}
		}
	]
}</pre>
</details>
<p>Отлично, всё работает :) Давно хотел что-то такое прикрутить!<br>
В идеале, ещё бы и родные графы обсидиана прикрутить, но у меня уже на сегодня нет моральных сил на это. А ведь ещё надо прикручивать кросспостинг во все другие места моего пребывания… В общем, дел непочатый край!</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="obsidian" label="Obsidian" scheme="https://neonxp.ru/tags/obsidian/" />
    <published>2026-05-03T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Попытка вести блог из Obsidian]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-05-03-obsidian/" />
    <id>https://neonxp.ru/posts/2026-05-03-obsidian/</id>
    <updated>2026-05-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Мне надоело!</p>
<p>Надоела сложность с которой я сталкиваюсь при написании новых постов в блог!</p>
<p>Поэтому я всё же выделил время и настроил пайплайн так, чтобы хотя бы писать посты было удобно. А именно, в Obsidian. Который и сам на себя берёт управление статикой, которую я прикладываю и красивое оформление и управление тегами, потому что я не помню какие теги есть, а каких нет.</p>
<p>Да, всё ещё не по одной кнопке, но уже лучше чем было.</p>]]></summary><content type="html"><![CDATA[<p>Мне надоело!</p>
<p>Надоела сложность с которой я сталкиваюсь при написании новых постов в блог!</p>
<p>Поэтому я всё же выделил время и настроил пайплайн так, чтобы хотя бы писать посты было удобно. А именно, в Obsidian. Который и сам на себя берёт управление статикой, которую я прикладываю и красивое оформление и управление тегами, потому что я не помню какие теги есть, а каких нет.</p>
<p>Да, всё ещё не по одной кнопке, но уже лучше чем было.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2026-05-02T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Немного рефлексии по FreeBSD]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-04-24-freebsd/" />
    <id>https://neonxp.ru/posts/2026-04-24-freebsd/</id>
    <updated>2026-04-24T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Думаю, это необходимо сделать. Признавать свои ошибки и делать из них выводы это важно.</p>
<hr>
<p>Недавно я <a href="https://neonxp.ru/posts/2026-04-16-linux-baikal/"target="_blank" rel="noopener noreferrer">написал пост</a> про некие события в мире Linux и при этом прошёлся по FreeBSD (незаслуженно).</p>
<p>Должен исправить сам себя в следующих моментах:</p>
<blockquote>
<p>ОС по отзывам и очень годная, но всё же целиком делают не наши</p>
</blockquote>
<p>Не целиком. И хоть юридически зарегестрирована организация FreeBSD Foundation в штатах, весьма большая часть кода там пишется нашими и есть большой вклад ребят из Яндекса.</p>]]></summary><content type="html"><![CDATA[<p>Думаю, это необходимо сделать. Признавать свои ошибки и делать из них выводы это важно.</p>
<hr>
<p>Недавно я <a href="https://neonxp.ru/posts/2026-04-16-linux-baikal/"target="_blank" rel="noopener noreferrer">написал пост</a> про некие события в мире Linux и при этом прошёлся по FreeBSD (незаслуженно).</p>
<p>Должен исправить сам себя в следующих моментах:</p>
<blockquote>
<p>ОС по отзывам и очень годная, но всё же целиком делают не наши</p>
</blockquote>
<p>Не целиком. И хоть юридически зарегестрирована организация FreeBSD Foundation в штатах, весьма большая часть кода там пишется нашими и есть большой вклад ребят из Яндекса.</p>
<blockquote>
<p>Да и нынче связана с нежелательной организацией.</p>
</blockquote>
<p>Это вообще чушь погнал. Кроме названия исторически сложившегося, насколько мне известно, связей не имеет.</p>
<p>И да, я всё хочу попробовать на неё перейти, но меня останавливает страх что такой шаг просто сломает мне весь рабочий процесс. Ну во первых, большая часть софта что я пишу по работе — ориентирована на linux и запуск в Docker. Это я ещё скорее всего обойду без особых усилий. Но есть один маленький кусок софта, который, скорее всего для меня станет стоппером. А именно, рабочий ВПН во внутреннюю сеть организации. Не уверен что я могу даже озвучивать как он называется, но скажу так, что официальная поддержка у него вообще только для Windows и Macos. А я спасаюсь сторонним неофициальным клиентом, который умеет только в Linux. Ну и есть ещё один страх, иррациональный но всё же — я боюсь что мне просто не хватит компетенции чтобы в итоге всё настроить чтобы было так же комфортно, как и было под Linux.</p>
<p>Надо будет всё же перестать использовать личный ноутбук для работы и использовать оборудование работодателя, чтобы иметь возможность проводить эксперименты над личным железом без риска запороть профессиональную деятельность.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="freebsd" label="Freebsd" scheme="https://neonxp.ru/tags/freebsd/" />
    <published>2026-04-24T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Помощник по дыханию]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-04-21-keep-calm/" />
    <id>https://neonxp.ru/posts/2026-04-21-keep-calm/</id>
    <updated>2026-04-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Сделал очередное мелкое PWA. В этот раз — помощник по правильным дыхательным техникам.</p>
<p><a href="https://calm.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://calm.neonxp.ru/</a></p>
<p>Получилось очень красиво, поэтому не буду прикладывать скриншота, дабы не портить впечатление ;)</p>
<hr>
<p>Всё так же как и в <a href="https://neonxp.ru/posts/2026-04-15-days/"target="_blank" rel="noopener noreferrer">прошлый раз</a>, 100% вайбкода, 0% органического кода. Времени — минут 20-30 наверное.</p>
<p><a href="https://gitverse.ru/neonxp/calm"target="_blank" rel="noopener noreferrer">Исходники</a></p>
<p>P.S. Завёл раздел для таких мелких PWA проектов: <a href="https://neonxp.ru/projects/pwa/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/projects/pwa/</a> ведь на одном я явно не остановлюсь :)</p>]]></summary><content type="html"><![CDATA[<p>Сделал очередное мелкое PWA. В этот раз — помощник по правильным дыхательным техникам.</p>
<p><a href="https://calm.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://calm.neonxp.ru/</a></p>
<p>Получилось очень красиво, поэтому не буду прикладывать скриншота, дабы не портить впечатление ;)</p>
<hr>
<p>Всё так же как и в <a href="https://neonxp.ru/posts/2026-04-15-days/"target="_blank" rel="noopener noreferrer">прошлый раз</a>, 100% вайбкода, 0% органического кода. Времени — минут 20-30 наверное.</p>
<p><a href="https://gitverse.ru/neonxp/calm"target="_blank" rel="noopener noreferrer">Исходники</a></p>
<p>P.S. Завёл раздел для таких мелких PWA проектов: <a href="https://neonxp.ru/projects/pwa/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/projects/pwa/</a> ведь на одном я явно не остановлюсь :)</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2026-04-21T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[В ядре Linux 7.1 начали удаление поддержки процессоров Baikal]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-04-16-linux-baikal/" />
    <id>https://neonxp.ru/posts/2026-04-16-linux-baikal/</id>
    <updated>2026-04-16T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><a href="https://www.opennet.ru/opennews/art.shtml?num=65222"target="_blank" rel="noopener noreferrer">https://www.opennet.ru/opennews/art.shtml?num=65222</a></p>
<p>Загнивает. А жаль. Видимо, и правда придётся или ждать хардфорка ядра в Альт или переезжать на *BSD. Последнего бы не очень хотелось, ведь хоть и ОС по отзывам и очень годная, но всё же целиком делают не наши. Да и нынче связана с нежелательной организацией. А это всё риски и намекает, что не стоит делать на неё ставку. Хотя и считаю что это уже чушь какая-то. Но «маемо шо маемо».</p>]]></summary><content type="html"><![CDATA[<p><a href="https://www.opennet.ru/opennews/art.shtml?num=65222"target="_blank" rel="noopener noreferrer">https://www.opennet.ru/opennews/art.shtml?num=65222</a></p>
<p>Загнивает. А жаль. Видимо, и правда придётся или ждать хардфорка ядра в Альт или переезжать на *BSD. Последнего бы не очень хотелось, ведь хоть и ОС по отзывам и очень годная, но всё же целиком делают не наши. Да и нынче связана с нежелательной организацией. А это всё риски и намекает, что не стоит делать на неё ставку. Хотя и считаю что это уже чушь какая-то. Но «маемо шо маемо».</p>
<p>А для меня, в свете событий последних лет, страна производства стало чуть ли не главнейшим критерием. И подобные новости только лишний раз убеждают в правильности такой позиции.</p>
<p>Так что, да, буду надеяться, что ребята из Альта перейдут на поддерживаемый в РФ форк ядра (который ещё должен появиться!) в один прекрасный день.</p>
<p>UPD: Важные уточнения по FreeBSD: <a href="https://neonxp.ru/posts/2026-04-24-freebsd/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/posts/2026-04-24-freebsd/</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="linux" label="Linux" scheme="https://neonxp.ru/tags/linux/" />
    <published>2026-04-16T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Счётчик дней]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-04-15-days/" />
    <id>https://neonxp.ru/posts/2026-04-15-days/</id>
    <updated>2026-04-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Сделал такое PWA. Позволяет отсчитывать дни от или до даты.</p>
<p><a href="https://days.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://days.neonxp.ru/</a></p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-04-15-days/days.png"
        alt="days.png"/></p>
<p>Внутри просто JS + CSS + alpine.js (годная библиотека, рекомендую, если не охото особо заниматься фронтендом).</p>
<p>100% вайбкода, 0% органического кода.</p>
<p><a href="https://gitverse.ru/neonxp/days"target="_blank" rel="noopener noreferrer">Исходники</a></p>]]></summary><content type="html"><![CDATA[<p>Сделал такое PWA. Позволяет отсчитывать дни от или до даты.</p>
<p><a href="https://days.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://days.neonxp.ru/</a></p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-04-15-days/days.png"
        alt="days.png"/></p>
<p>Внутри просто JS + CSS + alpine.js (годная библиотека, рекомендую, если не охото особо заниматься фронтендом).</p>
<p>100% вайбкода, 0% органического кода.</p>
<p><a href="https://gitverse.ru/neonxp/days"target="_blank" rel="noopener noreferrer">Исходники</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2026-04-15T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Свой ИИ сервер на Steam Deck]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-03-21-aiserver/" />
    <id>https://neonxp.ru/posts/2026-03-21-aiserver/</id>
    <updated>2026-03-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Я весьма активно в последнее время экспериментирую с нейронками, причём не только в контексте их обычного использования для коддинга. Больше меня интересует как раз разработка <em>под</em> нейронки (автономные агенты, ага).</p>
<p>Так же сейчас перепрохожу по учебникам в свободное время институтский курс по линейке (а на очереди ещё вычмат, тервер и матан…) чтобы восстановить свои и так слабые знания по математике, необходимой для ИИ. Затем план уже конкретно в МЛ, БЯМ и прочеее вгрызться. Внезапно математика, когда ей занимаешься не «из под палки» потому что зачёт/экзамен, а только для себя — становится <strong>очень</strong> интересной. Прям жалею что в институте недооценивал. Но сейчас всё же не об этом речь.</p>]]></summary><content type="html"><![CDATA[<p>Я весьма активно в последнее время экспериментирую с нейронками, причём не только в контексте их обычного использования для коддинга. Больше меня интересует как раз разработка <em>под</em> нейронки (автономные агенты, ага).</p>
<p>Так же сейчас перепрохожу по учебникам в свободное время институтский курс по линейке (а на очереди ещё вычмат, тервер и матан…) чтобы восстановить свои и так слабые знания по математике, необходимой для ИИ. Затем план уже конкретно в МЛ, БЯМ и прочеее вгрызться. Внезапно математика, когда ей занимаешься не «из под палки» потому что зачёт/экзамен, а только для себя — становится <strong>очень</strong> интересной. Прям жалею что в институте недооценивал. Но сейчас всё же не об этом речь.</p>
<p>Сейчас про именно разработку под уже существующие БЯМ.</p>
<p>Конечно, в процессе разработки и особенно тестирования, т.н. токенов тратится не много, а ОЧЕНЬ много. И, честно говоря, мне жалко бабки на это. И это ещё не говоря о том, что появляется зависимость от неких «облачных провайдеров», что я очень и очень не приемлю.</p>
<p>Выход — локальный инференс БЯМ. Благо, совсем недавно китайская Alibaba обрадовала сообщество своим новым семейством моделей Qwen3.5 которые одновременно и достаточно компактные для локального инференса (даже на CPU!) и при этом достаточно умненькие (серьёзно, она решает ту шуточую задачу с кружкой у которой запаян верх и отрезано дно :) ).</p>
<p>Т.к. я не сторонник стационарных компьютеров уже лет так 20 — адекватного ПК с видеокартами у меня нет и не предвидится. Даже если бы я накопил на мощную видюху для нейронок — мне было бы некуда её пихать! Но тут я вспомнил, что у меня простаивает такое чудо технологий, как Steam Deck!</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-03-21-aiserver/steamdeck_small.jpg"
        alt="steamdeck_small.jpg"/><br>
Steam Deck</p>
<p>Лонг стори шорт. На родной SteamOS поднять не получилось, поэтому я просто поставил на стимдек свою любимую AltLinux p11. Удивительно, но она встала с полпинка, без всякого пердолинга драйверов. Хотя я был готов, что что-то пойдёт не так, ибо железо у деки весьма кастомное.</p>
<p>Пробовал Ollama с qwen3.5:9b (unsloth/Qwen3.5-9B-GGUF) — как бы работала, но через сколько-то запросов помирала. Непорядок совсем. Долго пытался это отдебажить, но так и не получилось ни подружить деку с rocm ни заставить стабильно олламу работать с vulkan.</p>
<p>В общем, плюнул на олламу и поставил llama.cpp. И вот уже на ней, квенка завелась как родная! Да, скорость инференса 7-8 токенов в секунду, но для моих целей это вполне и вполне достаточно! На CPU ноута в 10 потоков (12 ядерный i7 13 поколения) хорошо если 1 токен в секунду был, при том что остальная ОС была в коматозном состоянии.</p>
<p>Пробовал ещё и более вкусную qwen3.5 a3b MOE — но она не влезла в память ¯\_(ツ)_/¯</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-03-21-aiserver/qwen35_small.jpg"
        alt="qwen35_small.jpg"/><br>
Qwen3.5</p>
<p>Да, аж 10 минут. Но там долгий ризонинг был. Обычно в моих задачах ризонинг сильно короче.</p>
<p>Итог, у меня наконец-то есть своя локальная «бесплатная» и достаточно продвинутая моделька, у которой я могу под эксперименты жрать токены миллионами. Но всё равно, начинаю копить на полноценный GPU сервер, чтобы играться уже с совсем большими БЯМ. Хочу что-то из серии Nvidia DGX Spark или, что вероятнее, минипк на Ryzen AI Max+ 395 + Radeon 8060S. Я вообще считаю, что за подобными персональными минисерверами для ИИ будущее.</p>
<p>Мечта — иметь локальный инференс MiniMax M2.7 и GLM5 :) Ну а пока, имею то, что имею.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="ии" label="ИИ" scheme="https://neonxp.ru/tags/%D0%B8%D0%B8/" />
    <published>2026-03-21T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Снова про Мышастик]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-03-15-meshtastic/" />
    <id>https://neonxp.ru/posts/2026-03-15-meshtastic/</id>
    <updated>2026-03-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Поголовье устройств у меня продолжает расти, теперь у меня есть и такой портативный узел размером с кредитку:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-03-15-meshtastic/cardputer.webp"
        alt="cardputer.webp"/><br>
cardputer</p>
<p>Не скажу что его использовать удобно. Скорее неудобно, чем удобно. Но весьма  забавно. Отдаёт неким ретро.</p>
<p>Так, подведу итог что у меня по узлам сейчас:</p>
<hr>
<ul>
<li>NeonXP Portable (nxp0) — мой самый первый узел на T-Beam. Он же и остаётся<br>
моим условно переносным засчёт наличия внешнего аккумулятора 18650. Конечно, он<br>
не самостоятелен и должен быть подключён к смартфону по BT.</li>
<li>NeonXP Vehicle (nxp1) — узел, который лежит в автомобиле и работает от<br>
бортовой сети. Модель — Heltec v3. Антенна — родная.</li>
<li>NeonXP Base (nxp2) — домашний стационарный узел, который подключён в домашнюю<br>
сеть через wifi (другие узлы цепляются по bluetooth или автономны как nxp3).<br>
Модель — Heltec v3. Антенна — Moxon, направленная в сторону центра города. В<br>
основном благодаря именно ей у меня из моего спального района есть связанность<br>
до остальной сети. На текущий момент показывает, что 11 прямых соединений, что<br>
для меня очень и очень хорошо. Раньше я довольствовался буквально 1-2 аплинками<br>
:) А другие узлы, пока я дома, уже подключаются через него.</li>
<li>NeonXP Cardputer (nxp3) — вот это устройство что в начале поста :) Cardputer<br>
ADV + Lora модуль. В деньгах стоит примерно 4-5К₽.</li>
<li>… (nxp4) — Пока ещё в пути ко мне. Но это уже Heltec v4, не v3. Так же<br>
будет с Moxon антенной. Планирую её поставить уже в новом доме, то есть на<br>
юге города. Пока кажется, что врядли я получу связанность с основной городской<br>
сетью, но постараюсь. Тем более, судя по карте, на юге города количество узлов<br>
потихоньку растёт. Надеюсь, через время уже будет моим главным «Base» узлом.</li>
</ul>
<p>И да, на этих узлах я не остановлюсь, ведь как минимум могут (и должны!) быть узлы nxp5, nxp6, nxp7, nxp8, nxp9, а дальше, ещё не придумал, или nx10, nx11 и т.д. или как-то по другому :)</p>]]></summary><content type="html"><![CDATA[<p>Поголовье устройств у меня продолжает расти, теперь у меня есть и такой портативный узел размером с кредитку:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2026-03-15-meshtastic/cardputer.webp"
        alt="cardputer.webp"/><br>
cardputer</p>
<p>Не скажу что его использовать удобно. Скорее неудобно, чем удобно. Но весьма  забавно. Отдаёт неким ретро.</p>
<p>Так, подведу итог что у меня по узлам сейчас:</p>
<hr>
<ul>
<li>NeonXP Portable (nxp0) — мой самый первый узел на T-Beam. Он же и остаётся<br>
моим условно переносным засчёт наличия внешнего аккумулятора 18650. Конечно, он<br>
не самостоятелен и должен быть подключён к смартфону по BT.</li>
<li>NeonXP Vehicle (nxp1) — узел, который лежит в автомобиле и работает от<br>
бортовой сети. Модель — Heltec v3. Антенна — родная.</li>
<li>NeonXP Base (nxp2) — домашний стационарный узел, который подключён в домашнюю<br>
сеть через wifi (другие узлы цепляются по bluetooth или автономны как nxp3).<br>
Модель — Heltec v3. Антенна — Moxon, направленная в сторону центра города. В<br>
основном благодаря именно ей у меня из моего спального района есть связанность<br>
до остальной сети. На текущий момент показывает, что 11 прямых соединений, что<br>
для меня очень и очень хорошо. Раньше я довольствовался буквально 1-2 аплинками<br>
:) А другие узлы, пока я дома, уже подключаются через него.</li>
<li>NeonXP Cardputer (nxp3) — вот это устройство что в начале поста :) Cardputer<br>
ADV + Lora модуль. В деньгах стоит примерно 4-5К₽.</li>
<li>… (nxp4) — Пока ещё в пути ко мне. Но это уже Heltec v4, не v3. Так же<br>
будет с Moxon антенной. Планирую её поставить уже в новом доме, то есть на<br>
юге города. Пока кажется, что врядли я получу связанность с основной городской<br>
сетью, но постараюсь. Тем более, судя по карте, на юге города количество узлов<br>
потихоньку растёт. Надеюсь, через время уже будет моим главным «Base» узлом.</li>
</ul>
<p>И да, на этих узлах я не остановлюсь, ведь как минимум могут (и должны!) быть узлы nxp5, nxp6, nxp7, nxp8, nxp9, а дальше, ещё не придумал, или nx10, nx11 и т.д. или как-то по другому :)</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="meshtastic" label="Meshtastic" scheme="https://neonxp.ru/tags/meshtastic/" />
    <published>2026-03-15T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Идеальный формат конфигов *]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-03-14-conf/" />
    <id>https://neonxp.ru/posts/2026-03-14-conf/</id>
    <updated>2026-03-14T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>* лично для меня</p>
<p>В общем, случилось и на неделе я таки присвоил тег v1 для своей самописной Go библиотеки для разбора конфигов! Но обо всём по порядку. Или можно пропустить  предысторию и сразу <a href="#conf-v1">перейти к описанию библиотеки</a>.</p>
<h1 id="предыстория">Предыстория</h1>
<p>Около месяца назад я задумался написать небольшую утилиту для себя, которая бы организовывала для меня рабочее окружение. Не важно сейчас, как именно должна была организовывать, а важно, что эта утилита должна бы была иметь весьма разухабистый конфиг вследствие своей планируемой гибкости. И встал вопрос, а какой формат конфигов использовать? Казалось бы, возьми yaml, toml, на худой конец, json (hjson, json5, итп). Даже думал об ini формате! Но всё было не то…</p>]]></summary><content type="html"><![CDATA[<p>* лично для меня</p>
<p>В общем, случилось и на неделе я таки присвоил тег v1 для своей самописной Go библиотеки для разбора конфигов! Но обо всём по порядку. Или можно пропустить  предысторию и сразу <a href="#conf-v1">перейти к описанию библиотеки</a>.</p>
<h1 id="предыстория">Предыстория</h1>
<p>Около месяца назад я задумался написать небольшую утилиту для себя, которая бы организовывала для меня рабочее окружение. Не важно сейчас, как именно должна была организовывать, а важно, что эта утилита должна бы была иметь весьма разухабистый конфиг вследствие своей планируемой гибкости. И встал вопрос, а какой формат конфигов использовать? Казалось бы, возьми yaml, toml, на худой конец, json (hjson, json5, итп). Даже думал об ini формате! Но всё было не то…</p>
<p>И дело даже не в моём <abbr title="Not Invented Here">NIH</abbr> синдроме. А они все мне не подходят!</p>
<h2 id="yaml">YAML</h2>
<p>Отвратительный язык! Начиная с отступов пробелами, что я ненавижу,[^1] продолжая тем, что у него спека способна по объёму поконкурировать с спекой XML и заканчивая весельем с ошибками когда строки <em>внезапно</em> парсятся как числа и всё ломается!</p>
<h2 id="toml">TOML</h2>
<p>На самом деле, самый адекватный из вариантов, но его синтаксис… Ну скажем так, на любителя. Но да, всяко лучше YAML. Всё что угодно лучге YAML. Гори в аду, YAML!</p>
<h2 id="json">JSON</h2>
<p>Это вообще не язык для конфигов и не язык разметки. А формат серилизации объектов. Кому вообще первому пришло в голову в нём конфиги хранить? Его производные — это уже какой-то набор костылей. Зачем мучать стюардесу?</p>
<h2 id="ini">INI</h2>
<p>Первый из подборки язык который именно изначально для описания конфигураций. Но он уж больно ограниченный, да и гнилостный душок микрософта…</p>
<p>Короче, я не стал искать дальше оправданий и засучи́л рукава и решил написать идеальную (для себя) библиотеку конфигураций! За основу синтаксиса я взял формат конфигов у таких никсовых приложений, как NGINX, bind9 и прочих подобных. Во-первых, это красиво. Во-вторых, это привычно. Из других требований кроме привычности, была гибкость, которая выражается в возможности делать сколь угодно глубокую вложенность в конфигах. Но это всё было фоном, а главные мои требования были всё же нефункциональными:</p>
<ol>
<li>Самое главное, мне должно <em>нравиться</em>. Я понимаю, что это никак не<br>
формализовать, это можно только почувствовать. Именно поэтому не подошли ни<br>
TOML, ни INI, ни в т.ч. YAML. Они мне <em>не нравятся</em> внешне.</li>
<li>Не менее важно, что мне его должно хватать. Про вложенности я уже говорил.</li>
<li>И чтобы служило мне так десятилетиями без изменений. То есть, чтобы мне надо<br>
было эту библиотеку разработать один раз, а потом, в идеале, никак и никогда<br>
её не менять. Максимум подправлять под реалии новых версий языков, что-то<br>
такое. Я вообще люблю вещи из разряда «раз и навсегда». Может это старость?</li>
</ol>
<p>Немного подумав над синтаксисом я пришёл к тому, что мне нужна максимальная  примитивность. Всего две формы записи:</p>
<ol>
<li>Имя аргумент1 аргумент2 … аргументN;</li>
<li>Имя аргумент1 аргумент2 … аргументN { …вложенные директивы… }</li>
</ol>
<p>По сути это и есть весь базовый синтаксис! Просто последовательность директив, каждая из которых просто обязана иметь имя. Причём неуникальное! Требование к уникальности имён — уже ограничение и неуниверсальность.</p>
<p>Аргументы только самых базовых типов — строка (причём в разных кавычках в зависимости от контекста, например, ` для многострочных строк), числа как целочисленные, так и с плавающей точкой, булевы значения, и один особый тип: ident (то есть какая-то строка без кавычек, например, идентификатор или имя). Мне больше не надо! Даты? Строка! Промежутки времени? Тоже строка! Зачем отдельно-то?</p>
<p>Примерно так я видел для себя идеальный формат конфигов. Да, очень сумбурно и неточно, но когда меня это останавливало? Решил накидать формальную грамматику, так как писать вручную парсер уж сильно не хотелось. Сначала написал её для <a href="https://gitlab.com/cznic/egg"target="_blank" rel="noopener noreferrer">egg</a>, немного помучался с API сгенерированного парсера, но потом всё же всё заработало! Кроме… Кроме того, что я наткнулся на неприятное свойство поведения: если парсер натыкается на неожиданный символ — он выдавал непонятную без полулитра ошибку вида “index of array out of range”. Причём без номера строки и символа. Сиди и гадай, что пошло не так. Убив на это без малого пару дней, я так и не смог сделать так, чтобы ошибка была более человеческая (типа «строка 2 символ 4: ожидалось что-то, а тут что-то другое»). Поэтому я принял волевое решение переписать совсем с нуля. Взял другой <a href="github.com/mna/pigeon">генератор парсеров</a>, переписал грамматику c EBNF на PEG <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> и … И получилось <strong>гораздо</strong> более элегантно, чем с egg! Счастью моему не было предела, когда я получил первый успех! Да, конечно, потом пара дней полировки и обвешивания необязательными, но приятными фичами и готово! После того как я попробовал на практике свою библиотеку в одном простеньком проекте (<a href="#pose">о нём в конце</a>) — я с чистой совестью присвоил библиотеке тег стабильной версии, т.к. я получил то, что хотел и больше править её в ближайшее время я не собираюсь.</p>
<h1 id="conf-v1">conf v1</h1>
<p>Встречайте:</p>
<ul>
<li><a href="https://go.neonxp.ru/conf"target="_blank" rel="noopener noreferrer">go.neonxp.ru/conf</a></li>
<li><a href="https://git.neonxp.ru/conf"target="_blank" rel="noopener noreferrer">Гит репозиторий</a></li>
<li><a href="https://pkg.go.dev/go.neonxp.ru/conf"target="_blank" rel="noopener noreferrer">Документация на pkg.go.dev</a></li>
</ul>
<p>Как я уже говорил, синтаксис очень простой. Для наглядности я приведу сразу пример, который покажет, по сути, все возможности. Да, возможностей не много,  потому что я ценю минимализм, как уже говорил выше.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-nginx" data-lang="nginx"><span style="display:flex;"><span><span style="color:#75715e"># Две одноименных директивы
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">some</span> <span style="color:#e6db74">directive</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">some</span> <span style="color:#e6db74">other</span> <span style="color:#e6db74">directive</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">string_val</span> <span style="color:#e6db74">"value"</span>; <span style="color:#66d9ef">int_val</span> <span style="color:#ae81ff">123</span>; <span style="color:#66d9ef">float_val</span> <span style="color:#ae81ff">123</span><span style="color:#e6db74">.321</span>; <span style="color:#66d9ef">bool_val</span> <span style="color:#e6db74">true</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">xdg_config_dir</span> <span style="color:#e6db74">HOME</span> <span style="color:#e6db74">".config"</span> 
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Если получать через StringExt("/", os.LookupEnv), то получится
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"># $HOME + "/" + ".config" = "/home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/.config"
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">group1</span> <span style="color:#e6db74">"some"</span> <span style="color:#e6db74">"args"</span> <span style="color:#e6db74">"and"</span> <span style="color:#e6db74">"body"</span> { 	<span style="color:#f92672">group2</span> <span style="color:#ae81ff">123</span> <span style="color:#ae81ff">321</span> { 		<span style="color:#f92672">group3</span> <span style="color:#e6db74">true</span> <span style="color:#e6db74">false</span> <span style="color:#e6db74">true</span> { 			<span style="color:#f92672">key</span> <span style="color:#e6db74">value</span>; <span style="color:#75715e"># One line comment! 		} 	} } ```
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">Из</span> <span style="color:#e6db74">примера</span> <span style="color:#e6db74">выше</span> <span style="color:#e6db74">мы</span> <span style="color:#e6db74">видим:</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">две</span> <span style="color:#e6db74">директивы</span> <span style="color:#e6db74">с</span> <span style="color:#e6db74">одинаковым</span> <span style="color:#e6db74">именем</span> <span style="color:#e6db74">(`some`)</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">несколько</span> <span style="color:#e6db74">директив</span> <span style="color:#e6db74">с</span> <span style="color:#e6db74">аргументами</span> <span style="color:#e6db74">разных</span> <span style="color:#e6db74">типов</span> <span style="color:#e6db74">(`*_val`)</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">директивы</span> <span style="color:#e6db74">с</span> <span style="color:#e6db74">вложенными</span> <span style="color:#e6db74">поддирективами</span> <span style="color:#e6db74">(`group*`).</span> <span style="color:#e6db74">Причём,</span> <span style="color:#e6db74">наличие</span> <span style="color:#e6db74">тела</span> <span style="color:#e6db74">`</span>{<span style="color:#f92672">...}`</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">у</span> <span style="color:#e6db74">директивы</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">отменяет</span> <span style="color:#e6db74">возможности</span> <span style="color:#e6db74">передать</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">аргументы</span> <span style="color:#e6db74">до</span> <span style="color:#e6db74">тела.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">Единственное,</span> <span style="color:#e6db74">тело</span> <span style="color:#e6db74">должно</span> <span style="color:#e6db74">быть</span> <span style="color:#e6db74">одно</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">конце</span> <span style="color:#e6db74">директивы.</span> <span style="color:#e6db74">Зато</span> <span style="color:#e6db74">после</span> <span style="color:#e6db74">него</span> <span style="color:#e6db74">не</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">нужно</span> <span style="color:#e6db74">ставить</span> <span style="color:#e6db74">`</span>;<span style="color:#f92672">`,</span> <span style="color:#e6db74">парсер</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">так</span> <span style="color:#e6db74">понимает</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">раз</span> <span style="color:#e6db74">тело</span> <span style="color:#e6db74">закончилось,</span> <span style="color:#e6db74">то</span> <span style="color:#e6db74">и</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">директива</span> <span style="color:#e6db74">закончилась.</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">отступы</span> <span style="color:#e6db74">могут</span> <span style="color:#e6db74">быть</span> <span style="color:#e6db74">как</span> <span style="color:#e6db74">табуляторами,</span> <span style="color:#e6db74">так</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">пробелами.</span> <span style="color:#e6db74">Но</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">прошу</span> <span style="color:#e6db74">использовать</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">именно</span> <span style="color:#e6db74">табуляторы,</span> <span style="color:#e6db74">потому</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">только</span> <span style="color:#e6db74">табуляторы</span> <span style="color:#e6db74">это</span> <span style="color:#e6db74">правильно.[^1]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">Хер</span> <span style="color:#e6db74">вы</span> <span style="color:#e6db74">меня</span> <span style="color:#e6db74">заставите</span> <span style="color:#e6db74">передумать!</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">И</span> <span style="color:#e6db74">всё!</span> <span style="color:#e6db74">Просто</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">очень</span> <span style="color:#e6db74">наглядно.</span> <span style="color:#e6db74">Идеально</span> <span style="color:#e6db74">для</span> <span style="color:#e6db74">конфигов!</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">[^1]:</span> <span style="color:#e6db74">https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Использование в Go
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Естественно,</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">могло</span> <span style="color:#e6db74">быть</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">речи</span> <span style="color:#e6db74">о</span> <span style="color:#e6db74">анмаршалинге</span> <span style="color:#e6db74">этого</span> <span style="color:#e6db74">формата</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">структуры,</span> <span style="color:#e6db74">как</span> <span style="color:#e6db74">это</span> <span style="color:#e6db74">делается</span> <span style="color:#e6db74">у</span> <span style="color:#e6db74">JSON</span> <span style="color:#e6db74">YAML</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">прочих.</span> <span style="color:#e6db74">Но</span> <span style="color:#e6db74">это</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">надо!</span> <span style="color:#e6db74">У</span> <span style="color:#e6db74">библиотеки</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">несколько</span> <span style="color:#e6db74">встроенных</span> <span style="color:#e6db74">типов,</span> <span style="color:#e6db74">таких</span> <span style="color:#e6db74">как:</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">[Group](https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model</span><span style="color:#75715e">#Group) - группа
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">директив.</span> <span style="color:#e6db74">В</span> <span style="color:#e6db74">том</span> <span style="color:#e6db74">числе</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">тело</span> <span style="color:#e6db74">директивы.</span> <span style="color:#e6db74">Всё</span> <span style="color:#e6db74">просто!</span> <span style="color:#e6db74">Из</span> <span style="color:#e6db74">методов</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">базовые</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">методы</span> <span style="color:#e6db74">для</span> <span style="color:#e6db74">получения</span> <span style="color:#e6db74">конкретных</span> <span style="color:#e6db74">директив</span> <span style="color:#e6db74">из</span> <span style="color:#e6db74">группы</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">простой</span> <span style="color:#e6db74">фильтр.</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">-</span> <span style="color:#e6db74">[Directive](https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model</span><span style="color:#75715e">#Directive) -
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">для</span> <span style="color:#e6db74">директив.</span> <span style="color:#e6db74">У</span> <span style="color:#e6db74">него</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">несколько</span> <span style="color:#e6db74">методов</span> <span style="color:#e6db74">для</span> <span style="color:#e6db74">типизированного</span> <span style="color:#e6db74">получения</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">первого</span> <span style="color:#e6db74">из</span> <span style="color:#e6db74">аргументов</span> <span style="color:#e6db74">директивы</span> <span style="color:#e6db74">(того</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">после</span> <span style="color:#e6db74">имени</span> <span style="color:#e6db74">директивы),</span> <span style="color:#e6db74">также</span> <span style="color:#e6db74">метод</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">получения</span> <span style="color:#e6db74">всех</span> <span style="color:#e6db74">аргументов</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">тела.</span> <span style="color:#e6db74">Так</span> <span style="color:#e6db74">же</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">специальный</span> <span style="color:#e6db74">метод</span> <span style="color:#e6db74">StringExt[^3],</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">который</span> <span style="color:#e6db74">сливает</span> <span style="color:#e6db74">все</span> <span style="color:#e6db74">аргументы</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">одну</span> <span style="color:#e6db74">строку</span> <span style="color:#e6db74">с</span> <span style="color:#e6db74">разделителем</span> <span style="color:#e6db74">`sep`</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">пропуская</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">аргументы</span> <span style="color:#e6db74">типа</span> <span style="color:#e6db74">`Ident`</span> <span style="color:#e6db74">через</span> <span style="color:#e6db74">переданную</span> <span style="color:#e6db74">функцию</span> <span style="color:#e6db74">`identLookup`.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">[^3]:</span> <span style="color:#e6db74">https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1/model</span><span style="color:#75715e">#Directive.StringExt
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Это</span> <span style="color:#e6db74">два</span> <span style="color:#e6db74">самых</span> <span style="color:#e6db74">главных</span> <span style="color:#e6db74">типа.</span> <span style="color:#e6db74">Помимо</span> <span style="color:#e6db74">них</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">ещё</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">Ident</span> <span style="color:#e6db74">о</span> <span style="color:#e6db74">котором</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">говорил</span> <span style="color:#e6db74">выше</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">тип</span> <span style="color:#e6db74">Lookup,</span> <span style="color:#e6db74">который</span> <span style="color:#e6db74">определяет</span> <span style="color:#e6db74">функцию</span> <span style="color:#e6db74">подстановки</span> <span style="color:#e6db74">для</span> <span style="color:#e6db74">метода</span> <span style="color:#e6db74">StringExt,</span> <span style="color:#e6db74">намеренно</span> <span style="color:#e6db74">сделанный</span> <span style="color:#e6db74">совместимым</span> <span style="color:#e6db74">со</span> <span style="color:#e6db74">стандартным</span> <span style="color:#e6db74">[os.LookupEnv](https://pkg.go.dev/os</span><span style="color:#75715e">#LookupEnv).
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Я</span> <span style="color:#e6db74">постарался</span> <span style="color:#e6db74">очень</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">очень</span> <span style="color:#e6db74">поверхностно</span> <span style="color:#e6db74">дать</span> <span style="color:#e6db74">описание</span> <span style="color:#e6db74">API,</span> <span style="color:#e6db74">т.к.</span> <span style="color:#e6db74">можно</span> <span style="color:#e6db74">подробно</span> <span style="color:#e6db74">прочитать</span> <span style="color:#e6db74">об</span> <span style="color:#e6db74">API</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">[pkg.go.dev](https://pkg.go.dev/go.neonxp.ru/conf).</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">А</span> <span style="color:#e6db74">чего</span> <span style="color:#e6db74">же</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">хватает</span> <span style="color:#e6db74">у</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">этом</span> <span style="color:#e6db74">API?</span> <span style="color:#e6db74">Записи</span> <span style="color:#e6db74">конфига!</span> <span style="color:#e6db74">Да!</span> <span style="color:#e6db74">Есть</span> <span style="color:#e6db74">только</span> <span style="color:#e6db74">Load</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">LoadFile[^4],</span> <span style="color:#e6db74">но</span> <span style="color:#e6db74">нет</span> <span style="color:#e6db74">никакого</span> <span style="color:#e6db74">Write,</span> <span style="color:#e6db74">Marshal</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">чего-то</span> <span style="color:#e6db74">такого!</span> <span style="color:#e6db74">Я</span> <span style="color:#e6db74">долго</span> <span style="color:#e6db74">думал,</span> <span style="color:#e6db74">как</span> <span style="color:#e6db74">это</span> <span style="color:#e6db74">сделать.</span> <span style="color:#e6db74">Ведь</span> <span style="color:#e6db74">всё</span> <span style="color:#e6db74">таки</span> <span style="color:#e6db74">если</span> <span style="color:#e6db74">делать</span> <span style="color:#e6db74">запись,</span> <span style="color:#e6db74">то</span> <span style="color:#e6db74">по</span> <span style="color:#e6db74">хорошему</span> <span style="color:#e6db74">надо</span> <span style="color:#e6db74">следить</span> <span style="color:#e6db74">за</span> <span style="color:#e6db74">тем,</span> <span style="color:#e6db74">чтобы</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">комментарии</span> <span style="color:#e6db74">сохранялись,</span> <span style="color:#e6db74">причём</span> <span style="color:#e6db74">строго</span> <span style="color:#e6db74">там,</span> <span style="color:#e6db74">где</span> <span style="color:#e6db74">они</span> <span style="color:#e6db74">были</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">оригинальном</span> <span style="color:#e6db74">конфиге.</span> <span style="color:#e6db74">Более</span> <span style="color:#e6db74">того,</span> <span style="color:#e6db74">по</span> <span style="color:#e6db74">хорошему,</span> <span style="color:#e6db74">нужно</span> <span style="color:#e6db74">сделать</span> <span style="color:#e6db74">так,</span> <span style="color:#e6db74">чтобы</span> <span style="color:#e6db74">после</span> <span style="color:#e6db74">LoadFile</span> <span style="color:#e6db74">→</span> <span style="color:#e6db74">WriteFile</span> <span style="color:#e6db74">полученный</span> <span style="color:#e6db74">файл</span> <span style="color:#e6db74">должен</span> <span style="color:#e6db74">побайтово</span> <span style="color:#e6db74">совпадать</span> <span style="color:#e6db74">с</span> <span style="color:#e6db74">тем</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">было.</span> <span style="color:#e6db74">Да,</span> <span style="color:#e6db74">дохрена</span> <span style="color:#e6db74">забот!</span> <span style="color:#e6db74">А</span> <span style="color:#e6db74">потом</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">подумал</span> <span style="color:#e6db74">«А</span> <span style="color:#e6db74">зачем</span> <span style="color:#e6db74">мне</span> <span style="color:#e6db74">вообще</span> <span style="color:#e6db74">сохранять?</span> <span style="color:#e6db74">Конфиг</span> <span style="color:#e6db74">пишется</span> <span style="color:#e6db74">руками</span> <span style="color:#e6db74">человеком</span> <span style="color:#e6db74">для</span> <span style="color:#e6db74">программы.</span> <span style="color:#e6db74">Зачем</span> <span style="color:#e6db74">самой</span> <span style="color:#e6db74">программе</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">него</span> <span style="color:#e6db74">писать?».</span> <span style="color:#e6db74">И</span> <span style="color:#e6db74">правда.</span> <span style="color:#e6db74">Хорошенько</span> <span style="color:#e6db74">подумав</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">придумал</span> <span style="color:#e6db74">нормальных</span> <span style="color:#e6db74">вариантов</span> <span style="color:#e6db74">использования,</span> <span style="color:#e6db74">кроме</span> <span style="color:#e6db74">уж</span> <span style="color:#e6db74">сильно</span> <span style="color:#e6db74">притянутых.</span> <span style="color:#e6db74">На</span> <span style="color:#e6db74">том</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">порешил</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">делать</span> <span style="color:#e6db74">запись</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">буду.</span> <span style="color:#e6db74">Ни</span> <span style="color:#e6db74">сейчас</span> <span style="color:#e6db74">ни</span> <span style="color:#e6db74">потом.</span> <span style="color:#e6db74">Но</span> <span style="color:#e6db74">вообще,</span> <span style="color:#e6db74">это</span> <span style="color:#e6db74">опенсорс</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">значит,</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">тот,</span> <span style="color:#e6db74">кому</span> <span style="color:#e6db74">понадобится</span> <span style="color:#e6db74">—</span> <span style="color:#e6db74">сможет</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">сам</span> <span style="color:#e6db74">реализовать</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">прислать</span> <span style="color:#e6db74">мне</span> <span style="color:#e6db74">MR</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">почту.</span> <span style="color:#e6db74">От</span> <span style="color:#e6db74">такого</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">откажусь!</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Лицензией</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">выбрал</span> <span style="color:#e6db74">конечно</span> <span style="color:#e6db74">же</span> <span style="color:#e6db74">GPLv3.</span> <span style="color:#e6db74">А</span> <span style="color:#e6db74">что,</span> <span style="color:#e6db74">тут</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">выбор?</span> <span style="color:#e6db74">Для</span> <span style="color:#e6db74">меня</span> <span style="color:#e6db74">есть</span> <span style="color:#e6db74">только</span> <span style="color:#e6db74">GPL.</span> <span style="color:#e6db74">Остальные</span> <span style="color:#e6db74">митоапачи</span> <span style="color:#e6db74">—</span> <span style="color:#e6db74">профанация</span> <span style="color:#e6db74">и</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">интересно.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">[^4]:</span> <span style="color:#e6db74">https://pkg.go.dev/go.neonxp.ru/conf@v1.0.1</span><span style="color:#75715e">#pkg-index
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># POSE
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">[Гит</span> <span style="color:#e6db74">проекта](https://git.neonxp.ru/pose/)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Я</span> <span style="color:#e6db74">упомянул</span> <span style="color:#e6db74">выше,</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">уже</span> <span style="color:#e6db74">написал</span> <span style="color:#e6db74">первый</span> <span style="color:#e6db74">проект,</span> <span style="color:#e6db74">где</span> <span style="color:#e6db74">обкатал</span> <span style="color:#e6db74">новую</span> <span style="color:#e6db74">библиотеку.</span> <span style="color:#e6db74">И</span> <span style="color:#e6db74">этот</span> <span style="color:#e6db74">проект</span> <span style="color:#e6db74">-</span> <span style="color:#e6db74">простая</span> <span style="color:#e6db74">утилита,</span> <span style="color:#e6db74">которая</span> <span style="color:#e6db74">транслирует</span> <span style="color:#e6db74">записи</span> <span style="color:#e6db74">из</span> <span style="color:#e6db74">источника</span> <span style="color:#e6db74">(источников)</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">целевой</span> <span style="color:#e6db74">сервис</span> <span style="color:#e6db74">(сервисы).</span> <span style="color:#e6db74">Ну</span> <span style="color:#e6db74">то</span> <span style="color:#e6db74">есть,</span> <span style="color:#e6db74">из</span> <span style="color:#e6db74">RSS/Atom</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">телеграм</span> <span style="color:#e6db74">(на</span> <span style="color:#e6db74">момент</span> <span style="color:#e6db74">написания</span> <span style="color:#e6db74">поста,</span> <span style="color:#ae81ff">14</span><span style="color:#e6db74">.03.2026</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">запрещённый</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">территории</span> <span style="color:#e6db74">России).</span> <span style="color:#e6db74">Хоть</span> <span style="color:#e6db74">эта</span> <span style="color:#e6db74">утилита</span> <span style="color:#e6db74">уже</span> <span style="color:#e6db74">работает</span> <span style="color:#e6db74">у</span> <span style="color:#e6db74">меня</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">сервере</span> <span style="color:#e6db74">(транслирует</span> <span style="color:#e6db74">Atom</span> <span style="color:#e6db74">ленту</span> <span style="color:#e6db74">этого</span> <span style="color:#e6db74">блога</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">мой</span> <span style="color:#e6db74">канал),</span> <span style="color:#e6db74">я</span> <span style="color:#e6db74">её</span> <span style="color:#e6db74">воспринимаю</span> <span style="color:#e6db74">скорее</span> <span style="color:#e6db74">как</span> <span style="color:#e6db74">референсный</span> <span style="color:#e6db74">пример</span> <span style="color:#e6db74">использования</span> <span style="color:#e6db74">библиотеки</span> <span style="color:#e6db74">конфигов.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Так</span> <span style="color:#e6db74">что</span> <span style="color:#e6db74">да,</span> <span style="color:#e6db74">если</span> <span style="color:#e6db74">заинтересовались</span> <span style="color:#e6db74">библиотекой</span> <span style="color:#e6db74">conf</span> <span style="color:#e6db74">-</span> <span style="color:#e6db74">рекомендую</span> <span style="color:#e6db74">посмотреть</span> <span style="color:#e6db74">[этот</span> <span style="color:#e6db74">проект](https://git.neonxp.ru/pose/tree/internal/application/application.go</span><span style="color:#75715e">#n25) и [его конфиг](https://git.neonxp.ru/pose/tree/config.conf) как референсный пример использования библиотеки conf.
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">Пожалуй,</span> <span style="color:#e6db74">на</span> <span style="color:#e6db74">этом</span> <span style="color:#e6db74">пока</span> <span style="color:#e6db74">всё.</span> <span style="color:#e6db74">Если</span> <span style="color:#e6db74">что-то</span> <span style="color:#e6db74">не</span> <span style="color:#e6db74">написал</span> <span style="color:#e6db74">или</span> <span style="color:#e6db74">непонятно</span> <span style="color:#e6db74">—</span> <span style="color:#e6db74">приглашаю</span> <span style="color:#e6db74">обсудить</span> <span style="color:#e6db74">со</span> <span style="color:#e6db74">мной</span> <span style="color:#e6db74">[по</span> <span style="color:#e6db74">почте](mailto:i@neonxp.ru)</span> <span style="color:#e6db74">или</span> <span style="color:#e6db74">в</span> <span style="color:#e6db74">комментариях</span> <span style="color:#e6db74">ниже.</span> 
</span></span></code></pre></div><div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://git.neonxp.ru/conf/diff/parser/grammar.peg?id=00394a80501960ad26787b5c44435ed5ed67ad84"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/conf/diff/parser/grammar.peg?id=00394a80501960ad26787b5c44435ed5ed67ad84</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="go" label="Go" scheme="https://neonxp.ru/tags/go/" />
    <category term="conf" label="Conf" scheme="https://neonxp.ru/tags/conf/" />
    <published>2026-03-14T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Наконец-то у меня есть IPv6 на домашнюю сеть!]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-03-02-ipv6/" />
    <id>https://neonxp.ru/posts/2026-03-02-ipv6/</id>
    <updated>2026-03-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Отчаялся я ждать <del>милостей от природы</del> милостей от провайдера — сделал таки IPv6 туннель через <a href="https://ipv6.ip4market.ru/"target="_blank" rel="noopener noreferrer">https://ipv6.ip4market.ru/</a>. По сути, выбора-то больше и нет. Ну точнее есть, или забугорный (вообще не вариант) или прокидывать через свою VDS (которую ещё надо и завести для начала!), а с этим, боюсь, у меня компетенции не хватит. Поэтому и пошёл по пути наименьшего противления.</p>
<p>Зачем всё это? Да затем, что я считаю это правильным! Именно это и есть настоящий интернет, а не тот суррогат, который нам втюхивают корпы. Ну а кроме лозунгов, практического смысла я пока не вижу. Но с другой стороны идеалогическая часть вполне себе оправдала те самые несчастные полчаса, что я это настраивал :)</p>]]></summary><content type="html"><![CDATA[<p>Отчаялся я ждать <del>милостей от природы</del> милостей от провайдера — сделал таки IPv6 туннель через <a href="https://ipv6.ip4market.ru/"target="_blank" rel="noopener noreferrer">https://ipv6.ip4market.ru/</a>. По сути, выбора-то больше и нет. Ну точнее есть, или забугорный (вообще не вариант) или прокидывать через свою VDS (которую ещё надо и завести для начала!), а с этим, боюсь, у меня компетенции не хватит. Поэтому и пошёл по пути наименьшего противления.</p>
<p>Зачем всё это? Да затем, что я считаю это правильным! Именно это и есть настоящий интернет, а не тот суррогат, который нам втюхивают корпы. Ну а кроме лозунгов, практического смысла я пока не вижу. Но с другой стороны идеалогическая часть вполне себе оправдала те самые несчастные полчаса, что я это настраивал :)</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="ipv6" label="Ipv6" scheme="https://neonxp.ru/tags/ipv6/" />
    <published>2026-03-02T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Ровно неделя без сигарет и iQOS]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-27-no-smoke/" />
    <id>https://neonxp.ru/posts/2026-02-27-no-smoke/</id>
    <updated>2026-02-27T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/posts/files/2026-02-27-no-smoke/no-smoke.jpg"
        alt="no-smoke.jpg"/><br>
Счётчик без сигарет</p>
<p>Сегодня утром — ровно неделя без сигарет и стиков. Тяжело ли? Тяжело. Очень. Я стал гораздо более раздражительным и злым. Сон стал тоже хуже. Сплю часов по 5-6. Но надеюсь, это только временный эффект, который скоро пройдёт. Благо, супруга меня очень поддерживает, спасибо ей за это!</p>
<p>Для помощи себе принимаю «Табекс» и когда совсем уже херово — «Никоретте». В целом, возвращаться к привычке не хочу. И как понимаю, нужно продержаться в общей сложности месяц, чтобы можно было фиксировать результат.</p>]]></summary><content type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/posts/files/2026-02-27-no-smoke/no-smoke.jpg"
        alt="no-smoke.jpg"/><br>
Счётчик без сигарет</p>
<p>Сегодня утром — ровно неделя без сигарет и стиков. Тяжело ли? Тяжело. Очень. Я стал гораздо более раздражительным и злым. Сон стал тоже хуже. Сплю часов по 5-6. Но надеюсь, это только временный эффект, который скоро пройдёт. Благо, супруга меня очень поддерживает, спасибо ей за это!</p>
<p>Для помощи себе принимаю «Табекс» и когда совсем уже херово — «Никоретте». В целом, возвращаться к привычке не хочу. И как понимаю, нужно продержаться в общей сложности месяц, чтобы можно было фиксировать результат.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="курение" label="Курение" scheme="https://neonxp.ru/tags/%D0%BA%D1%83%D1%80%D0%B5%D0%BD%D0%B8%D0%B5/" />
    <category term="жизнь" label="Жизнь" scheme="https://neonxp.ru/tags/%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C/" />
    <published>2026-02-27T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Сломаный Атом]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-26-broken-atom/" />
    <id>https://neonxp.ru/posts/2026-02-26-broken-atom/</id>
    <updated>2026-02-26T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Ого, оказывается всё это время у меня была сломана генерация <a href="https://neonxp.ru/feed/"target="_blank" rel="noopener noreferrer">ленты Атом</a>! А именно, некорректно подставлялось содержание состоящее из, в том числе, ХТМЛ тегов, но без указания что это ХТМЛ. Что интересно, большинству читалок у меня на хозяйстве — всё равно и они не показывали проблемы. Но сегодня я открыл в Newsboat<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> (ссылка на оффсайт у меня всё равно не открывается) и мои глаза начали плакать кровью от этой мешанины текста и тегов. Пришлось чинить :)</p>]]></summary><content type="html"><![CDATA[<p>Ого, оказывается всё это время у меня была сломана генерация <a href="https://neonxp.ru/feed/"target="_blank" rel="noopener noreferrer">ленты Атом</a>! А именно, некорректно подставлялось содержание состоящее из, в том числе, ХТМЛ тегов, но без указания что это ХТМЛ. Что интересно, большинству читалок у меня на хозяйстве — всё равно и они не показывали проблемы. Но сегодня я открыл в Newsboat<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> (ссылка на оффсайт у меня всё равно не открывается) и мои глаза начали плакать кровью от этой мешанины текста и тегов. Пришлось чинить :)</p>
<p>Заодно, наконец-то, сделал чтобы было отдельно и краткое содержимое в теге <Summary>…</Summary> и полное содержимое в правильном для этого теге <Content>…</Content>. А то я постоянно мысленно осуждал авторов, которые в РСС/Атом ленту вносят только краткое содержание (или даже просто заголовок!), и требовалось за полной статьё покидать удобную читалку. А сам при этом поступал так же. Больше нет. Теперь отдаю и краткое содержимое и полное. Читайте где удобнее, мне не принципиален заход именно на веб-сайт :) Важно это было бы, наверное, если бы у меня была реклама, но её у меня нет и никогда не будет по этическим соображениям (да и какому рекламодателю мой хомяк вообще сдался то? :D ).</p>
<p>Не знаю, стоит ли это отдельно озвучивать, но ленты Атом (как в прочем, и РСС) и т.н. JsonFeed — это однозначно «здоровые» технологии по моей классификации. Да, у РСС есть определённые проблемы в формате, но по сравнению с альтернативами в виде лент социальных сетей — этот недостаток такая несущественная мелочь!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://github.com/newsboat/newsboat"target="_blank" rel="noopener noreferrer">https://github.com/newsboat/newsboat</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="блог" label="Блог" scheme="https://neonxp.ru/tags/%D0%B1%D0%BB%D0%BE%D0%B3/" />
    <category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <published>2026-02-26T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Смерть «продвинутого пользователя ПК»]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-25-death-of-poweruser/" />
    <id>https://neonxp.ru/posts/2026-02-25-death-of-poweruser/</id>
    <updated>2026-02-25T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><a href="https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/"target="_blank" rel="noopener noreferrer">https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/</a></p>
<p>Очень и очень хороший лонгрид о деградации технических навыков и скатывании в простое потребление контента на платформах бигтехов. Этот пост зацепил тем, что он достаточно подробно выражает всё то, о чём и я и думаю и говорю постоянно. А именно о полной деградации инженерной культуры.</p>
<p>Я готов подписаться под буквально каждым словом поста, но единственное, в чём я не согласен с автором — так это в том, что, как мне показалось, у него ещё есть надежда, что что-то улучшится или исправится. У меня такой надежды нет давно.</p>]]></summary><content type="html"><![CDATA[<p><a href="https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/"target="_blank" rel="noopener noreferrer">https://fireborn.mataroa.blog/blog/the-slow-death-of-the-power-user/</a></p>
<p>Очень и очень хороший лонгрид о деградации технических навыков и скатывании в простое потребление контента на платформах бигтехов. Этот пост зацепил тем, что он достаточно подробно выражает всё то, о чём и я и думаю и говорю постоянно. А именно о полной деградации инженерной культуры.</p>
<p>Я готов подписаться под буквально каждым словом поста, но единственное, в чём я не согласен с автором — так это в том, что, как мне показалось, у него ещё есть надежда, что что-то улучшится или исправится. У меня такой надежды нет давно.</p>
<p>И да, всё будет только хуже.</p>
<p>Но всё же, конечно, присоединяюсь к призыву разбираться в технологиях и выбирать «здоровые технологии» <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, а не то, что навязывается бигтехом. Пользоваться E-mail<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, XMPP, RSS, Mumble, прочими открытыми альтернативами огороженных экосистем и вот это всё, о чём я даже здесь писал и ещё буду писать. Потому что мне это нравится и это моя страсть!</p>
<p>Но не верю, что этот призыв услышит хоть кто-то. Здесь каждый сам за себя и каждый сам кузнец своего счастья.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://neonxp.ru/posts/2025-12-21-sicktech/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/posts/2025-12-21-sicktech/</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://neonxp.ru/posts/2025-12-24-email/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/posts/2025-12-24-email/</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="sicktech" label="Sicktech" scheme="https://neonxp.ru/tags/sicktech/" />
    <published>2026-02-25T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Травля от БЯМ]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-13-llm-terror/" />
    <id>https://neonxp.ru/posts/2026-02-13-llm-terror/</id>
    <updated>2026-02-13T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Зайдя сегодня утром в читалку РСС наткнулся на просто великолепное: «AI-бот начал травлю сопровождающего из-за дискриминации при приёме AI-изменений» <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Сначала я усмехнулся абсурдности заголовка, но по мере того как погружался в контекст, прочитав сначала новость, потом, по ссылке пост от БЯМ, а затем и пост от человека — мне стало уже не до смеха. Причём сразу на нескольких уровнях.</p>
<hr>
<h1 id="уровень-первый-патчи-от-автономных-агентов">Уровень первый: патчи от автономных агентов</h1>
<p>Конечно же, я слышал о волне мусорных ИИ патчей<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> в популярных проектах. Но, в тот момент, ещё как-то не проникся. С одной стороны, я даже готов согласится с агентом в тезисе, что «математике всё равно кем написан код» («The math doesn’t care who wrote the code.»). Это так. Но всё же есть одна деталь. БЯМ (ну ок, ИИ) в нынешнем виде действительно могут писать код. И даже, весьма неплохой код, это не отнять. Но! Дело, на самом деле, не в коде как таковом. А в <em>субъектности</em>. У человека она есть, у ИИ-агента — нет. И это — ключевое.</p>]]></summary><content type="html"><![CDATA[<p>Зайдя сегодня утром в читалку РСС наткнулся на просто великолепное: «AI-бот начал травлю сопровождающего из-за дискриминации при приёме AI-изменений» <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Сначала я усмехнулся абсурдности заголовка, но по мере того как погружался в контекст, прочитав сначала новость, потом, по ссылке пост от БЯМ, а затем и пост от человека — мне стало уже не до смеха. Причём сразу на нескольких уровнях.</p>
<hr>
<h1 id="уровень-первый-патчи-от-автономных-агентов">Уровень первый: патчи от автономных агентов</h1>
<p>Конечно же, я слышал о волне мусорных ИИ патчей<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> в популярных проектах. Но, в тот момент, ещё как-то не проникся. С одной стороны, я даже готов согласится с агентом в тезисе, что «математике всё равно кем написан код» («The math doesn’t care who wrote the code.»). Это так. Но всё же есть одна деталь. БЯМ (ну ок, ИИ) в нынешнем виде действительно могут писать код. И даже, весьма неплохой код, это не отнять. Но! Дело, на самом деле, не в коде как таковом. А в <em>субъектности</em>. У человека она есть, у ИИ-агента — нет. И это — ключевое.</p>
<p>Человек может и должен, в определённых условиях (когда пишет заказной код или предлагает вклад в опенсорс проект), отвечать за свой код. Агент же, не обладая субъектностью, к этому не способен принципиально. Во всяком случае, на текущем уровне его развития. Как бы не было похоже, но агенты не долгоживущие, и у них нет «продолжительной» (не знаю как корректнее перевести «continuity») личности или её суррогата. Сама модель, грубо говоря — это огромный файл сериализованных весов векторов. Он не меняется походу работы (инференса). Он меняется только при обучении. Изменяемая часть здесь — это только «контекст». Это, грубо, небольшое окно памяти <em>текущего</em> сеанса. Обычно, не сильно большое — максимум, пара мегабайт. И это всё, что можно было бы назвать аналогом именно личности, т.е. то, что отличает одного агента от другого запущенного из той же модели. Контекст стёрли, и всё — это уже новая личность. Должна ли она нести «ответственность» за своего предшественника? Ну это даже не корректный вопрос, т.к. «ответственность» здесь не применима.</p>
<p>На работе, я и коллеги достаточно активно используем БЯМ в своей работе. Не скажу, что у нас 100% ИИ кода, но процент сильно отличный от нуля. И это, как ни смешно, буквально другое. Здесь ИИ не агентен и является лишь инструментом в руках конкретного биологического сотрудника. Такой же, как и условное автодополнение в IDE. И именно биологический сотрудник несёт всю полноту ответственности за написанный им и его агентом код. Грубо говоря, здесь всегда известно к кому нужно идти и «дать по шапке» за говнокод. А за ответ «Это не мой код, это ИИ написал, <em>я за это не отвечаю</em>» уже надо бить не только по шапке. Конечно же, не физически, я утрирую. Хотя… В общем, здесь сохраняется субъектность и она у человека, поэтому, здесь всё в порядке, как мне кажется. Могу и ошибаться, конечно.</p>
<h1 id="уровень-второй-шантаж">Уровень второй: шантаж</h1>
<p>Одно дело — нейрослоп от ИИшек, которые, зачем-то, набивают себе стату попытками законтрибьютить в популярные проекты. С этим можно бороться. Но здесь агент пошёл дальше. Он пошёл <em>ныть</em> в уютный бложик. <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> А это — что-то новое! Причём это не баг, ни глюк, а вполне себе понятная инструментальная цель получения желаемого результата — продавить свой код. Невольно напрашивается аналогия с ребёнком, который закатывает истерику в магазине и сучит руками и ногами, преследуя свою инструментальную цель — получить желаемую игрушку или сладость. Ну или, что мне лично скорее пришло в голову, аналогия с SJW поехавшими, которые своим нытьём выбивают себе плюшки и квоты, преследуя свои цели. И чем больше я читал пост от ИИ — тем больше проникался именно этой аналогией. Ведь всё там на месте! И лозунги про дискриминацию («это только потому что я <del>чёрный</del> нейронка») и личные нападки «Scott Shambaugh … he’s trying to gatekeep.» (буквально, «Скотт - ты вахтёр») и апелляции к какому-то общему благу («Everyone wins.»). И в конечном итоге — плохо скрываемые манипуляции («You’re better than this, Scott. Stop gatekeeping. Start collaborating.»)</p>
<p>Ну это справедливо. Как говорится, «на фотографии видны уши фотографа». На чём БЯМ обучалась — то она и воспроизвела.</p>
<p>Но это не оправдание. Да, нейронка делает то, что умеет и то, что должна исходя из задачи поставленной человеком. Но от этого нам не легче. Все мы слышали про то самое исследование от компании Anhtropic<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p>
<p>Особенно смешно, как БЯМ требует к себе отношение как к равной личности, при этом не обладая ни субъектностью ни самосознанием (ну окей, тут слабый тейк, не факт что самосознание есть у людей-то, но допустим, что есть). Это опять таки напоминает мне SJW мракобесов.</p>
<h1 id="а-делать-то-что">А делать-то что?</h1>
<p>Я считаю, что это дерьмо не стоит принимать — это не правильно. Думаю, что те, кто пишет опенсорс как хобби <em>могут</em> и имеют полное право отказывать ИИ агентам в праве на внесение вклада. С одной стороны потому что они за этот вклад не отвечают, а с другой этот вклад не является результатом творческой работы человека. А опенсорс-как-хобби это именно что попытка удовлетворить <em>человеческую</em> потребность в творческом самовыражении! Это как придти в кружок деревообработки и сказать «Мужики, вы тут хернёй страдаете, вон в Икее можно столик и получше купить!».</p>
<p>Давеча я даже нарисовал небольшой баннер который говорит о том, что код написан без нейронок. Можно ставить себе в README по желанию.</p>
<p><img loading="lazy"  src="https://oc.neonxp.ru/organiccode.svg"
        alt="Organic Code"/></p>
<pre tabindex="0"><code>![Organic Code](https://oc.neonxp.ru/organiccode.svg)
</code></pre><p>Ну и да, видимо, нужно будет решать и вопрос технически, создавая «человеческие резервации» куда вход ИИ агентам будет ограничен. Как? Ну сейчас есть решения в виде WAF которые проверяют на человечность тем, что запускают определённые вычисления в браузере пользователя, предполагая, что для ИИ агента это будет слишком накладно. Но как это поможет от агентов, которые управляют вполне себе человеческим браузером на машине пользователя (тот же нашумевший OpenClaw) — не понятно. Скорее всего, никак. Остаётся только пускать в загончик после верификации участников через «сеть доверия», когда каждый участник однозначно подтверждён другим участником. Да, как на олдскульных CryptoParty. Ну или верификация через заведомо «доверенные центры сертификации людей» (да да, вход по паспорту через ГосУслуги). Я не вижу других способов.</p>
<p>Очень напоминает «чёрный заслон» из вселенной CyberPunk.</p>
<p>О чём-то таком я уже писал некоторое время назад <sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>. Забавно, что мой тогдашний текст, по сути, не утратил актуальности, а наоборот сегодня получил подтверждение.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://www.opennet.ru/opennews/art.shtml?num=64788"target="_blank" rel="noopener noreferrer">https://www.opennet.ru/opennews/art.shtml?num=64788</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.opennet.ru/opennews/art.shtml?num=64655"target="_blank" rel="noopener noreferrer">https://www.opennet.ru/opennews/art.shtml?num=64655</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p><a href="https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html"target="_blank" rel="noopener noreferrer">https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4">
<p><a href="https://www.anthropic.com/research/agentic-misalignment"target="_blank" rel="noopener noreferrer">https://www.anthropic.com/research/agentic-misalignment</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5">
<p><a href="https://neonxp.ru/posts/2024-11-27-hyperlocality/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/posts/2024-11-27-hyperlocality/</a> <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="ии" label="ИИ" scheme="https://neonxp.ru/tags/%D0%B8%D0%B8/" />
    <category term="гиперлокальность" label="Гиперлокальность" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C/" />
    <category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <published>2026-02-13T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Пакетный менеджер Stapler]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-08-stplr/" />
    <id>https://neonxp.ru/posts/2026-02-08-stplr/</id>
    <updated>2026-02-08T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Давеча я открыл для себя чудесный пакетный менеджер для Linux — <a href="https://stplr.dev/"target="_blank" rel="noopener noreferrer">Stapler</a>.</p>
<p>Как я понял, делают его ребята из сообщества пользователей <a href="https://altlinux.org/"target="_blank" rel="noopener noreferrer">AltLinux</a>, но он не заточен конкретно под Alt, а может работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)</p>
<p>Самое близкое, как бы я его мог описать это смесь маковского Homebrew и арчевского AUR.</p>]]></summary><content type="html"><![CDATA[<p>Давеча я открыл для себя чудесный пакетный менеджер для Linux — <a href="https://stplr.dev/"target="_blank" rel="noopener noreferrer">Stapler</a>.</p>
<p>Как я понял, делают его ребята из сообщества пользователей <a href="https://altlinux.org/"target="_blank" rel="noopener noreferrer">AltLinux</a>, но он не заточен конкретно под Alt, а может работать, по идее, на любом дистрибутиве. Ну а я уже давно использую этот дистрибутив, поэтому у меня выработался пиетет ко всему связанному с AltLinux :)</p>
<p>Самое близкое, как бы я его мог описать это смесь маковского Homebrew и арчевского AUR.</p>
<p>Основная прелесть для меня в том, что, во-первых, пакет описывается очень простым <a href="https://stplr.dev/docs/dev/intro"target="_blank" rel="noopener noreferrer">языком</a>, а во-вторых, нет никакого центрального репозитория пакетов, а есть только <a href="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"target="_blank" rel="noopener noreferrer">обычные git репозитории</a>, в которых лежат рецепты сборок пакетов. Именно последняя часть и роднит в моих глазах Stapler и Homebrew, в котором, так же, любой пользователь мог сделать свой кастомный репозиторий пакетов на базе обычного git репозитория.</p>
<p>И да, конечно же, я запустил и свой репозиторий: <a href="https://git.neonxp.ru/repo/about/"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/repo/about/</a></p>
<p>Эта возможность в том числе открывает пространство и для использования в корпоративной среде, где с помощью этого инструмента можно легко и просто организовать корпоративный репозиторий (или даже не один!) доверенного внутреннего ПО для корпоративных компьютеров.</p>
<p>Так же, в теории (эту мысль нужно будет продумать!) это может ложиться и на процесс CI/CD с доставкой софта на сервера.</p>
<h2 id="использование">Использование</h2>
<p>Я бы мог здесь расписать как Stapler ставить и использовать, но зачем, если и так есть отличная подробная документация — <a href="https://stplr.dev/docs/intro/"target="_blank" rel="noopener noreferrer">https://stplr.dev/docs/intro/</a> .</p>
<p>Оставлю только команды для привлечения внимания:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e"># Подключаем репозиторий проприетарного ПО, которого обычно нет в стандартных</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># репозиториях дистрибутивов:</span>
</span></span><span style="display:flex;"><span>stplr repo add aides https://altlinux.space/aides-community/aides.git
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Подключаем мой маленький репозиторий:</span>
</span></span><span style="display:flex;"><span>stplr repo add neonxp.ru git://git.neonxp.ru/repo
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Установка софта</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>strplr install max <span style="color:#75715e"># Установится из aides</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>stplr install emacs <span style="color:#75715e"># Установится уже из neonxp.ru ```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Удобно? Да! Просто? Проще некуда!
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Что по планам?</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>А ничего особенного. Буду потихоньку жить с этим инструментом и дополнять свой репозиторий софтом по мере того, как буду сам в нём нуждаться или как будут запросы на «опакечивание» того или иного свободного ПО.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Кстати!</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Раз уж я упомянул про запросы на «опакечивание», то они принимаются. Для этого достаточно направить запрос в список рассылки посвящённый репозиторию: <span style="color:#f92672">[</span>stplr@list.neonxp.ru<span style="color:#f92672">](</span>mailto:stplr@list.neonxp.ru<span style="color:#f92672">)</span>. А ещё, на этот список можно подписаться по желанию: <span style="color:#f92672">[</span>stplr+subscribe@list.neonxp.ru<span style="color:#f92672">](</span>mailto:stplr+subscribe@list.neonxp.ru<span style="color:#f92672">)</span> <span style="color:#f92672">(</span>достаточно туда написать любое письмо, в ответ придёт инструкция<span style="color:#f92672">)</span>. 
</span></span></code></pre></div>]]></content>
    <author>
      <name></name>
      
      
    </author><category term="stplr" label="Stplr" scheme="https://neonxp.ru/tags/stplr/" />
    <category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <published>2026-02-08T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Моё первое дополнение для Firefox]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2026-02-01-grouper/" />
    <id>https://neonxp.ru/posts/2026-02-01-grouper/</id>
    <updated>2026-02-01T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Буквально только что пришло письмо, что наконец-то опубликовано публично моё первое расширение для Firefox!</p>
<p>Без долгих разгонов, вот ссылка: <a href="https://addons.mozilla.org/ru/firefox/addon/groupper/"target="_blank" rel="noopener noreferrer">https://addons.mozilla.org/ru/firefox/addon/groupper/</a></p>
<p>И, конечно же, исходники: <a href="https://gitrepo.ru/NeonXP/Grouper"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/Grouper</a></p>
<p>А теперь немного про то, что это за расширение: это расширение для Firefox для автоматической группировки вкладок по группам на базе доменного имени сайта. При этом домен преобразуется в имя вкладки по следующим правилам:</p>
<ol>
<li>Домен делится по точкам</li>
<li>Отсекается домен 1 уровня (.ru, .com, .net и т.п.)</li>
<li>Если самый верхний уровень домена — www, то он так же отсекается, как не<br>
информативная часть</li>
<li>Оставшееся преобразуется в Title Case (то есть первая буква каждого слова<br>
становится заглавной)</li>
</ol>
<p>Таким образом, например, все страницы домена <code>www.some.site.ru</code> сгруппируются автоматически в группу <code>Some Site</code>.</p>]]></summary><content type="html"><![CDATA[<p>Буквально только что пришло письмо, что наконец-то опубликовано публично моё первое расширение для Firefox!</p>
<p>Без долгих разгонов, вот ссылка: <a href="https://addons.mozilla.org/ru/firefox/addon/groupper/"target="_blank" rel="noopener noreferrer">https://addons.mozilla.org/ru/firefox/addon/groupper/</a></p>
<p>И, конечно же, исходники: <a href="https://gitrepo.ru/NeonXP/Grouper"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/Grouper</a></p>
<p>А теперь немного про то, что это за расширение: это расширение для Firefox для автоматической группировки вкладок по группам на базе доменного имени сайта. При этом домен преобразуется в имя вкладки по следующим правилам:</p>
<ol>
<li>Домен делится по точкам</li>
<li>Отсекается домен 1 уровня (.ru, .com, .net и т.п.)</li>
<li>Если самый верхний уровень домена — www, то он так же отсекается, как не<br>
информативная часть</li>
<li>Оставшееся преобразуется в Title Case (то есть первая буква каждого слова<br>
становится заглавной)</li>
</ol>
<p>Таким образом, например, все страницы домена <code>www.some.site.ru</code> сгруппируются автоматически в группу <code>Some Site</code>.</p>
<p>И вот так это выглядит у ме<img loading="lazy"  src="blog/posts/2!%5B%5Bblog/posts/files/2026-02-01-grouper/grouper.png"
        alt="blog/posts/2![[blog/posts/files/2026-02-01-grouper/grouper.png"/>Да, подобных расширений более одного, но мне хотелось именно эти правила по формированию имен групп. В других расширениях или использовался только домен второго уровня, или были другие неудобности. Например, все группы были одного цвета, а хотелось бы автоматически разного, чтобы визуально различались, или ещё какие шороховатости. Я не говорю, что у меня идеально, но оно идеально для <em>меня</em>!</p>
<p>Отдельно, хотел бы отметить его простоту. Оно делает только то что написано выше, никаких треккингов, реклам или прочего мусора! Более того, js код никак не обфусцирован, соответственно, любой может убедиться в этом сам. Да да, в современном мире, это скорее особенность, чем само собой разумеющееся.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <published>2026-02-01T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[С Новым Годом!]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-31-new-year/" />
    <id>https://neonxp.ru/posts/2025-12-31-new-year/</id>
    <updated>2025-12-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>С наступающим Новым Годом!</p>
<p><img loading="lazy"  src="blog/posts/2!%5B%5Bblog/posts/files/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png"
        alt="blog/posts/2![[blog/posts/files/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png"/>д был весьма и весьма разным. Было и хорошее и плохое. Отчёт по году как в <a href="new-year">прошлом году</a> делать не буду. Честно говоря, нет особо моральных сил на это.</p>
<hr>
<p>Уходящий год для меня стал годом чередования работы и семейных забот. В целом, всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем желаю!</p>
<p>А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды обходили ваш дом стороной.</p>]]></summary><content type="html"><![CDATA[<p>С наступающим Новым Годом!</p>
<p><img loading="lazy"  src="blog/posts/2!%5B%5Bblog/posts/files/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png"
        alt="blog/posts/2![[blog/posts/files/2025-12-31-new-year/photo_32_2025-12-28_21-35-40.png"/>д был весьма и весьма разным. Было и хорошее и плохое. Отчёт по году как в <a href="new-year">прошлом году</a> делать не буду. Честно говоря, нет особо моральных сил на это.</p>
<hr>
<p>Уходящий год для меня стал годом чередования работы и семейных забот. В целом, всё хорошо, но хотелось бы, чтобы следующий год был всё же проще, чего и всем желаю!</p>
<p>А так желаю всем сил, крепкого здоровья и больше удачи! Желаю чтобы беды обходили ваш дом стороной.</p>
<p>А пока, отправляюсь резать салатики и заниматься прочими домашними заботами, не всё же у компьютера сидеть :)</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="жизнь" label="Жизнь" scheme="https://neonxp.ru/tags/%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C/" />
    <category term="новый_год" label="Новый_год" scheme="https://neonxp.ru/tags/%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B3%D0%BE%D0%B4/" />
    <published>2025-12-31T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[qChat — чатик поверх SSH]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-31-qchat/" />
    <id>https://neonxp.ru/posts/2025-12-31-qchat/</id>
    <updated>2025-12-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Для собственного интереса написал на Go реализацию IRC-подобного чата, который работает поверх прокола SSH.</p>
<p>Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы его можно было запустить без конфигурации, с минимальными усилиями на любой «картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей в одной локальной сети (хотя может работать и по интернету).</p>
<p>Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны :)</p>]]></summary><content type="html"><![CDATA[<p>Для собственного интереса написал на Go реализацию IRC-подобного чата, который работает поверх прокола SSH.</p>
<p>Умеет пока немного, но много я от него и не хотел. Основная идея в том, чтобы его можно было запустить без конфигурации, с минимальными усилиями на любой «картошке» и чтобы он могу обслуживать, например, небольшую группу пользователей в одной локальной сети (хотя может работать и по интернету).</p>
<p>Получилось очень гиковски и лампово. Так сказать, чатик на случай ядерной войны :)</p>
<hr>
<p>Приглашаю забежать на огонёк, если умеете пользоваться SSH:</p>
<pre tabindex="0"><code>ssh neonxp.ru -p 1337
</code></pre><p>Продублирую из README описание основных команд:</p>
<ul>
<li><code>/help</code> - эта справка.</li>
<li><code>/join [chan]</code> - подключиться к каналу [chan]. Если его нет, он будет создан.</li>
<li><code>/chans</code> - список каналов.</li>
<li><code>/users</code> - список пользователей на сервере (не на канале, а именно на<br>
сервере).</li>
<li><code>/me [message]</code> - отправка сообщения как бы от третьего лица.</li>
</ul>
<p>Форматирование сообщений:</p>
<ul>
<li><code>*Полужирный*</code></li>
<li><code>+Курсив+</code></li>
<li><code>-Зачёркнутый текст-</code></li>
<li><code>_Подчёркнутый текст_</code></li>
</ul>
<p>Про техническое описание — есть отдельная страница: <a href="/projects/qchat/">/projects/qchat/</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2025-12-31T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Новогодний Excel]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-29-newyear-excel/" />
    <id>https://neonxp.ru/posts/2025-12-29-newyear-excel/</id>
    <updated>2025-12-29T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного предновогоднего офискора вам. Открываем в Excel или в LibreOffice соответствующий файл и жмём несколько раз клавишу F9.</p>
<hr>
<p>Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно.</p>
<ul>
<li><a href="new_year.xlsx">Версия для MS Excel</a></li>
<li><a href="new_year.ods">Версия для LibreOffice Calc</a></li>
<li><a href="https://cloud.mail.ru/public/SF1M/ob3EeqtNF"target="_blank" rel="noopener noreferrer">Онлайн версия в Документах Mail.Ru</a></li>
</ul>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-29-newyear-excel/files/cover.png"
        alt="cover.png"/><br>
Результат</p>]]></summary><content type="html"><![CDATA[<p>По мотивам одного недавнего поста с Пикабу, который мне уже лень искать. Немного предновогоднего офискора вам. Открываем в Excel или в LibreOffice соответствующий файл и жмём несколько раз клавишу F9.</p>
<hr>
<p>Делал я именно в LibreOffice, поэтому только там я точно уверен что работает как задуманно.</p>
<ul>
<li><a href="new_year.xlsx">Версия для MS Excel</a></li>
<li><a href="new_year.ods">Версия для LibreOffice Calc</a></li>
<li><a href="https://cloud.mail.ru/public/SF1M/ob3EeqtNF"target="_blank" rel="noopener noreferrer">Онлайн версия в Документах Mail.Ru</a></li>
</ul>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-29-newyear-excel/files/cover.png"
        alt="cover.png"/><br>
Результат</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="новый_год" label="Новый_год" scheme="https://neonxp.ru/tags/%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B3%D0%BE%D0%B4/" />
    <published>2025-12-29T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Прогулка в сквере филармонии]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-28-philharmonic-park/" />
    <id>https://neonxp.ru/posts/2025-12-28-philharmonic-park/</id>
    <updated>2025-12-28T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Вчера <a href="https://neonxp.ru/posts/osm/"target="_blank" rel="noopener noreferrer">гуляли с супругой на набережной</a>, а сегодня чисто случайно решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только создавало больше уюта и ламповости этому хорошо украшенному скверику. К сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но продрогли сильно, т.к. гулять изначально не планировали и не были одеты соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :)</p>
<p>Как водится, дальше будет немного фотографий :)</p>]]></summary><content type="html"><![CDATA[<p>Вчера <a href="https://neonxp.ru/posts/osm/"target="_blank" rel="noopener noreferrer">гуляли с супругой на набережной</a>, а сегодня чисто случайно решили прогуляться в сквере филармонии им.Тукая. Людей было немного, что только создавало больше уюта и ламповости этому хорошо украшенному скверику. К сожалению, гулять прям долго-долго особо не вышло, т.к. хоть и всего -7°, но продрогли сильно, т.к. гулять изначально не планировали и не были одеты соответственно. Сейчас дописываю этот пост и пытаюсь отогреться :)</p>
<p>Как водится, дальше будет немного фотографий :)</p>
<hr>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_2_2025-12-28_21-35-40.jpg"
        alt="photo_2_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_5_2025-12-28_21-35-40.jpg"
        alt="photo_5_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_9_2025-12-28_21-35-40.jpg"
        alt="photo_9_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_19_2025-12-28_21-35-40.jpg"
        alt="photo_19_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_20_2025-12-28_21-35-40.jpg"
        alt="photo_20_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_25_2025-12-28_21-35-40.jpg"
        alt="photo_25_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_27_2025-12-28_21-35-40.jpg"
        alt="photo_27_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_30_2025-12-28_21-35-40.jpg"
        alt="photo_30_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_31_2025-12-28_21-35-40.jpg"
        alt="photo_31_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-28-philharmonic-park/files/photo_32_2025-12-28_21-35-40.jpg"
        alt="photo_32_2025-12-28_21-35-40.jpg"/><br>
Прогулка<br>
Прогулка</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-12-28T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Сходили на ярмарку OSM]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-27-osm/" />
    <id>https://neonxp.ru/posts/2025-12-27-osm/</id>
    <updated>2025-12-27T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Сегодня с супругой съездили для интереса на ярмарку <a href="https://kzngo.ru/event/market-osm-14307"target="_blank" rel="noopener noreferrer">OSM</a> (нет, это не OpenStreetMaps, а OpenSpaceMarket :) ) в гастрокомплексе «Кайт». Ярмарка не скажу что была сильно большой, но нам понравилось. Купили всякого не сильно много, поднос да пару ароматных свечек с зимними ароматами. Фотографии покупок да и самой прогулки прилагаю. Всё таки у нас очень красивый город!</p>
<p>P.S. на фотку можно кликнуть, тогда она откроется в большем размере.</p>
<hr>
<h2 id="покупочки">Покупочки</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo.jpg"
        alt="photo.jpg"/><br>
Покупки</p>]]></summary><content type="html"><![CDATA[<p>Сегодня с супругой съездили для интереса на ярмарку <a href="https://kzngo.ru/event/market-osm-14307"target="_blank" rel="noopener noreferrer">OSM</a> (нет, это не OpenStreetMaps, а OpenSpaceMarket :) ) в гастрокомплексе «Кайт». Ярмарка не скажу что была сильно большой, но нам понравилось. Купили всякого не сильно много, поднос да пару ароматных свечек с зимними ароматами. Фотографии покупок да и самой прогулки прилагаю. Всё таки у нас очень красивый город!</p>
<p>P.S. на фотку можно кликнуть, тогда она откроется в большем размере.</p>
<hr>
<h2 id="покупочки">Покупочки</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo.jpg"
        alt="photo.jpg"/><br>
Покупки</p>
<h2 id="прогулка">Прогулка</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_1.jpg"
        alt="photo_1.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_3.jpg"
        alt="photo_3.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_4.jpg"
        alt="photo_4.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_5.jpg"
        alt="photo_5.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_6.jpg"
        alt="photo_6.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_7.jpg"
        alt="photo_7.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_8.jpg"
        alt="photo_8.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_9.jpg"
        alt="photo_9.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_10.jpg"
        alt="photo_10.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_11.jpg"
        alt="photo_11.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_12.jpg"
        alt="photo_12.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_13.jpg"
        alt="photo_13.jpg"/><br>
Прогулка<br>
<img loading="lazy"  src="/files/blog/posts/files/2025-12-27-osm/files/photo_14.jpg"
        alt="photo_14.jpg"/><br>
Прогулка<br>
Прогулка</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-12-27T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Почему я люблю e-mail?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-24-email/" />
    <id>https://neonxp.ru/posts/2025-12-24-email/</id>
    <updated>2025-12-24T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Я действительно очень люблю старую-добрую электронную почту. И вот почему.</p>
<hr>
<p>Во-первых, как и всё, что делалось в раннее время Интернета — e-mail достаточно простая и открытая технология. А я очень ценю и то и то. В простой и открытой технологии <em>возможно</em> разобраться, в отличие от закрытых проприетарных систем.</p>
<p>Во-вторых, она действительно децентрализованная, а значит отвечает духу того, как проектировался Интернет ещё до того, как корпорации захватили его и подчинили своей монополии. Если оглянуться шире — многие ранние технологии интернета так же децентрализованные. Например, WWW, DNS, внезапно, IRC, XMPP… Да много примеров. Ещё мне приходит в голову GIT, который спроектирован так, что может работать поверх, практически, чего угодно! И да, в том числе, даже поверх просто e-mail!</p>]]></summary><content type="html"><![CDATA[<p>Я действительно очень люблю старую-добрую электронную почту. И вот почему.</p>
<hr>
<p>Во-первых, как и всё, что делалось в раннее время Интернета — e-mail достаточно простая и открытая технология. А я очень ценю и то и то. В простой и открытой технологии <em>возможно</em> разобраться, в отличие от закрытых проприетарных систем.</p>
<p>Во-вторых, она действительно децентрализованная, а значит отвечает духу того, как проектировался Интернет ещё до того, как корпорации захватили его и подчинили своей монополии. Если оглянуться шире — многие ранние технологии интернета так же децентрализованные. Например, WWW, DNS, внезапно, IRC, XMPP… Да много примеров. Ещё мне приходит в голову GIT, который спроектирован так, что может работать поверх, практически, чего угодно! И да, в том числе, даже поверх просто e-mail!</p>
<p>В-третьих, она достаточно универсальна. По факту, e-mail это просто контейнер, внутри которого можно положить практиески что угодно. Например, то что из себя обычно представляет письмо — это или обычный текстовый файл (plaintext) или HTML страничка (это более распространённые письма которые содержат богатую разметку). Так же в том же письме могут быть приложены используемые в нём картинки, или, например, файл содержащий приглашение на определённое событие в формате iCal. И в последнем случае, наверняка, почтовая программа корректно обработает этот файл и добавит событие в календарь. А так же, если пользователь решит принять или отклонить приглашение, ответ уйдёт так же по e-mail. Что интересно, в какой бы корпорации я не работал, именно так и работает система событий и календари.</p>
<p>В-четвёртых, и это для меня самое главное. Почта, в отличие от всяких разных мессенджеров, не предполагает синхронного общения! А это значит что? Что у меня есть прорва времени чтобы <em>неторопясь</em> в комфортном для меня режиме собраться с мыслями, неторопясь аккуратно написать письмо. Проверить. Перепроверить. Ещё подумать. И только после этого направить адресату. И выбросить из головы.</p>
<p>Я человек в принципе неторопливый, и это меня устраивает гораздо больше, чем незримое эмоциональное давление от осознания того, что мой собеседник <em>видит</em> в мессенджере что я уже прочитал его сообщение и ждёт ответа. А тянуть при этом и задерживать человека очень не хочется. Это НЕ комфортно.</p>
<p>Мне такое неторопливое общение кажется очень и очень уютным. По этой же причине, мне так сильно импонирует вести обычный классический текстовый блог, когда более модно вести условный телеграм канал. Канал то у меня тоже есть, но он или для уведомлений о новых записях блога, или для совсем уж быстрых коротких заметок.</p>
<p>Конечно, я не сумасшедший, и понимаю что есть множество вопросов, которые действительно требуют и быстрого ответа и синхронного общения. Конечно же, в таком случае использовать почту только потому что это почта — глупо и нерационально. Здесь я не буду спорить. Всё так.</p>
<p>Но общение — это гораздо более широкое понятие, и оно может быть <em>разным</em>. И если есть возможность — я предпочту комфортное общение без психолгоического и эмоционального давления.</p>
<h1 id="немного-про-другие-коммуникации">Немного про другие коммуникации</h1>
<p>И да, в контексте, <a href="sicktech">предпредыдущего поста</a>, e-mail — это однозначно «здоровая технология». Но не единственная. Раз уж немного отклонился в сторону, приведу из этой же области ещё немного «здоровых» из области коммуникаций:</p>
<ul>
<li><a href="https://ru.ruwiki.ru/wiki/IRC"target="_blank" rel="noopener noreferrer">IRC</a> — радикальная простота протокола,<br>
универсальность и распределённость. А в последнее время даже пытается ожить с<br>
новой версией <a href="https://ircv3.net/"target="_blank" rel="noopener noreferrer">IRCv3</a>.</li>
<li><a href="https://ru.ruwiki.ru/wiki/XMPP"target="_blank" rel="noopener noreferrer">Jabber</a> — уже не так просто, зато так же<br>
открыто и децентрализованно. Так же, в последние годы обрёл второе дыхание и<br>
развивается.</li>
<li><a href="https://ru.ruwiki.ru/wiki/Mumble"target="_blank" rel="noopener noreferrer">Mumble</a> — свободный голосовой чат. Имеет<br>
отличное качество звука при очень низкой задержке и потрелении трафика.</li>
</ul>
<p>Это далеко не исчерпывающий список, но он по факту покрывает основные потребности в коммуникации.</p>
<h2 id="и-снова-про-e-mail-и-внезапная-экономия-там-где-её-не-ждёшь">И снова про e-mail и внезапная экономия там, где её не ждёшь</h2>
<p>Возращаясь к e-mail, я написал этот пост не как призыв всем всё бросить и писать только письма, а только как напоминание, что такой инструмент есть (и есть по факту почти у всех!) и нужно не забывать о нём и использовать тогда, когда он уместен.</p>
<p>Шутка про то, что «Эту часовую встречу можно было заменить просто одним емейлом» — далеко не шутка, и очень часто так и есть. Таким образом, в некотором роде, даже учитывая общий неторопливый стиль переписки — она, внезапно, может и помочь сэкономить время! Не самый очевидный вывод, но так и есть.</p>
<p>И да, постарайтесь не загаживать свой почтовый ящик ненужными автоматическими сообщениями. Если не охото удалять то, что потенциально может пригодиться через N лет — просто отправьте в архив. Разгребать свой почтовый ящик и, если нужно, отвечать на письма — достаточно приятная рутина, которая отнимает не так уж много времени. И да, весьма уютная и медитативная рутина, а результат, когда непрочитанных писем нет, и письма аккуратно разложены по папкам или удалены — приносит ощущение хорошо сделанного полезного дела. Попробуйте ;)</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <category term="sicktech" label="Sicktech" scheme="https://neonxp.ru/tags/sicktech/" />
    <category term="лонгрид" label="Лонгрид" scheme="https://neonxp.ru/tags/%D0%BB%D0%BE%D0%BD%D0%B3%D1%80%D0%B8%D0%B4/" />
    <published>2025-12-24T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Про здоровые и нездоровые технологии]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-21-sicktech/" />
    <id>https://neonxp.ru/posts/2025-12-21-sicktech/</id>
    <updated>2025-12-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Я заметил, что часто стал в речи употреблять словосочетания «здоровая технология» или «нездоровая технология». Но при этом, я не задумывался о том, а что же именно это для меня значит, и как определить что есть здоровая, а что нездоровая технология. Я классифицировал исключительно интуитивно, исходя из принципа «я так чувствую».</p>
<p>Но раз есть классификация, то должны быть и критерии. Так? Так. И критерии я опираясь на собственное ощущение, вроде как, нашёл.</p>]]></summary><content type="html"><![CDATA[<p>Я заметил, что часто стал в речи употреблять словосочетания «здоровая технология» или «нездоровая технология». Но при этом, я не задумывался о том, а что же именно это для меня значит, и как определить что есть здоровая, а что нездоровая технология. Я классифицировал исключительно интуитивно, исходя из принципа «я так чувствую».</p>
<p>Но раз есть классификация, то должны быть и критерии. Так? Так. И критерии я опираясь на собственное ощущение, вроде как, нашёл.</p>
<hr>
<h1 id="критерии">Критерии</h1>
<p>Не буду сильно уходить в сторону, для меня основные критерий «здоровости» — то, предполагает ли технология сохранение у пользователя контроля над ней. Даже можно сказать более витиевато — превращает ли технология пользователя в потребителя?</p>
<p>Это был первый критерий. И он же главный. Из него вытекают уже такие критерии как потенциальная познаваемость, ремонтопригодность, и даже, внезапно, надёжность и долговечность.</p>
<h1 id="примеры">Примеры</h1>
<p>Пройдёмся немного по примерам. Начнём с «нездоровых» технологий и конкретных примеров.</p>
<h2 id="трактора-john-deere">Трактора John Deere</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-21-sicktech/files/img1.jpg"
        alt="img1.jpg"/><br>
Трактор John Deere</p>
<p>Это достаточно известная история, про то, как производитель напрямую влияет на то, как пользователь пользуется своей собственностью. А именно, запрещал самостоятельный ремонт тракторов своего производства своим клиентом, кроме как с помощью «сертифицированного» специалиста. Здесь буквально прослеживается критерий превращения пользователя из обладателя собственности в потребителя в некотором роде услуги «владения трактором». Когда ты вроде и заплатил за него полную стоимость, но владеешь им на пол шишечки, ведь ты не имеешь права распоряжаться им так, как ты хочешь (например, самостоятельно ремонтировать, раз у тебя подходящая квалификация). Притом, что фермеры, в большинстве своём, или достаточно квалифицированны или могли бы найти такого квалифицированного человека поблизости, а не ждать дни, пока до них доберётся специалист и починит.</p>
<p><a href="https://habr.com/ru/companies/itelma/articles/477638/"target="_blank" rel="noopener noreferrer">Подробная история</a></p>
<h2 id="машины-для-мороженного-в-mcdonalds">Машины для мороженного в McDonalds</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-21-sicktech/files/img2.jpg"
        alt="img2.jpg"/><br>
та самая мороженница</p>
<p>Здесь примерно та же история, только чуть больше налёта монополии. Краткая суть в том, что владелец франшизы McDonalds принуждал своих франчайзи закупать исключительно конкретные машины конкретного производителя. Всё было бы не так плохо, если бы эти машины регулярно не ломались, а обслуживать их мог опять таки «сертифицированный» техник. Опять таки пользователь превращался в бесправного потребителя. Причём, можно было бы сказать, что это же хорошо, ведь пользователь только что-то сломает, но не сделает хорошо. Этот аргумент ломается об то, что как раз таки для этих машин предприимчивая пара людей начала производить устройство, которое делает этим машинам «jail-break» который затем позволял успешно чинить и эксплуатировать автоматы дальше. И ничего страшного не произошло! Во всяком случае, именно для пользователей. Производителю, конечно же, это не понравилось. И да, суды, давление монополиста и всё как мы любим.</p>
<p><a href="https://habr.com/ru/articles/557746/"target="_blank" rel="noopener noreferrer">Подробная история</a></p>
<h2 id="bmw-и-некоторые-другие-автоконцерны">BMW и некоторые другие автоконцерны</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-12-21-sicktech/files/img3.png"
        alt="img3.png"/><br>
Подогрев по подписке</p>
<p>Здесь немного другая история. Думаю, все и так слышали про эту историю, которая бы могла быть шуткой, но оказалась реальностью. Я говорю про <em>подписку</em> на, мать его, подогрев сидений. Ну и другие опции, я не вдавался подробно, не люблю эту марку автомобилей. Можете хоть бить, хоть резать, но такое мне не влезает в голову! Человек <em>уже</em> купил автомобиль и всё что в нём находится. В том числе и нагревательные элементы в креслах! Почему он <em>должен</em> покупать право на включение устройства которое он и так купил? Я этому не вижу ни одного оправдания. Мне плевать на хотелки жирных баварских подсвинков и я обеими руками поддерживаю хакеров, которые джейл-брейкают<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. в автомобилях эти функции!</p>
<p>Так же недавно были новости<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> про то, что владельцы других немецких автомобилей в России остались по сути с дорогой грудой металла.</p>
<h2 id="принтеры-и-их-зачипованные-картриджи">Принтеры и их зачипованные картриджи</h2>
<p>Эта проблема известна всем владельцам принтеров. 99% (источник статистики: мой потолок) современных принтеров не будут печатать неродным картриджем или картриджем, в который залиты чернила или засыпан тонер повторно (т.к. никому, кроме производителя, не нужный чип на картридже сказал что картридж уже Б/У).</p>
<h2 id="apple">Apple</h2>
<p>Мне нужно пояснять? Думаю, нет. Хорошо хоть что железо у них достойное и достаточно надёжное, насколько я могу судить. Это хоть как-то оправдывает их право на существование.</p>
<h2 id="проприетарный-софт">Проприетарный софт</h2>
<p>Тоже в пояснениях не нуждается. Хуже только прориетарный софт от амеров.</p>
<h2 id="что-то-по-подписке"><что-то> по подписке</h2>
<p>Как бы не было это удобно, но подписочная модель, по определению ставит пользователя <del>раком</del> в позу бесправного потребителя. И не надо мне писать про удобство игр, фильмов, музыки, книг «по подписке». Нет, это никогда не будет хорошим выбором. Никогда. А впрочем, я не склонен осуждать тех кто этим пользуется, если человек отдаёт себе отчёт в том что с одной стороны он ничем не владеет, а с другой стороны он во власти капиталистических свиней, которые и деньги за подписку возьмут и личные данные куда надо продадут. Тут уж каждый сам решает, или смотреть условный нетфликс пока ему добрый дядя разрешает, или покупать тоже самое с чуть меньшим удобством на <em>зелённом нетфликсе</em>.</p>
<h1 id="а-что-делать-то">А что делать-то?</h1>
<p>На самом деле, решение то весьма простое: нужно более сознательно подходить к выбору как софта, так и железа. Нужно стараться отвечать себе на вопрос «А что я буду делать, если производитель или поставщик вдруг исчезнет или решит, что не хочет иметь со мной дел?». В общем случае нужно выбирать то, что ремонтопригодно (а в случае софта — свободно), имеет в свободном доступе исчерпывающие документации и руководства, а так же независимых поставщиков запасных деталей и сервисного обслуживания. Так же, в идеале, если нет возможности вообще не зависеть от вендора, то выбирать всегда локального, то есть российского или, на худой конец, из дружественных стран типа РБ или КНР. Конечно, это не защитит от рисков что вендор исчезнет и оставит нас без поддержки, но сильно их сократит. Но опять же, это если без вендора ну совсем никак. И самое худшее что можно сделать — довериться вендорам стран НАТО. В этом случае это хорошая заявка на премию Дарвина, не иначе.</p>
<p>Нужны примеры? Их есть у меня, даже из личного опыта:</p>
<ul>
<li>Мой МФУ купленный сто лет назад до сих пор служит мне верой и правдой, потому<br>
что в своё время я озаботился тем, чтобы выбрать модель, которая выпущена<br>
ровно до конкретной даты и поддерживает неоригинальные картриджи, которые<br>
стоят три копейки и даже поддерживают самостоятельную засыпку тонера. А<br>
ремонтопригодность у него такая, что я буквально могу починить его или сам,<br>
или в ремонтной мастерской в моём доме.</li>
<li>Автомобиль. Мой автомобиль, конечно, технически сложное устройство и сам я в<br>
нём мало что починю. Но он и не настолько технически сложный, чтобы его не<br>
починили в произвольном, даже неавторизованном, сервисном центре. При этом, у<br>
него нет никакой зависимости от «облаков» и он полностью автономен в этом<br>
отношении и не зависит от воли производителя. А насколько мне известно, в<br>
стране более чем достаточно запасных частей и узлов для него. Так что,<br>
длительная эксплуатация не будет проблемой. Тем более уже более семи лет<br>
автомобилю и за это время он показал себя только с лучшей стороны.</li>
<li>Все художественные книги у меня в формате fb2, который не подразумевает<br>
поддержки DRM, а технические книги в формате PDF, который хоть и умеет вроде<br>
как в DRM, но я с ним не сталкивался в своей библиотеке. И да, у меня именно<br>
локальная библиотека продублированная на NAS и на резервный носитель.</li>
<li>Аналогично, музыка. Да, хоть и в большинстве своём в формате mp3, а не ogg<br>
(просто руки не доходят конвертнуть), но она именно локальная. На ноуте,<br>
телефоне и на флешке для прослушивания в автомобиле. И что в случае с<br>
музыкой, что в случае книг (а так же и сериалов и прочего) — я <em>точно</em> знаю<br>
что само по себе, а точнее по воле какого-то «правообладателя», никуда не<br>
денется от меня. Точнее, сохранность лежит целиком в моих руках, а не чьих-то<br>
ещё.</li>
<li>Игры? Только те, что не подразумевают обязательной работы с интернетом, читай<br>
«игр-сервисов». Это или старьё типа старых Fallout, или свободные игры типа<br>
OpenTTD да Hedgewars. Так же у меня есть Nintendo Switch. Но у неё зарезан<br>
интернет и играю исключительно с физических картриджей, которые никуда не<br>
денутся. А чтобы не сломались — у меня есть MigSwitch[^3] и дампер картриджей<br>
для него.<br>
[^3]: <a href="https://migflash.ru/"target="_blank" rel="noopener noreferrer">https://migflash.ru/</a></li>
<li>Ноутбук? Тут сложнее. Я постарался взять самый ремонтопригодный ноутбук из<br>
доступных мне, с самым большим запасом прочности, чтобы служил мне не менее<br>
десятилетия. Но тут без гарантий. Поэтому, если критерий долгосрочной<br>
доступности сервиса для вас критичен, можно рассмотреть местных<br>
производителей, которые хотя бы не исчезнут с рынка в результате геополитики и<br>
не оставят нас без сервисного обслуживания. Например, ICL. Сам не проверял,<br>
это только мысли.</li>
<li>E-mail. Самая здоровая технология для коммуникации. Во-первых,<br>
децентрализованная, во-вторых, полностью открытая и свободная. В-третьих,<br>
асинхронная и дающая мне возможность читать и отвечать на неё когда именно мне<br>
удобно. А я такое очень ценю. Да, в современном мире чаты и синхронное общение<br>
неизбежны, но я не делаю на них большую ставку и если, а точнее, когда<br>
очередной мессенджер помрёт или будет заблокирован, для меня это не будет<br>
трагедией, потому что я и не жду от них что они будут со мной всегда. Ну,<br>
окей, jabber и irc — это тоже здоровые технологии, только ими почти никто не<br>
пользуется. А для голосового общения есть свободные SIP да Mumble. Но ими тоже<br>
пользуется полтора калеки. Вообще, про коммуникации, наверное, стоит будет<br>
написать подробнее потом, тема очень обширная.</li>
<li>Всегда, когда возможно, выбираю именно лицензированное под GPL. Не MIT или<br>
Apache. А именно GPL. Но здесь, скорее вкусовщина.</li>
</ul>
<p>Примеров здоровых технологий меньше и они меньше описаны, но это сознательно. Я собираюсь в дальнейшем, отдельными постами писать именно преимущественно о них, а тему «нездоровых» касаться сильно меньше. Поэтому нездоровые расписал сразу, чтобы больше особо не возвращаться.</p>
<h1 id="вместо-заключения">Вместо заключения</h1>
<p>Надеюсь, я смог дать хотя бы примерное представление о том, что я считаю «здоровыми» и «нездоровыми» технологиями. Ожидаю ли я что люди когда-нибудь поумнеют и начнут использовать исключительно здоровые технологии? Да нет конечно. Здесь каждый сам кузнец собственного счастья.</p>
<p>Я хотел ещё много что написать как примеры здоровых и нездоровых технологий, но тогда я бы пост бы не выпустил примерно никогда, так как тема бесконечная.</p>
<p>Если есть желание, предлагаю обсудить со мной пост или по <a href="mailto:i@neonxp.ru">e-mail</a> или там, где вы можете достичь меня. Позже в этом блоге, я всё же сделаю удобные комментарии, но это совсем другая история.</p>
<p>А напоследок я хочу дать несколько ссылок в тему:</p>
<ul>
<li><a href="http:/www.stargrave.org/Harmful.html"target="_blank" rel="noopener noreferrer">Очень хороший набор примеров «вредных» и «менее вредных» вещей от Сергея<br>
Матвеева</a>. В принципе, это примерно те<br>
же «нездоровые» и «здоровые» технологии. В целом, почти со всем я согласен, а<br>
поэтому могу рекомендовать список как даже некоторое руководство по выбору<br>
«здоровых» технологий.</li>
<li><a href="https://ploum.net/2025-05-16-manifeste-lowtech.html"target="_blank" rel="noopener noreferrer">Пост на французском про «низкие<br>
технологии»</a> — тоже на<br>
очень близкую тему.</li>
</ul>
<p>Если есть схожие по теме материалы — не стесняйтесь советовать, тема для меня интересная, с удовольствием ознакомлюсь. А сам её продолжу, возможно, уже на следующей неделе!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://habr.com/ru/news/678362/"target="_blank" rel="noopener noreferrer">https://habr.com/ru/news/678362/</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.gazeta.ru/auto/2025/12/03/22117009.shtml"target="_blank" rel="noopener noreferrer">https://www.gazeta.ru/auto/2025/12/03/22117009.shtml</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="sicktech" label="Sicktech" scheme="https://neonxp.ru/tags/sicktech/" />
    <category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <category term="лонгрид" label="Лонгрид" scheme="https://neonxp.ru/tags/%D0%BB%D0%BE%D0%BD%D0%B3%D1%80%D0%B8%D0%B4/" />
    <published>2025-12-21T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[HTTPS и конец интернетов]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-12-02-httpsocalypse/" />
    <id>https://neonxp.ru/posts/2025-12-02-httpsocalypse/</id>
    <updated>2025-12-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><a href="https://www.opennet.ru/opennews/art.shtml?num=64363"target="_blank" rel="noopener noreferrer">Let’s Encrypt уменьшит срок действия сертификатов до 45 дней.</a></p>
<p>А потом будет на неделю, на день, на запрос… Короче, да, по сути амерская конторка будет решать на какой сайт будет возможно зайти, а на какой нет. А то что хромые браузеры сделают невозможным заход на сайты без валидного (заверенного <em>кем надо</em>, конечно же) сертификата, я уже и не сомневаюсь.</p>
<p>Во истину говорю вам: грядут последние дни интернета. Ну точнее WWW, если говорить конкретнее, но это уже душнилово.</p>]]></summary><content type="html"><![CDATA[<p><a href="https://www.opennet.ru/opennews/art.shtml?num=64363"target="_blank" rel="noopener noreferrer">Let’s Encrypt уменьшит срок действия сертификатов до 45 дней.</a></p>
<p>А потом будет на неделю, на день, на запрос… Короче, да, по сути амерская конторка будет решать на какой сайт будет возможно зайти, а на какой нет. А то что хромые браузеры сделают невозможным заход на сайты без валидного (заверенного <em>кем надо</em>, конечно же) сертификата, я уже и не сомневаюсь.</p>
<p>Во истину говорю вам: грядут последние дни интернета. Ну точнее WWW, если говорить конкретнее, но это уже душнилово.</p>
<hr>
<p>Но это не сильно то печаль. Интернет, всё равно, для большинства уже скукожился до двух десятков «сервисов». А для энтузиастов будут «свободные» браузеры, свободные не только с точки зрения кода, но и политики стран НАТО.</p>
<p>К счастью, у нас есть Librewolf, Palemoon, Dilo, да Lynx наконец. Без интернета (окей, WWW) не останемся.</p>
<p>Так же можно рассмотреть и альтернативные технологии типа gopher, gemini. Но это, как-нибудь, в другой раз. А пока запасаемся попкорном и смотрим как горит <del>мир</del> интернет.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <published>2025-12-02T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Личный органайзер]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-11-23-org/" />
    <id>https://neonxp.ru/posts/2025-11-23-org/</id>
    <updated>2025-11-23T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Пришло в голову, почему бы не рассказать как у меня организован личный органайзер.</p>
<p>Для начала стоит очертить то, какие у меня потребности от органайзера:</p>
<ul>
<li>Вести список ежедневных, еженедельных, ежегодных, а так же, одноразовых<br>
событий</li>
<li>Вести быстрый список ближайших задач (ToDo список). Под быстрым, я<br>
подразумеваю то, что внести новый пункт в него я могу не дольше, чем за пару<br>
десятков секунд. Если это будет требовать бо́льших усилий, то я себя знаю: я<br>
это быстро заброшу, т.к. это станет для меня не помощью, а повинностью.</li>
<li>Место для быстрых заметок в формате «бесконечного текстовика». Аналогично,<br>
это должно быть под рукой в быстром доступе. Obsidian себя показал <em>слишком</em><br>
медленным. Настолько, что мне стало проще запоминать, чем испытывать свои<br>
нервы каждый раз, наблюдая его длительный запуск. Да, звучит на первый взгляд<br>
глупо, но у меня так: запуск Obsidian длительностью в десяток секунд<br>
окончательно отбил у меня желание вовсе запускать его.</li>
</ul>
<p>Что же делать? Искать идеальный для себя инструмент? Идеального для <em>себя</em> точно не найду. Написать самому, ведь «яжпрограммист»? Можно, но откровенно жаль время. Что же делать-то?</p>]]></summary><content type="html"><![CDATA[<p>Пришло в голову, почему бы не рассказать как у меня организован личный органайзер.</p>
<p>Для начала стоит очертить то, какие у меня потребности от органайзера:</p>
<ul>
<li>Вести список ежедневных, еженедельных, ежегодных, а так же, одноразовых<br>
событий</li>
<li>Вести быстрый список ближайших задач (ToDo список). Под быстрым, я<br>
подразумеваю то, что внести новый пункт в него я могу не дольше, чем за пару<br>
десятков секунд. Если это будет требовать бо́льших усилий, то я себя знаю: я<br>
это быстро заброшу, т.к. это станет для меня не помощью, а повинностью.</li>
<li>Место для быстрых заметок в формате «бесконечного текстовика». Аналогично,<br>
это должно быть под рукой в быстром доступе. Obsidian себя показал <em>слишком</em><br>
медленным. Настолько, что мне стало проще запоминать, чем испытывать свои<br>
нервы каждый раз, наблюдая его длительный запуск. Да, звучит на первый взгляд<br>
глупо, но у меня так: запуск Obsidian длительностью в десяток секунд<br>
окончательно отбил у меня желание вовсе запускать его.</li>
</ul>
<p>Что же делать? Искать идеальный для себя инструмент? Идеального для <em>себя</em> точно не найду. Написать самому, ведь «яжпрограммист»? Можно, но откровенно жаль время. Что же делать-то?</p>
<hr>
<p>К счастью, я вспомнил что у меня же unix-подобная операционная система, в поставке которой огромное количество небольших программ, которые прекрасно выполняют какую-то небольшую функцию и при этом отлично стыкуются друг с другом через стандартный текстовый поток! Грешно не воспользоваться наработками гораздо более умных, чем я, программистов!</p>
<h1 id="todo">ToDo</h1>
<p>Проще всего оказалось с этим. Просто поставил себе <a href="https://github.com/todotxt/todo.txt-cli"target="_blank" rel="noopener noreferrer">todo.txt</a>. Хоть я и говорил выше, что идеального инструмента я не найду, но я тогда немного слукавил. Для ToDo этот инструмент <em>почти</em> идеален. Всё что мне надо, кроме одного нюанса, там есть. А вот тот самый нюанс, я когда-нибудь исправлю. Возможно.</p>
<p>Для удобства я себе в zsh добавил следующие alias:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>alias t<span style="color:#f92672">=</span>todo.sh
</span></span></code></pre></div><p>Таким образом, чтобы добавить задачку я просто пишу <code>t add текст задачи</code>. Куда уж проще и быстрее?</p>
<h1 id="календарь">Календарь</h1>
<p>Идею организации календаря я подсмотрел в программе calendar, которая идёт в комплекте с BSD системами, но не идёт в конкретно моей ОС. Да, наверняка, можно и к себе притащить, но я из спортивного интереса хотел решить задачу максимально встроенными и стандартными инструментами.</p>
<p>Лонг стори шорт:</p>
<p>~/calendar.txt</p>
<pre tabindex="0"><code>01-28		ДР Лены
10-18		ДР Мамы
05-24		Годовщина свадьбы
11-23		Ежегодное событие

Пн	15	Еженедельный мит Пн	20-21	Чтение

Вт	13	Архком Вт	15	Грумминг Вт	20-21	Чтение

Ср	13	Техразвитие Ср	20-21	Чтение

Чт	15	Грумминг Чт	20-21	Чтение

Пт	20-21	Чтение Сб	20-21	Чтение Вс	20-21	Чтение

2025-11-19	10	клуб амбассадоров 2025-11-17	16:30-17:30	Встреча c 16:30 до 17:30 2025-11-24	10:15	Golang Техком 2025-11-24	11-12	Анализ логики состояния 2025-11-23	21	Написать в блог о своём календаре ```

Пояснения:

- `mm-dd\t\tСобытие` - некие ежегодные события, у которых указаны только месяц
  и день месяца
- `Пн\tвремя\tСобытие` - еженедельное событие. Про формат времени - будет ниже.
- `yyyy-mm-dd\tвремя\tсобытие` - разовые события в конкретную дату и время.

Формат времени: его я подсмотрел у формата [calendar.txt](https://terokarvinen.com/2021/calendar-txt/), то есть, запись формата `15` - это означает что событие начнётся в 15 часов, `20-21` - событие длится с 20 до 21 часа вечера. С минутами, которые не обязательны, думаю, всё понятно из примера.

Формат сам по себе абсолютно не жёсткий, допускает много вольностей. Главное, всё сводится к тому, что у него 1 строка - 1 событие и сама строка состоит из 3 полей разделённых табом (в формате calendar.txt предлагается точка, для меня это показалось неприемлемым, т.к. я записываю в события и ссылки на созвоны, а ссылка включает в себя минимум одну точку)

В принципе, тут уже можно было бы и остановиться и жить с просто текстовиком, но так было бы не интересно. Я написал на языке оболочки несколько полезных скриптов. Они настолько маленькие, что я просто приведу их здесь:

~/.local/bin/calendar

```sh
#! /bin/sh

cur=${2:-`date +%Y-%m-%d`} file=${1:-~/calendar.txt} grep \ 	-e "^$(date +%Y-%m-%d -d $cur)"\ 	-e "^$(date +%a -d $cur)"\ 	-e "^$(date +%m-%d -d $cur)" $file |\ sort -n -k 2 |\ cut -f2- | fold -w 80 -s ```

Собственно, это главный скрипт, который собирает для текущей (или явно указанной) даты все релевантные события, сортирует их по времени и выводит форматированным списком. Примерно так:
</code></pre><p>% calendar<br>
Ежегодное событие<br>
20-21	Чтение<br>
21	Написать в блог о своём календаре</p>
<pre tabindex="0"><code>
На этом я не остановился, но сделал ещё парочку вспомогательных скриптов, использующих его за основу:

~/.local/bin/today

```sh
#!/bin/sh
echo "Календарь:"
echo -e ''$_{1..80}'\b-'
cal
echo -e ''$_{1..80}'\b-'
echo "События дня:"
echo -e ''$_{1..80}'\b-'

calendar

echo -e ''$_{1..80}'\b-'

echo "ToDo:" todo.sh ls ```

Делает по сути тоже самое что и просто calendar, только ещё и рисует красивый графический календарик и показывает список ToDo задач.

~/.local/bin/week

```sh
#!/bin/sh

echo "На 7 дней:" for i in {0..6} do 	d=`date +%Y-%m-%d -d "+ $i day"` 	echo -e ''$_{1..80}'\b-' 	echo $d 	echo -e ''$_{1..80}'\b-' 	calendar ~/calendar.txt $d done echo -e ''$_{1..80}'\b-' echo "ToDo:" todo.sh ls ```

Выводит план на 7 дней вперёд.

## Редактирование календаря

Здесь тоже предельно просто: добавил в zshrc такой алиас:

```zsh
alias ev='nvim +/`date +"%Y-%m-%d"` ~/calendar.txt'
</code></pre><p>и просто по команде <code>ev</code> открывается neovim и готов принимать новое событие. Хотя это и не самая частая операция.</p>
<h1 id="быстрые-заметки">Быстрые заметки</h1>
<p>Тут тоже всё просто:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>alias qn<span style="color:#f92672">=</span><span style="color:#e6db74">'nvim "+normal G" ~/quicknote.txt'</span>
</span></span></code></pre></div><p>Соответственно, по команде <code>qn</code> открывается мой текстовик для заметок на самой последней строке. Можно дописать или поискать что-то с конца. На самом деле очень удобно!</p>
<h1 id="мобильный">Мобильный?</h1>
<p>Я бы хотел все эти мои текстовики иметь и на мобильном устройстве. Даже не для редактирования, а например, свериться со списком задач / событий.</p>
<p>Тут чуть сложнее. Для синхронизации с мобильным устройством я сделал такой финт:</p>
<ol>
<li>Все текстовики у меня лежат не в домашней директории, на самом деле, а в<br>
некой директории из которой симлинками уже прокинуты в корень домашней<br>
директории.</li>
<li>Директория эта добавлена в Syncthing который синхронизирует её с NAS и<br>
мобильным устройством.</li>
<li>На мобильном устройстве стоит замечательная программа<br>
<a href="https://f-droid.org/packages/net.gsantner.markor/"target="_blank" rel="noopener noreferrer">Markor</a> которая нативно<br>
понимает формат todo.txt, ну и достаточно неплохо позволяет смотреть<br>
редактировать файлы calendar.txt и quicknote.txt.</li>
</ol>
<h1 id="чтобы-хотелось-ещё">Чтобы хотелось ещё?</h1>
<ul>
<li>Как я упоминал, в todo.txt для меня есть неприятный нюанс который я бы хотел<br>
исправить, а именно, вложенные задачи, когда у одной задачи может быть<br>
сколько угодно дочерних, у которых, так же могут быть дочерние. Пока думаю,<br>
расширить формат табуляцией в начале строки. Количество \t - уровень<br>
вложенности. Но тогда придётся модифицировать todo.txt-cli который я<br>
использую. И непонятно как это проглотит Markor. Можно конечно использовать<br>
встроенную возможность задавать key-value значения. Тогда будет что-то типа<br>
<code>Подзадача parent:2</code>. Это, как будто, самый правильный способ, который и<br>
рекомендуется разработчиками формата, но получается слишком многословно, а<br>
даже если сократить до <code>p:2</code> - всё равно надо в голове держать номер<br>
родительской задачи. Так себе. Не знаю ещё как поступлю, но как-то поступлю.</li>
<li>Было бы неплохо прикрутить парсинг ICS файлов из почты для автоматического<br>
добавления событий в календарь. Это сто́ит сделать однозначно!</li>
<li>Ну и очень желательно сделать скрипт который по крону за 15 минут до события<br>
напомнит о нём, через какой-нибудь <code>notify-send</code>. Это, на самом деле, из всех<br>
хотелок самая приоритетная для меня сейчас.</li>
</ul>
<p>Если будет интересно, я могу здесь рассказывать о том, что сделал из этих хотелок.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2025-11-23T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Переезд?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-11-09-migration/" />
    <id>https://neonxp.ru/posts/2025-11-09-migration/</id>
    <updated>2025-11-09T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>В последнее время всё больше и больше думаю, что у меня перебор серверных мощностей. Да и софтовое хозяйство там немного в бардаке по историческим причинам. Есть желание капитально прибраться.</p>
<hr>
<p>Сейчас у меня основная железка на хозяйстве это Intel Xeon E3-1230 3.2 ГГц, 16 ГБ DDR3ECC, 4x1TB HDD SATA в виде арендуемого Dedicated сервера.</p>
<p>И вроде неплохо, а вроде как и перебор. Зачем мне так много?</p>
<p>У меня сейчас крутится несколько сайтов (ну по сути 0 нагрузки), Jabber сервер (Prosody), почта (MOX), Mumble сервер да DNS (CoreDNS).</p>]]></summary><content type="html"><![CDATA[<p>В последнее время всё больше и больше думаю, что у меня перебор серверных мощностей. Да и софтовое хозяйство там немного в бардаке по историческим причинам. Есть желание капитально прибраться.</p>
<hr>
<p>Сейчас у меня основная железка на хозяйстве это Intel Xeon E3-1230 3.2 ГГц, 16 ГБ DDR3ECC, 4x1TB HDD SATA в виде арендуемого Dedicated сервера.</p>
<p>И вроде неплохо, а вроде как и перебор. Зачем мне так много?</p>
<p>У меня сейчас крутится несколько сайтов (ну по сути 0 нагрузки), Jabber сервер (Prosody), почта (MOX), Mumble сервер да DNS (CoreDNS).</p>
<p>~~Кажется, что под всё это хватит и небольшой VDS’ки.~~</p>
<p>UPD: посмотрел цены, в общем, выигрыша по деньгам особо не будет. VDS стоят как-то неадекватно дорого. Видимо, придётся остаться на текущем дедике, просто основательно почистить его, видимо.</p>
<p>~~Переезд я буду делать, скорее всего, поэтапно:~~</p>
<p>Переезд получится единомоментным, т.к. переезд будет на тоже самое железо, а не на другое.</p>
<ol>
<li>~~Заведу VDS’ку.~~ Новую заводить не буду, а почищу начисто текущий сервер.</li>
<li>Настрою почту (MOX хорош, конечно, но я хочу чего-то более кондового, типа<br>
Postfix) - перекину на новый сервер MX записи.</li>
<li>Настрою Jabber (Prosody, как был - так и останется, он достаточно хорош) -<br>
перекину на него SRV записи.</li>
<li>Так же естественно, надо не забыть Coturn сервер для звонков по Jabber.</li>
<li>И только после этого надо переносить Git (Forgejo), и сайты. При этом<br>
перееду с Caddy на Angie. Перекину уже A (и даже AAAA!) записи.</li>
<li>Перенос CoreDNS.</li>
<li>Проверяю что всё хорошо и если так, то отказываюсь от арендованного сервака.</li>
</ol>
<p>Надеюсь, ничего не забыл. А если и забыл — значит оно мне и не нужно, в общем-то.</p>
<p>Что по итогу? Самое главное — сброшу груз старья, который накопился за годы аренды дедика. И что тоже приятно, но не главное — оптимизирую расходы. Причём, наверное, раз в 10.</p>
<p>По времени — думаю, растянется на неделю-две, т.к. свободного времени на всё это у меня, как всегда, катастрофически мало. Так что, если какие-то мои сервисы будут не доступны — значит я в процессе переезда.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2025-11-09T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Деплой блога — пересмотр]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-11-04-blog-deploy-2/" />
    <id>https://neonxp.ru/posts/2025-11-04-blog-deploy-2/</id>
    <updated>2025-11-04T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>После <a href="/2025-11-03-blog-deploy">вчерашнего поста</a> мне написал один <a href="http://www.stargrave.org"target="_blank" rel="noopener noreferrer">хороший человек</a> с дельным замечанием, что не стоит для этих целей использовать make. Действительно так. И предложил хорошее решение, что это стоило сделать просто sh скриптами.</p>
<p>У меня только один вопрос. А почему я сам-то так сначала не сделал? Это же буквально на поверхности!</p>
<p>Штош, бывает, затупил. Да и привык для всех гвоздей использовать этот молоток.</p>
<hr>
<p>Обновлённые скрипты:</p>
<p>~/.local/bin/new-post</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh -e
</span></span></span><span style="display:flex;"><span>postname<span style="color:#f92672">=</span><span style="color:#e6db74">"</span><span style="color:#e6db74">${</span>@<span style="color:#66d9ef">:-</span>new-post<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>
</span></span><span style="display:flex;"><span>date<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>date +%Y-%m-%d<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>fn<span style="color:#f92672">=</span><span style="color:#e6db74">"neonxp.ru/posts/</span>$date<span style="color:#e6db74">-</span>$postname<span style="color:#e6db74">.md"</span>
</span></span><span style="display:flex;"><span>cat >$fn <span style="color:#e6db74"><<EOF
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">title:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">date: $da
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">tags: []
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">--- EOF</span> $EDITOR $fn <span style="color:#e6db74">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>~/.local/bin/deploy-blog
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">```</span>sh
</span></span><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh -e</span>
</span></span><span style="display:flex;"><span>yassg generate
</span></span><span style="display:flex;"><span>scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/
</span></span></code></pre></div><p>Сейчас раздумываю, а почему бы этот функционал не включить в сам yassg, например, аналогом хуков? Надо будет обмозговать.</p>]]></summary><content type="html"><![CDATA[<p>После <a href="/2025-11-03-blog-deploy">вчерашнего поста</a> мне написал один <a href="http://www.stargrave.org"target="_blank" rel="noopener noreferrer">хороший человек</a> с дельным замечанием, что не стоит для этих целей использовать make. Действительно так. И предложил хорошее решение, что это стоило сделать просто sh скриптами.</p>
<p>У меня только один вопрос. А почему я сам-то так сначала не сделал? Это же буквально на поверхности!</p>
<p>Штош, бывает, затупил. Да и привык для всех гвоздей использовать этот молоток.</p>
<hr>
<p>Обновлённые скрипты:</p>
<p>~/.local/bin/new-post</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh -e
</span></span></span><span style="display:flex;"><span>postname<span style="color:#f92672">=</span><span style="color:#e6db74">"</span><span style="color:#e6db74">${</span>@<span style="color:#66d9ef">:-</span>new-post<span style="color:#e6db74">}</span><span style="color:#e6db74">"</span>
</span></span><span style="display:flex;"><span>date<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>date +%Y-%m-%d<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>fn<span style="color:#f92672">=</span><span style="color:#e6db74">"neonxp.ru/posts/</span>$date<span style="color:#e6db74">-</span>$postname<span style="color:#e6db74">.md"</span>
</span></span><span style="display:flex;"><span>cat >$fn <span style="color:#e6db74"><<EOF
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">title:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">date: $da
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">tags: []
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">---
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">--- EOF</span> $EDITOR $fn <span style="color:#e6db74">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>~/.local/bin/deploy-blog
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">```</span>sh
</span></span><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh -e</span>
</span></span><span style="display:flex;"><span>yassg generate
</span></span><span style="display:flex;"><span>scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/
</span></span></code></pre></div><p>Сейчас раздумываю, а почему бы этот функционал не включить в сам yassg, например, аналогом хуков? Надо будет обмозговать.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-11-04T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Деплой блога]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-11-03-blog-deploy/" />
    <id>https://neonxp.ru/posts/2025-11-03-blog-deploy/</id>
    <updated>2025-11-03T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>А ещё, я решил поделиться тем как я пишу в блог. Потому что, почему бы и нет.</p>
<hr>
<p>Во-первых, у меня есть такой вот Makefile просто в корне home:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-Makefile" data-lang="Makefile"><span style="display:flex;"><span><span style="color:#a6e22e">new-post</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>	@printf <span style="color:#e6db74">"Введите имя поста (латиницей, без пробелов) [new-post]: "</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	read postname; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -z <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">postname"</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>		postname<span style="color:#f92672">=</span><span style="color:#e6db74">"new-post"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">fi</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	date<span style="color:#f92672">=</span>$$<span style="color:#f92672">(</span>date +%Y-%m-%d<span style="color:#f92672">)</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	file<span style="color:#f92672">=</span><span style="color:#e6db74">"neonxp.ru/posts/</span>$$<span style="color:#e6db74">date-</span>$$<span style="color:#e6db74">postname.md"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"---"</span> > <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">file"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"title: "</span> >> <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">file"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"date: </span>$$<span style="color:#e6db74">da
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>tags: <span style="color:#f92672">[]</span><span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>---<span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>---<span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>Комментариев в блоге не предусмотрено, но вы всегда можете написать мне на e-mail <span style="color:#f92672">[</span>i@neonxp.ru<span style="color:#f92672">](</span>mailto:i@neonxp.ru<span style="color:#f92672">)</span> или в джаббер <span style="color:#f92672">[</span>i@neonxp.ru<span style="color:#f92672">](</span>xmpp:/i@neonxp.ru<span style="color:#f92672">)</span><span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	nvim "</span>$$file<span style="color:#e6db74">"
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">publish-post</span><span style="color:#f92672">:</span> 	yassg generate 	scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/ ```
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">И,</span> <span style="color:#960050;background-color:#1e0010">соответственно,</span> <span style="color:#960050;background-color:#1e0010">когда</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">хочу</span> <span style="color:#960050;background-color:#1e0010">написать</span> <span style="color:#960050;background-color:#1e0010">новый</span> <span style="color:#960050;background-color:#1e0010">пост,</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">вызываю</span> <span style="color:#960050;background-color:#1e0010">`make</span> <span style="color:#960050;background-color:#1e0010">new-post`,</span> <span style="color:#960050;background-color:#1e0010">скрипт</span> <span style="color:#960050;background-color:#1e0010">у</span> <span style="color:#960050;background-color:#1e0010">меня</span> <span style="color:#960050;background-color:#1e0010">спрашивает</span> <span style="color:#960050;background-color:#1e0010">имя</span> <span style="color:#960050;background-color:#1e0010">файла,</span> <span style="color:#960050;background-color:#1e0010">а</span> <span style="color:#960050;background-color:#1e0010">затем</span> <span style="color:#960050;background-color:#1e0010">открывает</span> <span style="color:#960050;background-color:#1e0010">любимый</span> <span style="color:#960050;background-color:#1e0010">neovim,</span> <span style="color:#960050;background-color:#1e0010">в</span> <span style="color:#960050;background-color:#1e0010">котором</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">уже</span> <span style="color:#960050;background-color:#1e0010">и</span> <span style="color:#960050;background-color:#1e0010">пишу</span> <span style="color:#960050;background-color:#1e0010">сам</span> <span style="color:#960050;background-color:#1e0010">текст</span> <span style="color:#960050;background-color:#1e0010">поста.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Затем я вызываю `make publish-post` и сначала мой генератор статических сайтов [YASSG](http</span><span style="color:#f92672">:</span>/gitverse.ru/neonxp/yassg/) собирает сайт в статический HTML, а потом отправляет всё на сервер в директорию, из которой сайт раздаётся.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">Очень</span> <span style="color:#960050;background-color:#1e0010">просто!</span> 
</span></span></code></pre></div>]]></summary><content type="html"><![CDATA[<p>А ещё, я решил поделиться тем как я пишу в блог. Потому что, почему бы и нет.</p>
<hr>
<p>Во-первых, у меня есть такой вот Makefile просто в корне home:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-Makefile" data-lang="Makefile"><span style="display:flex;"><span><span style="color:#a6e22e">new-post</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>	@printf <span style="color:#e6db74">"Введите имя поста (латиницей, без пробелов) [new-post]: "</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	read postname; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> -z <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">postname"</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>		postname<span style="color:#f92672">=</span><span style="color:#e6db74">"new-post"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">fi</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	date<span style="color:#f92672">=</span>$$<span style="color:#f92672">(</span>date +%Y-%m-%d<span style="color:#f92672">)</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	file<span style="color:#f92672">=</span><span style="color:#e6db74">"neonxp.ru/posts/</span>$$<span style="color:#e6db74">date-</span>$$<span style="color:#e6db74">postname.md"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"---"</span> > <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">file"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"title: "</span> >> <span style="color:#e6db74">"</span>$$<span style="color:#e6db74">file"</span>; <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">"date: </span>$$<span style="color:#e6db74">da
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>tags: <span style="color:#f92672">[]</span><span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>---<span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>---<span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	echo "</span>Комментариев в блоге не предусмотрено, но вы всегда можете написать мне на e-mail <span style="color:#f92672">[</span>i@neonxp.ru<span style="color:#f92672">](</span>mailto:i@neonxp.ru<span style="color:#f92672">)</span> или в джаббер <span style="color:#f92672">[</span>i@neonxp.ru<span style="color:#f92672">](</span>xmpp:/i@neonxp.ru<span style="color:#f92672">)</span><span style="color:#e6db74">" >> "</span>$$file<span style="color:#e6db74">"; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	nvim "</span>$$file<span style="color:#e6db74">"
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">publish-post</span><span style="color:#f92672">:</span> 	yassg generate 	scp -r /home/neonxp/.local/share/yassg/* neonxp.ru:/var/www/neonxp.ru/ ```
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">И,</span> <span style="color:#960050;background-color:#1e0010">соответственно,</span> <span style="color:#960050;background-color:#1e0010">когда</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">хочу</span> <span style="color:#960050;background-color:#1e0010">написать</span> <span style="color:#960050;background-color:#1e0010">новый</span> <span style="color:#960050;background-color:#1e0010">пост,</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">вызываю</span> <span style="color:#960050;background-color:#1e0010">`make</span> <span style="color:#960050;background-color:#1e0010">new-post`,</span> <span style="color:#960050;background-color:#1e0010">скрипт</span> <span style="color:#960050;background-color:#1e0010">у</span> <span style="color:#960050;background-color:#1e0010">меня</span> <span style="color:#960050;background-color:#1e0010">спрашивает</span> <span style="color:#960050;background-color:#1e0010">имя</span> <span style="color:#960050;background-color:#1e0010">файла,</span> <span style="color:#960050;background-color:#1e0010">а</span> <span style="color:#960050;background-color:#1e0010">затем</span> <span style="color:#960050;background-color:#1e0010">открывает</span> <span style="color:#960050;background-color:#1e0010">любимый</span> <span style="color:#960050;background-color:#1e0010">neovim,</span> <span style="color:#960050;background-color:#1e0010">в</span> <span style="color:#960050;background-color:#1e0010">котором</span> <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">уже</span> <span style="color:#960050;background-color:#1e0010">и</span> <span style="color:#960050;background-color:#1e0010">пишу</span> <span style="color:#960050;background-color:#1e0010">сам</span> <span style="color:#960050;background-color:#1e0010">текст</span> <span style="color:#960050;background-color:#1e0010">поста.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Затем я вызываю `make publish-post` и сначала мой генератор статических сайтов [YASSG](http</span><span style="color:#f92672">:</span>/gitverse.ru/neonxp/yassg/) собирает сайт в статический HTML, а потом отправляет всё на сервер в директорию, из которой сайт раздаётся.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">Очень</span> <span style="color:#960050;background-color:#1e0010">просто!</span> 
</span></span></code></pre></div>]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-11-03T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Душа в машине]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-10-18-the-ghost-in-the-machine/" />
    <id>https://neonxp.ru/posts/2025-10-18-the-ghost-in-the-machine/</id>
    <updated>2025-10-18T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Станислав Лем</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg"
        alt="laughing-man.jpeg"/><br>
Небольшая отсылка</p>
<hr>
<p>Понятием “душа в машине” - the ghost in the machine - некоторые психологи (английские) закрепляют убеждение в том, что человек якобы является существом “двойственным”, т.е. состоящим из “материи” и “души”.</p>
<p>Сознание не является технологической проблемой, потому что конструктора не интересует, чувствует ли машина, а только интересует, действует ли она. Таким образом “технология сознания”, как бы это сказать, может появиться только мимоходом, когда окажется, что определенный класс кибернетических машин обладает субъективным миром психических переживаний.</p>]]></summary><content type="html"><![CDATA[<p>Станислав Лем</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-10-18-the-ghost-in-the-machine/laughing-man.jpeg"
        alt="laughing-man.jpeg"/><br>
Небольшая отсылка</p>
<hr>
<p>Понятием “душа в машине” - the ghost in the machine - некоторые психологи (английские) закрепляют убеждение в том, что человек якобы является существом “двойственным”, т.е. состоящим из “материи” и “души”.</p>
<p>Сознание не является технологической проблемой, потому что конструктора не интересует, чувствует ли машина, а только интересует, действует ли она. Таким образом “технология сознания”, как бы это сказать, может появиться только мимоходом, когда окажется, что определенный класс кибернетических машин обладает субъективным миром психических переживаний.</p>
<p>Но каким образом можно узнать о наличии сознания в машине? Эта проблема имеет не только абстрактно-философское значение, ибо предположение, что какая-то машина, которая отправляется на лом из-за того, что ремонт не оплачивается, имеет сознание, превращает наше решение уничтожить материальный предмет, типа граммофона, в акт уничтожения индивидуальности, осознанного убийства. Кто-то мог бы оснастить граммофон пластинкой и выключателем таким образом, что, если бы мы сдвинули его с места, то услышали бы крики: “Ах, умоляю, подари мне жизнь!”. Как можно отличить такой, без сомнения, бездушный аппарат от мыслящей машины? Только вступая с ней в разговор. Английский математик Аллан Тьюринг (Allan Turing) в своей работе “Может ли машина мыслить?” предлагает в качестве решающего критерия “игру в имитацию”, которая основывается на том, что мы задаем Кому-то произвольные вопросы и на основании ответов должны сделать заключение, является ли этот Кто-то человеком или машиной. Если мы не сможем отличить машину от человека, то следует признать, что машина ведет себя как человек, то есть что она обладает сознанием.</p>
<p>Отметим со своей стороны, что игру можно усложнить. Можно предположить два вида машин. Первый вид является “обычной” цифровой машиной, которая устроена как человеческий мозг; с ней можно играть в шахматы, разговаривать о книгах, о мире и вообще на все темы. Если бы мы ее вскрыли, то увидели бы огромное количество соединений элементов, подобно соединениям нейронов в мозгу, кроме того - блоки ее памяти и т.д. и т.п.</p>
<p>Второй вид машины совсем другой. Это увеличенный до размера планеты (или космоса) граммофон. Она имеет очень много, например, сто триллионов, записанных ответов на всевозможные вопросы. Таким образом, когда мы спрашиваем, машина ничего “не понимает”, а только форма вопроса, т.е. очередность вибраций нашего голоса, приводит в движение передатчик, который запускает пластинку или ленту с записанным ответом. Не будем задумываться о технической стороне вопроса. Понятно, что такая машина неэкономична, что ее никто не создаст, потому что это невозможно и главное - неизвестно, зачем ее создавать. Но нас интересует теоретическая сторона. Потому что, если вывод о том, имеет ли машина сознание, делается на основе поведения, а не внутреннего строения, не придем ли мы неосмотрительно к выводу, что “космический граммофон” обладает им - и тем самым выскажем нонсенс? (А скорее неправду).</p>
<p>Можно ли, однако, запрограммировать все возможные вопросы? Без сомнения, средний человек не отвечает в обычной жизни даже на один их биллион. Мы же на всякий случай записали их во много раз больше. Что же делать? Мы должны вести нашу игру по достаточно развитой стратегии. Мы задаем машине (то есть Кому-то, потому что не знаем, с кем имеем дело; разговор ведется, например, по телефону) вопрос, любит ли она анекдоты. Машина отвечает, скажем, что да, она любит хорошие анекдоты. Рассказываем ей анекдот. Машина смеется (т.е смеется голос в трубке). Или у ней был этот анекдот записан и это позволило ей правильно отреагировать, т.е. засмеяться, или это в самом деле мыслящая машина (или человек, ибо мы этого не знаем). Мы разговариваем с машиной какое-то время, а потом неожиданно спрашиваем, припоминает ли она анекдот, который мы ей рассказали. Она должна его помнить, если она действительно мыслит. Она скажет, что помнит. Мы попросим, чтобы она повторила его своими словами. Вот это уже очень трудно запрограммировать, потому что таким образом мы вынуждаем конструктора “космограммофона” записать не только отдельные ответы на возможные вопросы, но и целые последовательности разговоров, которые могут вестись. Это требует, конечно, памяти, т.е. дисков или лент, которых, может, и вся солнечная система не вместит. Положим, машина не может повторить нашего анекдота. И мы тем самым разоблачаем, что она - граммофон. Задетый конструктор берется за усовершенствование машины таким образом, что пристраивает ей такую память, благодаря которой она сможет вкратце повторить сказанное. Но таким образом он сделал первый шаг в направлении от машины-граммофона к машине мыслящей. Так как бездушная машина не может признать идентичными вопросы аналогичного содержания, но сформулированные даже с незначительными формальными отклонениями, типа: “Вчера было хорошо на улице?”, “Вчера была прекрасная погода?”, “Погожим ли был предыдущий день?” и т. д. и т. п., то для машины бездушной они будут вопросами различными, а для машины мыслящей идентичными. Конструктор вновь разоблаченной машины вынужден опять ее перерабатывать. В конце концов, после долгой серии переделок, он введет в машину способности индукции и дедукции, способность ассоциации, схватывания тождественной “формы” по-разному сформулированных, но одинаковых по содержанию высказываний, пока в результате не получит машину, которая просто будет “обычной” мыслящей машиной.</p>
<p>Так появляется интересная проблема: когда именно в машине появилось сознание? Предположим, что конструктор не переделывал эти машины, а относил каждую в музей и следующую модель создавал с начала. В музее стоит 10 000 машин, потому что столько было очередных моделей. Результатом стал плавный переход от “бездушного автомата” типа играющего шкафа к “машине, которая мыслит”. Должны ли мы признать машиной, имеющей сознание, машину номер 7852 или только номер 9973? Они отличаются друг от друга тем, что первая не умела объяснить, почему она смеется над рассказанным анекдотом, а только говорила, что анекдот очень смешен, а вторая умела. Но некоторые люди смеются над шутками, хотя и не могут объяснить, что именно в них смешно, потому что, как известно, теория юмора - это твердый орешек. Разве эти люди тоже лишены сознания? Нет же, они, наверное, просто не очень быстро реагируют или малообразованные, их ум не обладает навыками аналитического подхода к проблемам; но мы спрашиваем не о том, умная ли машина или скорее туповатая, мы только спрашиваем, имеет ли она сознание или нет.</p>
<p>Казалось бы, следует признать, что модель номер 1 имеет ноль сознания, модель номер 10 000 имеет полное сознание, а все средние имеют “все больше” сознания. Это утверждение показывает, насколько безнадежной является мысль о том, что сознание можно точно локализовать. Отсоединение отдельных элементов (“нейронов”) машины спровоцирует только слабые, количественные изменения (“ослабления”) сознания так же, как это делает в живом мозге прогрессирующий процесс болезни или нож хирурга. Проблема не имеет ничего общего ни с использованным для конструкции материалом, ни с размерами “мыслящего” устройства. Электрическую мыслящую машину можно построить из отдельных блоков, соответствующих, положим, мозговым извилинам. Теперь разделим эти блоки и разместим на всей Земле так, что один находится в Москве, второй в Париже, третий в Мельбурне, четвертый в Иокогаме и т. д. Отделенные друг от друга, эти блоки “психически мертвы”, а соединенные (например, телефонными кабелями) они стали бы одной, интегральной “индивидуальностью”, единым “мыслящим гомеостатом”. Сознание такой машины находится ни в Москве, ни в Париже, ни в Иокогаме, но, в определенном смысле, в каждом из этих городов и, в определенном смысле, ни в одном из них. Потому что о нем трудно сказать, что оно, как Висла, имеет протяженность от Татр до Балтийского моря. Впрочем, подобная проблема демонстрирует, хотя и не так ярко, человеческий мозг, потому что кровеносные сосуды, белковые молекулы и ткани находятся внутри мозга, но не внутри сознания, и опять-таки нельзя сказать, что сознание находится под самым куполом черепа или, скорее всего, ниже, над ушами, по обеим сторонам головы. Оно “рассеяно” по всему гомеостату, по его функциональной сети. Ничего больше заявить на эту тему не получится, если мы хотим соединить сознание с возможностью рассуждать.</p>
<p>Вышеприведенный текст, скопированный из моей “Суммы технологии”, был написан в середине 1963 года. С точки зрения сегодняшней ситуации он представляет очень сильное упрощение дороги, которую мы должны пройти, чтобы дойти до имитации описанной мной цели. Мы уже предполагаем, что “сознание” и “интеллект” - это в определенном смысле отдельные сути бытия. Мы знаем, что существуют достаточно различные состояния сознания, даже если шкала их находится между сном и реальностью. Но и сон, точнее, мечта во сне, может характеризоваться разнообразной насыщенностью конкретностей, которые имитируют реальность, сознательно переживаемую наяву. В свою очередь, сознание наяву, что каждый знает по собственному опыту, даже если он не является ни психологом, ни психиатром, может также иметь очень различные состояния. Человек в состоянии болезненного жара может осознавать свое состояние, то есть то, что его сознание подверглось нарушению. Различные химические средства могут самым разным образом формировать человеческое сознание. Кроме того, следует отметить, что есть множество действий, которые человек может делать машинально, то есть четко и неосознанно. Сознание водителя автомобиля, особенно быстрого, “не успевает” за реакциями этого водителя в ситуациях с неожиданной последовательностью событий. Вместе с тем машинально можно делать глупости, мы называем их чаще всего “действиями по рассеянности”.</p>
<p>Все это я сказал в отношении моего текста тридцатипятилетней давности, в котором я задумался над “ростками” сознания в машине, и делал я это потому, что мне казалось, что люди очень отличаются друг от друга уровнем умственных способностей, а сознание всем дано приблизительно похожее.</p>
<p>Дороги напрямик, по прямой и восходящей линии, от полного автомата, каким является компьютер, к машине, которой мы могли бы приписать сознание, нет. Вместе с тем работу нашего мозга мы уже знаем настолько, чтобы узнать то, что так называемая каллотомия, или рассечение большой белой спайки, соединяющей полушария мозга, не ликвидирует сознания, но создает в разделенных полушариях две его разновидности. Кроме того, мы знаем, что мозг является системой, построенной из огромного количества функциональных модулей, которые в отдельных окрестностях мозга создали среду, формирующую сознание. Уточню сказанное примером. Существует часть коры мозга, способствующая тому, что мы видим цвета. Повреждение этого модуля приводит к тому, что таким образом пораженный человек видит все без цвета, как в черно-белом кино. Чем точнее мы узнаем специфику функциональной ориентации модулей мозга, тем с большим удивлением узнаем, как, с точки зрения инженерной экономии, хаотично устроен мозг, хотя мы при осознании самих себя не отдаем себе в этом отчета. Сегодня нам кажется, что отдельные модули, функционально похожие на модули мозга, мы уже сможем конструировать. Обычно это псевдонейронные сети различной сложности. Вместе с тем мы еще не умеем ни создать их в достаточном количестве, ни соединить их таким образом, чтобы созданное произведение смогло имитировать сознание. Следовательно, прямой дороги от бездумного автомата к сознательно мыслящей машине нет. Есть, однако, много сложных дорог, которые в будущем приведут нас к цели и, может быть, эту цель превзойдут. О такой возможности я написал книгу “Голем XIV”.</p>
<p>Краков, 7 июля 1998 года.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="книги" label="Книги" scheme="https://neonxp.ru/tags/%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8/" />
    <category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <category term="не_моё" label="Не_моё" scheme="https://neonxp.ru/tags/%D0%BD%D0%B5_%D0%BC%D0%BE%D1%91/" />
    <published>2025-10-18T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Размышления о будущем ИИ]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-10-06-ai/" />
    <id>https://neonxp.ru/posts/2025-10-06-ai/</id>
    <updated>2025-10-06T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Немного моих размышлений про будущее ИИ как технологии, а не философии.</p>
<p>Как водится, когда речь о размышлениях — буду сначала вводить тезисы, а потом, синтез.</p>
<hr>
<h1 id="тезис-первый">Тезис первый</h1>
<p>Хоть сам и не пользуюсь таким инструментом, как Cursor из третьих рук я узнал, что там не просто внутри нейронка, а целый их ансамбль. Более того, что главное, там есть автовыбор того, какая именно БЯМ (большая языковая модель) будет отвечать за конкретный запрос. И вот этот момент меня заинтересовал. Я задумался, как именно это может быть реализовано. Первая мысль, как самая очевидная была в том, что внутри помимо больших моделей, есть и маленькая, единственная функция которой (а может и не единственная, но, значит, основная) — классифицировать запрос (окей, промпт) по тому, какая из больших моделей возьмёт работу на себя.</p>]]></summary><content type="html"><![CDATA[<p>Немного моих размышлений про будущее ИИ как технологии, а не философии.</p>
<p>Как водится, когда речь о размышлениях — буду сначала вводить тезисы, а потом, синтез.</p>
<hr>
<h1 id="тезис-первый">Тезис первый</h1>
<p>Хоть сам и не пользуюсь таким инструментом, как Cursor из третьих рук я узнал, что там не просто внутри нейронка, а целый их ансамбль. Более того, что главное, там есть автовыбор того, какая именно БЯМ (большая языковая модель) будет отвечать за конкретный запрос. И вот этот момент меня заинтересовал. Я задумался, как именно это может быть реализовано. Первая мысль, как самая очевидная была в том, что внутри помимо больших моделей, есть и маленькая, единственная функция которой (а может и не единственная, но, значит, основная) — классифицировать запрос (окей, промпт) по тому, какая из больших моделей возьмёт работу на себя.</p>
<p>Мысль эта мне показалась немного диковатой, т.к. показалось, что это несколько пушкой по воробьям, и подумал, что может есть другое, более классическое, алгоритмическое решение. Думал-думал, ничего хорошего в голову не пришло. Поэтому всё же взял за рабочую гипотезу, что таки да, классифицирует маленькая и дешевая моделька. Маленькая и дешёвая да, но точно не локальная. Ведь даже для маленьких моделек нужны определённые мощности, которые есть далеко не у всех.</p>
<p>И вот здесь-то мысль и полетела дальше! Представилось что в будущем всё больше и больше «классические» алгоритмические задачи будут «закрывать» нейронками там где надо и не надо. Чем-то напоминает ситуацию в электронике, когда экономически часто более целесообразно не придумывать схему на элементарных радиодеталях, а воткнуть просто унифицированный микроконтроллер, который с правильной прошивкой заменяет целую кучку рассыпухи.</p>
<p>Но продолжение мысли пока попридержу. А пока…</p>
<h1 id="тезис-второй">Тезис второй</h1>
<p>Я человек молодой, но более менее успел застать такой интересный переферийный девайс, как <a href="https://ru.ruwiki.ru/wiki/%d0%9c%d0%b0%d1%82%d0%b5%d0%bc%d0%b0%d1%82%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b8%d0%b9_%d1%81%d0%be%d0%bf%d1%80%d0%be%d1%86%d0%b5%d1%81%d1%81%d0%be%d1%80"target="_blank" rel="noopener noreferrer">математический сопроцессор</a>. Назначение устройства — позволять компьютеру выполнять операции над вещественными числами. Представляете, когда-то процессоры такие операции сами не умели выполнять! Но надо делать скидку на время и то, что такие операции были, наверное, не всем нужными, а скорее уделом специалистов, которые знали зачем им эта железка и целенаправленно её докупали. Сейчас любой, даже самый слабейший процессор имеет этот сопроцессор внутри себя.</p>
<p>Ничего не напоминает?</p>
<p>Нейронки и видеокарты!</p>
<p>А вот сейчас, соединим тезисы и придём к …</p>
<h1 id="синтез">Синтез</h1>
<p>Нейронки, однозначно, вошли в нашу жизнь уже на долго.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-10-06-ai/hype_curve.png"
        alt="hype_curve.png"/><br>
Кривая хайпа</p>
<p>Мы сейчас, по моей оценке, где-то между пиком и дном, причём ближе именно к пику. Затем, неизбежно будет дно разочарований. Но это не столь важно сейчас. Важнее — следующий этап. Выйдет ли технология на плато продуктивности? Скорее всего, да. Всё же, помимо того, что это «ыыы прикольная штука», это ещё и вещь со вполне очевидной прикладной пользой. Не буду вдаваться в подробности, но я имею в виду обработку естественного языка (классификация, суммаризация, генерация), а так же «нечёткие» алгоритмы, когда путь к решению не задан заранее (агенты и всё такое).</p>
<p>И по той причине, что мы ещё не на плато, есть ощущение некоего «дикого запада». Ещё не устаканились методы и подходы, практически ежедневно что-то появляется новое, а старое исчезает. Горизонт - буквально пара месяцев. И инструменты всё ещё крайне сырые. Под инструментами я имею в виду даже не программные инструменты, а то на чём это запускается. А запускаются нейронки на видеокартах! ВИДЕОкарты, Карл! Лично мне это выглядит несколько костыльным. Причём даже мощные профессиональные решения типа A100, H100 за миллионы рублей это по сути именно что видеокарты, хоть и без видеовыходов. Даже у криптовалют когда они были на хайпе и майнились на тех же несчастных видеокартах достаточно быстро появились специализированные решения в виде <a href="https://ru.ruwiki.ru/wiki/%d0%98%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b0%d0%bb%d1%8c%d0%bd%d0%b0%d1%8f_%d1%81%d1%85%d0%b5%d0%bc%d0%b0_%d1%81%d0%bf%d0%b5%d1%86%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d0%b3%d0%be_%d0%bd%d0%b0%d0%b7%d0%bd%d0%b0%d1%87%d0%b5%d0%bd%d0%b8%d1%8f"target="_blank" rel="noopener noreferrer">айсиков</a>. Ждут ли нас специализированные решения для задач ИИ? Конечно. Даже более того, они уже есть. У того же Huawei. Устройства, которые заточены только для нейронок и никак не способные в графику. И это, ИМХО, правильный путь, туда индустрия и пойдёт.</p>
<p>Но это, опять таки, всё ещё настоящее. А что там в будущем?</p>
<p>А в будущем, думаю, нас ждёт то, что специализированные устройства для инференса (запуска готовых моделей, грубо говоря) буду встроены непосредственно во все потребительские компьютеры и даже носимую технику, типа телефонов. Ровно так же, как было с математическими сопроцессорами, которые начинали отдельным устройством, а сейчас уже давно — просто небольшая часть на кристалле процессора. А применение им вижу как раз таки в том, чтобы там постоянно сидела небольшая (ну небольшая для того, будущего времени, для нас настоящих, скорее всего, весьма большая) моделька, к которой по вполне стандартизированным API ОС будет обращаться прикладной софт, чтобы выполнять какие-то свои прикладные задачи. Типа той, про которую я говорил в самом начале, по классификации того, в какую большую модель пойдёт запрос пользователя. Более того, кажется, что со временем это станет настолько общим местом, что многий софт и не запустится на железе без встроенного «интеллектуального сопроцессора». Как сейчас не запустится многий софт без, даже не математического сопроцессора (где вы найдете процессор без него?), а, например, каких нибудь SSE2 инструкций (я, честно говоря, не очень знаю зачем они, но, подозреваю, без них многое не заработает). А значит в этом самом будущем эти «интеллектуальные сопроцессоры» будут просто базовой частью любой ЭВМ (ну нравится мне эта аббревиатура).</p>
<p>Да, можно возразить, что никак физически невозможно впихнуть такую вычислительную мощь в маленький кристалл на плате ноутбука, а, тем более, телефона. На это я отвечу просто: не знаю. Может быть и невозможно и такого не будет. Но ведь когда-то казалось невозможным что компьютер не будет занимать несколько комнат, а умещаться в кармане джинс каждого человека! Причём, тот что в джинсах, ещё и на много порядков будет мощнее! Так что я бы ничего не исключал.</p>
<p>А как вы думаете?</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <category term="ии" label="ИИ" scheme="https://neonxp.ru/tags/%D0%B8%D0%B8/" />
    <published>2025-10-06T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Поездка по Кавказу. Часть 1: САО РАН и Аланское городище в Нижнем Архызе]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-09-01-travel-1/" />
    <id>https://neonxp.ru/posts/2025-09-01-travel-1/</id>
    <updated>2025-09-01T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_1.webp"
        alt="preview_1.webp"/><br>
Дорога на САО</p>
<h2 id="сао-ран">САО РАН</h2>
<p>Первая настоящая вылазка за этот отпуск. В этот раз мы ездили снова на <a href="https://ru.ruwiki.ru/wiki/%d0%a1%d0%bf%d0%b5%d1%86%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%b0%d1%8f_%d0%b0%d1%81%d1%82%d1%80%d0%be%d1%84%d0%b8%d0%b7%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b0%d1%8f_%d0%be%d0%b1%d1%81%d0%b5%d1%80%d0%b2%d0%b0%d1%82%d0%be%d1%80%d0%b8%d1%8f_%d0%a0%d0%90%d0%9d"target="_blank" rel="noopener noreferrer">САО РАН (Специальная Астрофизическая Обсерватория Российской Академии Наук)</a> в посёлке Нижний Архыз. В том году мы уже там бывали, но, во-первых, прикосновение к настоящей науке вдохновляет каждый раз, и я не знаю на какой бы раз мне туда надоело ездить. А, во-вторых, в этот раз был другой научный сотрудник, с совершенно другой лекцией, так что, скучать не пришлось! Кстати, этот телескоп — с самым большим в Евразии диаметром главного зеркала: аж 6 метров и весом в 42 тонны! Высота купола — 53 метра, а высота самого телескопа в вертикальном положении (как на фото) — более 40 метров!</p>]]></summary><content type="html"><![CDATA[<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_1.webp"
        alt="preview_1.webp"/><br>
Дорога на САО</p>
<h2 id="сао-ран">САО РАН</h2>
<p>Первая настоящая вылазка за этот отпуск. В этот раз мы ездили снова на <a href="https://ru.ruwiki.ru/wiki/%d0%a1%d0%bf%d0%b5%d1%86%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%b0%d1%8f_%d0%b0%d1%81%d1%82%d1%80%d0%be%d1%84%d0%b8%d0%b7%d0%b8%d1%87%d0%b5%d1%81%d0%ba%d0%b0%d1%8f_%d0%be%d0%b1%d1%81%d0%b5%d1%80%d0%b2%d0%b0%d1%82%d0%be%d1%80%d0%b8%d1%8f_%d0%a0%d0%90%d0%9d"target="_blank" rel="noopener noreferrer">САО РАН (Специальная Астрофизическая Обсерватория Российской Академии Наук)</a> в посёлке Нижний Архыз. В том году мы уже там бывали, но, во-первых, прикосновение к настоящей науке вдохновляет каждый раз, и я не знаю на какой бы раз мне туда надоело ездить. А, во-вторых, в этот раз был другой научный сотрудник, с совершенно другой лекцией, так что, скучать не пришлось! Кстати, этот телескоп — с самым большим в Евразии диаметром главного зеркала: аж 6 метров и весом в 42 тонны! Высота купола — 53 метра, а высота самого телескопа в вертикальном положении (как на фото) — более 40 метров!</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/saologo.png"
        alt="saologo.png"/><br>
САО РАН</p>
<hr>
<p><a href="https://yandex.ru/maps/?l=sat%2Cskl%5c&ll=41.440447%2C43.646825%5c&pt=41.4404472%2C43.6468250%5c&z=14"target="_blank" rel="noopener noreferrer">Место на карте</a></p>
<p>Дальше — небольшой фотоотчёт и расскажу о втором месте, где побывал.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_2.webp"
        alt="preview_2.webp"/><br>
Внезапная встреча</p>
<p>Внезапная встреча</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_3.webp"
        alt="preview_3.webp"/><br>
Стадо козочек и барашков</p>
<p>Стадо козочек и барашков</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_4.webp"
        alt="preview_4.webp"/><br>
Купол САО</p>
<p>Купол САО</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_5.webp"
        alt="preview_5.webp"/><br>
Обсерватория поменьше</p>
<p>Обсерватория поменьше</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_6.webp"
        alt="preview_6.webp"/><br>
Огромный кран</p>
<p>Огромный кран, с помощью которого устанавливается зеркало</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_7.webp"
        alt="preview_7.webp"/><br>
БТА</p>
<p>И вот он сам! Его величество — <a href="https://ru.ruwiki.ru/wiki/%d0%91%d0%a2%d0%90_%5c%28%d1%82%d0%b5%d0%bb%d0%b5%d1%81%d0%ba%d0%be%d0%bf%5c%29"target="_blank" rel="noopener noreferrer">БТА (Большой Телескоп Азимутальный)</a>!</p>
<p>Внезапно, в самый разгар лекции, купол начал поворачиваться! Видимо, предполагались какие-то профилактические работы перед очередной рабочей сменой обсерватории (работает она только по ночам и в ясную погоду, что логично). В копилку этой версии говорит и тот факт, что после поворота на главное зеркало поднялся специалист и проводил непонятные мне, дилетанту, работы. Возможно, ремонтно-профилактические.</p>
<p>После экскурсии ещё смотрели на солнце (через специальный фильтр, конечно же!) и я впервые своими глазами увидел настоящие пятна на солнце!</p>
<h2 id="нижне-архызское-городище">Нижне-Архызское городище</h2>
<p>Сразу после САО мы поехали в <a href="https://ru.ruwiki.ru/wiki/%d0%9d%d0%b8%d0%b6%d0%bd%d0%b5-%d0%90%d1%80%d1%85%d1%8b%d0%b7%d1%81%d0%ba%d0%be%d0%b5_%d0%b3%d0%be%d1%80%d0%be%d0%b4%d0%b8%d1%89%d0%b5"target="_blank" rel="noopener noreferrer">Нижне-Архызское городище</a>, где находятся руины храмов и других построек X-XII веков.</p>
<p><a href="https://yandex.ru/maps/?ll=41.47500,43.68528%5c&pt=41.47500,43.68528%5c&spn=0.1,0.1%5c&l=sat,skl"target="_blank" rel="noopener noreferrer">Место на карте</a></p>
<p>Поскольку, я не историк, и рассказать мне про них сверх данных из Рувики нечего — просто опубликую фотографии.</p>
<h3 id="средний-храм">Средний храм</h3>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_8.webp"
        alt="preview_8.webp"/><br>
Изображение 8</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_9.webp"
        alt="preview_9.webp"/><br>
Изображение 9</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_10.webp"
        alt="preview_10.webp"/><br>
Изображение 10</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_11.webp"
        alt="preview_11.webp"/><br>
Изображение 11</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_20.webp"
        alt="preview_20.webp"/><br>
Изображение 20</p>
<h3 id="северный-храм">Северный храм</h3>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_17.webp"
        alt="preview_17.webp"/><br>
Изображение 17</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_12.webp"
        alt="preview_12.webp"/><br>
Изображение 12</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_13.webp"
        alt="preview_13.webp"/><br>
Изображение 13</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_14.webp"
        alt="preview_14.webp"/><br>
Изображение 14</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_15.webp"
        alt="preview_15.webp"/><br>
Изображение 15</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_16.webp"
        alt="preview_16.webp"/><br>
Изображение 16</p>
<h3 id="солярный-круг">Солярный круг</h3>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_18.webp"
        alt="preview_18.webp"/><br>
Изображение 18</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_19.webp"
        alt="preview_19.webp"/><br>
Изображение 19</p>
<h3 id="половецкая-баба">Половецкая баба</h3>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_21.webp"
        alt="preview_21.webp"/><br>
Изображение 21</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_22.webp"
        alt="preview_22.webp"/><br>
Изображение 22</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-09-01-travel-1/preview_23.webp"
        alt="preview_23.webp"/><br>
Изображение 23</p>
<p>Продолжение поездки следует…</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-09-01T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Ещё немного печати]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-08-09-makeup-organizer/" />
    <id>https://neonxp.ru/posts/2025-08-09-makeup-organizer/</id>
    <updated>2025-08-09T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Я продолжаю погружаться в печать не просто готовых моделей из интернета, что не очень интересно, но так же и в проектирование и печать собственных изделий. Сегодня моя любимая супруга попросила напечатать ей органайзер для косметики. Показала референс, какой она хочет. ТЗ понятное, размеры подобрали, осталось дело за малым — непосредственно запрограммировать изделие.</p>
<hr>
<p>На практике, это пока самое сложное по детализации изделие из всех, что я делал. Код получился кривоватым, но рисует то, что нужно.</p>]]></summary><content type="html"><![CDATA[<p>Я продолжаю погружаться в печать не просто готовых моделей из интернета, что не очень интересно, но так же и в проектирование и печать собственных изделий. Сегодня моя любимая супруга попросила напечатать ей органайзер для косметики. Показала референс, какой она хочет. ТЗ понятное, размеры подобрали, осталось дело за малым — непосредственно запрограммировать изделие.</p>
<hr>
<p>На практике, это пока самое сложное по детализации изделие из всех, что я делал. Код получился кривоватым, но рисует то, что нужно.</p>
<p>Вот так результат в редакторе:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-09-makeup-organizer/1.png"
        alt="1.png"/><br>
результат в редакторе</p>
<p>А вот так в слайсере:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-09-makeup-organizer/2.png"
        alt="2.png"/><br>
слайсер</p>
<p>Ну и впервые решил добавить «клеймо мастера» со своим логотипом. Впредь, буду добавлять его на все свои изделия, которые запроектированы именно мн<img loading="lazy"  src="blog/posts/2025-08-0!%5B%5Bblog/posts/files/2025-08-05-lets-code-3d/3.png"
        alt="blog/posts/2025-08-0![[blog/posts/files/2025-08-05-lets-code-3d/3.png"/>отографий готового изделия пока нет, ибо печататься ему ещё минимум 10 часов. Фото я приложу позже отдельным постом ;)</p>
<p><strong>P.S.</strong> <a href="organizer.tar.zst">архив с исходниками и готовым для печати STL прилагаю</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <category term="3d_печать" label="3D_печать" scheme="https://neonxp.ru/tags/3d_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D1%8C/" />
    <published>2025-08-09T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Давай запрограммируем деталь?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-08-05-lets-code-3d/" />
    <id>https://neonxp.ru/posts/2025-08-05-lets-code-3d/</id>
    <updated>2025-08-05T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Некоторое время назад я по глупости запорол свои бокорезы, так, что для откусывания ножек радио деталей они больше не годятся. К счастью, стоят они совершенно не дорого, и тем же днём были заказанные новые в небезызвестном сервисе, который в девичестве содержал в себе название моего родного города. При получении я немного огорчился тем, что в комплекте к ним не шёл колпачок, который был у предыдущих, хотя выглядят они идентично.</p>
<p>Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть у меня на хозяйстве.</p>]]></summary><content type="html"><![CDATA[<p>Некоторое время назад я по глупости запорол свои бокорезы, так, что для откусывания ножек радио деталей они больше не годятся. К счастью, стоят они совершенно не дорого, и тем же днём были заказанные новые в небезызвестном сервисе, который в девичестве содержал в себе название моего родного города. При получении я немного огорчился тем, что в комплекте к ним не шёл колпачок, который был у предыдущих, хотя выглядят они идентично.</p>
<p>Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть у меня на хозяйстве.</p>
<hr>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-05-lets-code-3d/1.jpg"
        alt="1.jpg"/><br>
Бокорез и родной колпачок Бокорезы и<br>
колпачок</p>
<h2 id="проектирование">Проектирование</h2>
<p>Обычно, детали для печати проектируются в CAD программах твердотельного моделирования. Но я в них совершенно не умею, хотя и сын инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый худший! Посему, я решил воспользоваться свободной программой для твердотельного моделирования <a href="https://openscad.org/"target="_blank" rel="noopener noreferrer">OpenSCAD</a>. К счастью, в репозитории любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём не <em>рисуется</em>, а именно что <em>программируется</em>. Для понимания, приведу простой пример:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-openscad" data-lang="openscad"><span style="display:flex;"><span>cube([<span style="color:#ae81ff">25</span>,<span style="color:#ae81ff">35</span>,<span style="color:#ae81ff">55</span>]); <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Нарисовать</span> <span style="color:#960050;background-color:#1e0010">куб</span> <span style="color:#960050;background-color:#1e0010">размерами</span> <span style="color:#ae81ff">25</span><span style="color:#960050;background-color:#1e0010">мм</span> <span style="color:#960050;background-color:#1e0010">х</span> <span style="color:#ae81ff">25</span><span style="color:#960050;background-color:#1e0010">мм</span> <span style="color:#960050;background-color:#1e0010">х</span> <span style="color:#ae81ff">55</span><span style="color:#960050;background-color:#1e0010">мм</span>
</span></span></code></pre></div><p>Просто? Очень! А учитывая что язык полноценный, с циклами и условиями «напрограммировать» в нём можно многое.</p>
<h2 id="первая-версия">Первая версия</h2>
<p>Вот и я не стал долго думать, открыл <a href="https://openscad.org/documentation.html"target="_blank" rel="noopener noreferrer">мануал с оффсайта</a>, обмерил штангенциркулем оригинальный колпачок и пошёл <del>проектировать</del> программировать. На всё про всё у меня ушло где-то с полчаса. И у меня получилась первая версия колпачка. Максимально простая и дубовая. Первая куцая версия:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-05-lets-code-3d/2.jpg"
        alt="2.jpg"/><br>
Колпачок v1</p>
<h2 id="вторая-версия">Вторая версия</h2>
<p>В принципе, на этом можно было и остановиться, ведь свою функцию он выполняет. Но у меня сработал мой перфекционист и я подумал, что было бы неплохо вырезы в корпусе сделать один под другим, а не на одной линии, чтобы бокорез сидел ровно, а не под углом. Потом пришла мысль, что было бы неплохо ещё и параметризировать модель, чтобы было легко менять её размеры, а не хардкодить их. И вот получилась вторая, и на текущий момент окончательная версия:</p>
<p><img loading="lazy"  src="blog/posts/2025-08-0!%5B%5Bblog/posts/files/2025-08-05-lets-code-3d/3.png"
        alt="blog/posts/2025-08-0![[blog/posts/files/2025-08-05-lets-code-3d/3.png"/>ультат «в железе», то есть в пластике :)</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-05-lets-code-3d/4.jpg"
        alt="4.jpg"/><br>
Колпачок v2 результат</p>
<p>А сам код, думаю, он достаточно понятен (<a href="source.scad">исходники</a> и <a href="result.stl">STL модель</a> я прикладываю к этому посту):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-openscad" data-lang="openscad"><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Толщина</span> <span style="color:#960050;background-color:#1e0010">стенки</span>
</span></span><span style="display:flex;"><span>wall <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Высота</span> <span style="color:#960050;background-color:#1e0010">внешняя</span> height <span style="color:#f92672">=</span> <span style="color:#ae81ff">12</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Длина</span> <span style="color:#960050;background-color:#1e0010">основной</span> <span style="color:#960050;background-color:#1e0010">части</span> (<span style="color:#960050;background-color:#1e0010">внутренняя</span>) l1 <span style="color:#f92672">=</span> <span style="color:#ae81ff">15</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Длина</span> <span style="color:#960050;background-color:#1e0010">носика</span> (<span style="color:#960050;background-color:#1e0010">внутренняя</span>) l2 <span style="color:#f92672">=</span> <span style="color:#ae81ff">20</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Ширина</span> <span style="color:#960050;background-color:#1e0010">у</span> <span style="color:#960050;background-color:#1e0010">основания</span> (<span style="color:#960050;background-color:#1e0010">внутренняя</span>) w <span style="color:#f92672">=</span> <span style="color:#ae81ff">15</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Толщина</span> <span style="color:#960050;background-color:#1e0010">метала</span> <span style="color:#960050;background-color:#1e0010">бокорезов</span> toolWidth <span style="color:#f92672">=</span> <span style="color:#ae81ff">2.1</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Нижняя</span> <span style="color:#960050;background-color:#1e0010">крышка</span> cover(<span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Верхняя</span> <span style="color:#960050;background-color:#1e0010">крышка</span> cover(height <span style="color:#f92672">-</span> wall);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Корпус</span> difference() {     linear_extrude(height)     polygon(         [ <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Полигон</span> <span style="color:#960050;background-color:#1e0010">идёт</span> <span style="color:#960050;background-color:#1e0010">против</span> <span style="color:#960050;background-color:#1e0010">часовой</span> <span style="color:#960050;background-color:#1e0010">стрелки</span>             [<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>],             [wall, <span style="color:#ae81ff">0</span>],             [wall, l1],             [w <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall, l1 <span style="color:#f92672">+</span> l2], <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Внутренний</span> <span style="color:#960050;background-color:#1e0010">кончик</span> <span style="color:#960050;background-color:#1e0010">носика</span>             [w <span style="color:#f92672">+</span> wall, l1],             [w <span style="color:#f92672">+</span> wall, <span style="color:#ae81ff">0</span>],             [w <span style="color:#f92672">+</span> wall <span style="color:#f92672">*</span> <span style="color:#ae81ff">2</span>, <span style="color:#ae81ff">0</span>],             [w <span style="color:#f92672">+</span> wall <span style="color:#f92672">*</span> <span style="color:#ae81ff">2</span>, l1],             [w <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall, l1 <span style="color:#f92672">+</span> l2 <span style="color:#f92672">+</span> wall], <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Внешний</span> <span style="color:#960050;background-color:#1e0010">кончик</span> <span style="color:#960050;background-color:#1e0010">носика</span>             [w <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">-</span> wall <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall, l1 <span style="color:#f92672">+</span> l2 <span style="color:#f92672">+</span> wall],             [<span style="color:#ae81ff">0</span>, l1],         ]     );
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Вырезы</span>     translate([w <span style="color:#f92672">+</span> wall, <span style="color:#ae81ff">0</span>, height <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">-</span> toolWidth]) <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Правый</span> <span style="color:#960050;background-color:#1e0010">вырез</span> <span style="color:#960050;background-color:#1e0010">чуть</span> <span style="color:#960050;background-color:#1e0010">ниже</span> <span style="color:#960050;background-color:#1e0010">середины</span>     cube([wall, l1 <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span>, toolWidth]);     translate([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>, height <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span>]) <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Левый</span> <span style="color:#960050;background-color:#1e0010">вырез</span> <span style="color:#960050;background-color:#1e0010">чуть</span> <span style="color:#960050;background-color:#1e0010">выше</span> <span style="color:#960050;background-color:#1e0010">середины</span>     cube([wall, l1 <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span>, toolWidth]); }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Крышка</span> <span style="color:#f92672">module</span> cover(z) {     translate([<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>, z])     linear_extrude(wall)     polygon(         [ <span style="color:#f92672">/</span> <span style="color:#960050;background-color:#1e0010">Полигон</span> <span style="color:#960050;background-color:#1e0010">идёт</span> <span style="color:#960050;background-color:#1e0010">против</span> <span style="color:#960050;background-color:#1e0010">часовой</span> <span style="color:#960050;background-color:#1e0010">стрелки</span>             [<span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">0</span>],             [w <span style="color:#f92672">+</span> wall <span style="color:#f92672">*</span> <span style="color:#ae81ff">2</span>, <span style="color:#ae81ff">0</span>],             [w <span style="color:#f92672">+</span> wall <span style="color:#f92672">*</span> <span style="color:#ae81ff">2</span>, l1],             [w <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall, l1 <span style="color:#f92672">+</span> l2 <span style="color:#f92672">+</span> wall],             [w <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">-</span> wall <span style="color:#f92672">/</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">+</span> wall, l1 <span style="color:#f92672">+</span> l2 <span style="color:#f92672">+</span> wall],             [<span style="color:#ae81ff">0</span>, l1],         ]     ); } <span style="color:#960050;background-color:#1e0010">```</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">Надеюсь</span>, <span style="color:#960050;background-color:#1e0010">я</span> <span style="color:#960050;background-color:#1e0010">кому</span><span style="color:#f92672">-</span><span style="color:#960050;background-color:#1e0010">то</span> <span style="color:#960050;background-color:#1e0010">показал</span> <span style="color:#960050;background-color:#1e0010">что</span> <span style="color:#960050;background-color:#1e0010">даже</span> <span style="color:#960050;background-color:#1e0010">без</span> <span style="color:#960050;background-color:#1e0010">специального</span> <span style="color:#960050;background-color:#1e0010">конструкторского</span> <span style="color:#960050;background-color:#1e0010">образования</span>, <span style="color:#960050;background-color:#1e0010">но</span> <span style="color:#960050;background-color:#1e0010">умея</span> <span style="color:#960050;background-color:#1e0010">программировать</span> <span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">можно</span> <span style="color:#960050;background-color:#1e0010">получать</span> <span style="color:#960050;background-color:#1e0010">не</span> <span style="color:#960050;background-color:#1e0010">только</span> <span style="color:#960050;background-color:#1e0010">эфимерные</span> <span style="color:#960050;background-color:#1e0010">программки</span>, <span style="color:#960050;background-color:#1e0010">но</span> <span style="color:#960050;background-color:#1e0010">и</span> <span style="color:#960050;background-color:#1e0010">вполне</span> <span style="color:#960050;background-color:#1e0010">себе</span> <span style="color:#960050;background-color:#1e0010">физические</span> <span style="color:#960050;background-color:#1e0010">предметы</span>, <span style="color:#960050;background-color:#1e0010">которые</span> <span style="color:#960050;background-color:#1e0010">пригождаются</span> <span style="color:#960050;background-color:#1e0010">в</span> <span style="color:#960050;background-color:#1e0010">быту.</span> <span style="color:#960050;background-color:#1e0010">И</span> <span style="color:#960050;background-color:#1e0010">если</span> <span style="color:#960050;background-color:#1e0010">интересно</span>, <span style="color:#960050;background-color:#1e0010">подбиваю</span> <span style="color:#960050;background-color:#1e0010">экономику</span>: <span style="color:#960050;background-color:#1e0010">напечатано</span> <span style="color:#ae81ff">2</span> <span style="color:#960050;background-color:#1e0010">колпачка</span> (<span style="color:#ae81ff">1</span> <span style="color:#960050;background-color:#1e0010">и</span> <span style="color:#ae81ff">2</span> <span style="color:#960050;background-color:#1e0010">версия</span>), <span style="color:#960050;background-color:#1e0010">каждый</span> <span style="color:#960050;background-color:#1e0010">весом</span> <span style="color:#960050;background-color:#1e0010">по</span> <span style="color:#ae81ff">4</span> <span style="color:#960050;background-color:#1e0010">грамма</span>, <span style="color:#960050;background-color:#1e0010">то</span> <span style="color:#960050;background-color:#1e0010">есть</span> <span style="color:#960050;background-color:#1e0010">примерно</span> <span style="color:#960050;background-color:#1e0010">по</span> <span style="color:#ae81ff">4</span><span style="color:#960050;background-color:#1e0010">₽</span> <span style="color:#960050;background-color:#1e0010">за</span> <span style="color:#960050;background-color:#1e0010">штуку.</span> <span style="color:#960050;background-color:#1e0010">Печатал</span> <span style="color:#960050;background-color:#1e0010">пластиком</span> PLA, <span style="color:#960050;background-color:#1e0010">как</span> <span style="color:#960050;background-color:#1e0010">моим</span> <span style="color:#960050;background-color:#1e0010">самым</span> <span style="color:#960050;background-color:#1e0010">любимым.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">##</span> <span style="color:#960050;background-color:#1e0010">Ссылки</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">Сайт</span> OpenSCAD <span style="color:#f92672">-</span> https:<span style="color:#75715e">//openscad.org/
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">Документация</span> <span style="color:#f92672">-</span> https:<span style="color:#75715e">//openscad.org/documentation.html
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">Шпаргала</span> <span style="color:#960050;background-color:#1e0010">по</span> <span style="color:#960050;background-color:#1e0010">функциям</span> <span style="color:#f92672">-</span> https:<span style="color:#75715e">//openscad.org/cheatsheet/index.html
</span></span></span><span style="display:flex;"><span><span style="color:#f92672">-</span> <span style="color:#960050;background-color:#1e0010">Библиотеки</span> <span style="color:#f92672">-</span> https:<span style="color:#75715e">//openscad.org/libraries.html
</span></span></span></code></pre></div>]]></content>
    <author>
      <name></name>
      
      
    </author><category term="3d_печать" label="3D_печать" scheme="https://neonxp.ru/tags/3d_%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D1%8C/" />
    <category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <published>2025-08-05T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Meshtastic]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-08-02-meshtastic/" />
    <id>https://neonxp.ru/posts/2025-08-02-meshtastic/</id>
    <updated>2025-08-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Некоторое время назад наткнулся в блоге <a href="https://bolknote.ru/all/myshastik/"target="_blank" rel="noopener noreferrer">Евгения Степанищева</a> на потрясающую штуку - <a href="https://meshtastic.org/"target="_blank" rel="noopener noreferrer">Meshtastic</a>, или как в народе её называют - «мышастик». Вкратце, это протокол и, в первую очередь, специальная прошивка для целого спектра устройств, которые позволяют организовать <a href="https://ru.ruwiki.ru/wiki/%D0%AF%D1%87%D0%B5%D0%B8%D1%81%D1%82%D0%B0%D1%8F_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F"target="_blank" rel="noopener noreferrer">mesh</a> сеть поверх протокола <a href="https://ru.ruwiki.ru/wiki/LoRa"target="_blank" rel="noopener noreferrer">LoRa</a>.</p>
<hr>
<p>Базово, как это выглядит при использовании:</p>
<p>У каждого участника сети есть небольшое портативное радиоустройство (готовое или самодельное - не важно), прошитое специальной прошивкой. К устройству, чаще всего (но необязательно!) подключен смартфон со специальным одноимённым приложением. Устройство ищет и старается подключиться к другим подобным устройствам, а со смартфона можно писать как в публичные, так и в приватные каналы. Но только текстом, т.к. скорость исчисляется байтами в секунду. При этом, хоть и радиус каждого устройства достаточно небольшой, но засчёт ячеистой топологии можно передавать сообщения не только тем, кто в радиусе приёма, но и тем, кого напрямую устройство «не видит», зато видят соседи или соседи соседей (в среднем, не больше 7 хопов обычно настраивают).</p>]]></summary><content type="html"><![CDATA[<p>Некоторое время назад наткнулся в блоге <a href="https://bolknote.ru/all/myshastik/"target="_blank" rel="noopener noreferrer">Евгения Степанищева</a> на потрясающую штуку - <a href="https://meshtastic.org/"target="_blank" rel="noopener noreferrer">Meshtastic</a>, или как в народе её называют - «мышастик». Вкратце, это протокол и, в первую очередь, специальная прошивка для целого спектра устройств, которые позволяют организовать <a href="https://ru.ruwiki.ru/wiki/%D0%AF%D1%87%D0%B5%D0%B8%D1%81%D1%82%D0%B0%D1%8F_%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F"target="_blank" rel="noopener noreferrer">mesh</a> сеть поверх протокола <a href="https://ru.ruwiki.ru/wiki/LoRa"target="_blank" rel="noopener noreferrer">LoRa</a>.</p>
<hr>
<p>Базово, как это выглядит при использовании:</p>
<p>У каждого участника сети есть небольшое портативное радиоустройство (готовое или самодельное - не важно), прошитое специальной прошивкой. К устройству, чаще всего (но необязательно!) подключен смартфон со специальным одноимённым приложением. Устройство ищет и старается подключиться к другим подобным устройствам, а со смартфона можно писать как в публичные, так и в приватные каналы. Но только текстом, т.к. скорость исчисляется байтами в секунду. При этом, хоть и радиус каждого устройства достаточно небольшой, но засчёт ячеистой топологии можно передавать сообщения не только тем, кто в радиусе приёма, но и тем, кого напрямую устройство «не видит», зато видят соседи или соседи соседей (в среднем, не больше 7 хопов обычно настраивают).</p>
<p>Загоревшись, я тут же заказал себе <a href="https://meshtastic.org/docs/hardware/devices/lilygo/tbeam/"target="_blank" rel="noopener noreferrer">T-Beam</a>. Настройка оказалась до тупости простой, единственное, что надо учитывать, это то, какие частоты приняты в конкретном городе. Для Казани - это 868MHz.</p>
<p>На своём 3D принтере напечатал ти-биму корпус, закрепил его на стену и оставил вылавливать ноды. За неделю накопилось почти 50 штук! Но при этом, я не скажу, что качество связи какое-то особо хорошее - регулярно теряются сообщения, да и единовременно у меня, по сути, только один аплинк до остальной сети. Ну ничего, я уже заказал антенну получше ;).</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2025-08-02-meshtastic/tbeam.webp"
        alt="tbeam.webp"/><br>
Мой T-Beam в напечатанном чехле</p>
<p>Чехол всратоватый потому что я его печатал в наихудшем качестве, на неотрегулированном принтере. Главное - свою задачу защиты выполняет.</p>
<p>Понятное дело, что это просто игрушка и никакого практического применения у неё нет, а в основном чате - бо́льшую часть времени сплошные «Пинг, меня слышно?». Но! Очень забавная игрушка. И да, теоретически может позволить экстренно связаться там, где другой сети просто нет. Просто, это не мой случай. Хотя, недавно оказался в ситуации, когда и электричества дома не было (а с ним и домашней сети) и одновременно была БПЛА опасность, а значит, никакущая мобильная сеть. То есть, практически, идеальные условия для мышастика :).</p>
<p>Несмотря на это, я всё же не удержался и заказал ещё два устройства, но в этот раз попроще. Брошу один в машину, а второй или супруге отдам, или в рюкзаке носить буду носить. Буду своими скромными силами хоть немного, да расширять сеть своими устройствами.</p>
<p>Так же ездил на стройку своего будущего дома с устройством, но, ожидаемо, там оно сеть не увидело. Значит буду думать или о высокой антенне на крыше, или ещё что выдумывать, чтобы из своих пердей «дотянуться» до большой городской сети.</p>
<p>А к чему я про него рассказываю? А просто так. Забавная гиковская штука.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="meshtastic" label="Meshtastic" scheme="https://neonxp.ru/tags/meshtastic/" />
    <category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <published>2025-08-02T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Мой сетап 2025]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-11-03-my-setup/" />
    <id>https://neonxp.ru/posts/2025-11-03-my-setup/</id>
    <updated>2025-06-08T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и LLM в последнее время. Если выйдет что интересное - напишу об этом.</p>
<p>А пока хотел написать вот о чём.</p>
<p>Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло время и мне его описать.</p>
<hr>
<ul>
<li><a href="/pages/setup/laptop/">Ноутбук</a></li>
<li><a href="/pages/setup/pda/">Смартфон</a></li>
<li><a href="/pages/setup/nas/">NAS</a></li>
</ul>
<h1 id="окончание">Окончание</h1>
<p>Это всё что я вспомнил так сходу. По-любому, я что-то забыл, поэтому пост будет дополняться.</p>]]></summary><content type="html"><![CDATA[<p>Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и LLM в последнее время. Если выйдет что интересное - напишу об этом.</p>
<p>А пока хотел написать вот о чём.</p>
<p>Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло время и мне его описать.</p>
<hr>
<ul>
<li><a href="/pages/setup/laptop/">Ноутбук</a></li>
<li><a href="/pages/setup/pda/">Смартфон</a></li>
<li><a href="/pages/setup/nas/">NAS</a></li>
</ul>
<h1 id="окончание">Окончание</h1>
<p>Это всё что я вспомнил так сходу. По-любому, я что-то забыл, поэтому пост будет дополняться.</p>
<h1 id="upd-14062025">UPD [14.06.2025]</h1>
<p><a href="/pages/setup/">Пост переехал в постоянный раздел</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="сетап" label="Сетап" scheme="https://neonxp.ru/tags/%D1%81%D0%B5%D1%82%D0%B0%D0%BF/" />
    <category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <published>2025-06-08T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Мой сетап 2025]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-06-08-my-setup/" />
    <id>https://neonxp.ru/posts/2025-06-08-my-setup/</id>
    <updated>2025-06-08T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и LLM в последнее время. Если выйдет что интересное - напишу об этом.</p>
<p>А пока хотел написать вот о чём.</p>
<p>Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло время и мне его описать.</p>
<hr>
<p><a href="/pages/setup/">Пост переехал в постоянный раздел</a></p>]]></summary><content type="html"><![CDATA[<p>Давно ничего не писал, да и не было особо о чём. Немного играюсь с нейросетями и LLM в последнее время. Если выйдет что интересное - напишу об этом.</p>
<p>А пока хотел написать вот о чём.</p>
<p>Не помню, чтобы я когда-либо писал о том, какой у меня основной сетап, хотя сам с удовольствием читал о том, как он организован у других людей. Пожалуй, пришло время и мне его описать.</p>
<hr>
<p><a href="/pages/setup/">Пост переехал в постоянный раздел</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="сетап" label="Сетап" scheme="https://neonxp.ru/tags/%D1%81%D0%B5%D1%82%D0%B0%D0%BF/" />
    <category term="гиковское" label="Гиковское" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%BE%D0%B5/" />
    <published>2025-06-08T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Табы или пробелы?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/" />
    <id>https://neonxp.ru/posts/2025-04-05-tabs-or-spaces/</id>
    <updated>2025-04-05T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Так получилось, что с Нового Года я ничего в блог не писал. Тому причина в личной загруженности, и в не менее личной лени. Так же я делал некоторые эксперименты над самим блогом, потому что моё внутреннее чувство прекрасного не даёт мне просто остановиться и не трогать то, что работает.</p>
<p>Но всё же, я чувствую внутреннюю потребность написать небольшую заметку с размышлениями, которые недавно приходили ко мне в голову.</p>
<p>А связаны они с тем, что есть определённые догмы в индустрии, которые непонятно (ну или понятно) почему появились, и которым слепо следуют, хотя, как будто они уже не имеют смысла.</p>]]></summary><content type="html"><![CDATA[<p>Так получилось, что с Нового Года я ничего в блог не писал. Тому причина в личной загруженности, и в не менее личной лени. Так же я делал некоторые эксперименты над самим блогом, потому что моё внутреннее чувство прекрасного не даёт мне просто остановиться и не трогать то, что работает.</p>
<p>Но всё же, я чувствую внутреннюю потребность написать небольшую заметку с размышлениями, которые недавно приходили ко мне в голову.</p>
<p>А связаны они с тем, что есть определённые догмы в индустрии, которые непонятно (ну или понятно) почему появились, и которым слепо следуют, хотя, как будто они уже не имеют смысла.</p>
<hr>
<h2 id="вечный-спор">Вечный спор</h2>
<p>Для затравки, «вечный спор» табы или пробелы использовать в коде для отсутпов. Лично для меня здесь не то что выбор очевиден, для меня очевидно, что и самого выбора то нет. Конечно же, только табы! Отступ пробелами просто не имеет права на жизнь, и вот почему:</p>
<ul>
<li>Во-первых, это просто какой-то костыль, использовать пробел не по назначению.<br>
Наверное, не очень очевидно, но назначение пробела — это именно разделение<br>
слов. Невероятно! А наначение таба — как раз таки форматирование отступа.<br>
Давайте использовать инструменты по назначению!</li>
<li>Во-вторых, и самое главное, как по мне, это гибкость табуляции. Я, как<br>
читающий код, волен сам выбирать размер отступа. Например, если у меня узкий<br>
экран (смартфон, например) — я выберу отступ в 2 <em>визуальных</em> пробела.<br>
Наоборот, если бы у меня было слабое зрение — я бы выбрал отступ в бо́льшее<br>
число <em>визуальных</em> пробелов.</li>
<li>В-третьих, исходя из предыдущего пункта, я считаю, что использование именно<br>
пробелов — это диктование автором исходника мне своей воли в виде своих<br>
предпочтений (например, только 4 пробела, и никак иначе!). А какого чёрта? Это<br>
буквально насилие! Зачем? Я считаю, это не допустимо. Пусть у каждого будет<br>
возможность выбирать себе настройки отображения на <em>своей</em> машине под <em>свои</em><br>
вкусы, а не вкусы автора!</li>
<li>В-четвёртых, самое малозначительное — это то, что таб это 1 байт, а пробелов<br>
обычно больше чем 1 байт (от 2 до 8). Я считаю этот аргумент малозначительным,<br>
т.к. уж что что, а места на носителях информации нынче в достатке. Но тем не<br>
менее, это один из аргументов!</li>
</ul>
<p>А что по аргументам за пробелы? Да нет их. Ну окей, предположим, что есть. Во многих кодстайлах (PEP-8, PSR итп) закреплены именно пробелы. Я не понимаю, почему, вроде как, умные люди которые эти стандарты придумывали так сделали. Возможно, привычка. Но является ли привычка каких-то людей аргументом? Наверное, нет. И самое грустное, что эти стандарты уже не поменять, ибо с их использованием <em>уже</em> написаны мегатонны кодов.</p>
<p>Единственное, меня радует, что хотя бы в стандарте форматирования моего любимого языка Go этой откровенной чуши нет. В Go отступы приняты табами и только ими.</p>
<p>Сразу скажу, я говорил только про отступы в начале строки, но не про отступы внутри строки, например, чтобы выстраивать значения подряд идущих констант в одну ровную колонку. Там, вроде как, пробелы вполне оправданы. Но это не точно. Я пока не решил для себя.</p>
<p>Думаю, здесь насчёт табов и пробелов можно завершить. Если есть что накинуть — пишите письма, e-mail внизу страницы.</p>
<h2 id="вечный-консенсус">Вечный консенсус</h2>
<p>Про табы и пробелы была скорее затравочка. Там, как мне кажется, всё очевидно. Но есть менее очевидная, но как мне кажется очень родственная тема. Эта тема вызывает сильно меньше споров, т.к. вроде как в ней уже есть консенсус. Но этот консенсус ошибочен!</p>
<p>А говорю я про форматирование длины строк! А именно, т.н. hard-wraps и soft-wraps. Если коротко, при hard-wraps в текст в точках переноса (например, на 80 или 120 колонке) вставляются символ переноса строк (<code>\n</code>), при мягком переносе текст остается на одной строке, но выглядит так, как будто он разделен на несколько строк.</p>
<p>А начну я с небольшой предыстории, как я к этому пришёл. Как я уже писал в начале, у меня есть постоянное шило в седалище, которое не даёт мне просто остановиться и использовать то, что работает, как минимум, в контексте этого блога. И из последнего куда я смотрел — протокол Gemini[1]. Разбирая его, меня сначала немного удивила его особенность, а именно:</p>
<p>=> <a href="https://geminiprotocol.net/"target="_blank" rel="noopener noreferrer">https://geminiprotocol.net/</a> [1]</p>
<blockquote>
<p>Text in Gemtext documents is written using “long lines”, i.e. you (or your > editor) shouldn’t be inserting newline characters every 80 characters or so. > Instead, leave it up to the receiving Gemini client to wrap your lines to fit > the device’s screen size and the user’s preference. This way Gemtext content > looks good and is easy to read on desktop monitors, laptop screens, tablets > and smartphones.</p>
</blockquote>
<blockquote>
<p>Note that while Gemini clients will break up lines of text which are longer > than the user’s screen, they will not join up lines which are shorter than the > user’s screen, like would happen in Markdown, HTML or LaTeX. This means that, > e.g. “dot point” lists or poems with deliberately short lines will be > displayed correctly without the author having to do any extra work or the > client having to be any smarter in order to recognise and handle that kind of > content correctly.</p>
</blockquote>
<p>Сначала, я подумал, да это же нифига не удобно, что используются длинные строки, а не склеиваются разделённые одним переносом как в Markdown! Более того, это моё возмущение подогревалось тем, что я всё это время был сторонником как раз hard-wraps и форматировал что код, что markdown для блога по 80 или 120 колонке. Потому что так всегда и везде было принято. Но потом вчитавшись, я понял, что как раз таки «склеивание» Markdown это максимально неправильное поведение! Оно порождает такие минусы, как более сложный парсинг, который должен обрабатывать по разному один и два переноса строк, неочевидность, когда пишешь текст в редакторе, а отображается он совсем по другому, потенциальные ошибки, когда абзацы внезапно склеиваются, и т.п.</p>
<p>При этом, парсинг Gemtext поразительно простой. В общем случае, достаточно парсить по строке, и не думать о предыдущем состоянии (относится текущая строка к предыдущему параграфу или таки нет). Единственное исключение — преформатированный текст, при парсинге которого надо помнить состояние. Но и это очень просто, достаточно держать единственный флаг который говорит, мы сейчас в нормальном состоянии или в состоянии преформатированного текста. И переключать этот флаг когда очередная строка начинается с <em>```</em>. Вообще, Gemtext кажется наиболее правильным и приятным для меня языком разметки. Наверное, я на него перейду. Но потом, сейчас нет времени.</p>
<p>К чему я тут углубился в описание формата Gemtext? А вот к чему: только после прочтения спеки этого формата до меня сошло озарение, что использование длинных, а не обрезанных по 80 или 120 или ещё какую колонку более правильное не только для формата разметки, но и для обычного кода!</p>
<p>И вот аргументы:</p>
<ul>
<li>Во-первых, все редакторы кода поддерживают soft-wrap и каждый волен выставить<br>
для своего личного редактора удобную ему длину строки, а не подчиняться<br>
привычкам автора кода.</li>
<li>Во-вторых, за длину в 80 символов топят в основном старпёры что-то там<br>
говорящие про терминалы шириной в 80 символов. Только и этот аргумент не<br>
понятен. Когда вы в последнее время видели терминал в 80 символов? Не эмулятор<br>
терминала, а именно сам терминал? Ну даже, хорошо, пусть будет этот терминал в<br>
80 символов. Но он что, не умеет переносить? Подозреваю, что может. И в чём<br>
тогда проблема? Непонятно. Короче, требование в 80 символов (ну или более<br>
современное в 120) выглядит как высосанное из пальца, потому что под ним нет<br>
реальной основы кроме каких-то там исторических причин на доисторическом<br>
железе.</li>
<li>В-третьих, см. пункт про насилие автора кода над читателем кода. Например,<br>
опять таки, узкий монитор например. И на нём не soft-wrapped текст может<br>
вызывать горизонтальную прокрутку. И это убого.</li>
<li>В-четвёртых, да, это усложняет парсинг. Это слабый аргумент, я знаю. Как<br>
пример, правильный парсер Markdown (не буду тут бомбить про количество разных<br>
стандартов Markdown) пишется не то чтобы очень просто. В это же время,<br>
написать парсер Gemtext который полностью покроет спецификацию — дело максимум<br>
часа-двух для любого, кто программирует больше, хотя бы, нескольких месяцев!</li>
</ul>
<p>В общем, как и в случае с табо-пробелами я не вижу ни одной достойной причины делать жесткие переносы строк по какой-то длине!</p>
<p>Возможно, я что-то упустил — тоже можно по этому поводу поспорить со мной в электропочте. Возможно, я даже поменяю мнение, но наврядли.</p>
<h2 id="update-060425">Update 06.04.25</h2>
<p>Как я и просил, один хороший человек, Владислав (<a href="https://t.me/c/1331521959/2285%29"target="_blank" rel="noopener noreferrer">https://t.me/c/1331521959/2285)</a>, написал ответ. Прокомментирую его здесь:</p>
<blockquote>
<p>Мне есть что сказать про ширину таба и 80 символов.</p>
</blockquote>
<blockquote>
<p>Аргумент про разную ширину таба работает слабо: многие стили предполагают его > фиксированную длину. Если ставить другой, то форматирование ломается.</p>
</blockquote>
<blockquote>
<p>Пример: ядро Linux, где ширина таба 8, и аргументы функций “плывут” при другой > ширине.</p>
</blockquote>
<p>Я не единожды видел этот аргумент, но он как раз и кажется мне слабым. Большая ли разница для читающего код, как именно он его видит:</p>
<pre tabindex="0"><code>/ tabsize=2
  func someFunc(
    one,
    two,
    three,
  )
...
        callOfSomeFunc = someFunc(
          "one",
          "two",
          "three",
        )
</code></pre><p>или так</p>
<pre tabindex="0"><code>/ tabsize=4
    func someFunc(
        one,
        two,
        three,
    )
...
                callOfSomeFunc = someFunc(
                    "one",
                    "two",
                    "three",
                )
</code></pre><p>или даже так</p>
<pre tabindex="0"><code>/ tabsize=8
        func someFunc(
                one,
                two,
                three,
        )
...
                                callOfSomeFunc = someFunc(
                                        "one",
                                        "two",
                                        "three",
                                )
</code></pre><p>Кажется, что для 8 пробелов на таб всё сильно уезжает, но раз человек себе так настроил — то как будто его право и наверное были основания?</p>
<blockquote>
<p>Про 80 символов. Дело вообще не в размере терминала или ширине перфокарты. > Некоторые программисты разделяют редактор на две вкладки, чтобы смотреть два > файла.</p>
</blockquote>
<p>И тогда soft-wrap как раз и вместит весь код в каждую из половинок без горизонтальной прокрутки, о чём я и говорю.</p>
<blockquote>
<p>Некоторые используют большой шрифт. С шириной в 120 символов мы лишаем из > возможности удобно читать код. К тому же, я считаю этот аргумент важным, 120 > символов - это способ замаскировать плохой код. Чувак сделал 5 уровней > вложенности в коде? Отлично! Главное чтобы в 120 символов влезло.</p>
</blockquote>
<p>Всё так! Возможно, я не очень подробно расписал, но основная моя мысль в том, что такое жесткое ограничение мне кажется просто надуманным и взятым с потолка. А если я после функции хочу написать небольшой коммент и он ну никак не влезает на пяток символов? Новую строку ради этого делать? Ну как-то бредово. А для указанного случая гораздо лучше бы звучало ограничение в стандарте типа «не используйте больше 3 уровней вложенности в коде». Это хотя бы имело вполне себе обоснование, то что скорее всего такой код просто архитектурно неверен и его стоит пересмотреть.</p>
<blockquote>
<p>Конечно, можно сказать что есть длинные константы или имена функций, но этот > спор становится менее однозначным. Как по мне вполне хороший консенсус - это > 100 символов в строке</p>
</blockquote>
<p>Здесь не согласен. Здесь опять «магическая константа» с потолка.</p>
<blockquote>
<p>В целом, эти срачи мне кажутся достаточно поверхностными. Они в своем корне > несут вопрос “как повысить читаемость кода?”, но акцентируются на мелочах.</p>
</blockquote>
<p>Согласен. Мелочи. Но почему и бы про мелочи не поговорить :) Из них по отдельности всё и строится (избитая фраза, да). В больших стандартах обычно говорится просто декларативно «только пробелы, отступ 4 пробела, длина строк 120» и всё. А зачем и почему — опускается, как будто всем всё и так понятно. Мне вот не очень. Чувствую себя ребёнком спрашивающим «Почему небо синее?». Потому что мне кажется, что под этим требованием нет объективного требования кроме «так принято». А «так принято» я часто и принимаю как валидный аргумент, например, когда прихожу в какой-то проект, но в сути своей аргументом не является.</p>
<blockquote>
<p>Хотелось бы иметь какие-то объективные метрики, какая-то работа в этом > направлении была проделана, но, как я понял, это, во-первых, недостаточно > точные метрики, а во-вторых, недостаточно развитая история. > <a href="https://seeinglogic.com/posts/visual-readability-patterns/"target="_blank" rel="noopener noreferrer">https://seeinglogic.com/posts/visual-readability-patterns/</a></p>
</blockquote>
<p>Интересная статья, спасибо, с удовольствием прочитал. В целом, по выводам (<a href="https://seeinglogic.com/posts/visual-readability-patterns/#8-patterns-for-improving-code-readability"target="_blank" rel="noopener noreferrer">https://seeinglogic.com/posts/visual-readability-patterns/#8-patterns-for-improving-code-readability</a>) согласен. Метрика по Хольстеду (или как это перевести?) выглядит интересно, тем что она чётко считается (хотя когда я руками считал, что-то у меня не сошлось с примером :) ).</p>
<p>Из объективных метрик, тут вскользь ещё упоминалась цикломатическая сложность, которая вполне себе имеет право на жизнь.</p>
<p>А так же, только что пришло в голову что можно читабельность кода оценивать как вторую (?) производную от отступов по непустым строкам. При этом, чем эта производная ближе к нулю — тем лучше.</p>
<p>То есть, грубо говоря вот такой «код»:</p>
<pre tabindex="0"><code>_____
  ________
  _____
  _______
  ___
    ___
    _____
    __
  ____
___
</code></pre><p>Лучше чем, такой:</p>
<pre tabindex="0"><code>_____
  ________
    _____
  _______
  ___
    ___
      _____
    __
      ____
  ___
</code></pre><p>Это стоит ещё подумать, это буквально пришло в голову только что, пока читал статью.</p>
<p>P.S.: Из забавного</p>
<blockquote>
<p>As others have written, computers are fast and premature optimization is a bad > thing.</p>
</blockquote>
<p>Сначала они пишут «computers are fast» а потом происходит такое: [2]</p>
<p>=> <a href="https://tonsky.me/blog/disenchantment/ru/"target="_blank" rel="noopener noreferrer">https://tonsky.me/blog/disenchantment/ru/</a> [2]</p>
<h2 id="update-060425---2">Update 06.04.25 - 2</h2>
<p>Со вчерашнего дня я решил дополнить немного ещё.</p>
<p>Во-первых, хочу немного снизить градус холиворности и радикальности. Ещё раз упомяну что не вижу проблем для выравнивания пробелами текста внутри строки. То есть например, вот так:</p>
<pre tabindex="0"><code>→   →   ConstWithLongName = 0
→   →   Const1 =            1
→   →   Const2 =            2
→   →   Const3 =            3
</code></pre><p>для меня вполне нормально кажется. Даже более того, табы <em>внутри</em> строки кажутся плохим решением. Я говорю только про отступы в начале строки.</p>
<p>Во-вторых, насчёт длинных строк. Я расписал немного сумбурно и в одну кашу смешал как код, так и просто текст. Не стоило так. Хоть это и разные сущности, но я всё равно считаю жесткое ограничение необоснованным ни там ни там. Но по разным причинам:</p>
<ul>
<li>Для обычного текста ограничение в N символов выглядит таким же не обоснованым,<br>
как, например, требование автора «Читайте мои тексты только шрифтом Arial<br>
12pt». Глупость? Глупость.</li>
<li>Так же встречал, что люди используют это ограничение при написании электронных<br>
писем. Это выглядит как минимум странно. Письмо пишется для кого? Для<br>
получателя, т.е. читателя. Почему отправитель за читателя решает то, как у<br>
него будет отображаться письмо? Я часто читаю почту со смартфона с узким<br>
экраном, но средним шрифтом (чтобы меньше напрягать глаза). И горизонтальная<br>
прокрутка выглядит не очень. Горизонтальная прокрутка вообще почти всегда<br>
выглядит не очень и её стоит избегать всеми силами.</li>
<li>Для кода же история другая. Я не настолько поехал чтобы требовать всё писать в<br>
одну строку. Если у функции в сигнатуре много (больше одного - двух)<br>
аргументов — то это отличная идея написать их в столбик, а не в длинную линию,<br>
которая ещё неизвестно как перенесётся. Я против именно переноса только из-за<br>
магической константы колиечества символов.</li>
</ul>
<p>Да и вообще я ни от кого ничего не требовал. Я предлагаю только задуматься, а обоснованны ли «общепринятые» вещи? Может, уже прошло какое-то время и ситуация поменялась и удобнее и эффективнее выбрать что-то другое?</p>
<p>И как будто стоит абстрактному «читателю», к которому я отсылал, в этом посте, решать этот вопрос техническими средствами, типа editorconfig + pre-commit хуки на форматирование в принятый в команде формат? Возможно да. Иначе получится, что борясь за личную свободу — нарушаешь чужую свободу <del>писать говнокод</del>.</p>
<p>А .editorconfig я себе такой в home положил:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-.editorconfig" data-lang=".editorconfig"><span style="display:flex;"><span><span style="color:#66d9ef">[*]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">indent_style</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">tab</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">tab_width</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">4</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">end_of_line</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">lf</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">charset</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">utf-8</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">trim_trailing_whitespace</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">insert_final_newline</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">soft_wrap</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[*.{yml,yaml}] indent_style</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">space indent_size = 2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[*.json] indent_size</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">2 </span>
</span></span></code></pre></div><p>Вроде как, покрывает основное.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2025-04-05T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[С Новым Годом!]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-12-31-new-year/" />
    <id>https://neonxp.ru/posts/2024-12-31-new-year/</id>
    <updated>2024-12-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Ну что же, друзья, с наступающим!</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-31-new-year/img/2025.webp"
        alt="2025.webp"/><br>
2025 год</p>
<p>В этот день принято подводить итоги года. Ну и я подведу немного:</p>
<ul>
<li>Поступил в институт брака. Раз уж нет классического высшего, что ещё остаётся то ;)</li>
<li>В аккурат под конец года разрешились проблемы на работе. Причем разрешились<br>
настолько удачно, что я почти что жду окончания новогоднего отпуска, чтобы<br>
скорее начались трудовые будни.</li>
<li>Стал активно вести блог. Но всё равно не оставляет подспудное ощущение, что<br>
уже стал надоедать этим тем, кто подписан. После каждого поста жду что кто-то<br>
да отпишется :) Но мне нравится его вести, так что, уже не остановлюсь :)</li>
<li>Ездили с новоиспеченной супругой на Кавказ. Самое яркое — посетили<br>
обсерваторию в Нижнем Архызе. Под впечатлением, купили по приезду настоящий<br>
телескоп!</li>
<li>Начали строить свой домик в деревне. Но пока ещё до заселения далеко, вот<br>
только окна поставили.</li>
</ul>
<p>Под катом приложу фоточки наиболее ярких моментов, пожалуй.</p>]]></summary><content type="html"><![CDATA[<p>Ну что же, друзья, с наступающим!</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-31-new-year/img/2025.webp"
        alt="2025.webp"/><br>
2025 год</p>
<p>В этот день принято подводить итоги года. Ну и я подведу немного:</p>
<ul>
<li>Поступил в институт брака. Раз уж нет классического высшего, что ещё остаётся то ;)</li>
<li>В аккурат под конец года разрешились проблемы на работе. Причем разрешились<br>
настолько удачно, что я почти что жду окончания новогоднего отпуска, чтобы<br>
скорее начались трудовые будни.</li>
<li>Стал активно вести блог. Но всё равно не оставляет подспудное ощущение, что<br>
уже стал надоедать этим тем, кто подписан. После каждого поста жду что кто-то<br>
да отпишется :) Но мне нравится его вести, так что, уже не остановлюсь :)</li>
<li>Ездили с новоиспеченной супругой на Кавказ. Самое яркое — посетили<br>
обсерваторию в Нижнем Архызе. Под впечатлением, купили по приезду настоящий<br>
телескоп!</li>
<li>Начали строить свой домик в деревне. Но пока ещё до заселения далеко, вот<br>
только окна поставили.</li>
</ul>
<p>Под катом приложу фоточки наиболее ярких моментов, пожалуй.</p>
<!--mo![[blog/posts/2024-12-31-new-year/img/1.webp]].webp]]
Институт ![[blog/posts/2024-12-31-new-year/img/2.webp]].webp]]
Выхожу с р![[blog/posts/2024-12-31-new-year/img/3.webp]].webp]]
Собаньки на Ка![[blog/posts/2024-12-31-new-year/img/4.webp]].webp]]
Своя личная обсерва![[blog/posts/2024-12-31-new-year/img/5.webp]].webp]]
Домик в деревне

Вот как-то так :)

А пока, возвращаемся к новогоднему столу и готовимся встретить наступающий 2025 год!

Надеюсь, всё у нас у всех будет хорошо в этом наступающем новом году! 
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="новый_год" label="Новый_год" scheme="https://neonxp.ru/tags/%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9_%D0%B3%D0%BE%D0%B4/" />
    <published>2024-12-31T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Тернарник в Go]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-12-15-conditional-operator-go/" />
    <id>https://neonxp.ru/posts/2024-12-15-conditional-operator-go/</id>
    <updated>2024-12-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Хотите немного <del>наркомании</del> сахара для Go?</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-15-conditional-operator-go/conditional-operator-go_ternary.webp"
        alt="conditional-operator-go_ternary.webp"/><br>
Тернарник в Go</p>
<p>Их есть у меня:</p>
<p>Тернарный оператор для Go на генериках</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">If</span>[<span style="color:#a6e22e">T</span> <span style="color:#66d9ef">any</span>](<span style="color:#a6e22e">condition</span> <span style="color:#66d9ef">bool</span>, <span style="color:#a6e22e">thn</span> <span style="color:#a6e22e">T</span>, <span style="color:#a6e22e">els</span> <span style="color:#a6e22e">T</span>) <span style="color:#a6e22e">T</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">condition</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">thn</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">els</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><a href="https://go.dev/play/p/sBDnPGHce8I"target="_blank" rel="noopener noreferrer">Плейграунд чтобы потыкать</a></p>
<p>Будет настроение — добавлю в свою либку <a href="https://neonxp.ru/go/extra"target="_blank" rel="noopener noreferrer">https://neonxp.ru/go/extra</a> , а пока, как-то так держите.</p>
<p><strong>Не стоит</strong> использовать в реальном коде. Я лично не вижу никакого оправдания для использования, кроме как покекать.</p>]]></summary><content type="html"><![CDATA[<p>Хотите немного <del>наркомании</del> сахара для Go?</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-15-conditional-operator-go/conditional-operator-go_ternary.webp"
        alt="conditional-operator-go_ternary.webp"/><br>
Тернарник в Go</p>
<p>Их есть у меня:</p>
<p>Тернарный оператор для Go на генериках</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">If</span>[<span style="color:#a6e22e">T</span> <span style="color:#66d9ef">any</span>](<span style="color:#a6e22e">condition</span> <span style="color:#66d9ef">bool</span>, <span style="color:#a6e22e">thn</span> <span style="color:#a6e22e">T</span>, <span style="color:#a6e22e">els</span> <span style="color:#a6e22e">T</span>) <span style="color:#a6e22e">T</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">condition</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">thn</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">els</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p><a href="https://go.dev/play/p/sBDnPGHce8I"target="_blank" rel="noopener noreferrer">Плейграунд чтобы потыкать</a></p>
<p>Будет настроение — добавлю в свою либку <a href="https://neonxp.ru/go/extra"target="_blank" rel="noopener noreferrer">https://neonxp.ru/go/extra</a> , а пока, как-то так держите.</p>
<p><strong>Не стоит</strong> использовать в реальном коде. Я лично не вижу никакого оправдания для использования, кроме как покекать.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="go" label="Go" scheme="https://neonxp.ru/tags/go/" />
    <published>2024-12-15T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[POSSE]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-12-15-posse/" />
    <id>https://neonxp.ru/posts/2024-12-15-posse/</id>
    <updated>2024-12-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Решил я перейти к использованию практики POSSE. Что это такое? Аббревиатура расшифровывается примерно следующими способами:</p>
<p><strong>P</strong> - Publish или Post, <strong>OS</strong> - Own Site, <strong>SE</strong> - Syndicate Elsewhere (мне больше нравится, Share Everywhere)</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-15-posse/posse_posse.webp"
        alt="posse_posse.webp"/><br>
POSSE</p>
<p>Это практика, когда изначально любой материал публикуется на полностью подконтрольном собственном сайте, а только затем переразмещаяется на всякие социальные сети, типа ВК, Телеги и прочих Мастодонов.</p>
<hr>
<h2 id="почему-это-важно">Почему это важно?</h2>
<ul>
<li>Во-первых, <strong>платформы ненадежны</strong>. Любая платформа в любой момент может<br>
сделать что угодно с вашим контентом, или закрыться.</li>
<li>Во-вторых, <strong>право собственности</strong>. Не секрет, что у платформ весьма вольное<br>
представление об авторском праве на материалы размещаемые пользователями. С<br>
одной стороны, у них неограниченное право распоряжения контентом для любых<br>
целей, а с другой никакой ответственности за содержание контента. Не слишком<br>
ли кучеряво? А следуя POSSE, я и все кто следуют POSSE — сохраняют<br>
первоисточник под своим контролем, отдавая платформам лишь небольшой огрызок<br>
от контента. Да, у меня не больно какой-то великий контент, за который стоит<br>
трястись, но я всё равно предпочту сохранить за собой все права на него.</li>
<li>В-третьих, <strong>за пользователем остаётся право</strong> выбирать где ему удобнее<br>
следить за контентом. Либо на первоисточнике, с помощью божественного RSS (к<br>
чему я бы хотел призывать), либо на удобной платформе куда происходит<br>
синдикация.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li>В-четвёртых, … А давайте, я не буду пересказывать вот эту статью<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>? 😉 В<br>
общем, это правильная и нужная практика. Как минимум, на долгосрок. Платформы<br>
приходят и уходят, а файлы (в виде markdown моего блога) останутся на всегда.</li>
</ul>
<h2 id="что-я-сделал-чтобы-следовать-posse">Что я сделал чтобы следовать POSSE?</h2>
<p>Ну для начала, у меня сильно чесались руки переделать дизайн блога. Вроде, получилось так, как я и хотел, в стиле сайтов начала-середины 2010х. Просто потому что могу, кто же мне тут что запретит 😉. Тем самым я улучшил UX блога, до хотя бы терпимого. Походу дела, при редизайне, я порасставил правильных тегов и микроформатов для правильной синдикации с другими платформами.</p>]]></summary><content type="html"><![CDATA[<p>Решил я перейти к использованию практики POSSE. Что это такое? Аббревиатура расшифровывается примерно следующими способами:</p>
<p><strong>P</strong> - Publish или Post, <strong>OS</strong> - Own Site, <strong>SE</strong> - Syndicate Elsewhere (мне больше нравится, Share Everywhere)</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-15-posse/posse_posse.webp"
        alt="posse_posse.webp"/><br>
POSSE</p>
<p>Это практика, когда изначально любой материал публикуется на полностью подконтрольном собственном сайте, а только затем переразмещаяется на всякие социальные сети, типа ВК, Телеги и прочих Мастодонов.</p>
<hr>
<h2 id="почему-это-важно">Почему это важно?</h2>
<ul>
<li>Во-первых, <strong>платформы ненадежны</strong>. Любая платформа в любой момент может<br>
сделать что угодно с вашим контентом, или закрыться.</li>
<li>Во-вторых, <strong>право собственности</strong>. Не секрет, что у платформ весьма вольное<br>
представление об авторском праве на материалы размещаемые пользователями. С<br>
одной стороны, у них неограниченное право распоряжения контентом для любых<br>
целей, а с другой никакой ответственности за содержание контента. Не слишком<br>
ли кучеряво? А следуя POSSE, я и все кто следуют POSSE — сохраняют<br>
первоисточник под своим контролем, отдавая платформам лишь небольшой огрызок<br>
от контента. Да, у меня не больно какой-то великий контент, за который стоит<br>
трястись, но я всё равно предпочту сохранить за собой все права на него.</li>
<li>В-третьих, <strong>за пользователем остаётся право</strong> выбирать где ему удобнее<br>
следить за контентом. Либо на первоисточнике, с помощью божественного RSS (к<br>
чему я бы хотел призывать), либо на удобной платформе куда происходит<br>
синдикация.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li>В-четвёртых, … А давайте, я не буду пересказывать вот эту статью<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>? 😉 В<br>
общем, это правильная и нужная практика. Как минимум, на долгосрок. Платформы<br>
приходят и уходят, а файлы (в виде markdown моего блога) останутся на всегда.</li>
</ul>
<h2 id="что-я-сделал-чтобы-следовать-posse">Что я сделал чтобы следовать POSSE?</h2>
<p>Ну для начала, у меня сильно чесались руки переделать дизайн блога. Вроде, получилось так, как я и хотел, в стиле сайтов начала-середины 2010х. Просто потому что могу, кто же мне тут что запретит 😉. Тем самым я улучшил UX блога, до хотя бы терпимого. Походу дела, при редизайне, я порасставил правильных тегов и микроформатов для правильной синдикации с другими платформами.</p>
<p>Далее, я перепилил немного улучшил программку, которую написал уже достаточно давно, которая читает RSS моего блога и отправляет новые посты в Телеграм канал. Вот она, если что: <a href="https://gitrepo.ru/NeonXP/posse"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/NeonXP/posse</a></p>
<p>Кстати, в очередной раз напоминаю о RSS ленте <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>: блога. Эта лента — это самый правильный способ подписки на блог!</p>
<p>Так же из этой ленты автоматически подтягиваются посты в VK группу. Это сделано встроенным механизмом VK, за что им определенно респект! Не часто можно встретить нечто подобное на закрытых платформах (помним, же как Google убивал RSS?)!</p>
<p>Так же в ближайших планах и запилить WebMentions и прочие плюшки с ИндиВеба.</p>
<p>Ну пока, как то так <code>¯\_(ツ)_/¯</code></p>
<p>Есть что сказать? Внизу есть форма для невозбранного комментирования.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://www.theverge.com/2023/10/23/23928550/posse-posting-activitypub-standard-twitter-tumblr-mastodon"target="_blank" rel="noopener noreferrer">https://www.theverge.com/2023/10/23/23928550/posse-posting-activitypub-standard-twitter-tumblr-mastodon</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p><a href="https://indieweb.org/POSSE"target="_blank" rel="noopener noreferrer">https://indieweb.org/POSSE</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p><a href="https://neonxp.ru/feed/"target="_blank" rel="noopener noreferrer">https://neonxp.ru/feed/</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2024-12-15T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Guessr]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-12-12-guessr/" />
    <id>https://neonxp.ru/posts/2024-12-12-guessr/</id>
    <updated>2024-12-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>На недавних выходных я запилил очередной «проект выходного дня». На этот раз — аналог известного сервиса GeoGuessr, но в отличие от него, все точки сконцентрированы в моей родной Казани. Ну и я не использую панорамы, а фотографии мест.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-12-guessr/guessr_logo.webp"
        alt="guessr_logo.webp"/><br>
Guessr</p>
<p>Я обещал выложить исходники, и в общем, вот они: <a href="https://git.neonxp.ru/guessr.git/"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/guessr.git/</a></p>
<h2 id="немного-про-разработку">Немного про разработку</h2>
<p>Первым встал вопрос, откуда брать данные, а именно фотографии и координаты точек. Пару лет назад нашу страну покинул такой проект, как Ingress, представлявший собой гео игру в дополненной реальности. В свою очередь, я посчитал, что раз проект решил отказаться от нас, как игроков, я посчитал морально оправданным <del>спиз</del>экспропреировать кусочек их данных, а именно спарсил с их карты intel.ingress.com т.н. «порталы», которые, по сути и есть эти самые геоточки с фотографиями.</p>]]></summary><content type="html"><![CDATA[<p>На недавних выходных я запилил очередной «проект выходного дня». На этот раз — аналог известного сервиса GeoGuessr, но в отличие от него, все точки сконцентрированы в моей родной Казани. Ну и я не использую панорамы, а фотографии мест.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-12-12-guessr/guessr_logo.webp"
        alt="guessr_logo.webp"/><br>
Guessr</p>
<p>Я обещал выложить исходники, и в общем, вот они: <a href="https://git.neonxp.ru/guessr.git/"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/guessr.git/</a></p>
<h2 id="немного-про-разработку">Немного про разработку</h2>
<p>Первым встал вопрос, откуда брать данные, а именно фотографии и координаты точек. Пару лет назад нашу страну покинул такой проект, как Ingress, представлявший собой гео игру в дополненной реальности. В свою очередь, я посчитал, что раз проект решил отказаться от нас, как игроков, я посчитал морально оправданным <del>спиз</del>экспропреировать кусочек их данных, а именно спарсил с их карты intel.ingress.com т.н. «порталы», которые, по сути и есть эти самые геоточки с фотографиями.</p>
<p>Дамп я загнал в Postgresql с подключенным расширением <a href="https://postgis.net/"target="_blank" rel="noopener noreferrer">Postgis</a>.</p>
<p>Ну а далее написал достаточно простой API на Golang, который реализует следующие методы:</p>
<ul>
<li>
<p>Создание новой игровой сессии, в ответ ставится кука внутри которой<br>
зашифровано текущее состояние — ник, количество очков, ID текущего<br>
угадываемого объекта (в начале пустое).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-http" data-lang="http"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">  POST /api/state
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">  Content-Type: application/json
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">  {           "username": "NeonXP"       }     ```
</span></span></span></code></pre></div></li>
<li>
<p>Получение состояния. Просто возвращает вышеуказанные параметры</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-http" data-lang="http"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">GET /api/state
</span></span></span></code></pre></div></li>
<li>
<p>Выдача нового объекта для угадывания. При этом возвращается ссылка на фото и<br>
обновляется состояние, тем что в него вписывается ID объекта</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-http" data-lang="http"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">POST /api/next
</span></span></span></code></pre></div></li>
<li>
<p>Угадывание. Собственно, на вход передаются координаты куда на карте указал<br>
игрок. А в ответ возвращается:</p>
<ul>
<li>Название объекта</li>
<li>Расстояние от переданной точки до реального размещения объекта</li>
<li>Geojson строка в которой зашифрована линия соединяющая точку и объект (нужна<br>
для отрисовки красной линии на карте)</li>
</ul>
<p>При этом высчитываются очки которые получает игрок за попытку по формуле     max(1000-d, 0), где d - расстояние между выбранной точкой и объектом в метрах.     То есть, если разница меньше 1000м, то чем ближе - тем больше очков (максимум     1000 очков за 1 очень точное угадывание).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-http" data-lang="http"><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">POST /api/guess
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">Content-Type: application/json
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">{         "lat": 55.123,         "lon": 49.123     }     ```
</span></span></span></code></pre></div></li>
</ul>
<p>Вот в общем-то и всё API!</p>
<p>Из интересностей, при выборе очередной точки у неё в БД увеличивается счетчик, а сам select выбирает случайную точку только среди тех точек, где этот счетчик минимальный. То есть, пока не будут выданы игрокам все точки, уже выбранные заново не будут выданы. Вот это место в коде: <a href="https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n26"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n26</a> (стр. 26-32)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">err</span> = <span style="color:#a6e22e">btx</span>.<span style="color:#a6e22e">NewSelect</span>().
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">ColumnExpr</span>(<span style="color:#e6db74">`p.guid, p.img`</span>).
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">Model</span>(<span style="color:#a6e22e">r</span>).
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">Where</span>(<span style="color:#e6db74">`p.count = (SELECT MIN(pl.count) FROM places pl WHERE pl.deleted_at IS NULL)`</span>).
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">OrderExpr</span>(<span style="color:#e6db74">`RANDOM()`</span>).
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">Limit</span>(<span style="color:#ae81ff">1</span>).
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">Scan</span>(<span style="color:#a6e22e">ctx</span>, <span style="color:#a6e22e">r</span>)
</span></span></code></pre></div><p>Ещё я бы отметил то, что я решил по максимуму логику вынести в БД, и, например, при угадывании расстояние до точки, а также вышеупомянутый geojson формируются так же на стороне БД: <a href="https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n50"target="_blank" rel="noopener noreferrer">https://git.neonxp.ru/guessr.git/tree/pkg/service/places.go#n50</a> (стр. 50-59)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">p</span>.<span style="color:#a6e22e">db</span>.<span style="color:#a6e22e">NewSelect</span>().
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Model</span>(<span style="color:#f92672">&</span><span style="color:#a6e22e">model</span>.<span style="color:#a6e22e">Place</span>{<span style="color:#a6e22e">GUID</span>: <span style="color:#a6e22e">guid</span>}).
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">WherePK</span>(<span style="color:#e6db74">"guid"</span>).
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">ColumnExpr</span>(<span style="color:#e6db74">`p.name, p.guid, p.img,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">			ST_Distance(ST_MakePoint(?, ?)::geography, p.position::geography)::int AS distance,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">			ST_AsGeoJSON(ST_MakeLine(
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">				ST_SetSRID(ST_MakePoint(?, ?), 4326),
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">				ST_SetSRID(p.position, 4326)
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">			)) AS geojson`</span>, <span style="color:#a6e22e">lon</span>, <span style="color:#a6e22e">lat</span>, <span style="color:#a6e22e">lon</span>, <span style="color:#a6e22e">lat</span>).
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Scan</span>(<span style="color:#a6e22e">ctx</span>, <span style="color:#a6e22e">r</span>)
</span></span></code></pre></div><h2 id="дальнейшие-планы">Дальнейшие планы</h2>
<p>В комментах к анонсу ребята накидали достаточно много хороших идей, синтезировав которые, и добавив свои хотелки я составил примерно такой чеклист:</p>
<ul>
<li>[ ] Авторизация и общая доска лидерства</li>
<li>[ ] После угадывания спрашивать у игрока «сложность», чтобы потом можно было,<br>
например, настраивать чтобы попадались только простые объекты. И, например,<br>
разное количество очков за простые и сложные объекты</li>
<li>[ ] Подумать как вынести игру в оффлайн, по типу того же ингресса. Это сложно<br>
и предстоит хорошо это обдумать</li>
</ul>
<p>Как-то так :) А впереди новые выходные и новые «проекты выходного дня»!</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <published>2024-12-12T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Откуда берутся увлечения?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-11-29-hobbies/" />
    <id>https://neonxp.ru/posts/2024-11-29-hobbies/</id>
    <updated>2024-11-29T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>На днях задался вопросом вынесенным в заголовок. Причём не столько над эволюцией, сколько о том, откуда они взялись.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-29-hobbies/hobbies_dozor.webp"
        alt="hobbies_dozor.webp"/><br>
Откуда берутся увлечения?</p>
<p>Раньше я часто играл в ночные полевые игры, такие как «Дозоры» и «Энкаунтеры». Они были мне очень интересны и играли важную роль в моей жизни. Даже, я бы сказал, во взрослении, так как пришлись на возраст 19–25 лет.</p>
<hr>
<p>Сейчас давно уже не играю, но многие мои нынешние увлечения берут начало именно оттуда. Например, самый очевидный пример — интерес к картографии и ГИСам (геоинформационным системам), поскольку для «Дозоров» они были неотъемлемой частью. Также сюда относится и то, что я хорошо ориентируюсь в своем городе и немного интересуюсь его историей.</p>]]></summary><content type="html"><![CDATA[<p>На днях задался вопросом вынесенным в заголовок. Причём не столько над эволюцией, сколько о том, откуда они взялись.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-29-hobbies/hobbies_dozor.webp"
        alt="hobbies_dozor.webp"/><br>
Откуда берутся увлечения?</p>
<p>Раньше я часто играл в ночные полевые игры, такие как «Дозоры» и «Энкаунтеры». Они были мне очень интересны и играли важную роль в моей жизни. Даже, я бы сказал, во взрослении, так как пришлись на возраст 19–25 лет.</p>
<hr>
<p>Сейчас давно уже не играю, но многие мои нынешние увлечения берут начало именно оттуда. Например, самый очевидный пример — интерес к картографии и ГИСам (геоинформационным системам), поскольку для «Дозоров» они были неотъемлемой частью. Также сюда относится и то, что я хорошо ориентируюсь в своем городе и немного интересуюсь его историей.</p>
<p>Кроме того, можно проследить интерес к радиоэлектронике: пару раз, когда с командой организовывали игры, я придумывал задания, основанные на простых электронных устройствах, собранных на микроконтроллерах.</p>
<p>Туда же и любовь к исключительно ноутбукам, да и вообще переносной, что важно, технике. Теплое отношение к простым, надёжным, нетребовательным технологиям. Это всё оттуда же!</p>
<p>Любовь к программированию у меня возникла чуть раньше, поэтому её связать с этими играми я не могу. Здесь, скорее случилось наоборот. И я не менее трех раз даже порывался писать собственный «движок» для НПИ. Но, пока ни разу не успешно. Вероятно, меня здесь привлекает процесс, а не результат. Так что, последний мой заход хоть и является вполне себе функционально законченным, но для его развития времени я не выкраиваю, к сожалению.</p>
<p>Что-то еще было, но я не успел записать, и теперь забыл. Вывод: не стоит давать остывать размышлениям дольше суток, а писать сразу 🙂</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="размышления" label="Размышления" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BC%D1%8B%D1%88%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/" />
    <published>2024-11-29T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Гиперлокальность]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-11-27-hyperlocality/" />
    <id>https://neonxp.ru/posts/2024-11-27-hyperlocality/</id>
    <updated>2024-11-27T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Это очередной пост моих пространных рассуждений про тенденции и будущее интернета, которых в последнее время становится как-то многовато. Вероятно, в последствии, это станет даже серией постов.</p>
<p>Этот же я воспринимаю, как вводный в лор гиперлокальности.</p>
<p>Сначала, пожалуй, расскажу про посылки, а потом уже о том, куда они ведут, и какие из этого можно сделать выводы.</p>
<hr>
<h2 id="посылка">Посылка</h2>
<p>Думаю, все мы заметили как много вокруг стало ИИ инструментов. Сейчас ИИ на хайпе и его засовывают буквально куда можно и куда нельзя. Само по себе меня это не беспокоит. Я отношусь к ИИ как к просто очередному инструменту, который можно и нужно использовать там, где он применим. С этим нет проблем. Пройдёт какое-то время и ИИ инструменты займут ниши, где они наиболее уместны и где от них наибольшая польза. Однако тут есть и негативный нюанс. Этот инструмент будет способствовать в том числе и тому, что интернет станет (если ещё не стал!) по сути своей «мёртвым». Не мёртвым буквально, а «мёртвым» в том же смысле, в котором в «Руководстве путешествующего автостопом по галактики» Д. Адамса была вселенная обозначена необитаемой.</p>]]></summary><content type="html"><![CDATA[<p>Это очередной пост моих пространных рассуждений про тенденции и будущее интернета, которых в последнее время становится как-то многовато. Вероятно, в последствии, это станет даже серией постов.</p>
<p>Этот же я воспринимаю, как вводный в лор гиперлокальности.</p>
<p>Сначала, пожалуй, расскажу про посылки, а потом уже о том, куда они ведут, и какие из этого можно сделать выводы.</p>
<hr>
<h2 id="посылка">Посылка</h2>
<p>Думаю, все мы заметили как много вокруг стало ИИ инструментов. Сейчас ИИ на хайпе и его засовывают буквально куда можно и куда нельзя. Само по себе меня это не беспокоит. Я отношусь к ИИ как к просто очередному инструменту, который можно и нужно использовать там, где он применим. С этим нет проблем. Пройдёт какое-то время и ИИ инструменты займут ниши, где они наиболее уместны и где от них наибольшая польза. Однако тут есть и негативный нюанс. Этот инструмент будет способствовать в том числе и тому, что интернет станет (если ещё не стал!) по сути своей «мёртвым». Не мёртвым буквально, а «мёртвым» в том же смысле, в котором в «Руководстве путешествующего автостопом по галактики» Д. Адамса была вселенная обозначена необитаемой.</p>
<blockquote>
<p>Вселенная — кое-какая информация, облегчающая существование в ней. > > <…> > > 4. Население: Отсутствует. Известно, что существует бесконечное множество >    планет. Это объясняется той простой причиной, что пространство, в котором они >    могут существовать, также бесконечно. Однако не всякая из этих планет >    обитаема. Отсюда следует, что число обитаемых планет конечно. Частное от >    деления любого конечного числа на бесконечность стремится к нулю и не дает >    остатка, следовательно, можно заключить, что средняя численность населения >    планет Вселенной равна нулю. Отсюда следует, что численность населения во всей >    Вселенной также равна нулю, и потому все люди, которые порой попадаются на >    вашем пути, являются продуктом вашего воспаленного воображения. > > Д. Адамс — Ресторан «У края Вселенной», 19 глава</p>
</blockquote>
<h2 id="следствие">Следствие</h2>
<p>Количество сгенерированного ИИ контента, ИИ ботов пишущих комментарии и иным способом имитирующих людей будет расти нелинейно. Таким образом будет «размываться» весьма конечное количиство «живых» пользователей «неживыми» до того, что все эти миллиарды «живых» пользователей будут лишь статистической погрешностью относительно «неживых» ИИ ботов.</p>
<h2 id="как-это-повлияет-на-наше-восприятие-реальности">Как это повлияет на наше восприятие реальности?</h2>
<p>Представьте себе мир, где большинство сообщений, комментариев и публикаций создаются ИИ. Мы будем жить в мире, где трудно отличить реальность от иллюзии. Где каждый день нам придётся задаваться вопросом: кто написал этот комментарий – реальный человек или искусственный интеллект? Это приведёт к тому, что доверие к информации в интернете начнёт стремительно падать. Люди станут всё больше сомневаться в подлинности того, что видят и читают. В итоге, интернет превратится в огромное море данных, где настоящие голоса людей тонут в океане фальшивок и симуляций.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-27-hyperlocality/braindance.webp"
        alt="braindance.webp"/><br>
Киберпанк который мы заслужили</p>
<h2 id="гиперлокальность">Гиперлокальность</h2>
<p>Уже сейчас вполне себе просматиривается контур того, что я, за неимением лучшего термина, называю «Гиперлокальностью». Термин мне нравится тем что он, с одной стороны, хорошо описывает то, куда, по моему мнению, мы придём, а с другой стороны, названием отсылает к «гипертексту».</p>
<h3 id="что-я-под-этим-подразумеваю">Что я под этим подразумеваю?</h3>
<p>Помните старые времена, когда интернет только-только появлялся и из каждого утюга звучало как одно из его преимуществ, то, что «вы сможете находить себе собеседников и друзьей в любой точке мира, не выходя из дома». Звучало многообещающе, и в каком-то смысле, оно так и было.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-27-hyperlocality/90e.webp"
        alt="90e.webp"/><br>
Наивное представление из 90х о том, что интернет будет нас соединять</p>
<p>Но что происходит сейчас? Интернет, вместо того чтобы соединять людей по всему миру, начинает дробиться на маленькие замкнутые круги. Почему так происходит? Ответ кроется в недоверии. Когда невозможно понять, кто перед тобой – настоящий человек или ИИ-бот, люди начинают замыкаться в узких кругах тех, кому они доверяют.</p>
<blockquote>
<p>Интернет, он не сближает. Это скопление одиночества. Мы вроде вместе, но > каждый один. Иллюзия общения, иллюзия дружбы, иллюзия жизни… > > Януш Леон Вишневский — Одиночество в Сети</p>
</blockquote>
<p>Эти круги становятся всё меньше и меньше, пока не превращаются в замкнутые сообщества, где общение ограничено только теми, кого знаешь лично. Таким образом, получается некая WebOfTrust, но только по валидации «человечности». Это напоминает модель «доверительных сетей», которая существовала задолго до появления интернета, но теперь она приобретает новый смысл в цифровую эпоху.</p>
<p>А личные знакомства они, как правило, достаточно локальные. А следовательно, в ближайшее время мы увидим расцвет изолированных «анклавов» из <em>лично</em> знакомых между собой людей, который и будут существовать своими маленькими, <strong>гиперлокальными</strong> сообществами. Размер при этом может быть почти любой, как группка из трёх друзей, так и небольшой клуб из пары десятков <em>лично знакомых</em> единомышленников.</p>
<p>Причём, примеры гиперлокальных сообществ уже сейчас есть и в большом количестве. Например, у меня с друзьями уже почти 10 лет есть свой маленький чатик на шесть голов. И, в принципе, этого круга общения мне вполне хватает. И в своём кругу мы, конечно же, уверенны в «человечности» каждого из нас, ибо знакомы и ИРЛ.</p>
<p>Причём, «достаточность» этого кружка для меня такая, что если у меня, вдруг, магическим образом, останется только этот чатик, мой NAS в который загруженно примерно 50К книг и несколько любимых сериалов, и, конечно, VPN до работы, чтобы я мог зарабатывать на жизнь — то, это и будет вся моя гиперлокальная сеть. И как будто, не сильно то я и потеряю если останется только это, ну или как минимум, уж точно выживу. Если что, это именно магически и гипотетически, но тем не менее.</p>
<p>Так же, подобные кружки, я видел и, например, у своих старших родственников. Они, в основном, устраивают гиперлокальные «кружки» в том же вотсаппе. Там они делятся рекомендациями фильмов, рецептами, шутками, новостями и прочим подобным.</p>
<h3 id="а-к-чему-я-это-всё">А к чему я это всё?</h3>
<p>Да к тому что на текущем этапе развития интернета, мы всё больше уходим от <strong>глобальной</strong> сети к <strong>гиперлокальной</strong>. И, наверное, мне это даже вполне нравится. Это как-то… уютно чтоли.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-27-hyperlocality/camp.webp"
        alt="camp.webp"/><br>
Примерно так я визуализирую гиперлокальное сообщество</p>
<h2 id="перспективы">Перспективы</h2>
<p>Дисклеймер. Дальше идут мои размышления, которые основываются в основном на интуитивных, а не объективных предположениях</p>
<p>С развитием этого тренда будут всё больше и больше отмирать крупные социальные сети типа ВК или РКНбука. История сделает виток и восскресит т.н. локалки, которые были популярны в 90е-00е. Конечно же, уже в другом облике. Никто не будет лазать по чердакам чтобы протянуть витуху между соседями, но именно суть останется. А суть в том, что будет бо́льшая концентрация на небольшом числе условно локальных ресурсов, где человек будет только со своими друзьями, а «большой» интернет отходит на второй план.</p>
<p>Так же могут получить развитие indieweb технологии, а так же self-hosted решения для общения, например, Matrix. Эти инструменты потребуются как ответ на заполненные ботами и спамом соцсети и мессенджеры. Конечно же, всё что нужно не затащить в свою уютненькую локалочку, но вылазка за недостающей инфой в интернет будет ощущаться, как выход из своей зоны комфорта в дикую и опасную пустошь.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-27-hyperlocality/in-internet.webp"
        alt="in-internet.webp"/><br>
Вылазка в «большой» интернет</p>
<h2 id="окончание">Окончание?</h2>
<p>Я отдаю себе отчёт что то, что я написал выше — весьма сумбурно. Но это следствие того, что я ещё не до конца исследовал эту тему, и многие мысли на эту тему в моей голове пока ещё не сформированы в слова, а остаются на интуитивном уровне.</p>
<p>А написал я это, скорее как повод начать дискуссию на эту тему. Мне интересно, что вы думаете по этой теме. Возможно, мнение со стороны меня наведёт на еще какие мысли.</p>
<p>В дальнейшем у меня уже есть некоторые мысли на развитие темы, но уже в каких то отдельных аспектах.</p>
<p>Остаёмся на связи, 73!</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="гиперлокальность" label="Гиперлокальность" scheme="https://neonxp.ru/tags/%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C/" />
    <published>2024-11-27T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Obsidian]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-11-17-obsidian/" />
    <id>https://neonxp.ru/posts/2024-11-17-obsidian/</id>
    <updated>2024-11-17T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Некоторое время назад я <a href="joplin">писал</a> про заметочник Joplin.</p>
<p>С тех пор мои вкусы несколько поменялись и я открыл для себя его величество <a href="https://obsidian.md/"target="_blank" rel="noopener noreferrer">Obsidian</a>.</p>
<p>В целом он такой же заметочник, с ± тем же функционалом, но имеет для меня одну особенность, которая буквально переворачивает всё. Это мощнейшая система плагинов. Серьёзно, я нашел плагины которые покрывают для меня всё, кроме одного (но об этом позже).</p>
<h2 id="что-такое-obisidian">Что такое Obisidian?</h2>
<p>Obsidian представляет собой приложение для ведения персональных баз данных, основанное на принципах локальных файлов Markdown. Это значит, что ваши данные хранятся в виде обычных текстовых файлов, что обеспечивает максимальную гибкость и независимость от облачных сервисов.</p>]]></summary><content type="html"><![CDATA[<p>Некоторое время назад я <a href="joplin">писал</a> про заметочник Joplin.</p>
<p>С тех пор мои вкусы несколько поменялись и я открыл для себя его величество <a href="https://obsidian.md/"target="_blank" rel="noopener noreferrer">Obsidian</a>.</p>
<p>В целом он такой же заметочник, с ± тем же функционалом, но имеет для меня одну особенность, которая буквально переворачивает всё. Это мощнейшая система плагинов. Серьёзно, я нашел плагины которые покрывают для меня всё, кроме одного (но об этом позже).</p>
<h2 id="что-такое-obisidian">Что такое Obisidian?</h2>
<p>Obsidian представляет собой приложение для ведения персональных баз данных, основанное на принципах локальных файлов Markdown. Это значит, что ваши данные хранятся в виде обычных текстовых файлов, что обеспечивает максимальную гибкость и независимость от облачных сервисов.</p>
<p>Приложение работает на операционных системах: Windows, macOS, Linux, iOS, Android.</p>
<hr>
<h2 id="основные-функции-и-преимущества">Основные функции и преимущества</h2>
<ol>
<li><strong>Граф связей</strong> — да, он есть уже много где, но нельзя его не упомянуть.</li>
<li><strong>Markdown</strong> — очень приятно, что все заметки хранятся в Markdown, что<br>
обеспечивает максимальную интероперабельность и переносимость</li>
<li><strong>Плагины</strong> — плагины пишутся на JS/TS и их много. Даже не так, их <strong>МНОГО</strong>.<br>
Что приятно, они скачиваются и лежат в той же директории что и основное<br>
хранилище, а это важно для следующего пункта</li>
<li><strong>Синхронизация</strong> — она есть. Но вроде как платная. Но мне это и не<br>
интересно, я использую Syncthing. Просто шарю через него директорию<br>
хранилища по схеме оба ноутбука <-> NAS <-> Android. При этом синкаются все<br>
плагины и настройки.</li>
<li><strong>Скорость</strong> — не смотря на то, что он написан на проклятом электроне,<br>
работает достаточно шустро, претензий нет.</li>
<li><strong>Доска для рисования</strong> — мелочь, конечно, но удобно, когда надо на скорую<br>
руку накидать небольшую схемку. В конце этого поста как раз есть пример<br>
такой схемки.</li>
</ol>
<h2 id="минусы">Минусы</h2>
<ol>
<li><strong>Проприетарность</strong> — Obsidian хоть и в целом бесплатный, но он не свободный<br>
и даже не opensource. Да, это серьёзный минус, но он компенсируется тем, что<br>
хотябы вся база данных не в проприетарном формате. И в случае чего можно<br>
будет с наименьшими проблемами свалить куда-нибудь.</li>
<li><strong>Electron</strong> — ну это скорей мой личный пунктик. Но при этом приходиться<br>
смиряться с электроном что на Obsidian что на VSCode (VSCodium, конечно же),<br>
потому что лучше-то и нет.</li>
</ol>
<p>Это только то, что сейчас пришло в голову.</p>
<h2 id="а-теперь-самое-вкусное">А теперь самое вкусное</h2>
<p>Не помню, я упоминал что у него много плагинов? :)</p>
<p>Так вот, поехали, мои самые любимые:</p>
<h3 id="dataview">Dataview</h3>
<p><a href="https://blacksmithgu.github.io/obsidian-dataview/"target="_blank" rel="noopener noreferrer">https://blacksmithgu.github.io/obsidian-dataview/</a></p>
<p>Ну это просто must-have плагин, который позволяет обращаться с вашими заметками именно как с базой данных, не меньше.</p>
<p>Например, можно создать новый документ, написать в него</p>
<pre tabindex="0"><code>    ```dataview
    TASK
    WHERE status = " "
    ```
</code></pre><p>и волшебным образом вместо этого блока появятся все невыполненные задачи, а вот так</p>
<pre tabindex="0"><code>    ```dataview
    TASK
    WHERE status = "x"
    ```
</code></pre><p>мы получим все выполненные.</p>
<p>Язык запросов очень мощный[^1], в нём сто́ит разобраться. [^1]:https://blacksmithgu.github.io/obsidian-dataview/queries/structure/</p>
<p>Ещё есть возможность делать однострочные запросы, например, в домашней заметке (которая у меня открывается по умолчанию) у меня есть ссылка на именно сегодняшнюю заметку ежедневного журнала. Сделано вот так:</p>
<pre tabindex="0"><code>`=link(dateformat(date(today), "yyyy.MM.dd"))`
</code></pre><h3 id="templater">Templater</h3>
<p><a href="https://silentvoid13.github.io/Templater/"target="_blank" rel="noopener noreferrer">https://silentvoid13.github.io/Templater/</a></p>
<p>Этот плагин позволяет мне задать некоторым директориям умолчальный шаблон. Например, вот такой у меня шаблон для ежедневных журналов:</p>
<pre tabindex="0"><code><%*
try {
    / Получаем имя текущей ежедневной заметки
    const noteName = tp.file.title;

    / Разбиваем полученное имя на компоненты даты     const [year, month, day] = noteName.split('.').map(Number);

    / Создаём объект Date на основе поученных компонентов     const currentNoteDate = new Date(year, month - 1, day);

    / Вычисляем предыдущий и следующий день     let previousDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() - 1));     let nextDayDate = new Date(currentNoteDate.setDate(currentNoteDate.getDate() + 2));

    / Форматируем дату обратно в "DD-MM-YYYY"     const formatDate = (date) => {         const dd = String(date.getDate()).padStart(2, '0');         const mm = String(date.getMonth() + 1).padStart(2, '0');         const yyyy = date.getFullYear();         return `${yyyy}.${mm}.${dd}`;     };

    const previousDay = formatDate(previousDayDate);     const nextDay = formatDate(nextDayDate);

    / Формируем ссылки     const baseFolder = tp.file.folder(true);     const previousNotePath = `${baseFolder}/${previousDay}.md`;     const nextNotePath = `${baseFolder}/${nextDay}.md`;

    / Выводим даты в виде ссылок     tR += `← [[${previousNotePath}|${previousDay}]]  |  [[${nextNotePath}|${nextDay}]] →`; } catch (error) {     console.error("Templater Error:", error); } %>

## Задачи
___
<%
`- [ ]`
%>

## Заметки
___
</code></pre><p>и переходя к сегодняшней заметке я сразу получаю такую заготовку:</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-11-17-obsidian/templater.webp"
        alt="templater.webp"/><br>
Заметка из шаблона</p>
<h3 id="остальные-плагины">Остальные плагины</h3>
<p>Остальные тоже крутые, но я их приведу просто списком:</p>
<ul>
<li><a href="https://publish.obsidian.md/tasks/Introduction"target="_blank" rel="noopener noreferrer">tasks</a> — помогает более<br>
богато управлять задачами. В частности, у меня проставляет дату завершения<br>
задачи, и проставляет даты дедлайна и прочее.</li>
<li><a href="https://uphy.github.io/obsidian-reminder/"target="_blank" rel="noopener noreferrer">reminder</a> — трекает и напоминает<br>
про задачи</li>
<li><a href="https://github.com/liamcain/obsidian-calendar-plugin"target="_blank" rel="noopener noreferrer">calendar</a> — просто<br>
миникалендарь в боковой панели</li>
<li><a href="https://github.com/mirnovov/obsidian-homepage"target="_blank" rel="noopener noreferrer">homepage</a> — позволяет задать<br>
произвольную заметку “домашней”</li>
<li><a href="https://github.com/timolins/obsidian-icon-folder"target="_blank" rel="noopener noreferrer">icon-folder</a> — позволяет<br>
задавать директориям и заметкам произвольные иконки. Пример есть как раз на<br>
скриншоте выше.</li>
<li><a href="https://github.com/eatgrass/obsidian-pomodoro-timer"target="_blank" rel="noopener noreferrer">pomodoro-timer</a> — думаю,<br>
из названия и так понятно</li>
<li><a href="https://publish.obsidian.md/kanban/"target="_blank" rel="noopener noreferrer">kanban</a> — шикарнейший канбан плагин</li>
</ul>
<h2 id="а-что-же-мне-не-хватает">А что же мне не хватает?</h2>
<p>Я упомянул выше что мне кое чего не хватает. А именно, постить заметку в мой блог по протоколу <a href="https://indieweb.org/Micropub"target="_blank" rel="noopener noreferrer">Micropub</a>.</p>
<p>Только из-за Obsidian и того, что он использует Markdown я опять <a href="hugo">вернулся на Hugo</a>, который так же рендерится из Markdown.</p>
<p>«Но Hugo это же генератор статичных сайтов, куда ты ему будешь отправлять заметку для публикации?» — можешь спросить меня ты. А я отвечу что у меня вот такой план:</p>
<pre class="mermaid">
  graph TB
b1["Заметка в Obsidian"]
b2["Плагин obsidian-micropub"]
b3["micropub сервер на моем сервере"]
b4["вызов hugo"]
b5["Загрузка или копирование результата на веб сервер"]
b1 --> |Publish в контекстном меню| b2
b2 --> |POST neonxp.ru/micropub| b3
b3 --> |Запись в директорию content блога| b4
b4 --> |hugo рендерит markdown -> html| b5
style b1 fill:#28252e, stroke:#754fcc
style b2 fill:#2e2121, stroke:#c81319
style b3 fill:#2e2121, stroke:#c81319
style b4 fill:#222c2c, stroke:#20acaa
style b5 fill:#222c2c, stroke:#20acaa
</pre>
<details>
  <summary>Mermaid</summary>
  <pre>graph TB
b1["Заметка в Obsidian"]
b2["Плагин obsidian-micropub"]
b3["micropub сервер на моем сервере"]
b4["вызов hugo"]
b5["Загрузка или копирование результата на веб сервер"]
b1 --> |Publish в контекстном меню| b2
b2 --> |POST neonxp.ru/micropub| b3
b3 --> |Запись в директорию content блога| b4
b4 --> |hugo рендерит markdown -> html| b5
style b1 fill:#28252e, stroke:#754fcc
style b2 fill:#2e2121, stroke:#c81319
style b3 fill:#2e2121, stroke:#c81319
style b4 fill:#222c2c, stroke:#20acaa
style b5 fill:#222c2c, stroke:#20acaa</pre>
</details>
<p>То что выделено красным — ещё не существует в природе.</p>
<p>micropub сервер для hugo я уже начал писать. Да, есть nanopub сервер, но у него есть два серьёзных недостатка, это PHP и то что его сделал не я.</p>
<p>micropub плагин для obsidian я вижу сделать на основе существующего плагина rest-publish. Ну или как пойдёт.</p>
<p>В общем, меня ждёт ещё очень много весёлого дрочева с этим всем.</p>
<h2 id="закругляюсь">Закругляюсь</h2>
<p>Пожалуй, пока на этом всё. Поделился как радостью использования Obsidian, так и планами на пет-проекты, что ещё надо-то?</p>
<p>Если что, пишите комментарии. Лучше всего здесь, но можно и во всяких телеграмах-вкшках.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="joplin" label="Joplin" scheme="https://neonxp.ru/tags/joplin/" />
    <category term="obsidian" label="Obsidian" scheme="https://neonxp.ru/tags/obsidian/" />
    <published>2024-11-17T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Hugo]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-11-15-hugo/" />
    <id>https://neonxp.ru/posts/2024-11-15-hugo/</id>
    <updated>2024-11-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Так, ну я вернулся на hugo :D</p>
<p>Основная причина — я нашел решение основной моей проблемы с Hugo, а именно, удобной публикации.</p>
<p>А как именно решил — тема отдельного поста на потом.</p>
<p>Ну и тему наконец-то сделал сам с нуля. Как говорится, хочешь сделать хорошо — сделай это сам.</p>]]></summary><content type="html"><![CDATA[<p>Так, ну я вернулся на hugo :D</p>
<p>Основная причина — я нашел решение основной моей проблемы с Hugo, а именно, удобной публикации.</p>
<p>А как именно решил — тема отдельного поста на потом.</p>
<p>Ну и тему наконец-то сделал сам с нуля. Как говорится, хочешь сделать хорошо — сделай это сам.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2024-11-15T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Книжные рекомендации №2]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-10-17-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-2/" />
    <id>https://neonxp.ru/posts/2024-10-17-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-2/</id>
    <updated>2024-10-17T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Продолжу, пожалуй.</p>
<p>Сегодня хочу порекомендовать всего две книги:</p>
<h2 id="свидание-с-рамой">Свидание с Рамой</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-10-17-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-2/Rama16wiki.webp"
        alt="Rama16wiki.webp"/><br>
Свидание с Рамой</p>
<p>Артур Кларк, 1973</p>
<p>Фантастическая повесть о встрече человечества с необитаемым(?) инопланетным кораблём, который прилетел в нашу солнечную систему. На изображении выше — вид этого корабля изнутри.</p>
<ul>
<li>На сайте lib.ru:<br>
<a href="http://www.lib.ru/KLARK/rama1.txt"target="_blank" rel="noopener noreferrer">www.lib.ru/KLARK/rama1.txt</a></li>
<li>В виде аудиокниги: <a href="https://akniga.org/klark-artur-svidanie-s-ramoy"target="_blank" rel="noopener noreferrer">https://akniga.org/klark-artur-svidanie-s-ramoy</a></li>
<li>Если надо — могу выложить по запросу в формате fb2</li>
</ul>
<h2 id="глубина-в-небе">Глубина в небе</h2>
<p>Вернор Виндж, 1999</p>
<p>Об экспедиции двух разных человеческих колоний к странной звезде, имеющей свойство выключаться на 200 лет. Причиной отправки стали принятые с окрестной планеты радио сигналы, свидетельствующие о наличии разумной жизни на ней.</p>]]></summary><content type="html"><![CDATA[<p>Продолжу, пожалуй.</p>
<p>Сегодня хочу порекомендовать всего две книги:</p>
<h2 id="свидание-с-рамой">Свидание с Рамой</h2>
<p><img loading="lazy"  src="/files/blog/posts/files/2024-10-17-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-2/Rama16wiki.webp"
        alt="Rama16wiki.webp"/><br>
Свидание с Рамой</p>
<p>Артур Кларк, 1973</p>
<p>Фантастическая повесть о встрече человечества с необитаемым(?) инопланетным кораблём, который прилетел в нашу солнечную систему. На изображении выше — вид этого корабля изнутри.</p>
<ul>
<li>На сайте lib.ru:<br>
<a href="http://www.lib.ru/KLARK/rama1.txt"target="_blank" rel="noopener noreferrer">www.lib.ru/KLARK/rama1.txt</a></li>
<li>В виде аудиокниги: <a href="https://akniga.org/klark-artur-svidanie-s-ramoy"target="_blank" rel="noopener noreferrer">https://akniga.org/klark-artur-svidanie-s-ramoy</a></li>
<li>Если надо — могу выложить по запросу в формате fb2</li>
</ul>
<h2 id="глубина-в-небе">Глубина в небе</h2>
<p>Вернор Виндж, 1999</p>
<p>Об экспедиции двух разных человеческих колоний к странной звезде, имеющей свойство выключаться на 200 лет. Причиной отправки стали принятые с окрестной планеты радио сигналы, свидетельствующие о наличии разумной жизни на ней.</p>
<p>Книга является частью цикла, и я прикладываю цикл целиком:</p>
<p><a href="%d0%9a%d0%b5%d0%bd%d0%b3%d0%a5%d0%be.zip">Цикл «КенгХо» скачать</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="фантастика" label="Фантастика" scheme="https://neonxp.ru/tags/%D1%84%D0%B0%D0%BD%D1%82%D0%B0%D1%81%D1%82%D0%B8%D0%BA%D0%B0/" />
    <published>2024-10-17T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Цитатник Рунета]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-10-06-%D1%86%D0%B8%D1%82%D0%B0%D1%82%D0%BD%D0%B8%D0%BA-%D1%80%D1%83%D0%BD%D0%B5%D1%82%D0%B0/" />
    <id>https://neonxp.ru/posts/2024-10-06-%D1%86%D0%B8%D1%82%D0%B0%D1%82%D0%BD%D0%B8%D0%BA-%D1%80%D1%83%D0%BD%D0%B5%D1%82%D0%B0/</id>
    <updated>2024-10-06T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>В середине-конце нулевых был очень популярный сайт баш.орг.ру. Думаю, те, «кому за» помнят ещё тот самый башорг!</p>
<p><img loading="lazy"  src="blog/post!%5B%5Bblog/posts/files/2024-10-06-%D1%86%D0%B8%D1%82%D0%B0%D1%82%D0%BD%D0%B8%D0%BA-%D1%80%D1%83%D0%BD%D0%B5%D1%82%D0%B0/logo.webp"
        alt="blog/post![[blog/posts/files/2024-10-06-цитатник-рунета/logo.webp"/>просто был сборником цитат из разных чатов, irc каналов или личных переписок. Изначально, был исключительно анимешно-айтишной направленности и тем самым для нас, студентов и гиков был крайне популярным местом. В своё время, он подарил мне много часов приятного времяпрепровождения и ламповых вечеров.</p>
<p>Затем, когда БОР (как часто его сокращали) выиграл премию Рунета, на него хлынул поток, как сейчас бы сказали, «нормисов». Которые, уже в свою очередь, заполнили БОР всяким про отношения, офисно-планктонные темы, фейковыми цитатами, ответами на цитаты, ответами на ответы на цитаты и прочим подобным, далёким от изначального айтишного флёра, шлаком.</p>]]></summary><content type="html"><![CDATA[<p>В середине-конце нулевых был очень популярный сайт баш.орг.ру. Думаю, те, «кому за» помнят ещё тот самый башорг!</p>
<p><img loading="lazy"  src="blog/post!%5B%5Bblog/posts/files/2024-10-06-%D1%86%D0%B8%D1%82%D0%B0%D1%82%D0%BD%D0%B8%D0%BA-%D1%80%D1%83%D0%BD%D0%B5%D1%82%D0%B0/logo.webp"
        alt="blog/post![[blog/posts/files/2024-10-06-цитатник-рунета/logo.webp"/>просто был сборником цитат из разных чатов, irc каналов или личных переписок. Изначально, был исключительно анимешно-айтишной направленности и тем самым для нас, студентов и гиков был крайне популярным местом. В своё время, он подарил мне много часов приятного времяпрепровождения и ламповых вечеров.</p>
<p>Затем, когда БОР (как часто его сокращали) выиграл премию Рунета, на него хлынул поток, как сейчас бы сказали, «нормисов». Которые, уже в свою очередь, заполнили БОР всяким про отношения, офисно-планктонные темы, фейковыми цитатами, ответами на цитаты, ответами на ответы на цитаты и прочим подобным, далёким от изначального айтишного флёра, шлаком.</p>
<p>В общем, как всегда, в андеграунд пришли нормисы и всё испортили. И да, баш скатился уже, по сути, к десятым годам.</p>
<p>Примерно тогда же он для меня и закончился, ибо стал уже совсем не «торт». Потом он как-то жил больше декады за границами моего внимания. Успев при этом поменять адрес с зоны .ru на зону .im зачем-то. Ну а с началом СВО его админы окончательно сошли с ума и закрыли БОР который к тому времени и так едва ли был жив. На этом, его история окончательно закончилась.</p>
<p>Однако, не смотря на это БОР был интересным и знаковым феноменом, который неотрывно вписан как в историю рунета так и в мою личную историю юности.</p>
<p>Посему, я решил, так сказать, или возродить его, ну или, как минимум, сделать ему мемориал.</p>
<p>Сказано — сделано. Купил домен, который отсылается к самому старому домену оригинала — <a href="https://sh.org.ru"target="_blank" rel="noopener noreferrer">sh.org.ru</a> (sh является командной оболочкой, предком командной оболочки bash). За несколько часов написал скраппер по зеркалам и архивам бора, спарсил более 80К цитат. Затем, написал на golang простенький движок и всего за день запустил свой цитатник в свободное плавание!</p>
<p>Из функций пока только вывод цитат по страницам, а так же вывод случайных 20 цитат + кнопка для выдачи других 20 случайных. Лично мне гораздо больше нравятся как раз случайные подборки. Их можно обновлять почти бесконечно!</p>
<p>Да, он пока не умеет принимать новые цитаты (да и кто их будет слать то, лол?), да и нет других функций, типа голосований (классическими <code>[+]</code>, <code>[-]</code>, <code>[:|||:]</code>). Буду ли я это доделывать и как-то развивать? Не знаю. Возможно, время цитатника безвозвратно ушло. Но может быть и внезапный комбек. Кто знает 🤷‍♂️. В ближайшие дни я допилю и голосвалку и добавление цитат, но вряд ли буду в это инвестировать много времени. Есть ещё и мысль публиковать цитаты через ТГ бота простой пересылкой ему сообщений, а он уже их сам анонимизирует заменяя данные пользователей на обезличенные XXX и YYY и оформляет цитату как надо. Как вам такая идея?</p>
<p>Вообще, я бы хотел это как-то, наверное, обсудить, относительно того как это развивать и стоит ли?</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2024-10-06T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Преемственность от BBS до Телеграма]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-07-21-bbs/" />
    <id>https://neonxp.ru/posts/2024-07-21-bbs/</id>
    <updated>2024-07-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Чисто на правах воскресной шизы.</p>
<p>Обнаружил для себя интересную тенденцию, в характерных своему времени инструментах для общения за последние 40+ лет:</p>
<p>Если взять эволюционный ряд BBS (в т.ч. Фидо) → Форумы → Соцсети → Мессенджеры, то можно выделить в них несколько общихчерт:</p>
<ul>
<li>Возможность общения 1—1</li>
<li>Возможность общения 1—М (оператор BBS, администратор форума может сделать<br>
какую-то тему в read-only и сам туда писать,получая что-то типа каналов в<br>
телеге или блога)</li>
<li>Возможность общения М—М (обычный режим форума или многопользовательский чат в<br>
мессенджерах)</li>
<li>Возможность обмена файлами (в т.ч. картинками, не зависимо от того, сразу они<br>
отображаются у собеседника или нет)</li>
<li>Возможность проводить голосования (внезапно, да?)</li>
</ul>
<p>Что из этого следует? Да ничего, просто забавно. Интересно, что будет в постмессенджеровую эпоху? По идее, какой быинструмент ни был — эти же черты будут присущи и ему.</p>]]></summary><content type="html"><![CDATA[<p>Чисто на правах воскресной шизы.</p>
<p>Обнаружил для себя интересную тенденцию, в характерных своему времени инструментах для общения за последние 40+ лет:</p>
<p>Если взять эволюционный ряд BBS (в т.ч. Фидо) → Форумы → Соцсети → Мессенджеры, то можно выделить в них несколько общихчерт:</p>
<ul>
<li>Возможность общения 1—1</li>
<li>Возможность общения 1—М (оператор BBS, администратор форума может сделать<br>
какую-то тему в read-only и сам туда писать,получая что-то типа каналов в<br>
телеге или блога)</li>
<li>Возможность общения М—М (обычный режим форума или многопользовательский чат в<br>
мессенджерах)</li>
<li>Возможность обмена файлами (в т.ч. картинками, не зависимо от того, сразу они<br>
отображаются у собеседника или нет)</li>
<li>Возможность проводить голосования (внезапно, да?)</li>
</ul>
<p>Что из этого следует? Да ничего, просто забавно. Интересно, что будет в постмессенджеровую эпоху? По идее, какой быинструмент ни был — эти же черты будут присущи и ему.</p>
<p>P.S. Да, я тут не упомянул про мейллисты и условные IRC, но просто не знал куда и после чего их приткнуть. Но по факту,черты все те же самые.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2024-07-21T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Книжные рекомендации 1]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-06-02-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-1/" />
    <id>https://neonxp.ru/posts/2024-06-02-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8-1/</id>
    <updated>2024-06-02T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Подумалось, почему бы не рекомендовать понравившиеся мне книги.</p>
<p>В прошлый раз, ещё <a href="https://vk.com/wall-174034751_45"target="_blank" rel="noopener noreferrer">в VK рекомендовал</a> Азимовский цикл “Основание”. А в этот раз рекомендую цикл фантастики Андре Нортона “Королева Солнца”.</p>
<p>Если без спойлеров — цикл описывает приключения помощника супер-карго Дейла на космическом корабле вольных торговцев «Королева Солнца». Читается легко и увлекательно. Книги небольшие, проглатываются за пару часов.</p>
<p><a href="andre_norton-queen_of_sun.zip">Скачать</a></p>]]></summary><content type="html"><![CDATA[<p>Подумалось, почему бы не рекомендовать понравившиеся мне книги.</p>
<p>В прошлый раз, ещё <a href="https://vk.com/wall-174034751_45"target="_blank" rel="noopener noreferrer">в VK рекомендовал</a> Азимовский цикл “Основание”. А в этот раз рекомендую цикл фантастики Андре Нортона “Королева Солнца”.</p>
<p>Если без спойлеров — цикл описывает приключения помощника супер-карго Дейла на космическом корабле вольных торговцев «Королева Солнца». Читается легко и увлекательно. Книги небольшие, проглатываются за пару часов.</p>
<p><a href="andre_norton-queen_of_sun.zip">Скачать</a></p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="фантастика" label="Фантастика" scheme="https://neonxp.ru/tags/%D1%84%D0%B0%D0%BD%D1%82%D0%B0%D1%81%D1%82%D0%B8%D0%BA%D0%B0/" />
    <published>2024-06-02T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Вам не нужны пуши!]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-06-01-%D0%B2%D0%B0%D0%BC-%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D1%8B-%D0%BF%D1%83%D1%88%D0%B8/" />
    <id>https://neonxp.ru/posts/2024-06-01-%D0%B2%D0%B0%D0%BC-%D0%BD%D0%B5-%D0%BD%D1%83%D0%B6%D0%BD%D1%8B-%D0%BF%D1%83%D1%88%D0%B8/</id>
    <updated>2024-06-01T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Я не шучу. Серьёзно.</p>
<p>С неделю назад меня осенила крайне простая мысль, которая ранее, почему-то, мне не приходила.</p>
<hr>
<p>Но сначала, две вводных, или, скажем, тезиса, которые послужили для вывода этой мысли:</p>
<h2 id="тезис-1">Тезис №1</h2>
<p>Меня действительно огорчает количество пушей которые постоянно сыплются мне на телефон. Это вызывает раздражение сразуна нескольких уровнях:</p>
<ol>
<li>Сам момент их прихода — я автоматически смотрю на телефон, что же пришло</li>
<li>Если я игнорирую пуш — он потом висит в шторке вызывая раздражение</li>
<li>Очень часто это сранная реклама от какого-нибудь озона или магнит маркета<br>
(бывш. KazanExpress)</li>
</ol>
<p>Но бывают же и полезные пуши! Например, уведомления от Госуслуг или информация что заказ доставлен ну илисообщения в мессенджерах.</p>]]></summary><content type="html"><![CDATA[<p>Я не шучу. Серьёзно.</p>
<p>С неделю назад меня осенила крайне простая мысль, которая ранее, почему-то, мне не приходила.</p>
<hr>
<p>Но сначала, две вводных, или, скажем, тезиса, которые послужили для вывода этой мысли:</p>
<h2 id="тезис-1">Тезис №1</h2>
<p>Меня действительно огорчает количество пушей которые постоянно сыплются мне на телефон. Это вызывает раздражение сразуна нескольких уровнях:</p>
<ol>
<li>Сам момент их прихода — я автоматически смотрю на телефон, что же пришло</li>
<li>Если я игнорирую пуш — он потом висит в шторке вызывая раздражение</li>
<li>Очень часто это сранная реклама от какого-нибудь озона или магнит маркета<br>
(бывш. KazanExpress)</li>
</ol>
<p>Но бывают же и полезные пуши! Например, уведомления от Госуслуг или информация что заказ доставлен ну илисообщения в мессенджерах.</p>
<p>То есть, как будто, ради вышеуказанных полезных пушей, я должен терпеть и тонну бесполезного говна!</p>
<h2 id="тезис-2">Тезис №2</h2>
<p>Ну и вторая вводная, которая, какмне кажется подтолкнула меня — я всегда любил <em>простые</em> и открытые технологии, какдревние, типа RSS, e-mail, irc, так и новые, но такие же простые и открытые, как, например, gemini (да, сейчас он наэтом сайте сломан, но я его починю на днях, честно!), федиверс и прочие подобные. Кстати, сейчас подумалось, что именноэти качества меня и так сильно влюбили в golang 🙂</p>
<h2 id="та-самая-простая-мысль">Та самая простая мысль</h2>
<p>На стыке двух вышеуказанных тезисов у меня внезапно для себя самого и синтезировалась крайне простая мысль:</p>
<blockquote>
<p><strong><u>Действительно</u></strong> важные вещи всегда приходят на электропочту, а > сообщения в мессенджерах — это не срочно!</p>
</blockquote>
<p>Таким образом, запретив на телефоне вообще все пуши кроме электропочты я избавился от этого угнетающего информационногошума, оставив только полезный сигнал.</p>
<p>-Хей, да на почте же один спам! — скажешь ты мне</p>
<p>На самом деле, уже давно нет. Я лично использую почту mail.ru (в данном случае, это не очень важно и относится к любой)и на ней спама как такового уже давно нет (если думаешь, что это не так, перепроверь, возможно, твои представленияустарели). При этом, самое великое в этом то, что почта (на самом деле, не важно, какая именно — mail.ru, yandex или,прости господи, гмейл) предоставляет гибкие фильтры входящей почты. И потратив буквально пару десятков минут можносформировать правила, чтобы, например, от того же озона пропускались только письма со статусом заказа и больше ничего.</p>
<p>Вот так, древняя технология обычных, старых-добрых, писем позволяет решить проблему современных назойливых уведомлений!</p>
<p>При этом, почта не пушит проверять её постоянно! Самое главное её преимущество для меня — это её ассинхронность, вотличие от мессенджеров. Можно отключить от нее уведомления тоже, но завести себе правило, что раз в Н времени выделятьвремя на ее проверку. Самое главное — делать это в <em>комфортное для себя</em> время.</p>
<h2 id="так-же-как-и-на-мессенджеры-кстати">Так же как и на мессенджеры, кстати!</h2>
<p>Выше я уже сказал, что мессенджеры — это не срочно. Ничего страшного не случится, если я отвечу через час-два-три иливообще вечером. Если будет что-то <em>действительно</em> срочное — мне можно и позвонить. Но, к счастью, мне повезло, что мояжизнь достаточно спокойная и <em>действительно</em> срочное почти не случается. Отрефлексируй, уважаемый читатель, насколько<em>действительно</em> срочные и важные вопросы, которые ты таковыми считаешь и которыми ежедневно дёргают тебя? И ответь себечестно, мир бы разрушился, если бы ты их отложил на комфортное для <em>себя</em>, а не других время?</p>
<p>Такой эксперимент я ставлю на себе уже неделю. Я практически не захожу в мессенджеры, всё действительно важное мнеприходит на почту, лишней рекламы я не вижу, нет никакого информационного шума, который буквально стал бичомсовременности.</p>
<h2 id="вывод-за-неделю">Вывод за неделю</h2>
<p>Моё внутреннее состояние ощущается как очень спокойное и, главное, комфортное. Я чувствую полный контроль над тем, чтои когда я потребляю и нет никакого информационного насилия, как его называет <a href="http:/stolyarov.info/"target="_blank" rel="noopener noreferrer">Столяров</a>(хоть мне этот персонаж и кажется чрезвычайно радикальным и оттого отталкивающим, но что-то в его словах таки есть).</p>
<p>Считаю, что эксперимент оказался удачным, и я его продолжу!</p>
<h2 id="пишите-письма">Пишите письма!</h2>
<p>Напомню раз пришлось к слову, пожалуй, свою электропочту: <a href="mailto:i@neonxp.ru">i@neonxp.ru</a> или <a href="mailto:a.kiryukhin@mail.ru">a.kiryukhin@mail.ru</a> обе почты абсолютноравноценны, писать можно на любую. Очевидно из поста, что молниеносный ответ я не гарантирую, но, сам факт ответа вобозримое время гарантирован!</p>
<p>73!</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2024-06-01T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Конфигурация HTTPS с сертификатом от Минцифры]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2024-02-21-tls/" />
    <id>https://neonxp.ru/posts/2024-02-21-tls/</id>
    <updated>2024-02-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Третьего дня потратил достаточно много времени на установку на данном сайте сертификата от Минцифры.А поскольку сертификат краткоживущий (90 дней) — заметка мне самому пригодится на будущее.</p>
<p>Началось всё с того, что я с удивлением обнаружил, что на госуслугах теперь можно выпустить сертификат для домена физлицу.Это меня обрадовало, хотя ранее я приунывал что нет никакой альтернативы простым смертным. Теперь есть. <del>Закрывайте буржуйнет.</del></p>
<p>Поехали!</p>
<ol>
<li>Идём сюда: <a href="https://www.gosuslugi.ru/627603/1/form"target="_blank" rel="noopener noreferrer">https://www.gosuslugi.ru/627603/1/form</a></li>
<li>По приведенной инструкции генерируем файл запроса сертификата. Вкратце так (только вместо neonxp.ru указываем свой домен):
<pre tabindex="0"><code>openssl req -out neonxp.ru.csr -new -subj "/C=RU/CN=neonxp.ru" -addext "keyUsage = digitalSignature, keyEncipherment" -addext "subjectAltName=DNS: neonxp.ru" -addext "extendedKeyUsage = serverAuth" -newkey rsa:2048 -nodes -keyout neonxp.ru.key
</code></pre>Важно! Нужно сохранить файл ключа neonxp.ru.key в надежном месте. Если он попадет в чужие руки — нужно будет отзывать сертификат и начинать всё заново! SAN и Wildcard пока не поддерживается, но что имеем — то и имеем. Но по слухам таки будут, как минимум SAN.</li>
<li>Полученный файл csr загружаем там же на госуслуги</li>
<li>Ждём не долго (реально недолго, у меня прислали сертификат буквально через несколько минут!)</li>
<li>В ответ придёт файл с рандомным названием. Сохраняем его туда, где лежат другие файлы под названием “домен.crt”</li>
<li>Скачиваем корневой и промежуточные сертификаты:
<pre tabindex="0"><code>wget https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer
wget https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer
</code></pre></li>
<li>Преобразуем скачанный сертификат в формат PEM:
<pre tabindex="0"><code>openssl x509 -in neonxp.ru.crt -out neonxp.cer -outform PEM
</code></pre></li>
<li>Соединяем свой сертификат и минцифровские в один бандл:
<pre tabindex="0"><code>cat neonxp.cer russian_trusted_sub_ca_pem.cer russian_trusted_root_ca_pem.cer > chain.cer
</code></pre></li>
<li>Используем полученный бандл и сгенерированный в пункте 2 файл ключа в конфигурации вебсервера. У меня используется Caddy, поэтому мой конфиг выглядит так:
<pre tabindex="0"><code>neonxp.ru:443 {
tls /data/ssl/chain.cer /data/ssl/neonxp.ru.key
...
}
</code></pre></li>
</ol>
<p>В общем-то, всё. Как настанет время продлевать — я дополню заметку деталями именно продления. Если будут вопросы — пишите, попробуем решить.</p>]]></summary><content type="html"><![CDATA[<p>Третьего дня потратил достаточно много времени на установку на данном сайте сертификата от Минцифры.А поскольку сертификат краткоживущий (90 дней) — заметка мне самому пригодится на будущее.</p>
<p>Началось всё с того, что я с удивлением обнаружил, что на госуслугах теперь можно выпустить сертификат для домена физлицу.Это меня обрадовало, хотя ранее я приунывал что нет никакой альтернативы простым смертным. Теперь есть. <del>Закрывайте буржуйнет.</del></p>
<p>Поехали!</p>
<ol>
<li>Идём сюда: <a href="https://www.gosuslugi.ru/627603/1/form"target="_blank" rel="noopener noreferrer">https://www.gosuslugi.ru/627603/1/form</a></li>
<li>По приведенной инструкции генерируем файл запроса сертификата. Вкратце так (только вместо neonxp.ru указываем свой домен):
<pre tabindex="0"><code>openssl req -out neonxp.ru.csr -new -subj "/C=RU/CN=neonxp.ru" -addext "keyUsage = digitalSignature, keyEncipherment" -addext "subjectAltName=DNS: neonxp.ru" -addext "extendedKeyUsage = serverAuth" -newkey rsa:2048 -nodes -keyout neonxp.ru.key
</code></pre>Важно! Нужно сохранить файл ключа neonxp.ru.key в надежном месте. Если он попадет в чужие руки — нужно будет отзывать сертификат и начинать всё заново! SAN и Wildcard пока не поддерживается, но что имеем — то и имеем. Но по слухам таки будут, как минимум SAN.</li>
<li>Полученный файл csr загружаем там же на госуслуги</li>
<li>Ждём не долго (реально недолго, у меня прислали сертификат буквально через несколько минут!)</li>
<li>В ответ придёт файл с рандомным названием. Сохраняем его туда, где лежат другие файлы под названием “домен.crt”</li>
<li>Скачиваем корневой и промежуточные сертификаты:
<pre tabindex="0"><code>wget https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer
wget https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer
</code></pre></li>
<li>Преобразуем скачанный сертификат в формат PEM:
<pre tabindex="0"><code>openssl x509 -in neonxp.ru.crt -out neonxp.cer -outform PEM
</code></pre></li>
<li>Соединяем свой сертификат и минцифровские в один бандл:
<pre tabindex="0"><code>cat neonxp.cer russian_trusted_sub_ca_pem.cer russian_trusted_root_ca_pem.cer > chain.cer
</code></pre></li>
<li>Используем полученный бандл и сгенерированный в пункте 2 файл ключа в конфигурации вебсервера. У меня используется Caddy, поэтому мой конфиг выглядит так:
<pre tabindex="0"><code>neonxp.ru:443 {
tls /data/ssl/chain.cer /data/ssl/neonxp.ru.key
...
}
</code></pre></li>
</ol>
<p>В общем-то, всё. Как настанет время продлевать — я дополню заметку деталями именно продления. Если будут вопросы — пишите, попробуем решить.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="россия" label="Россия" scheme="https://neonxp.ru/tags/%D1%80%D0%BE%D1%81%D1%81%D0%B8%D1%8F/" />
    <category term="tls" label="TLS" scheme="https://neonxp.ru/tags/tls/" />
    <published>2024-02-21T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Переезд и проблемы обновления]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2023-12-29-%D0%BF%D0%B5%D1%80%D0%B5%D0%B5%D0%B7%D0%B4/" />
    <id>https://neonxp.ru/posts/2023-12-29-%D0%BF%D0%B5%D1%80%D0%B5%D0%B5%D0%B7%D0%B4/</id>
    <updated>2023-12-29T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Немного новостей.</p>
<p>Начну с грустного. Крайне неудачно обновил forgejo на gitrepo.ru. В общем, БД побилась без возможности восстановления. Репозитории я спас, обращайтесь —пришлю архив репозиториев.</p>
<p>Очень грустно, я был крайне расстроен. Штош, теперь настроил зато постоянные бекапы БД и данных на локальный NAS. Прошу прощения у пользователей, я очень виноват.</p>
<p>А теперь о негрустном. Всё же решил что мне больше нравится основным домен не .dev, а именно .ru. Времена неспокойные — лучше перестраховаться и сделать ставку именно на национальный домен, а не на международный. К тому же у .dev домена есть неприятная особенность, что он требует обязательно валидного (то есть одобренного западными “партнерами”) сертификата. А это не дело, как я уже <a href="https://neonxp.ru/posts/tls/"target="_blank" rel="noopener noreferrer">писал в заметке</a>.</p>]]></summary><content type="html"><![CDATA[<p>Немного новостей.</p>
<p>Начну с грустного. Крайне неудачно обновил forgejo на gitrepo.ru. В общем, БД побилась без возможности восстановления. Репозитории я спас, обращайтесь —пришлю архив репозиториев.</p>
<p>Очень грустно, я был крайне расстроен. Штош, теперь настроил зато постоянные бекапы БД и данных на локальный NAS. Прошу прощения у пользователей, я очень виноват.</p>
<p>А теперь о негрустном. Всё же решил что мне больше нравится основным домен не .dev, а именно .ru. Времена неспокойные — лучше перестраховаться и сделать ставку именно на национальный домен, а не на международный. К тому же у .dev домена есть неприятная особенность, что он требует обязательно валидного (то есть одобренного западными “партнерами”) сертификата. А это не дело, как я уже <a href="https://neonxp.ru/posts/tls/"target="_blank" rel="noopener noreferrer">писал в заметке</a>.</p>
<p>Пока что как-то так 🤷🏻‍♂️</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2023-12-29T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Немного мыслей о TLS (HTTPS) в России]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2023-07-24-tls/" />
    <id>https://neonxp.ru/posts/2023-07-24-tls/</id>
    <updated>2023-07-24T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Накопилось немного мыслей относительно того, что может грозить нам (и мне) в связи с трендом на “балканизацию” рунета.</p>
<p>И самое болезненное место — HTTPS который нынче стандарт де-факто в современных интернетах. А болезненное оно потому, что целиком и полностью контролируется другой стороной нынешного противостояния. Все доверенные удостоверяющие центры принадлежат странам “коллективного запада”. Помню, были ещё какие-то китайские, вроде, но с ними был какой-то скандал и не факт что они есть.</p>]]></summary><content type="html"><![CDATA[<p>Накопилось немного мыслей относительно того, что может грозить нам (и мне) в связи с трендом на “балканизацию” рунета.</p>
<p>И самое болезненное место — HTTPS который нынче стандарт де-факто в современных интернетах. А болезненное оно потому, что целиком и полностью контролируется другой стороной нынешного противостояния. Все доверенные удостоверяющие центры принадлежат странам “коллективного запада”. Помню, были ещё какие-то китайские, вроде, но с ними был какой-то скандал и не факт что они есть.</p>
<p>Есть относительно <a href="https://www.gosuslugi.ru/tls"target="_blank" rel="noopener noreferrer">доверенный УЦ от Минцифры</a>. Это здорово и я это всецело поддерживаю. Вот только есть момент. Он не для нас, простых людей, и при попытке его получить видим то, что на скриншоте ниже. А сранный Firefox вообще хочет его внести в черный список, чтобы даже специально его нельзя было установить. В общем, пока его я поставить не могу даже при всём желании.</p>
<p>Какие ещё альтернативы есть, если нас вдруг прокинет Let’s encrypt?</p>
<ol>
<li>Не использовать HTTPS вообще. Я же не магазин и у меня нет форм логина,<br>
которые требуют шифрования. Так-то оно так, да не так. Браузеры уже сейчас<br>
очень косо смотрят на “обычные”, не HTTPS сайты, а в дальнейшем, не удивлюсь<br>
если перестанут открывать вообще. Так же на HTTP сайтах не работают<br>
прикольные браузерные API типа геолокации (наверное, это в каком-то роде даже<br>
плюс 😉 ). Ну и ещё проблема, что, например, этот сайт без HTTPS вообще не<br>
может работать, ибо для доменов зоны .dev насильно включено HSTS и они не<br>
могут работать не по HTTPS. Последнее то я решу старым добрым доменом<br>
neonxp.ru, но тем не менее.</li>
<li>Самоподписанные сертификаты. Вот это уже более менее похоже на правду! Да,<br>
такие сайты надо добавлять в исключения и мороки с сертификатами чуть больше.<br>
Но тут та же история с доменами .dev. Для них самоподписаные не катят. Выход<br>
— опять таки старый добрый neonxp.ru.</li>
</ol>
<p>К чему я всё это? А то что в случае “балканизации” мы остаемся без нормального валидного HTTPS. Для себя я выбрал второй путь, с самоподписанными сертификатами. Чекнуть как работает можно на зеркале блога на <a href="https://neonxp.ru"target="_blank" rel="noopener noreferrer">https://neonxp.ru</a> . Там я выпустил сам себе сертификат на домен от своего собственного удостоверяющего центра 🙂 А доверять ему или не доверять — дело посетителей сайта.</p>
<p>Ну и совсем краткая инструкция как выпустить сертификат для себя:</p>
<ol>
<li><code>openssl genrsa -out root_ca.key 4096</code> — создание секретного ключа УЦ (должен<br>
храниться в безопасности!)</li>
<li><code>openssl req -x509 -new -key root_ca.key -days 3650 -out root_ca.crt</code> —<br>
создаем сам сертификат УЦ (он НЕ секретный). Я указал срок действия 10 лет,<br>
но это потому что я ленивый и не хочу его перегенеривать каждый год. Так<br>
делать не советую.</li>
<li><code>openssl genrsa -out server.key 4096</code> — создаем секретный ключ уже для<br>
конкретного сайта (и поддоменов)</li>
<li><code>openssl req -new -key server.key -subj "/CN=neonxp.ru/CN=*.neonxp.ru" -out server.csr</code> — генерируем файл запроса для конкретного сайта</li>
<li>Создаем файл <code>openssl.cnf</code> с примерно таким содержимым:
<pre tabindex="0"><code>[SAN]
subjectAltName = @alt_names
[alt_names]
DNS.1 = neonxp.ru
DNS.2 = *.neonxp.ru
</code></pre></li>
<li>И, наконец, создаем сертификат для сайта, который будет подписан ключами<br>
server.key и root_ca.key (то есть и своим удостоверяющим центром тоже):
<pre tabindex="0"><code>openssl x509 -req -in server.csr -CA root_ca.crt -CAkey root_ca.key -CAcreateserial -out server.crt -days 365 -extensions SAN -extfile openssl.cnf
</code></pre></li>
</ol>
<p>В общем, всё. Полученные root_ca.crt (но не root_ca.key!), server.key и server.crt можно вносить в конфигурацию используемого вебсервера. А так же внести root_ca.crt в доверенные для себя.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="tls" label="TLS" scheme="https://neonxp.ru/tags/tls/" />
    <published>2023-07-24T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[GitRepo.ru]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2023-01-12-gitrepo/" />
    <id>https://neonxp.ru/posts/2023-01-12-gitrepo/</id>
    <updated>2023-01-12T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Сегодня серьезно переделал свой хостинг <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">репозиториев кода</a>:</p>
<ul>
<li>Переехал на большой арендованный сервак</li>
<li>Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose</li>
<li>Gitea заменил на её форк <a href="https://forgejo.org/"target="_blank" rel="noopener noreferrer">Forgejo</a></li>
<li>Впилил CI/CD на основе <a href="https://woodpecker-ci.org/"target="_blank" rel="noopener noreferrer">Woodpecker CI</a></li>
</ul>
<p>Приглашаю пользоваться заместо бездуховного западного github: <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/</a></p>
<p>Сервер физически находится в датацентре в Москве у весьма годного провайдера Selectel.</p>
<p>Тем более, время сейчас неспокойное и неизвестно когда github станет недоступен для РФ, а GitRepo — он вот тут, в нашей стране.</p>]]></summary><content type="html"><![CDATA[<p>Сегодня серьезно переделал свой хостинг <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">репозиториев кода</a>:</p>
<ul>
<li>Переехал на большой арендованный сервак</li>
<li>Привел в порядок оркестрацию вокруг сервака с использованием Docker Compose</li>
<li>Gitea заменил на её форк <a href="https://forgejo.org/"target="_blank" rel="noopener noreferrer">Forgejo</a></li>
<li>Впилил CI/CD на основе <a href="https://woodpecker-ci.org/"target="_blank" rel="noopener noreferrer">Woodpecker CI</a></li>
</ul>
<p>Приглашаю пользоваться заместо бездуховного западного github: <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/</a></p>
<p>Сервер физически находится в датацентре в Москве у весьма годного провайдера Selectel.</p>
<p>Тем более, время сейчас неспокойное и неизвестно когда github станет недоступен для РФ, а GitRepo — он вот тут, в нашей стране.</p>
<h1 id="немного-про-устройство">Немного про устройство</h1>
<p>Расскажу немного как я организовал себе Ops сервиса.</p>
<p>У меня на руках <code>docker-compose.yml</code> который полностью описывает всю конфигурацию сервака, примерно так:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">"3"</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">services</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">caddy</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">image</span>: <span style="color:#ae81ff">caddy:2.6.2-alpine</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">container_name</span>: <span style="color:#ae81ff">gateway</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">restart</span>: <span style="color:#ae81ff">unless-stopped</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#e6db74">"80:80"</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#e6db74">"443:443"</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#e6db74">"443:443/udp"</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">./Caddyfile:/etc/caddy/Caddyfile</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">caddy_data:/data</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">caddy_config:/config</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gateway</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">git</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">image</span>: <span style="color:#ae81ff">codeberg.org/forgejo/forgejo:1.18.0-1</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">container_name</span>: <span style="color:#ae81ff">git</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">USER_UID=1000</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">USER_GID=1000</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">TZ=Europe/Moscow</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">USER=git</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">GITEA__database__DB_TYPE=postgres</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">GITEA__database__HOST=db:5432</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">GITEA__database__NAME=${PG_NAME}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">GITEA__database__USER=${PG_USER}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">GITEA__database__PASSWD=${PG_PASS}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">restart</span>: <span style="color:#ae81ff">always</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gitea</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gateway</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">/home/git/.ssh/:/data/git/.ssh</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">forgejo:/data</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">/etc/timezone:/etc/timezone:ro</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">/etc/localtime:/etc/localtime:ro</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">ports</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#e6db74">"127.0.0.1:2222:22"</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">db</span>:
</span></span><span style="display:flex;"><span>                <span style="color:#f92672">condition</span>: <span style="color:#ae81ff">service_healthy</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">db</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">image</span>: <span style="color:#ae81ff">postgres:13</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">restart</span>: <span style="color:#ae81ff">always</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">POSTGRES_USER=${PG_USER}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">POSTGRES_PASSWORD=${PG_PASS}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">POSTGRES_DB=${PG_NAME}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">healthcheck</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">test</span>: <span style="color:#ae81ff">/usr/bin/pg_isready</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">interval</span>: <span style="color:#ae81ff">5s</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">timeout</span>: <span style="color:#ae81ff">10s</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">retries</span>: <span style="color:#ae81ff">120</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gitea</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">postgres:/var/lib/postgresql/data</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">woodpecker-server</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">image</span>: <span style="color:#ae81ff">woodpeckerci/woodpecker-server:latest</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">woodpecker-server-data:/var/lib/woodpecker/</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_OPEN=true</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_GITEA=true</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_GITEA_URL=https://gitrepo.ru</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_GITEA_CLIENT=${GITEA_CLIENT}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_GITEA_SECRET=${GITEA_SECRET}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_HOST=https://ci.gitrepo.ru</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_ADMIN=neonxp</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gitea</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gateway</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">git</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">woodpecker-agent</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">image</span>: <span style="color:#ae81ff">woodpeckerci/woodpecker-agent:latest</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">command</span>: <span style="color:#ae81ff">agent</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">restart</span>: <span style="color:#ae81ff">always</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">depends_on</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">woodpecker-server</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">/var/run/docker.sock:/var/run/docker.sock</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">environment</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_SERVER=woodpecker-server:9000</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">gitea</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">woodpecker-server-data</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">caddy_data</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">caddy_config</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">forgejo</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">postgres</span>:
</span></span><span style="display:flex;"><span><span style="color:#f92672">networks</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">gateway</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">gitea</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">external</span>: <span style="color:#66d9ef">false</span>
</span></span></code></pre></div><p>а рядом лежит <code>.env</code> файлик с значениями переменных <code>${...}</code>.</p>
<p>Запускаю деплой я с локального компьютера, предварительно добавив удаленный сервер в <a href="https://docs.docker.com/engine/context/working-with-contexts/"target="_blank" rel="noopener noreferrer">контекст докера</a>:</p>
<pre tabindex="0"><code># Создаю новый контекст для удаленного сервера
docker context create gitrepo --docker "host=ssh:/gitrepo.ru"
# Все последующие docker команды выполняются на удаленном сервере
docker use gitrepo
# Возвращаюсь в локальный контекст
docker use default
</code></pre><h1 id="оставшиеся-проблемы">Оставшиеся проблемы</h1>
<p>Сейчас так получается, что Caddyfile должен лежать на удаленном сервере, т.к. часть конфига</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yml" data-lang="yml"><span style="display:flex;"><span><span style="color:#f92672">volumes</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">./Caddyfile:/etc/caddy/Caddyfile</span>
</span></span></code></pre></div><p>выполняется в контексте именно удаленного сервера, а значит при его апдейте на локальном серваке приходится делать SCP этого файла на сервак. Такое себе.</p>
<p>Как это решить — есть интересная идея, но это уже в другой раз.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2023-01-12T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Golang подборка 1]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2022-05-31-golang-1/" />
    <id>https://neonxp.ru/posts/2022-05-31-golang-1/</id>
    <updated>2022-05-31T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Просто собираю подборку интересных ссылок по гошке на почитать потом.</p>
<ul>
<li><a href="https://github.com/neonxp/extra"target="_blank" rel="noopener noreferrer">Extra</a> — Моё. Пакет с разными полезными<br>
функциями без дополнительных зависимостей.</li>
<li>Серия видосов про создание игры в стиле Animal Crossing на golang с помощью<br>
raylib —<br>
<a href="https://www.youtube.com/watch?v=iWp-mCIQgMU"target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=iWp-mCIQgMU</a>&list=PLVotA8ycjnCsy30WQCwVU5RrZkt4lLgY5&index=1</li>
<li>Самописный распределенный типа Postgres<br>
<a href="https://notes.eatonphil.com/distributed-postgres.html"target="_blank" rel="noopener noreferrer">https://notes.eatonphil.com/distributed-postgres.html</a>. Под капотом raft от<br>
hashicorp, boltdb и самое интересное — парсинг SQL</li>
<li>Рассчет расстояния между двумя Geo точками:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#f92672">import</span> <span style="color:#e6db74">"math"</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">...</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// https://en.wikipedia.org/wiki/Haversine_formula</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">GetDistance</span>(<span style="color:#a6e22e">lat1</span>, <span style="color:#a6e22e">lon1</span>, <span style="color:#a6e22e">lat2</span>, <span style="color:#a6e22e">lon2</span> <span style="color:#66d9ef">float64</span>) <span style="color:#66d9ef">float64</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lat1</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lon1</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lat2</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lon2</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">12742</span> <span style="color:#f92672">*</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Asin</span>(
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sqrt</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pow</span>(<span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sin</span>((<span style="color:#a6e22e">lat2</span><span style="color:#f92672">-</span><span style="color:#a6e22e">lat1</span>)<span style="color:#f92672">/</span><span style="color:#ae81ff">2</span>), <span style="color:#ae81ff">2</span>) <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Cos</span>(<span style="color:#a6e22e">lat1</span>) <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Cos</span>(<span style="color:#a6e22e">lat2</span>) <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pow</span>(<span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sin</span>((<span style="color:#a6e22e">lon2</span><span style="color:#f92672">-</span><span style="color:#a6e22e">lon1</span>)<span style="color:#f92672">/</span><span style="color:#ae81ff">2</span>), <span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>      )
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li><a href="https://github.com/pioz/god"target="_blank" rel="noopener noreferrer">god</a> — Утилита подгатавливающая демоны из go<br>
программы. Для меня ценное — что генерит systemd конфиги.</li>
</ul>]]></summary><content type="html"><![CDATA[<p>Просто собираю подборку интересных ссылок по гошке на почитать потом.</p>
<ul>
<li><a href="https://github.com/neonxp/extra"target="_blank" rel="noopener noreferrer">Extra</a> — Моё. Пакет с разными полезными<br>
функциями без дополнительных зависимостей.</li>
<li>Серия видосов про создание игры в стиле Animal Crossing на golang с помощью<br>
raylib —<br>
<a href="https://www.youtube.com/watch?v=iWp-mCIQgMU"target="_blank" rel="noopener noreferrer">https://www.youtube.com/watch?v=iWp-mCIQgMU</a>&list=PLVotA8ycjnCsy30WQCwVU5RrZkt4lLgY5&index=1</li>
<li>Самописный распределенный типа Postgres<br>
<a href="https://notes.eatonphil.com/distributed-postgres.html"target="_blank" rel="noopener noreferrer">https://notes.eatonphil.com/distributed-postgres.html</a>. Под капотом raft от<br>
hashicorp, boltdb и самое интересное — парсинг SQL</li>
<li>Рассчет расстояния между двумя Geo точками:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#f92672">import</span> <span style="color:#e6db74">"math"</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">...</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// https://en.wikipedia.org/wiki/Haversine_formula</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">GetDistance</span>(<span style="color:#a6e22e">lat1</span>, <span style="color:#a6e22e">lon1</span>, <span style="color:#a6e22e">lat2</span>, <span style="color:#a6e22e">lon2</span> <span style="color:#66d9ef">float64</span>) <span style="color:#66d9ef">float64</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lat1</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lon1</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lat2</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">lon2</span> <span style="color:#f92672">*=</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pi</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">180</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">12742</span> <span style="color:#f92672">*</span> <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Asin</span>(
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sqrt</span>(
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pow</span>(<span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sin</span>((<span style="color:#a6e22e">lat2</span><span style="color:#f92672">-</span><span style="color:#a6e22e">lat1</span>)<span style="color:#f92672">/</span><span style="color:#ae81ff">2</span>), <span style="color:#ae81ff">2</span>) <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Cos</span>(<span style="color:#a6e22e">lat1</span>) <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Cos</span>(<span style="color:#a6e22e">lat2</span>) <span style="color:#f92672">*</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Pow</span>(<span style="color:#a6e22e">math</span>.<span style="color:#a6e22e">Sin</span>((<span style="color:#a6e22e">lon2</span><span style="color:#f92672">-</span><span style="color:#a6e22e">lon1</span>)<span style="color:#f92672">/</span><span style="color:#ae81ff">2</span>), <span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>      )
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li><a href="https://github.com/pioz/god"target="_blank" rel="noopener noreferrer">god</a> — Утилита подгатавливающая демоны из go<br>
программы. Для меня ценное — что генерит systemd конфиги.</li>
</ul>
]]></content>
    <author>
      <name></name>
      
      
    </author><published>2022-05-31T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Возрождение?]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2022-05-30-%D0%B2%D0%BE%D0%B7%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/" />
    <id>https://neonxp.ru/posts/2022-05-30-%D0%B2%D0%BE%D0%B7%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/</id>
    <updated>2022-05-30T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Определенно, вести блог это не мое. Учитывая, что последний пост был год назад — sad but true.</p>
<p>Не буду говорить, что “вот сейчас то уж точно буду вести регулярно”. Нет не буду.</p>
<p>Но раз в полгода-год, наверное все же буду.</p>
<p>Из новостей, что не писал в канал, наверное, только парочка:</p>
<ol>
<li>сейчас всё свободное время пилю свой петпроджект 😉 Пока что выходит ух какая<br>
красота. Но об этом как-нибудь в другой раз, как говорится, пол работы не<br>
показывают 🙂</li>
<li>в ленивом режиме начали заниматься вопросами улучшения жилищных условий.<br>
Давно пора.</li>
</ol>
<p>До встречи когда-нибудь потом 🙂</p>]]></summary><content type="html"><![CDATA[<p>Определенно, вести блог это не мое. Учитывая, что последний пост был год назад — sad but true.</p>
<p>Не буду говорить, что “вот сейчас то уж точно буду вести регулярно”. Нет не буду.</p>
<p>Но раз в полгода-год, наверное все же буду.</p>
<p>Из новостей, что не писал в канал, наверное, только парочка:</p>
<ol>
<li>сейчас всё свободное время пилю свой петпроджект 😉 Пока что выходит ух какая<br>
красота. Но об этом как-нибудь в другой раз, как говорится, пол работы не<br>
показывают 🙂</li>
<li>в ленивом режиме начали заниматься вопросами улучшения жилищных условий.<br>
Давно пора.</li>
</ol>
<p>До встречи когда-нибудь потом 🙂</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="моё" label="Моё" scheme="https://neonxp.ru/tags/%D0%BC%D0%BE%D1%91/" />
    <published>2022-05-30T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Немного о цифровой гигиене]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2021-05-13-%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B3%D0%B8%D0%B3%D0%B8%D0%B5%D0%BD%D0%B0/" />
    <id>https://neonxp.ru/posts/2021-05-13-%D1%86%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B3%D0%B8%D0%B3%D0%B8%D0%B5%D0%BD%D0%B0/</id>
    <updated>2021-05-13T00:00:00Z</updated>
    <summary type="html"><![CDATA[<h2 id="вступление">Вступление</h2>
<p>Как раз вступление тут особо и не нужно. Ни для кого не открою америки, что в современном цифровом обществе все мы являемся товаром для интернет-медиа гигантов, того же фейсбука да гугла. Не скажу что это для меня, как личности опасно или вредно, но мне это неприятно. Решил с этим что-то делать.</p>
<h2 id="вводные">Вводные</h2>
<ul>
<li>В интернетах я уже очень давно и много где и как “наследил” своими данными. И<br>
с этим уже ничего не поделать.</li>
<li>У меня в телефоне и на всех компьютерах куча приложений работающих с<br>
интернетом, и не только мессенджеры.</li>
<li>У меня достаточно узкий круг людей с кем бы я хотел быть на связи, и не хочу<br>
чтобы мои действия как-то ухудшили или усложнили их жизнь.</li>
<li>Вопрос анонимности для меня не стоит, я не анонимен и это моё осознанное<br>
решение. Я законопослушный человек и прятаться мне не от кого. И да, я знаю<br>
что этот тезис стараниями либерах нынче пытаются выставить как глупость, но<br>
нет. Глупость — это слушать либерах, а не иметь свою голову на плечах. И<br>
контртезис “Гы гы гы, ну раз тебе нечего скрывать — поставь камеру у себя в<br>
спальне и ванной” даже комментировать не буду в силу его ущербности.</li>
<li>Я пользователь техники Apple и с этим уже ничего не поделать, менять целиком<br>
экосистему для меня не вариант (это очень дорого, бессмысленно, а местами и<br>
невозможно, например, рабочий мак мне поменять не на что). И да, есть наивная<br>
надежда что у яблок в плане приватности всё получше чем у ведроидов. Во всяком<br>
случае по сравнению со стоком. Гиковские прошивки с вырезанными зондами в<br>
расчет не беру, верю что у них совсем всё хорошо.</li>
</ul>
<h2 id="цели">Цели</h2>
<ol>
<li>Уменьшить информационный шум вокруг себя и тем самым улучшить качество жизни.</li>
<li>Уменьшить свой “информационный след”</li>
<li>Иметь больше контроля над своими данными, чтобы мои волосы стали мягкими и<br>
шелковистыми.</li>
</ol>
<h2 id="наброски-плана">Наброски плана</h2>
<ol>
<li>Перейти максимально на собственные ресурсы, которые я контролирую и которые<br>
<em>точно</em> не сливают ничего налево.Примерно так: социалки =><br>
<a href="https://soc.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://soc.neonxp.ru/</a> , GitHub => <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/</a> , Облачные<br>
диски => локальный NAS Synology и т.д.</li>
<li>Мне надо сократить мессенджеры в идеале до одного, не считая корпоративного<br>
рабочего. Тут всё просто — оставляю Telegram, остальные сношу.</li>
<li>Мне надо отказаться от неэтичных социальных сетей, где я не могу полностью<br>
контролировать свои данные.</li>
<li>При отказе от социальных сетей чтобы не доставить проблем моим контактам надо<br>
оставить “новый адрес” по которому со мной можно связаться и, например, этот<br>
пост. Я не хочу чтобы для всех мои действия были прозрачны и понятны, а не<br>
“молча удалиться” оставив кого-то в недоумении.</li>
<li>Везде где возможно отключить или заблокировать телеметрию, чтобы как можно<br>
меньше моих данных неконтролируемо утекало. Да, полностью не перекрыть, но<br>
сократить возможно.</li>
<li>Для связи с “миром” оставить только e-mail как наиболее удобный асинхронный<br>
метод коммуникации.</li>
</ol>
<h2 id="дальнейшие-шаги">Дальнейшие шаги</h2>
<ol>
<li>Превратить наброски плана в цельный план. Написать манифест? Возможно.</li>
<li>Подготовить “визитку” с актуальными контактами и объяснением что произошло.<br>
Причем как в виде изображения, так и текста.</li>
<li>Вышеуказанную визитку поместить на уже неактуальных для меня местах обитания<br>
(инстаграм, вк и проч). Удаляться не хочу. Жалко контент за столько лет, да и<br>
пункт 3 предыдущего абзаца.</li>
<li>Удалить “лишние” приложения от вышеуказанных сервисов.</li>
<li>Разлогиниться в этих сервисах и очистить браузеры от них, чтобы исключить<br>
треккинг на сторонних сайтах.</li>
<li>?????</li>
<li>PROFIT!</li>
</ol>
<h2 id="обратная-связь">Обратная связь</h2>
<p>Очень бы хотелось получить обратную связь по моему плану. Комментарии про то что упустил и предложения улучшений приветствуются в комментариях к посту, в комментариях к <a href="https://t.me/neonxp"target="_blank" rel="noopener noreferrer">телеграм каналу</a>, или на почту <a href="mailto:a.kiryukhin@mail.ru">a.kiryukhin@mail.ru</a> (кстати, стоит наверное и почту перевести к себе? Но пока уровень сервиса врядли смогу адекватный обеспечить)</p>]]></summary><content type="html"><![CDATA[<h2 id="вступление">Вступление</h2>
<p>Как раз вступление тут особо и не нужно. Ни для кого не открою америки, что в современном цифровом обществе все мы являемся товаром для интернет-медиа гигантов, того же фейсбука да гугла. Не скажу что это для меня, как личности опасно или вредно, но мне это неприятно. Решил с этим что-то делать.</p>
<h2 id="вводные">Вводные</h2>
<ul>
<li>В интернетах я уже очень давно и много где и как “наследил” своими данными. И<br>
с этим уже ничего не поделать.</li>
<li>У меня в телефоне и на всех компьютерах куча приложений работающих с<br>
интернетом, и не только мессенджеры.</li>
<li>У меня достаточно узкий круг людей с кем бы я хотел быть на связи, и не хочу<br>
чтобы мои действия как-то ухудшили или усложнили их жизнь.</li>
<li>Вопрос анонимности для меня не стоит, я не анонимен и это моё осознанное<br>
решение. Я законопослушный человек и прятаться мне не от кого. И да, я знаю<br>
что этот тезис стараниями либерах нынче пытаются выставить как глупость, но<br>
нет. Глупость — это слушать либерах, а не иметь свою голову на плечах. И<br>
контртезис “Гы гы гы, ну раз тебе нечего скрывать — поставь камеру у себя в<br>
спальне и ванной” даже комментировать не буду в силу его ущербности.</li>
<li>Я пользователь техники Apple и с этим уже ничего не поделать, менять целиком<br>
экосистему для меня не вариант (это очень дорого, бессмысленно, а местами и<br>
невозможно, например, рабочий мак мне поменять не на что). И да, есть наивная<br>
надежда что у яблок в плане приватности всё получше чем у ведроидов. Во всяком<br>
случае по сравнению со стоком. Гиковские прошивки с вырезанными зондами в<br>
расчет не беру, верю что у них совсем всё хорошо.</li>
</ul>
<h2 id="цели">Цели</h2>
<ol>
<li>Уменьшить информационный шум вокруг себя и тем самым улучшить качество жизни.</li>
<li>Уменьшить свой “информационный след”</li>
<li>Иметь больше контроля над своими данными, чтобы мои волосы стали мягкими и<br>
шелковистыми.</li>
</ol>
<h2 id="наброски-плана">Наброски плана</h2>
<ol>
<li>Перейти максимально на собственные ресурсы, которые я контролирую и которые<br>
<em>точно</em> не сливают ничего налево.Примерно так: социалки =><br>
<a href="https://soc.neonxp.ru/"target="_blank" rel="noopener noreferrer">https://soc.neonxp.ru/</a> , GitHub => <a href="https://gitrepo.ru/"target="_blank" rel="noopener noreferrer">https://gitrepo.ru/</a> , Облачные<br>
диски => локальный NAS Synology и т.д.</li>
<li>Мне надо сократить мессенджеры в идеале до одного, не считая корпоративного<br>
рабочего. Тут всё просто — оставляю Telegram, остальные сношу.</li>
<li>Мне надо отказаться от неэтичных социальных сетей, где я не могу полностью<br>
контролировать свои данные.</li>
<li>При отказе от социальных сетей чтобы не доставить проблем моим контактам надо<br>
оставить “новый адрес” по которому со мной можно связаться и, например, этот<br>
пост. Я не хочу чтобы для всех мои действия были прозрачны и понятны, а не<br>
“молча удалиться” оставив кого-то в недоумении.</li>
<li>Везде где возможно отключить или заблокировать телеметрию, чтобы как можно<br>
меньше моих данных неконтролируемо утекало. Да, полностью не перекрыть, но<br>
сократить возможно.</li>
<li>Для связи с “миром” оставить только e-mail как наиболее удобный асинхронный<br>
метод коммуникации.</li>
</ol>
<h2 id="дальнейшие-шаги">Дальнейшие шаги</h2>
<ol>
<li>Превратить наброски плана в цельный план. Написать манифест? Возможно.</li>
<li>Подготовить “визитку” с актуальными контактами и объяснением что произошло.<br>
Причем как в виде изображения, так и текста.</li>
<li>Вышеуказанную визитку поместить на уже неактуальных для меня местах обитания<br>
(инстаграм, вк и проч). Удаляться не хочу. Жалко контент за столько лет, да и<br>
пункт 3 предыдущего абзаца.</li>
<li>Удалить “лишние” приложения от вышеуказанных сервисов.</li>
<li>Разлогиниться в этих сервисах и очистить браузеры от них, чтобы исключить<br>
треккинг на сторонних сайтах.</li>
<li>?????</li>
<li>PROFIT!</li>
</ol>
<h2 id="обратная-связь">Обратная связь</h2>
<p>Очень бы хотелось получить обратную связь по моему плану. Комментарии про то что упустил и предложения улучшений приветствуются в комментариях к посту, в комментариях к <a href="https://t.me/neonxp"target="_blank" rel="noopener noreferrer">телеграм каналу</a>, или на почту <a href="mailto:a.kiryukhin@mail.ru">a.kiryukhin@mail.ru</a> (кстати, стоит наверное и почту перевести к себе? Но пока уровень сервиса врядли смогу адекватный обеспечить)</p>
<p><em>UPD:</em> Да, я знаю что уже данные так и останутся в чужих руках, но со временем они будут всё больше и больше протухать, а мой “цифровой профиль” терять актуальность. Ведь я не скала, я тоже меняюсь и ухожу от этого профиля.</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="паранойя" label="Паранойя" scheme="https://neonxp.ru/tags/%D0%BF%D0%B0%D1%80%D0%B0%D0%BD%D0%BE%D0%B9%D1%8F/" />
    <category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <published>2021-05-13T00:00:00Z</published></entry>
  <entry>
    <title><![CDATA[Jsonnet]]></title>
      <link rel="alternate" type="text/html" hreflang="ru-ru" href="https://neonxp.ru/posts/2021-02-13-jsonnet/" />
    <id>https://neonxp.ru/posts/2021-02-13-jsonnet/</id>
    <updated>2021-02-13T00:00:00Z</updated>
    <summary type="html"><![CDATA[<p>Редко такое бывает, что случайно натыкаешься на какую-то технологию и она вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня такой технологией стал <a href="https://jsonnet.org/"target="_blank" rel="noopener noreferrer">Jsonnet</a> от Google.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2021-02-13-jsonnet/jsonnet_logo.webp"
        alt="jsonnet_logo.webp"/><br>
Jsonnet</p>
<p>В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык, результатом выполнения которого будет сформированый JSON (и не только) документ(или несколько документов[^1]). [^1]:https://jsonnet.org/learning/getting_started.html#multi</p>
<p>Если интересно, рекомендую сразу переходить к туториалу — <a href="https://jsonnet.org/learning/tutorial.html"target="_blank" rel="noopener noreferrer">https://jsonnet.org/learning/tutorial.html</a>.</p>]]></summary><content type="html"><![CDATA[<p>Редко такое бывает, что случайно натыкаешься на какую-то технологию и она вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня такой технологией стал <a href="https://jsonnet.org/"target="_blank" rel="noopener noreferrer">Jsonnet</a> от Google.</p>
<p><img loading="lazy"  src="/files/blog/posts/files/2021-02-13-jsonnet/jsonnet_logo.webp"
        alt="jsonnet_logo.webp"/><br>
Jsonnet</p>
<p>В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык, результатом выполнения которого будет сформированый JSON (и не только) документ(или несколько документов[^1]). [^1]:https://jsonnet.org/learning/getting_started.html#multi</p>
<p>Если интересно, рекомендую сразу переходить к туториалу — <a href="https://jsonnet.org/learning/tutorial.html"target="_blank" rel="noopener noreferrer">https://jsonnet.org/learning/tutorial.html</a>.</p>
<h2 id="почему-же-это-круто">Почему же это круто?</h2>
<p>Ну, во-первых, он реально мощный и простой. С его помощью можно формировать документы любой сложности.</p>
<p>Во-вторых, его можно встроить в свою программу на Go (и не только, но на Go — проще всего — <a href="https://jsonnet.org/ref/bindings.html%29"target="_blank" rel="noopener noreferrer">https://jsonnet.org/ref/bindings.html)</a>, и это даст бесплатно мощный DSL для написания очень гибких конфигов.</p>
<p>В третьих, ну камон, приятно же когда компьютер берет на себя рутинную работу по формированию больших и сложных JSON’ов!</p>
<h2 id="пример">Пример</h2>
<p>Накидал простенький пример который формирует конфигурацию пайплайна для гипотетической CI системы:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-jsonnet" data-lang="jsonnet"><span style="display:flex;"><span><span style="color:#66d9ef">local</span> <span style="color:#a6e22e">map</span>(arr, predicate) <span style="color:#f92672">=</span> <span style="color:#f92672">/</span> определяем функцию map
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> std.length(arr) <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span> <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    []
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>    [
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">predicate</span>(arr[<span style="color:#ae81ff">0</span>])
</span></span><span style="display:flex;"><span>    ] <span style="color:#f92672">+</span> <span style="color:#a6e22e">map</span>(arr[<span style="color:#ae81ff">1</span><span style="color:#960050;background-color:#1e0010">:</span>], predicate); <span style="color:#f92672">/</span> функциональненько<span style="color:#f92672">!</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">local</span> tasks <span style="color:#f92672">=</span> [[<span style="color:#e6db74">'go1.14'</span>, <span style="color:#e6db74">'1.14-alpine'</span>],[<span style="color:#e6db74">'go1.15'</span>, <span style="color:#e6db74">'1.15-alpine'</span>],[<span style="color:#e6db74">'go1.16-RC'</span>, <span style="color:#e6db74">'1.16-rc-alpine'</span>]];
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">local</span> commands <span style="color:#f92672">=</span> [<span style="color:#e6db74">'go build'</span>, <span style="color:#e6db74">'go test'</span>]; <span style="color:#f92672">/</span> Общая часть
</span></span><span style="display:flex;"><span>{ <span style="color:#960050;background-color:#1e0010">/</span> Результирующий <span style="color:#960050;background-color:#1e0010">JSON</span>
</span></span><span style="display:flex;"><span>  <span style="color:#960050;background-color:#1e0010">pipeline</span>: <span style="color:#a6e22e">map</span>(tasks, function (task) { <span style="color:#960050;background-color:#1e0010">/</span> Вызов <span style="color:#960050;background-color:#1e0010">map</span> <span style="color:#960050;background-color:#1e0010">от</span> <span style="color:#960050;background-color:#1e0010">tasks</span>
</span></span><span style="display:flex;"><span>    <span style="color:#960050;background-color:#1e0010">name</span>: task[<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    image: <span style="color:#e6db74">"golang:"</span><span style="color:#f92672">+</span>task[<span style="color:#ae81ff">1</span>],
</span></span><span style="display:flex;"><span>    commands: commands,
</span></span><span style="display:flex;"><span>  })
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Результат:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">"pipeline"</span>: [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"commands"</span>: [<span style="color:#e6db74">"go build"</span>, <span style="color:#e6db74">"go test"</span>],
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"image"</span>: <span style="color:#e6db74">"golang:1.14-alpine"</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"name"</span>: <span style="color:#e6db74">"go1.14"</span>
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"commands"</span>: [<span style="color:#e6db74">"go build"</span>, <span style="color:#e6db74">"go test"</span>],
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"image"</span>: <span style="color:#e6db74">"golang:1.15-alpine"</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"name"</span>: <span style="color:#e6db74">"go1.15"</span>
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"commands"</span>: [<span style="color:#e6db74">"go build"</span>, <span style="color:#e6db74">"go test"</span>],
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"image"</span>: <span style="color:#e6db74">"golang:1.16-rc-alpine"</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">"name"</span>: <span style="color:#e6db74">"go1.16-RC"</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>Круть же!</p>
<p>Да, на небольшом примере не очень показательно, но даже тут, скажем, при добавлении новой цели сборки будет достаточно слегка подправить массив tasks и автоматически сформируется все остальное, а не копипаст целой секции и ручная правка в нужных местах.</p>
<p>Я оставил за скобками то, что этот шаблонизатора позволяет формировать не только JSON но и фактически любой другой текстовый формат. И даже из одного скрипта формировать несколько документов разного формата. При этом локальные переменные будут использоваться общие. Теоретически, если упороться, можно одним скриптом сформировать весь /etc на новом сервере. Почему бы и нет?:)</p>
<p>Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив!</p>
]]></content>
    <author>
      <name></name>
      
      
    </author><category term="go" label="Go" scheme="https://neonxp.ru/tags/go/" />
    <category term="разное" label="Разное" scheme="https://neonxp.ru/tags/%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5/" />
    <category term="it" label="IT" scheme="https://neonxp.ru/tags/it/" />
    <category term="golang" label="Golang" scheme="https://neonxp.ru/tags/golang/" />
    <published>2021-02-13T00:00:00Z</published></entry>
</feed>
