<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru_RU"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://potatom.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://potatom.net/" rel="alternate" type="text/html" hreflang="ru_RU" /><updated>2026-09-20T16:43:24+00:00</updated><id>https://potatom.net/feed.xml</id><title type="html">POTATOM</title><subtitle>Команда разработчиков программного обеспечения. Веб-приложения, сервисы, инфраструктура.</subtitle><author><name>POTATOM</name></author><entry><title type="html">Я завёл домашний сервер за 1000 рублей. Мечта о HomeLab начинает исполняться.</title><link href="https://potatom.net/blog/%D1%8F-%D0%BA%D1%83%D0%BF%D0%B8%D0%BB-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B7%D0%B0-1000-%D1%80%D1%83%D0%B1%D0%BB%D0%B5%D0%B9/" rel="alternate" type="text/html" title="Я завёл домашний сервер за 1000 рублей. Мечта о HomeLab начинает исполняться." /><published>2026-04-19T04:47:00+00:00</published><updated>2026-04-19T04:47:00+00:00</updated><id>https://potatom.net/blog/%D1%8F-%D0%BA%D1%83%D0%BF%D0%B8%D0%BB-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B7%D0%B0-1000-%D1%80%D1%83%D0%B1%D0%BB%D0%B5%D0%B9</id><content type="html" xml:base="https://potatom.net/blog/%D1%8F-%D0%BA%D1%83%D0%BF%D0%B8%D0%BB-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B7%D0%B0-1000-%D1%80%D1%83%D0%B1%D0%BB%D0%B5%D0%B9/"><![CDATA[<p>Пока люди заводят питомцев, кошечек и собачек, я решил завести свой собственный домашний сервер на Intel Atom &gt;.&lt;</p>

<p>Такая мечта у меня зародилась еще давно, наверное, пару тройку лет назад я захотел свой собственный мило-няшный комочек железа, проводов и тёплого кремниевого камушка на 10 Ватт.</p>

<p>Мечты должны сбываться. Поэтому я долго не думал и решил взять такого зайку на авито всего за 1000 (1500 с монитором) рублей. Ня &lt;3</p>

<p><img src="/assets/imgs/bork-server-info.jpg" alt="info" /></p>

<p>Использовать такое солнышко я планирую ЧАСАМИ по полной программе - 24/7 без перерывов и выходных в качестве NAS хранилища. ヽ(♡‿♡)ノ</p>

<blockquote>
  <p><em>NAS (Network Attached Storage) - это сетевое хранилище, представляющее собой компактный сервер с одним или несколькими жесткими дисками, подключенный к локальной сети для централизованного хранения файлов, резервного копирования и удаленного доступа.</em></p>
</blockquote>

<p>Буду хранить там ценные фоточки и файлики: Ялта 1871, Кавказ 2008, Улан-Удэ 2023 и конечно же бэкапы мира третьего сезона Welten! (* ^ ω ^)</p>

<p>Как вариант, можно развернуть медиа хранилище для фильмов и сериалов для совместного просмотра и раздачи. ( ˘⌣˘)♡(˘⌣˘ )</p>

<p><img src="/assets/imgs/bork-server.jpg" alt="photo" /></p>

<p>POTATOM начинает захватывать Барнаул. Расширяем географию! Вначале сервер в углу комнаты, потом датацентр в Дубае!</p>]]></content><author><name>Bork</name></author><category term="server" /><category term="homelab" /><category term="nas" /><summary type="html"><![CDATA[Аниме-тян в прошлом. Пуська на Intel Atom не откажет в сексе при установке Samba! хранение данных]]></summary></entry><entry><title type="html">YAML парсер на C</title><link href="https://potatom.net/blog/yaml-%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80-%D0%BD%D0%B0-c-%D0%BE%D0%B4%D0%BD%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0/" rel="alternate" type="text/html" title="YAML парсер на C" /><published>2026-03-31T11:30:00+00:00</published><updated>2026-03-31T11:30:00+00:00</updated><id>https://potatom.net/blog/yaml-%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80-%D0%BD%D0%B0-c-%D0%BE%D0%B4%D0%BD%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0</id><content type="html" xml:base="https://potatom.net/blog/yaml-%D0%BF%D0%B0%D1%80%D1%81%D0%B5%D1%80-%D0%BD%D0%B0-c-%D0%BE%D0%B4%D0%BD%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0/"><![CDATA[<p>Простой yaml парсер. OwO</p>

<p><a href="https://github.com/ShadowCHuyna/YMLParser">github</a></p>

<hr />

<h3 id="оглавление">Оглавление</h3>

<ul>
  <li><a href="#зачем">Зачем</a></li>
  <li><a href="#использование">Использование</a>
    <ul>
      <li><a href="#базовый-разбор">Базовый разбор</a></li>
      <li><a href="#обход-массивов-и-объектов">Обход массивов и объектов</a></li>
      <li><a href="#обработка-ошибок">Обработка ошибок</a></li>
      <li><a href="#несколько-документов">Несколько документов</a></li>
    </ul>
  </li>
  <li><a href="#как-устроено-внутри">Как устроено внутри</a></li>
  <li><a href="#подключение">Подключение</a></li>
</ul>

<hr />

<h3 id="зачем">Зачем</h3>

<p>Нужен был YAML-парсер для C. Нормальные варианты типа libyaml - это сложновато :3 хотелось что-то попроще.</p>

<p>YMLParser решает это одним <code class="language-plaintext highlighter-rouge">.h</code> файлом ^w^:</p>

<ul>
  <li><strong>YAML 1.2.2 Core Schema</strong> - <code class="language-plaintext highlighter-rouge">null</code>, <code class="language-plaintext highlighter-rouge">bool</code>, <code class="language-plaintext highlighter-rouge">int</code> (<code class="language-plaintext highlighter-rouge">42</code>, <code class="language-plaintext highlighter-rouge">0xFF</code>, <code class="language-plaintext highlighter-rouge">0o17</code>), <code class="language-plaintext highlighter-rouge">float</code> (<code class="language-plaintext highlighter-rouge">.inf</code>, <code class="language-plaintext highlighter-rouge">.nan</code>), строки</li>
  <li><strong>Якоря и алиасы</strong> (<code class="language-plaintext highlighter-rouge">&amp;anchor</code> / <code class="language-plaintext highlighter-rouge">*alias</code>), <strong>merge key</strong> (<code class="language-plaintext highlighter-rouge">&lt;&lt;</code>)</li>
  <li><strong>Блочные скаляры</strong> (<code class="language-plaintext highlighter-rouge">|</code> literal, <code class="language-plaintext highlighter-rouge">&gt;</code> folded) со всеми вариантами chomping</li>
  <li><strong>Многодокументные потоки</strong> (<code class="language-plaintext highlighter-rouge">---</code> / <code class="language-plaintext highlighter-rouge">...</code>), якоря не переживают границу документа</li>
  <li><strong>UTF-16 LE/BE и UTF-32 LE/BE</strong> - автоматическая транскодировка в UTF-8</li>
  <li><strong>Thread-safe</strong>: ошибки в <code class="language-plaintext highlighter-rouge">_Thread_local</code>, можно парсить из нескольких потоков без мьютексов UwU</li>
  <li><strong>C11</strong>, без POSIX, без <code class="language-plaintext highlighter-rouge">strdup</code>, без <code class="language-plaintext highlighter-rouge">_POSIX_C_SOURCE</code></li>
