<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://vitaliitolokov.ru/feed.xml" rel="self" type="application/atom+xml" /><link href="https://vitaliitolokov.ru/" rel="alternate" type="text/html" /><updated>2026-05-23T09:51:20+00:00</updated><id>https://vitaliitolokov.ru/feed.xml</id><title type="html">Vitaliy Tolokov’s Blog</title><subtitle>Веб-разработчик. Истории из жизни, AI, пет-проекты и профессиональное развитие.</subtitle><author><name>Vitaliy Tolokov</name></author><entry><title type="html">RSS на Jekyll: лента без ручной настройки</title><link href="https://vitaliitolokov.ru/rss-lenta-na-bloge/" rel="alternate" type="text/html" title="RSS на Jekyll: лента без ручной настройки" /><published>2026-05-22T07:00:00+00:00</published><updated>2026-05-22T07:00:00+00:00</updated><id>https://vitaliitolokov.ru/rss-lenta-na-bloge</id><content type="html" xml:base="https://vitaliitolokov.ru/rss-lenta-na-bloge/"><![CDATA[<p>Новый пост в <code class="language-plaintext highlighter-rouge">_posts/</code> после деплоя сам попадает в Atom-ленту — отдельный шаг для RSS не нужен. Ниже — как это устроено на этом блоге и что проверить перед публикацией.</p>

<h2 id="зачем-вообще-rss">Зачем вообще RSS</h2>

<p>Читатель один раз добавляет URL ленты в Feedly, Inoreader или встроенный RSS в браузере. Приложение периодически запрашивает <code class="language-plaintext highlighter-rouge">feed.xml</code> и показывает заголовки и ссылки на свежие записи. Это не рассылка на почту: блог ничего не «отправляет», только отдаёт XML при сборке.</p>

<h2 id="что-делает-jekyll">Что делает Jekyll</h2>

<ol>
  <li>Файл лежит в <code class="language-plaintext highlighter-rouge">_posts/</code> с именем <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-slug.md</code> — дата в имени задаёт день публикации.</li>
  <li>В front matter поле <code class="language-plaintext highlighter-rouge">date</code> уточняет момент; дата в будущем скрывает пост до наступления этого дня.</li>
  <li>Плагин <code class="language-plaintext highlighter-rouge">jekyll-feed</code> генерирует <code class="language-plaintext highlighter-rouge">/feed.xml</code> из уже опубликованных постов (заголовок, дата, ссылка, excerpt).</li>
</ol>

<p>На проде лента: <code class="language-plaintext highlighter-rouge">https://vitaliitolokov.ru/feed.xml</code>. В подвале сайта и в <code class="language-plaintext highlighter-rouge">&lt;head&gt;</code> есть ссылка для подписки.</p>

<h2 id="чек-лист-перед-пушем">Чек-лист перед пушем</h2>

<table>
  <thead>
    <tr>
      <th>Проверка</th>
      <th>Зачем</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Имя файла и <code class="language-plaintext highlighter-rouge">date</code> совпадают по дню</td>
      <td>Иначе путается URL и сортировка</td>
    </tr>
    <tr>
      <td>Нет <code class="language-plaintext highlighter-rouge">published: false</code> и <code class="language-plaintext highlighter-rouge">hidden: true</code></td>
      <td>Пост не попадёт в ленту</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">excerpt</code> заполнен</td>
      <td>Нормальный анонс в RSS-клиенте</td>
    </tr>
    <tr>
      <td>Хотя бы один тег из фильтра на главной</td>
      <td>Пост виден при фильтрации</td>
    </tr>
  </tbody>
</table>

<p>Локально после сохранения: <code class="language-plaintext highlighter-rouge">http://127.0.0.1:4000/feed.xml</code> — в XML должна появиться новая <code class="language-plaintext highlighter-rouge">&lt;entry&gt;</code>.</p>

<h2 id="итог">Итог</h2>

<p>Достаточно положить markdown в <code class="language-plaintext highlighter-rouge">_posts/</code> и задеплоить сайт. Подписчики увидят запись, когда их клиент снова опросит ленту — обычно в течение минут или часа, не мгновенно.</p>