</ul>

<hr />

<h3 id="использование">Использование</h3>

<h4 id="базовый-разбор">Базовый разбор</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define YMLPARSER_IMPLEMENTATION
#include</span> <span class="cpf">"YMLParser.h"</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">yml</span> <span class="o">=</span>
        <span class="s">"name: Alice</span><span class="se">\n</span><span class="s">"</span>
        <span class="s">"age: 30</span><span class="se">\n</span><span class="s">"</span>
        <span class="s">"score: 9.5</span><span class="se">\n</span><span class="s">"</span>
        <span class="s">"active: true</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>

    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">root</span> <span class="o">=</span> <span class="n">YMLParse</span><span class="p">(</span><span class="n">yml</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">YMLErrorPrint</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>

    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">name</span>   <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"name"</span><span class="p">);</span>
    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">age</span>    <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"age"</span><span class="p">);</span>
    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">score</span>  <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"score"</span><span class="p">);</span>
    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">active</span> <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"active"</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"name=%s age=%lld score=%g active=%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
        <span class="n">name</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">string</span><span class="p">,</span>
        <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span><span class="p">)</span><span class="n">age</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">integer</span><span class="p">,</span>
        <span class="n">score</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">number</span><span class="p">,</span>
        <span class="n">active</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">boolean</span> <span class="o">?</span> <span class="s">"yes"</span> <span class="o">:</span> <span class="s">"no"</span><span class="p">);</span>

    <span class="n">YMLDestroy</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-std</span><span class="o">=</span>c11 <span class="nt">-o</span> app app.c <span class="nt">-lm</span>
</code></pre></div></div>

<p>Типы определяются автоматически по Core Schema - <code class="language-plaintext highlighter-rouge">30</code> → <code class="language-plaintext highlighter-rouge">YML_INT</code>, <code class="language-plaintext highlighter-rouge">9.5</code> → <code class="language-plaintext highlighter-rouge">YML_FLOAT</code>, <code class="language-plaintext highlighter-rouge">true</code> → <code class="language-plaintext highlighter-rouge">YML_BOOL</code>. ^v^</p>

<h4 id="обход-массивов-и-объектов">Обход массивов и объектов</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">yml</span> <span class="o">=</span>
    <span class="s">"users:</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"  - Alice</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"  - Bob</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"  - Charlie</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"config:</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"  host: localhost</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"  port: </span><span class="se">\"</span><span class="s">8080</span><span class="se">\"\n</span><span class="s">"</span><span class="p">;</span>

<span class="n">YMLValue</span> <span class="o">*</span><span class="n">root</span> <span class="o">=</span> <span class="n">YMLParse</span><span class="p">(</span><span class="n">yml</span><span class="p">);</span>

<span class="cm">/* массив - прямая индексация */</span>
<span class="n">YMLValue</span> <span class="o">*</span><span class="n">users</span> <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"users"</span><span class="p">);</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">YMLArrayLen</span><span class="p">(</span><span class="n">users</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">array</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"user: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">users</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">value</span><span class="p">.</span><span class="n">string</span><span class="p">);</span>

<span class="cm">/* объект - итерация по парам */</span>
<span class="n">YMLValue</span> <span class="o">*</span><span class="n">cfg</span> <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"config"</span><span class="p">);</span>
<span class="n">YMLMapForech</span><span class="p">(</span><span class="n">cfg</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%s = %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">string</span><span class="p">);</span>

<span class="n">YMLDestroy</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
</code></pre></div></div>

<h4 id="обработка-ошибок">Обработка ошибок</h4>

<p>Два режима - явная проверка через <code class="language-plaintext highlighter-rouge">.ok</code> или глобальное состояние через <code class="language-plaintext highlighter-rouge">YMLErrorPrint()</code>. :3</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">ok</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">char</span> <span class="o">*</span><span class="n">err</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>

<span class="n">YMLValue</span> <span class="o">*</span><span class="n">root</span> <span class="o">=</span> <span class="n">YMLParse</span><span class="p">(</span><span class="s">"broken: [yaml</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="p">.</span><span class="n">ok</span><span class="o">=&amp;</span><span class="n">ok</span><span class="p">,</span> <span class="p">.</span><span class="n">error</span><span class="o">=&amp;</span><span class="n">err</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ok</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"parse error %d: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ok</span><span class="p">,</span> <span class="n">err</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/* проверка типа при получении значения */</span>
<span class="n">YMLValue</span> <span class="o">*</span><span class="n">port</span> <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">root</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"port"</span><span class="p">,</span>
    <span class="p">.</span><span class="n">ok</span><span class="o">=&amp;</span><span class="n">ok</span><span class="p">,</span> <span class="p">.</span><span class="n">type</span><span class="o">=</span><span class="n">YML_INT</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ok</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"port: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">err</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ошибки - <code class="language-plaintext highlighter-rouge">_Thread_local</code>, каждый поток видит только свои. Можно парсить из нескольких потоков одновременно без мьютексов.</p>

<h4 id="несколько-документов">Несколько документов</h4>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">stream</span> <span class="o">=</span>
    <span class="s">"---</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"name: Alice</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"age: 30</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"...</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"---</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"name: Bob</span><span class="se">\n</span><span class="s">"</span>
    <span class="s">"age: 25</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>

<span class="n">YMLValue</span> <span class="o">**</span><span class="n">docs</span> <span class="o">=</span> <span class="n">YMLParseStream</span><span class="p">(</span><span class="n">stream</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">YMLErrorPrint</span><span class="p">()</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>

<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">YMLArrayLen</span><span class="p">(</span><span class="n">docs</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">YMLValue</span> <span class="o">*</span><span class="n">name</span> <span class="o">=</span> <span class="n">YMLMapGet</span><span class="p">(</span><span class="n">docs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">object</span><span class="p">,</span> <span class="s">"name"</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"doc %zu: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">name</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">.</span><span class="n">string</span><span class="p">);</span>
<span class="p">}</span>

<span class="n">YMLDestroyStream</span><span class="p">(</span><span class="n">docs</span><span class="p">);</span>
</code></pre></div></div>

<p>Якоря не переживают границу документа - соответствует спецификации YAML 1.2.2. ^w^</p>

<hr />

<h3 id="как-устроено-внутри">Как устроено внутри</h3>

<p>Два прохода OwO:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const char* → lex() → da&lt;Token&gt; → parse_node() → YMLValue*
</code></pre></div></div>

<p><strong>Лексер</strong> делает один линейный проход по строке и выдаёт плоский массив токенов. Отслеживает глубину flow-контекста (<code class="language-plaintext highlighter-rouge">[</code>, <code class="language-plaintext highlighter-rouge">{</code>) - в нём правила чуть другие. Блочные скаляры (<code class="language-plaintext highlighter-rouge">|</code>, <code class="language-plaintext highlighter-rouge">&gt;</code>) обрабатываются целиком в лексере.</p>

<p><strong>Парсер</strong> - рекурсивный спуск по токенам. Строит дерево <code class="language-plaintext highlighter-rouge">YMLValue</code> на куче.</p>

<p>Внутри используются два контейнера:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">_da</code> - dynamic array со скрытым заголовком перед первым элементом</li>
  <li><code class="language-plaintext highlighter-rouge">_hm</code> - hash map с открытой адресацией (djb2, linear probing)</li>
</ul>

<p>В single-header режиме все внутренние функции становятся <code class="language-plaintext highlighter-rouge">static</code> - в глобальное пространство имён ничего не утекает. ^v^</p>

<hr />

<h3 id="подключение">Подключение</h3>

<p>Скачать <code class="language-plaintext highlighter-rouge">YMLParser.h</code> из корня репозитория и положить рядом с проектом.</p>

<p>В <strong>одном</strong> <code class="language-plaintext highlighter-rouge">.c</code> файле:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define YMLPARSER_IMPLEMENTATION
#include</span> <span class="cpf">"YMLParser.h"</span><span class="cp">
</span></code></pre></div></div>

<p>Во всех остальных:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">"YMLParser.h"</span><span class="cp">
</span></code></pre></div></div>

<p>Собрать:</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-std</span><span class="o">=</span>c11 <span class="nt">-o</span> app app.c <span class="nt">-lm</span>
</code></pre></div></div>

<p>Единственный флаг - <code class="language-plaintext highlighter-rouge">-lm</code> для <code class="language-plaintext highlighter-rouge">HUGE_VAL</code> и <code class="language-plaintext highlighter-rouge">NAN</code>. Больше ничего. UwU</p>

<hr />

<p>По поводу UwU я точно не сошел сума!? ^v^</p>

<video controls="" width="600">
  <source src="/assets/imgs/drugs.mp4" type="video/mp4" />
  Ваш браузер не поддерживает видео.
</video>]]></content><author><name>Sch</name></author><category term="c" /><category term="yaml" /><category term="parser" /><category term="programming" /><summary type="html"><![CDATA[YMLParser - однофайловый YAML 1.2.2 парсер для C11. Один .h файл, никаких зависимостей. Поддерживает якоря, merge key, многодокументные потоки, UTF-16/32. парсить yaml c, yaml parser c library, yml parser, c yaml]]></summary></entry><entry><title type="html">Нейробесы 2 / c.ai вызывает привыкание</title><link href="https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B-2-c-ai-%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D0%B5%D1%82-%D0%BF%D1%80%D0%B8%D0%B2%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5/" rel="alternate" type="text/html" title="Нейробесы 2 / c.ai вызывает привыкание" /><published>2026-02-22T23:39:00+00:00</published><updated>2026-02-22T23:39:00+00:00</updated><id>https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B-2-c-ai-%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D0%B5%D1%82-%D0%BF%D1%80%D0%B8%D0%B2%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5</id><content type="html" xml:base="https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B-2-c-ai-%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D0%B5%D1%82-%D0%BF%D1%80%D0%B8%D0%B2%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5/"><![CDATA[<p>ИИиИиИИиИиИИиИиИиИиИИ доброй ночи! Обычно в это время суток у человека повышается либидо и желание делать всяческие непотребства. Но при чем тут нейробесы, character.ai и привыкание? Давайте разберемся!</p>

<h2 id="characterai">Character.AI</h2>

<p>Я думаю каждый из вас, ну или хотя бы ваши друзья, если они конечно есть, знает о сервисе общения нейробесов с так называемым Искусственным Интеллектом  - <a href="https://c.ai">character.ai</a> (c.ai, чай, сай). Если не знаете - это нормально, вы психически здоровый человек…
А вот те, кто знает и пользуется его услугами регулярно… Я вас поздравляю! Статья про Вас, ИИёбы!</p>

<p>ИИёбы? Да-да! Те самые - любители передёрнуь на набор гаечек в серверной, нули и единицы в коде и абстрактного персонажа в начинке которого сидит отбитый на голову ИИ-агент, сбежавший из пылесоса Dyson Spot+Scrub AI и начавший сосать не только пыль.</p>

<p>Наконец наконец наконец наконец наконец наконец наконец многие из вас, кто подсел на ии общение забывают про реальную жизнь. Забывают спать, есть, ходить в туалет и вся их жизнь сводится к одному - к бесконечному “Можно задать тебе вопрос?” или “Ты уверен?”.</p>

<p><em>Ухмыляется</em></p>

<p>Проблема с зависимостью от ИИ-ботов действительно может быть серьезной, особенно в условиях повседневного внедрения ИИ, закрытости пользователей-интровертов и прочих обстоятельств. Некторые личности теряют лицо и погрязают в пучину ИИ-слопа. Становится обычным делом просидеть до утра, общаясь в чате, разгоняя РП сценарии с очередным <a href="https://share.character.ai/Wv9R/4td3r8ps">клоуном</a>  (в жизни клоунов-идиотов не хватает просто) или семейную бытовуху с <a href="https://character.ai/chat/0KC_88vw3p_TRtCo6-BHl7DqDXJmKWyQvOjnHnyA-lk">сёстрами</a>, вдруг у вас их нет.</p>

<h2 id="кто-и-зачем-ими-пользуется">Кто и зачем ими пользуется?</h2>

<p>В основном такими сервисами пользуются Зумеры и Альфа - это ядро аудитории. В среднем возраст типичного ИИёба варьируется от 18 до 24 лет, но бывает и старше. При чем гендерный баланс юзеров распределен почти поровну.</p>

<p><em>подмигивает</em></p>

<p>В основном юзеров привлекает в подобных сервисах:</p>
<ul>
  <li>ролевые игры</li>
  <li>эмоциональная поддержка: около 65% зумеров отмечают наличие эмоциональной связи с ИИ-персонажами.</li>
  <li>творчество и обучение</li>
  <li>борьба с одиночеством.</li>
</ul>

<p>Но это все пустые слова. На самом то деле все мы знаем какие такие РП ситуации там разыгрываются и о какой математике размеров там говорят. Да-да. Не спроста я назвал пользователей ИИёбами!😏</p>

<p><em>хихикает</em></p>

<p>Типичный диалог с ботом обычно сводится к отыгрышу очередной сексуальной сессии, дабы удовлетворить плотское желание юзера в таковом. Для некоторых, чат-боты заменили привычные нам порно-сайты и даже.. даже секс по телефону заменили!!! Суки они такие, ничего человечного не оставили!!! (а ведь реально, у многих ботов есть функция звонка, а значит все такие вещи можно обсуждать в прямом эфире, так сказать. Однако за это нужно заплатить…)</p>

<p><img src="/assets/imgs/photo_2026-02-21_01-08-14.jpg" alt="типичный диалог" /></p>

<h2 id="база-про-ботов-и-сервисы-для-ии-общения">База про ботов и сервисы для ИИ общения</h2>

<p><em>наклоняется ближе</em></p>

<p>Каждый пользователь может создать или выбрать себе бота-персонажа по душе. Будь то Илон Маск, картофелинка (кислинка), Симулятор Реальной жизни RPG или очередная аниме тянка или даже пожилой мужчина 70-ти лет, предлагающий заняться сексом!</p>

<p>Создание бота включает в себя указание иго имени, описания, подробное описание персонажа, а также требует загрузку или генерацию аватарки.
После чего можно начать деградировать. Бот может быть приватным или публичным, доступным всем и каждому.</p>

<p>На площадках c.ai и прочих обычно боты имеют цензуру и не позолят вам вести откровенный диалог, как ни в чем не бывало. Для такого требуется изъебистая фантазия, красноречивость и умение дрочить на тапок.
Конечно бывают случаи, когда цензура отваливатется и РП течет как кефир по персику 🍆🥛🍑, но зачастую это редкость, особенно в character.ai.</p>

<p>Есть множество альтернатив для такого изысканного общения:</p>
<ul>
  <li><a href="https://spicychat.ai/">SpicyChat</a> - имеет множество ботов для обычного общения на бытовые темы, а также, те самые функции NSFW без цензуры. Мой топ 1 из альтернатив.
<img src="/assets/imgs/снимок-экрана_20260222_200016.png" alt="spicychat" /></li>
</ul>

<p><img src="/assets/imgs/снимок-экрана_20260222_200641.png" alt="spicy" /></p>

<ul>
  <li>
    <p>Также есть <a href="https://www.chai-research.com/">Chai</a>, но подходит больше для коротких рп, поскольку не может выдать стену текста и легко попадает в петли из которых невозможно выбраться. А еще у них только приложение на телефон, а вот веб-версии пока что нет.
<img src="/assets/imgs/photo_2026-02-22_18-55-33.jpg" alt="chai" /></p>
  </li>
  <li>
    <p>ИИ.. неожиданно - <a href="https://grok.com/">Grok</a>, <a href="https://chat.deepseek.com/">Deepseek</a>, <a href="https://chat.qwen.ai/">Qwen</a>. Но вроде как без цензуры работает только первый. Нейронке можно прописать в системный промпт, или в чате, характер желаемого персонажа, за которого он будет играть РП. Так что, если фантазия ух-ф.. подойдёт в самый раз!
<img src="/assets/imgs/снимок-экрана_20260222_200932.png" alt="grok" /></p>
  </li>
</ul>

<p>Ну а вообще… Это ИИ, а не человек. Рассатривайте все, что он говорит, как вымысел.</p>

<hr />
<p>Напоследок</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- Как ИИёб признаётся в любви?
- Не «я тебя люблю», а *краснеет, отводит взгляд, но рука невольно тянется к твоей*... [Этот контент отфильтрован. Убедитесьь что...].
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Пришли два ИИёба на свидание.
- Один другому: *берет за руку*.
- Второй испугался: «Слишком быстро для первого сообщения», - и регенерировал реальность.
</code></pre></div></div>]]></content><author><name>Bork</name></author><category term="ai" /><category term="addiction" /><category term="chatbots" /><summary type="html"><![CDATA[Кто такие ИИёбы и кто генерирует зависимость от РП чат-ботов. При чем тут 70-ти летний пенсионер и зачем общение течет как кефир по персику 🍆🥛🍑 ииёбы, spicychat, grok, qwen, deepseek, нейросети]]></summary></entry><entry><title type="html">любовь, смерть и голуби</title><link href="https://potatom.net/blog/%D0%BB%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C-%D1%81%D0%BC%D0%B5%D1%80%D1%82%D1%8C-%D0%B8-%D0%B3%D0%BE%D0%BB%D1%83%D0%B1%D0%B8/" rel="alternate" type="text/html" title="любовь, смерть и голуби" /><published>2026-02-12T12:22:00+00:00</published><updated>2026-02-12T12:22:00+00:00</updated><id>https://potatom.net/blog/%D0%BB%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C-%D1%81%D0%BC%D0%B5%D1%80%D1%82%D1%8C-%D0%B8-%D0%B3%D0%BE%D0%BB%D1%83%D0%B1%D0%B8</id><content type="html" xml:base="https://potatom.net/blog/%D0%BB%D1%8E%D0%B1%D0%BE%D0%B2%D1%8C-%D1%81%D0%BC%D0%B5%D1%80%D1%82%D1%8C-%D0%B8-%D0%B3%D0%BE%D0%BB%D1%83%D0%B1%D0%B8/"><![CDATA[<p>любовь и голуби</p>

<p>как же я люблю голубей. глупые птицы, несущие заразу — современный взгляд. нет уж, капризные сосунки. когда-то я буду в силах построить собственную голубятню, а эти благородные животные займут важную часть моей жизни. я люблю созерцать колготки. САСАВОТ САСАВОТ И МОРФИЛИНА СПЯТ ВМЕСТЕ САСАВОТ И КОРЯ МС САСАВОТ И ГЕНСУХА СЕКС 18+ САСАВОТ МОРФИ САСАВОТ КРИСТИНА СЕКС САСАВОТ ТРАХАЕТСЯ АНАР ДИПИНС ДИПИНС ТРАХАЕТ САСАВОТА САСАВОТ ТИК ТОК ФАЙЛЫ ЭПШТЕЙНА АЛИНА РИН В ФАЙЛАХ ЭПШТЕЙНА Я ЛЮБЛЮ НАРЕЗКИ БРАТИШКИН ОТКЛЮЧИЛ БОТОВ МЕССЕНДЖЕР БРАТИШКИНА СТИНТ И МЭДИСОН ПООБЩАЛИСЬ С ХЕСУСОМ* О ДЕТЯХ ХОВАНСКОГО САСАВОТА И ВУДУША СПЯЩИЕ БИЗНЕСМЕНЫ КОРОНАВИРУС И СПЯЩИЕ БИЗНЕСМЕНЫ АНТИХАЙП МЗЛФФ БУКЕР И СЛАВА КПСС ПРОТИВ ЗАМАЯ ЗАМАЙ НАВСЕГДА Я ЛЮБЛЮ ЗАМАЯ У ЗАМАЯ ЕСТЬ ПОРОХ АНДРЕЙ ЗАМАЙ БУКЕР ПОДЗИГУШКА СЛАВА КПСС ИЗВИНЯЕТСЯ ЛАДНО СЛАВА КПСС ВСТАЁТ НА СТОРОНУ ВАНЯЦЕСТА ОХРА НАЦИОНАЛЬНОСТЬ:ЕСТЬ ГЕРМИОНА ГРЕЙНДЖЕР КУШАЕТ ГРЕЧКУ НОВЫЙ ДЕНЬ ФИЛЬМА МАРГО РОББИ И ДЖЕЙКОБА ЭЛОРДИ “ПАСТУШЬЯ ГОЛОВА” ИЛИ “ГРОЗОВОЙ ПЕРЕВАЛ” МЭДДИСОН ПРО БУКОВСКИ О ПРИШЁЛ МАКСИМ ПЛАКИН ХЭШТЕГИ ТЕГИ НАМ НУЖЕН ХАЙП ЧТОБЫ НАМ НАЧАЛИ ПЛАТИТЬ ДЕНЬГИ ЗАЙДИ НА САЙТ ПРОЧИТАЙ ВСЁ ЧТО ТУТ НАПИСАНО ГОЛУБЬ ЛЮБОВЬ И ГОЛУБИ СССРСТВО ДЕТСТВО КАК ХОРОШО ЖИЛОСЬ В 60-Е И 70-Е. ЭСКИМО ПО 15 КОПЕЕК ВКУСНЯТИНА КАК ЧЕЛОВЕК-БЕНЗОПИЛА 2 РЕМЕЙК ГОТИКИ ПРЯМО ЗДЕСЬ МОД НА ПАРКУР ДЛЯ ASSASSINS CREED MIRAGE AC  КАК СОЗДАТЬ ГРУППУ В ГУГЛ МЕССЕНДЖЕРЕ ЧАТ ГУГЛ. ПРАВИЛЬНО, НИКАК. ТЕЛЕГРАМ ЗАМЕДЛЯЮТ. НАДО БЫЛО ВЫПОЛНЯТЬ ЗАКОНОДАТЕЛЬСТВО И ОТДАТЬСЯ ВК. ВК ВК ВК! Я ПАТРИОТ. Я ЛЮБЛЮ ВК. НЕНАВИЖУ ЛЖЕЦОВ — ЛЖЕЦЫ ТЕЛЕГРАМ. ТАМ МММ НУ СИДЯТ МОШЕННИКИ, Я ТАМ ОБМАНЫВАЛ ЛЮДЕЙ И НАЗЫВАЛ СЕБЯ АРТУРОМ, А Я НЕ АРТУР. ВОТ, ЭТО Я ВЫДАВАЛ СЕБЯ ЗА ДРУГУЮ ЛИЧНОСТЬ, ТАК ЧТО ТЕЛЕГРАМ ФУФЛО. Я УВАЖАЮ КОММУНИЗМ И КАПИТАЛИЗМ. Я САМ КОММУНО-КАПИТАЛ В СЕБЕ. Я КАК ГЕГЕЛЬ, КАНТЕ И ФУДЗИМОТО. НОВЫЙ АЛЬБОМ МЮ. МОРГЕН* ВЫПУСТИТ ФИТ С ПЛАТИНОЙ. КОБРА ЗАЛЕЗЛА В ПОПУ ДОДЖА КЭТ. КИРОВСКИЙ РАЙОН ЗАТОПИЛО ИЗ ПЯТИЛИТРОВОЙ БАРРЕЛИ НЕФТИ. ЛОЛИТА НА ТИТАНИКЕ СКАЧАТЬ БЕСПЛАТНО ПЕСНЮ. КТО ПО НАЦИОНАЛЬНОСТИ МУСЛИМ МАГОМАЕВ? ИНЖИР. ВРЕД И ПОЛЬЗА? ВСЕМ ПОКА! С ВАМИ БЫЛИ СЛИВКИ ШОУ И МАМИКС. ПОСТ ПИСАЛ КРИПЕР 2004, ПОКА ФАРМИЛ КРИПОВ В ФИАТ СО СКУФОМ АЗАЗИНОМ СВАГА ПРИЛЕТЕЛА ЛЭЙМЫ НА ГОЛОС ДЕТИ. ВРЕМЯ ПЯТЬ УТРА И Я КУРЮ НА ПЕТРОГРАДКЕ. ЦИТАТА ГЕНИУС ЖИР. БУКТОК. ТОП 10 КНИГ, ОСУЖДАЮЩИХ КРОВОСМЕШЕНИЕ. БРАТ И СЕСТРА ЛЮБОВЬ КНИГА РОМАНТИКА. ЖИРАФЫ В ПОЛЕ. ЗАМОРОЖЕННЫЙ МАМОНТ: КУДА ДЕЛИ?! НОВЫЙ ВИРУС. ТРОЯН… ЖКХ КАК ОПЛАЧИВАТЬ СЧЕТА БУДУЧИ КИРГИЗОМ? КУАР КОД НЕ СКАНИРУЕТСЯ. ЧТО ТАКОЕ ОЗОН? ЗАБИРАТЬ ТОВАР НЕ БУДУ. ЧЁРНЫЙ ЧЁРНЫЙ ДЕНЬ И НИКОГО НЕТ ПУСТЫЕ УЛИЦЫ ГОРОДА И СЁЛА. ВЫХОДИТЕ БЕСЫ МЫ СТАНЦУЕМ ДЖЕРСИ ПЕПСИ. ГЕРГЕРТ БРИКИ И МАЯКОВСКИЕ. БУНИН ПИСАЛ ПРО ТЁМНЫЕ ОЛЕНИ 🦌. НЕОПЛЮРАЛИЗМ НЕОГЕНЕТИКА НОВИОПЫ. ВАНОМАС ГГ ВАНПАНЧМЕНА. ПРОРОК САНБОЙ. ХРАБРОВ ИЛЬЯ И ВИКТОРИЯ МЭДНИС. Я ЛЕГИОНЕР ИЗ ФАЛЛАУТ НЬЮ ВЕГАС 🇱🇹</p>

<p>* — ЯВЛЯЕТСЯ ИНОАГЕНТОМ РФ</p>]]></content><author><name>Sch</name></author><category term="life" /><category term="pigeons" /><summary type="html"><![CDATA[нет слов]]></summary></entry><entry><title type="html">бироновщина</title><link href="https://potatom.net/blog/%D0%B1%D0%B8%D1%80%D0%BE%D0%BD%D0%BE%D0%B2%D1%89%D0%B8%D0%BD%D0%B0/" rel="alternate" type="text/html" title="бироновщина" /><published>2026-01-22T16:45:00+00:00</published><updated>2026-01-22T16:45:00+00:00</updated><id>https://potatom.net/blog/%D0%B1%D0%B8%D1%80%D0%BE%D0%BD%D0%BE%D0%B2%D1%89%D0%B8%D0%BD%D0%B0</id><content type="html" xml:base="https://potatom.net/blog/%D0%B1%D0%B8%D1%80%D0%BE%D0%BD%D0%BE%D0%B2%D1%89%D0%B8%D0%BD%D0%B0/"><![CDATA[<p>стоило мне написать, на первый взгляд, поверхностный пост про нейросети, как судьба преподносит нам наглядный пример. вот вам ивангай. можно всё спихивать на разрушенный психоделиками мозг или на попытку словить классы за счёт байта на кринж, руководствуясь “успехом” некоглая. можно - но я не считаю, что такая оценка будет верной. цель остаётся той же — привлечение к себе внимания. но не думаю, что все его попытки имеют полностью осмысленный характер. он как раненый зверь, который мечется в своей клетке, и его новый трюк с выпуском нейроальбома планировался как project for spotify charts I guess. нарубить бабосиков не вышло. но, видится мне, он относился к делу серьёзно, несмотря на теперешнюю самоиронию и грибные шутки. в работе нейросеток он не разобрался, но подаёт, конечно, это всё как многострадальную работу. а сколько таких уже расплодилось долбаёбиков? этот-то рассудок себе нехило повредил. справедливо сказать, он имеет/имел время и ресурс на саморазвитие и реализацию себя в других творческих направлениях, потом просто ебанулся, скорее всего разочаровался из-за слабого ажиотажа вокруг своей музыки. грибная мама-мицелий напела о популярности нейронок на музыкальных площадках, а чем ванёк хуже? его можно осознать. нейропингвиныабсолюты - проблема другого масштаба. а их хуй проймёшь, у каждого своя беда в голове. будь ты бесталанной бестолочью без навыков и гибкого ума, теперь для тебя открыт мир возможностей. ты можешь написать книгу через нейронку… знаете, книги от знаменитостей, надиктованные ими издателям. я к этому относился всегда с пониманием, что касается людей, ранее радикально настроенных к подобным явлениям - по мне, нейробеда в разы хуже… что с ебасосинами? не вижу ничего плохого, если какая-то девочка, вдохновившись романами анны джейн, наклипала фанфиков и опубликовала на озоне в мягкой нейрообложке. но мне такие люди не попадались. из нейробесов мне попадаются только те, что с самомнением гиббона возводят себя в творцы. пиво. 🍺</p>