<p>Если понадобится email-рассылка — это отдельный сервис; <code class="language-plaintext highlighter-rouge">jekyll-feed</code> её не заменяет.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="процессы" /><summary type="html"><![CDATA[Как feed.xml появляется при сборке, что видит подписчик и почему дата в имени файла влияет на публикацию.]]></summary></entry><entry><title type="html">Локальная LLM за вечер: что получилось, а что нет</title><link href="https://vitaliitolokov.ru/llm-lokalno/" rel="alternate" type="text/html" title="Локальная LLM за вечер: что получилось, а что нет" /><published>2026-05-20T00:00:00+00:00</published><updated>2026-05-20T00:00:00+00:00</updated><id>https://vitaliitolokov.ru/llm-lokalno</id><content type="html" xml:base="https://vitaliitolokov.ru/llm-lokalno/"><![CDATA[<p>В этой заметке — <strong>рыба</strong>: текст-заглушка, чтобы проверить ленту, карточки и страницу поста.</p>

<h2 id="зачем-вообще-локально">Зачем вообще локально</h2>

<p>Многие разработчики хотят гонять модели без отправки данных наружу. На практике упираешься в VRAM, скорость диска и то, насколько терпелив ты к «подумай ещё пять секунд» на каждый ответ.</p>

<blockquote>
  <p>Цитата-рыба: «Иногда достаточно семи миллиардов параметров, чтобы понять, что восьмых у тебя на видеокарте нет».</p>
</blockquote>

<h2 id="чек-лист-который-я-себе-оставил">Чек-лист, который я себе оставил</h2>

<ol>
  <li>Скачать рантайм и одну небольшую модель.</li>
  <li>Прогнать три типовых промпта: код, суммаризация, болтовня.</li>
  <li>Записать время ответа и качество — <strong>без иллюзий</strong>.</li>
</ol>

<h2 id="итог-пока-черновик">Итог (пока черновик)</h2>

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

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code># псевдокоманда для заметки
ollama run example-model "Объясни разницу между FP16 и Q4"
</code></pre></div></div>

<p>Дальше сюда пойдут реальные цифры и скриншоты — сейчас только структура и <strong>рыбный</strong> абзац для вёрстки.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="llm" /><summary type="html"><![CDATA[Пробный запуск модели на домашнем ПК: железо, квантование и первые промпты без облака.]]></summary></entry><entry><title type="html">Пет-проект: трекер привычек на выходных</title><link href="https://vitaliitolokov.ru/habit-tracker/" rel="alternate" type="text/html" title="Пет-проект: трекер привычек на выходных" /><published>2026-04-12T07:00:00+00:00</published><updated>2026-04-12T07:00:00+00:00</updated><id>https://vitaliitolokov.ru/habit-tracker</id><content type="html" xml:base="https://vitaliitolokov.ru/habit-tracker/"><![CDATA[<p><strong>Рыба-текст.</strong> Идея простая: не «супер-приложение», а страница, где видно, сколько дней подряд ты не забыл про зарядку, чтение или воду.</p>

<h2 id="scope-на-два-дня">Scope на два дня</h2>

<table>
  <thead>
    <tr>
      <th>Блок</th>
      <th>Сделано в MVP</th>
      <th>Отложено</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>UI</td>
      <td>Список + чек</td>
      <td>Графики, бейджи</td>
    </tr>
    <tr>
      <td>Данные</td>
      <td>SQLite</td>
      <td>Синхронизация</td>
    </tr>
    <tr>
      <td>Авторизация</td>
      <td>Нет</td>
      <td>OAuth, magic link</td>
    </tr>
  </tbody>
</table>

<h2 id="архитектура-рыба">Архитектура-рыба</h2>

<p>Фронт шлёт PATCH на <code class="language-plaintext highlighter-rouge">/api/habits/:id/toggle</code>. Бэкенд — тонкая обёртка над одной таблицей <code class="language-plaintext highlighter-rouge">habit_log</code>. Никаких микросервисов, никакой «платформы привычек».</p>

<h2 id="что-раздражало">Что раздражало</h2>

<ul>
  <li>Переусложнить стейт на первом экране.</li>
  <li>Писать README длиннее, чем код (почти попался).</li>
</ul>

<h2 id="планы">Планы</h2>