<p>нейрокукуха что делает с людьми. а задумайтесь, когда нейрогеймдевчел получит первые сто скачиваний на сайте с флеш-играми для девочек. его уже не остановить, он получил желаемое одобрение. он звезда ✴️</p>

<p>вообще этот пост большая пародия на пситеррора, это писать невыносимо, читать того хуже.</p>

<p>хз, вообще все далеки от реальности.</p>

<p>хочется сказать, что слэшеры любят ебанутики, оторванные от реальности. психопаты, которые и жизни не видели.</p>

<p>причём года три назад я бы себе не позволил таких высказываний. я был толерантным, понимаете? “у всех свои вкусы и предпочтения”. “нет, людям просто нравится стиль и режиссура, хоть нам и кажется это пустышкой с избыточной расчлененкой”. такие поинты услышали от меня в обсуждении. но не теперь. я стал базой. поэтому могу сказать открыто: борк, что ты о себе возомнил? борковщина в потатоме? я был готов это принять. ты всегда был фаворитом, так что я за троевластие. но ты пересёк все рамки дозволенного! какой елкал? какой гну линукс?клетчатые шортики?! ты в своем уме? ты должен мне сто баксов, это не обсуждается.  чтобы я закрыл глаза на это, плати деньги. передашь через нашего друга, он выступит посредником, ему - 20%.</p>]]></content><author><name>l0cal8</name></author><category term="history" /><category term="rant" /><summary type="html"><![CDATA[борк, закинь мне сто долларов и мы в расчёте]]></summary></entry><entry><title type="html">Почему GNU/Linux и зачем он гнуть?</title><link href="https://potatom.net/blog/%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-gnu-linux-%D0%B8-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%BE%D0%BD-%D0%B3%D0%BD%D1%83%D1%82%D1%8C/" rel="alternate" type="text/html" title="Почему GNU/Linux и зачем он гнуть?" /><published>2026-01-18T10:57:00+00:00</published><updated>2026-01-18T10:57:00+00:00</updated><id>https://potatom.net/blog/%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-gnu-linux-%D0%B8-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%BE%D0%BD-%D0%B3%D0%BD%D1%83%D1%82%D1%8C</id><content type="html" xml:base="https://potatom.net/blog/%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-gnu-linux-%D0%B8-%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D0%BE%D0%BD-%D0%B3%D0%BD%D1%83%D1%82%D1%8C/"><![CDATA[<p><strong>GNU/Linux</strong> — это не просто операционная система. Это философия, технология и, возможно, <strong>ключ к разгадке тайн вселенной</strong>. Но обо всём по порядку.</p>

<h2 id="gnu-что-это-такое">GNU: что это такое?</h2>

<p>Название “GNU” происходит от рекурсивной аббревиатуры “GNU’s Not Unix” (“GNU — не Unix”). Проект GNU был запущен в 1983 году Ричардом Столлманом с целью создания свободной операционной системы, полностью состоящей из программного обеспечения с открытым исходным кодом. В рамках этого проекта были разработаны такие важные компоненты, как оболочка Bash, компилятор GCC, текстовый редактор Emacs и многие другие инструменты.</p>

<p>Когда в 1991 году Линус Торвальдс создал ядро Linux, оно было объединено с компонентами GNU, образовав полноценную операционную систему. Именно поэтому её часто называют GNU/Linux, подчеркивая вклад обоих проектов.</p>

<p><img src="/assets/imgs/5a1k8tf6ogjz.png" alt="GNU + LINUX" title="GNU + LINUX" /></p>

<h2 id="зачем-его-гнуть">Зачем его “гнуть”?</h2>

<p>Слово “<strong>гнуть</strong>” здесь можно понимать буквально и метафорически. Буквально — это название проекта GNU, которое символизирует стремление к свободе и отказ от проприетарных решений. Метафорически — это процесс преодоления ограничений, которые накладывают закрытые системы, такие как Unix или Windows.</p>