<p>Добавить экспорт в CSV и тёмную тему. Пока пост существует только чтобы <strong>заполнить блог</strong> и проверить категорию <code class="language-plaintext highlighter-rouge">projects</code> в URL.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="pet-project" /><summary type="html"><![CDATA[Минимальный MVP: одна таблица, три привычки и честный отказ от лишних фич.]]></summary></entry><entry><title type="html">Неделя на удалёнке: ритм, шум и кофе</title><link href="https://vitaliitolokov.ru/remote-week/" rel="alternate" type="text/html" title="Неделя на удалёнке: ритм, шум и кофе" /><published>2026-03-08T15:45:00+00:00</published><updated>2026-03-08T15:45:00+00:00</updated><id>https://vitaliitolokov.ru/remote-week</id><content type="html" xml:base="https://vitaliitolokov.ru/remote-week/"><![CDATA[<p>Это <strong>история-рыба</strong>: вымышленная неделя, чтобы на главной было о чём почитать.</p>

<p>Понедельник начался с раннего стендапа и позднего завтрака. Вторник — с ремонтом у соседей и наушниками с шумоподавлением. К среде стало ясно, что «ещё один быстрый созвон» — это не быстро.</p>

<h2 id="маленькие-правила-тестовые">Маленькие правила (тестовые)</h2>

<ul>
  <li><strong>Окна без встреч</strong> — хотя бы два часа подряд.</li>
  <li>Прогулка между обедом и код-ревью — не опция, а перезагрузка.</li>
  <li>Вечером не открывать рабочий мессенджер «на минутку».</li>
</ul>

<h2 id="абзац-для-длины">Абзац для длины</h2>

<p>Когда весь дом становится офисом, границы размываются сами собой. Записывать конец рабочего дня в календарь звучит смешно, но помогает не дописывать отчёты в полночь. Рыбный вывод: ритм важнее мотивационных плакатов.</p>

<hr />

<p><em>Дальше — реальные фото и анекдоты из жизни; сейчас только заглушка.</em></p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="удалёнка" /><summary type="html"><![CDATA[Не советы из Pinterest, а заметки о том, как съехали созвоны и личные дела в один календарь.]]></summary></entry><entry><title type="html">Сборка блога на Jekyll: от темы до деплоя</title><link href="https://vitaliitolokov.ru/jekyll-blog-setup/" rel="alternate" type="text/html" title="Сборка блога на Jekyll: от темы до деплоя" /><published>2026-02-01T06:15:00+00:00</published><updated>2026-02-01T06:15:00+00:00</updated><id>https://vitaliitolokov.ru/jekyll-blog-setup</id><content type="html" xml:base="https://vitaliitolokov.ru/jekyll-blog-setup/"><![CDATA[<p><strong>Техническая рыба</strong> про настройку этого репозитория.</p>

<h2 id="стек">Стек</h2>

<ul>
  <li>Jekyll 4.x</li>
  <li>Тема Minimal Mistakes (локально через gem)</li>
  <li>Пагинация <code class="language-plaintext highlighter-rouge">jekyll-paginate</code>, пять постов на страницу</li>
  <li><code class="language-plaintext highlighter-rouge">permalink: /:title/</code></li>
</ul>

<h2 id="что-сознательно-выкинули">Что сознательно выкинули</h2>

<p>Главная-визитка со splash, меню из трёх кнопок, отдельная страница <code class="language-plaintext highlighter-rouge">/about/</code>. Осталась лента на <code class="language-plaintext highlighter-rouge">/</code> и боковая карточка автора из <code class="language-plaintext highlighter-rouge">_config.yml</code>.</p>

<h2 id="фрагмент-front-matter-пример">Фрагмент front matter (пример)</h2>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Заголовок"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-02-01 09:15:00 +0300</span>
<span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">процессы</span><span class="pi">]</span>
<span class="na">excerpt</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Короткое</span><span class="nv"> </span><span class="s">описание</span><span class="nv"> </span><span class="s">для</span><span class="nv"> </span><span class="s">списка."</span>
<span class="nn">---</span>
</code></pre></div></div>

<h2 id="деплой-заглушка">Деплой (заглушка)</h2>