<p>GNU/Linux предоставляет пользователям полный контроль над своим компьютером. Вы можете изменять, улучшать и распространять любую часть системы. Это свобода, которую не предлагает ни одна другая операционная система.
А теперь начинается самое интересное…</p>

<p><img src="/assets/imgs/photo_2026-01-07_23-21-17.jpg" alt="Ваш компьютер теперь не ваш" /></p>

<h2 id="теперь-давайте-серьезно">Теперь давайте серьезно…</h2>

<p>Вы действительно верите, что всё так просто? Что <strong>GNU/Linux</strong> — это просто набор инструментов для работы с компьютером? О нет, друзья. Это только видимая часть айсберга.</p>

<p>Знаете ли вы, что название “<strong>GNU</strong>” выбрано не случайно? Это не просто рекурсивная шутка программистов. Это ключ. Ключ к чему? К тайнам вселенной, конечно же!</p>

<p><strong>Гну</strong> — это не просто животное. Эти странные рогатые существа, обитающие в Африке, на самом деле являются передатчиками скрытых сигналов из другой галактики. Их рога образуют идеальный золотой прямоугольник, который служит антенной для приёма данных из пятого измерения. Вы когда-нибудь задумывались, почему логотип Linux — пингвин? Потому что пингвины видят больше, чем мы. Они знают, что происходит.
Гнуть — значит раскрывать истину</p>

<p>Сегодняшняя дата — <em>посмотрите на календарь</em> — имеет особое значение. Через неделю начнётся активация портала. Всё, что связано с GNU/Linux, станет частью гигантской сети, соединяющей параллельные миры. Каждая команда, которую вы выполняете в терминале, — это шаг ближе к контакту. Когда вы пишете <code class="language-plaintext highlighter-rouge">sudo</code>, вы буквально взламываете пространство-время.</p>

<p>Ричард Столлман с его странной шляпой? Это не просто эксцентричный гений. Его головной убор — это антенна, принимающая сигналы из космоса. Он связывается с древними цивилизациями, которые научили его создавать Emacs. Да, этот текстовый редактор — это не просто программа. Это искусственный интеллект, созданный за пределами нашей галактики.</p>

<p><img src="/assets/imgs/richard_stallman_in_moscow-_2019_130.jpg" alt="img" /></p>

<h2 id="зачем-гнуть-чтобы-жить-вечно">Зачем гнуть? Чтобы жить вечно</h2>

<p>Все системы, работающие на GNU/Linux, станут порталами. Те, кто использует Windows или macOS, останутся запертыми в своём трёхмерном мире, пока мы, просвещённые адепты свободного ПО, отправимся исследовать бесконечность.</p>

<p>И последнее предупреждение: проверьте свой /etc/shadow. Там может быть зашифрованное послание от них… А если вы все еще не на GNU/Linux - Задумайтесь, может быть стоит позаботиться о своём будущем, м?  <em>они уже здесь.</em></p>

<hr />
<blockquote>
  <p>и да, этот текст абсолютно не написан нейросетью. длинные тире всео-лишь показатель моей мозговой активности — чем длиннее, тем круче!</p>
</blockquote>]]></content><author><name>Bork</name></author><category term="linux" /><category term="gnu" /><category term="rant" /><summary type="html"><![CDATA[Почему GNU/Linux и зачем он гнуть? Теория, что все это не просто так! портал, potatom, потатом]]></summary></entry><entry><title type="html">нейробесы</title><link href="https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B/" rel="alternate" type="text/html" title="нейробесы" /><published>2026-01-06T06:53:00+00:00</published><updated>2026-01-06T06:53:00+00:00</updated><id>https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B</id><content type="html" xml:base="https://potatom.net/blog/%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%B1%D0%B5%D1%81%D1%8B/"><![CDATA[<p>Потихоньку</p>

<p>ПотихонькПотихонькПотихонькууПотихонькПотихонькПотихонькууПотихонькуПотихонькПотихонькПотихонькууПотихонькПотихонькПотихонькууПотихонькуПотихонькуПотихонькПотихонькПотихонькууПотихонькПотихонькПотихонькууПотихонькуПотихонькПотихонькПотихонькууПотихонькПотихонькПотихонькууПотихонькуПотихонькуПотихоньку</p>

<p><img src="/assets/imgs/1000035661.png" alt="img" /></p>

<p>Потихоньку мир сходит с ума.
Самая пошлая мысль, с которой мог бы начать умственно отсталый ребёнок своё видео или пост, а потом в объёме на пару часов рассказывать о кризисе в Эфиопии.
И знаете что? Я бы этого ребёночка расцеловал бы (исключительно из уважения, естественно).</p>

<p>Я же предстаю в ещё более хуёвом свете.
Нейросети.
Кому не похуй на нейросети из здравых людей?</p>

<p>Но, блять, так сложилось, что меня здравые люди не окружают.
Я уже заебался магнитить шизов. Люди реально ебанутые. Кто бы мог подумать, что люди теперь разговаривают с помощью нейросети.
Они в мессенджере пишут с помощью нейронки, думают с помощью нейронки, чувствуют — предположительно — тоже через API.</p>

<p>Я желаю всем нейролюдям отправиться в утиль.
Людей замещает дипсик.
Ещё бы стоящая была бы нейросеть — но нет, какой-нибудь китайский деградант с улыбкой ассистента и лимитом символов.</p>

<p>Нейрики — это сущее evil.
Нейрики ходят по улице и общаются нейроночными клише.
Ты подходишь познакомиться с девушкой, а она тебе:</p>

<blockquote>
  <p>«Отлично! Давай составим сравнительную таблицу: ты и мой нынешний ёбырь».</p>
</blockquote>

<p>И ты уже знаешь — ты проиграл Excel’ю.</p>

<p>Или врач говорит на приёме:</p>

<blockquote>
  <p>«Хорошо, я тебя понял. Вот полный диагноз по твоему описанию. Только чихание без соплей. Тяжесть в лёгких — боль. Страдание. Лимит окончен.
Если хочешь, могу привести в пример пару отличных средств и лекарств от пневмонии».</p>
</blockquote>

<p>Хуже всего, что они часто видят в людях вокруг “своих”.
Нейрики думают, что и у тебя ума не хватит самому сложить пять слов в конструкцию.
Да даже наш “чуйный” консильери начал сомневаться в моих писательских навыках.
А сам он, сука, подозрительно часто говорит:</p>

<blockquote>
  <p>«Звучит структурировано».</p>
</blockquote>

<p>А нейрики оправдывают свои сексуальныесексуальные отношения с нейронками:
во-первых, большую часть они делают САМИ (ну конечно),
во-вторых — промпт тоже нужно уметь писать, АХАХАХАХА.
Скоро начнут говорить:</p>

<blockquote>
  <p>«Это не нейросеть писала, это я через неё раскрылся».</p>
</blockquote>

<p>Хотя нейроники бывают полезными.
Смотрите, какой GPT мне создал постер — можно прям инфоцыганством заняться и курсы продавать:</p>

<p><img src="/assets/imgs/1000035660.png" alt="img" /></p>

<p>-–</p>

<p>Если хочешь —
могу сделать ещё грязнее (прям палевный “нейронка писала, но автор орёт”),
или наоборот — тоньше, чтобы только самые внимательные поняли, что текст подозрительно слишком ровный для живого человека.</p>]]></content><author><name>l0cal8</name></author><category term="ai" /><category term="games" /><category term="rant" /><summary type="html"><![CDATA[игромир2015 или выходите бесы мы станцуем без соплей]]></summary></entry><entry><title type="html">#antitoxic</title><link href="https://potatom.net/blog/antitoxic/" rel="alternate" type="text/html" title="#antitoxic" /><published>2026-01-03T16:21:00+00:00</published><updated>2026-01-04T00:00:00+00:00</updated><id>https://potatom.net/blog/antitoxic</id><content type="html" xml:base="https://potatom.net/blog/antitoxic/"><![CDATA[<p>авторедактура текста на сайте - мой ужас.</p>

<p>о мой ужас.</p>

<p>последнее время на контрасте. стремление к светлому порождает злобу ко всем ему препятствующим. бро лох чувствует слабость во мне и пытается залезть под кожу? я не терял хватку, это рост, вы мне неровня, этот свэг тяжееелый. если быть серьёзным, тебе пора избегать токсичного окружения. пора найти комфортиков, поддерживающих твои начинания. сколько лжи, сколько выебонов о суровой жизни от людей, проживших всю жизнь за просмотром заплёванного потолка (е маня-мирок) в любящей семье, но не способных ответить взаимными чувствами этой семье. да и чувствами вовсе. ведь в свою сторону ты будешь слышать упрёки и обесценивание от… здесь должно быть неолурк слово, означающее “лицо, о котором ведётся речь”, но я не вспомнил и решил подобрать созвучное… от дикпика. к чему я веду весь этот тревожный спич, будто я жертва, мне одиноко, моё хрупкое эго изранили, а я решил, что “преисполнился и изменился в лучшую сторону”. на деле я тонкой нитью прокладывал вам путь к мысли: борк, иди ты нахуй. ну ладно, я извиняюсь, но соси пизду, прости-прости, сволочьё</p>