<p>Сборка: <code class="language-plaintext highlighter-rouge">bundle exec jekyll build</code>. Для GitHub Pages — ветка <code class="language-plaintext highlighter-rouge">gh-pages</code> или Actions; детали допишу, когда подключу домен окончательно.</p>

<p>Пока цель поста — <strong>наполнить архив</strong> и проверить хлебные крошки, время чтения и related posts.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="процессы" /><summary type="html"><![CDATA[Как завёл статический блог, убрал лишние страницы и оставил ленту постов на корне сайта.]]></summary></entry><entry><title type="html">Созвон с командой после паузы</title><link href="https://vitaliitolokov.ru/team-sync/" rel="alternate" type="text/html" title="Созвон с командой после паузы" /><published>2025-12-15T13:00:00+00:00</published><updated>2025-12-15T13:00:00+00:00</updated><id>https://vitaliitolokov.ru/team-sync</id><content type="html" xml:base="https://vitaliitolokov.ru/team-sync/"><![CDATA[<p><strong>Рыбный отчёт</strong> о воображаемом созвоне.</p>

<h2 id="повестка">Повестка</h2>

<ol>
  <li>Статус по задачам в бэклоге.</li>
  <li>Договорённости по ревью и релизам.</li>
  <li>Пять минут «как вы отдохнули» — чтобы не превращать всё в митинг ради митинга.</li>
</ol>

<h2 id="заметки-в-свободной-форме">Заметки в свободной форме</h2>

<p>Часть контекста пришлось восстанавливать по старым тредам. Оказалось, что половина «срочного» декабря уже не срочная. Хороший знак.</p>

<h2 id="action-items-фиктивные">Action items (фиктивные)</h2>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Обновить доску</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Согласовать окно для релиза</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Не плодить новые чаты</li>
</ul>

<p>Текст длинный <strong>намеренно</strong>: проверить отображение списков, чекбоксов и даты в архиве по годам.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="быт" /><summary type="html"><![CDATA[Первый синк после каникул: что вспомнили, что забыли и что перенесли на январь.]]></summary></entry><entry><title type="html">Автогенерация UI: hype vs польза</title><link href="https://vitaliitolokov.ru/ui-codegen/" rel="alternate" type="text/html" title="Автогенерация UI: hype vs польза" /><published>2025-10-03T08:30:00+00:00</published><updated>2025-10-03T08:30:00+00:00</updated><id>https://vitaliitolokov.ru/ui-codegen</id><content type="html" xml:base="https://vitaliitolokov.ru/ui-codegen/"><![CDATA[<p>Заглушка под будущий разбор инструментов. <strong>Рыба</strong>, но с наброском структуры.</p>

<h2 id="гипотеза">Гипотеза</h2>

<p>Если на входе чёткий design token и компонентная библиотека, генерация даёт каркас быстрее, чем копипаст из старых Storybook-историй.</p>

<h2 id="где-сломалось">Где сломалось</h2>

<ul>
  <li>Нестандартная сетка — модель «додумывает» отступы.</li>
  <li>Сложные состояния (error, loading, empty) приходится дописывать вручную.</li>
  <li>Accessibility проверяется отдельно, не «из коробки».</li>
</ul>

<h2 id="мини-таблица-ожиданий">Мини-таблица ожиданий</h2>

<table>
  <thead>
    <tr>
      <th>Этап</th>
      <th>Ожидание</th>
      <th>Реальность (рыба)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Макет</td>
      <td>10 мин</td>
      <td>10 мин + правки</td>
    </tr>
    <tr>
      <td>Вёрстка</td>
      <td>1 час</td>
      <td>40 мин + ревью</td>
    </tr>
    <tr>
      <td>Регрессии</td>
      <td>0</td>
      <td>Всегда &gt; 0</td>
    </tr>
  </tbody>
</table>

<h2 id="вывод-черновик">Вывод-черновик</h2>

<p>Использовать как <strong>ускоритель черновика</strong>, не как замену дизайнеру и фронтендеру. Следующий пост в этой же категории — с реальными промптами и diff’ами.</p>]]></content><author><name>Vitaliy Tolokov</name></author><category term="llm" /><summary type="html"><![CDATA[Погонял генерацию макетов и компонентов — где экономия времени, а где правки дольше верстки.]]></summary></entry></feed>