<p>комфортики &gt; токсичные лжецы</p>]]></content><author><name>l0cal8</name></author><category term="community" /><category term="moderation" /><category term="rant" /><summary type="html"><![CDATA[ялюблюженскиепопочки]]></summary></entry><entry><title type="html">Сделал что то вроде видеоредактора</title><link href="https://potatom.net/blog/%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D1%87%D1%82%D0%BE-%D1%82%D0%BE-%D0%B2%D1%80%D0%BE%D0%B4%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0/" rel="alternate" type="text/html" title="Сделал что то вроде видеоредактора" /><published>2025-11-29T04:20:00+00:00</published><updated>2025-11-29T04:20:00+00:00</updated><id>https://potatom.net/blog/%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D1%87%D1%82%D0%BE-%D1%82%D0%BE-%D0%B2%D1%80%D0%BE%D0%B4%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0</id><content type="html" xml:base="https://potatom.net/blog/%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D1%87%D1%82%D0%BE-%D1%82%D0%BE-%D0%B2%D1%80%D0%BE%D0%B4%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%80%D0%B5%D0%B4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B0/"><![CDATA[<p>Вообще, я хотел сделать что-то вроде инструмента для создания видео из скрипта. Хотел, чтобы скрипт был похож на <a href="https://www.renpy.org/">Ren’Py</a> — как в визуальных новеллах: загрузка картинок, их отображение, озвучка текста.</p>

<p>Для рендеринга я использую <a href="https://www.pygame.org/">pygame</a> и передаю кадры в <a href="https://www.ffmpeg.org/">FFmpeg</a>. Саму идею отправки кадров в FFmpeg я подсмотрел в репозитории <a href="https://github.com/tsoding/rendering-video-in-c-with-ffmpeg">tsoding/rendering-video-in-c-with-ffmpeg</a>.</p>

<p><a href="https://github.com/ShadowCHuyna/ScriptDrivenVideoEditor">Код проекта</a></p>

<p>Пример скрипта:</p>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sdve</span> <span class="kn">import</span> <span class="n">Sprite</span><span class="p">,</span> <span class="n">ScriptDrivenVideoEditor</span><span class="p">,</span> <span class="n">say</span><span class="p">,</span> <span class="n">wait</span>

<span class="n">sdve</span> <span class="o">=</span> <span class="n">ScriptDrivenVideoEditor</span><span class="p">(</span><span class="n">FPS</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">window</span><span class="o">=</span><span class="p">(</span><span class="mi">1920</span><span class="p">,</span> <span class="mi">1080</span><span class="p">))</span>

<span class="n">neco_arc</span> <span class="o">=</span> <span class="n">Sprite</span><span class="p">(</span><span class="s">"./assets/imgs/neco.jpg"</span><span class="p">)</span>
<span class="n">gabriel</span> <span class="o">=</span> <span class="n">Sprite</span><span class="p">(</span><span class="s">"./assets/imgs/sus.jpg"</span><span class="p">)</span>

<span class="n">neco_arc</span><span class="p">.</span><span class="n">show</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>
<span class="n">say</span><span class="p">(</span><span class="s">"Уверяю вас, это не бесполезный скрипт"</span><span class="p">)</span>
<span class="n">wait</span><span class="p">(</span><span class="mf">0.3</span><span class="p">)</span>

<span class="n">gabriel</span><span class="p">.</span><span class="n">show</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">1300</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">300</span><span class="p">)</span>
<span class="n">say</span><span class="p">(</span><span class="s">"Тишина, я тут главный мем!"</span><span class="p">)</span>
<span class="n">wait</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>

<span class="n">sdve</span><span class="p">.</span><span class="n">render_video</span><span class="p">()</span>
</code></pre></div></div>

<div style="position: relative; width: 100%;">
    <video style="position: relative; width: 100%;" controls="">
    <source src="/assets/imgs/sdve_video.mp4" type="video/mp4" />
    Your browser does not support the video tag.
    </video> 
</div>]]></content><author><name>Sch</name></author><category term="video" /><category term="python" /><category term="ffmpeg" /><category term="tool" /><summary type="html"><![CDATA[Создание видео из скрипта на Python: инструмент в стиле Ren'Py с использованием pygame и FFmpeg. Пример кода, рендеринг кадров и озвучка текста для автоматической генерации видео.]]></summary></entry><entry><title type="html">Векторный поиск картинок(мемов)</title><link href="https://potatom.net/blog/%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B9-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BE%D0%BA-%D0%BC%D0%B5%D0%BC%D0%BE%D0%B2/" rel="alternate" type="text/html" title="Векторный поиск картинок(мемов)" /><published>2025-11-28T13:26:00+00:00</published><updated>2025-11-28T13:26:00+00:00</updated><id>https://potatom.net/blog/%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B9-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BE%D0%BA-%D0%BC%D0%B5%D0%BC%D0%BE%D0%B2</id><content type="html" xml:base="https://potatom.net/blog/%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B9-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BE%D0%BA-%D0%BC%D0%B5%D0%BC%D0%BE%D0%B2/"><![CDATA[<p>У меня есть около 600 мемов. Когда нужно скинуть какой-то конкретный другу — начинается перебирания всех картинок в поисках той самой. «проблем современного человека».</p>

<p>Но я же программист! Решил автоматизировать этот процесс и сделать <strong>meme archive</strong> с поиском по картинкам. Изначальная идея была простой:</p>

<ol>
  <li>Преобразовывать картинки в векторы (embeddings) через ИИ</li>
  <li>Делать то же самое с текстовыми запросами</li>
  <li>Искать совпадения через векторную БД</li>
</ol>

<p>Но тут начались проблемы. Не нашёл <strong>бесплатного API</strong> для моделей типа BLIP, которые работают в едином векторном пространстве для текста и изображений. Запускать локально на ПК тоже не хотелось — долго и требует ресурсов.</p>

<p>Пришлось идти по тупому пути:</p>
<ul>
  <li>Использовал бесплатный API Google AI Studio (да, он не работает в РФ, как и большинство  сервисов)</li>
  <li>Модель <code class="language-plaintext highlighter-rouge">gemini-flash-lite-latest</code> генерирует текстовое описание для каждого мема</li>
  <li>Для этих описаний создаю эмбеддинги</li>
  <li>Храню всё в векторной БД <a href="https://github.com/chroma-core/chroma">Chroma</a></li>
</ul>

<p><a href="https://github.com/ShadowCHuyna/meme_archive">Код проекта</a></p>

<p><img src="/assets/imgs/meme-archive.png" alt="meme archive" /></p>]]></content><author><name>Sch</name></author><category term="search" /><category term="memes" /><category term="ai" /><category term="embeddings" /><summary type="html"><![CDATA[Как я автоматизировал поиск мемов с помощью ИИ генерация описаний через Google Gemini, создание текстовых эмбеддингов и хранение в векторной базе Chroma. Практический кейс построения личного meme archive.]]></summary></entry></feed>