<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Denis Evsyukov</title><link>https://www.juev.org/</link><description>Recent content on Denis Evsyukov</description><generator>Hugo -- gohugo.io</generator><language>ru-RU</language><managingEditor>denis@evsyukov.org (Denis Evsyukov)</managingEditor><webMaster>denis@evsyukov.org (Denis Evsyukov)</webMaster><copyright>This work is licensed under a MIT License.</copyright><lastBuildDate>Sat, 06 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.juev.org/atom.xml" rel="self" type="application/rss+xml"/><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><title>Ссылки #393</title><link>https://www.juev.org/2026/06/06/weblinks-393/</link><pubDate>Sat, 06 Jun 2026 08:54:16 +0300</pubDate><author>denis@evsyukov.org (Denis Evsyukov)</author><guid>https://www.juev.org/2026/06/06/weblinks-393/</guid><description>&lt;p&gt;За прошедшую неделю собрал 23 ссылки.&lt;/p&gt;
&lt;h2 id="-ai"&gt;&lt;a href="#-ai" class="post_hash"&gt;&#129302; AI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/mims-harvard/AutoScientists"&gt;mims-harvard/AutoScientists&lt;/a&gt;
&lt;/strong&gt;
Система AI-агентов для долгих вычислительных научных экспериментов: агенты сами собираются в команды вокруг перспективных гипотез, критикуют предложения друг друга до траты вычислений на эксперимент и обмениваются удачами и провалами. Координация децентрализована, через локальный сервер, а не из единого центра.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/LearningCircuit/local-deep-research"&gt;LearningCircuit/local-deep-research&lt;/a&gt;
&lt;/strong&gt;
Open-source research-ассистент для автономных глубоких исследований: поиск по 10+ источникам (arXiv, PubMed, Wikipedia, GitHub), 100+ моделей через Ollama и облако, шифрование баз и нулевая телеметрия. Всё может работать локально — приватность по умолчанию.&lt;/p&gt;
&lt;h2 id="-инструменты"&gt;&lt;a href="#-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%bc%d0%b5%d0%bd%d1%82%d1%8b" class="post_hash"&gt;&#128187; Инструменты&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/harehare/mq"&gt;harehare/mq&lt;/a&gt;
&lt;/strong&gt;
jq для Markdown: командная утилита на Rust, которая фильтрует и трансформирует документ по структуре, а не по тексту. Полезна для LLM-пайплайнов, аудита документации и пакетной обработки &lt;code&gt;.md&lt;/code&gt;-файлов. Есть REPL, VSCode-расширение и несколько форматов вывода.&lt;/p&gt;
&lt;h2 id="-приватность"&gt;&lt;a href="#-%d0%bf%d1%80%d0%b8%d0%b2%d0%b0%d1%82%d0%bd%d0%be%d1%81%d1%82%d1%8c" class="post_hash"&gt;&#128274; Приватность&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://techcrunch.com/2026/06/04/filtr-is-a-new-privacy-tool-that-blocks-ads-in-almost-every-iphone-and-mac-app/"&gt;Filtr is a new privacy tool that blocks ads in almost every iPhone and Mac app&lt;/a&gt;
&lt;/strong&gt;
Блокировщик рекламы уровня системы от автора Safari-блокировщика Wipr. Использует новый URL-фильтр из iOS 26 и macOS 26 и режет рекламные сети не только в браузере, но почти во всех приложениях. Блок-лист хранится на устройстве и обновляется сам.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;На этой неделе — от AI-агентов, ведущих научные эксперименты, и локального research-ассистента до jq для Markdown и системного блокировщика рекламы на iOS и macOS.&lt;/p&gt;
&lt;p&gt;Хорошей вам недели!&lt;/p&gt;
&lt;p&gt;Читайте оригинал на странице: &lt;a href="https://www.juev.org/2026/06/06/weblinks-393/" alt="Ссылки #393"&gt;Ссылки #393&lt;/a&gt; (Denis Evsyukov)&lt;/p&gt;</description></item><item><title>Ссылки #392</title><link>https://www.juev.org/2026/05/30/weblinks-392/</link><pubDate>Sat, 30 May 2026 15:03:23 +0300</pubDate><author>denis@evsyukov.org (Denis Evsyukov)</author><guid>https://www.juev.org/2026/05/30/weblinks-392/</guid><description>&lt;p&gt;За прошедшую неделю собрал 27 ссылок.&lt;/p&gt;
&lt;h2 id="-ai"&gt;&lt;a href="#-ai" class="post_hash"&gt;&#129302; AI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html"&gt;Using Claude Code: The unreasonable effectiveness of HTML&lt;/a&gt;
&lt;/strong&gt;
Команда Claude Code объясняет, почему HTML выигрывает у Markdown для результатов работы агентов: плотность информации, визуальная наглядность, лёгкий шеринг и интерактивность.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rasbt/LLMs-from-scratch"&gt;rasbt/LLMs-from-scratch&lt;/a&gt;
&lt;/strong&gt;
Реализация GPT-подобного LLM на PyTorch с нуля, шаг за шагом — официальный репозиторий книги Себастьяна Рашки, 96K звёзд.&lt;/p&gt;
&lt;h2 id="-программирование"&gt;&lt;a href="#-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5" class="post_hash"&gt;&#128187; Программирование&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://skybert.net/llm/looking-closer-at-claude-generated-lisp-code/"&gt;Looking closer at Claude Generated Lisp Code | skybert.net&lt;/a&gt;
&lt;/strong&gt;
Разбор AI-сгенерированного Emacs Lisp кода: автор обнаружил, что Claude написал десятки строк там, где хватило бы трёх вызовов стандартного API. Хорошее напоминание, почему AI-код нужно ревьюить.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://habr.com/ru/articles/1037410/"&gt;Production начинается там, где заканчивается вайбкодинг&lt;/a&gt;
&lt;/strong&gt;
История pet-проекта, собранного с помощью LLM: демка собирается быстро, а sync, rollback, техдолг, безопасность и эксплуатация требуют ещё месяцев инженерной работы. О разрыве между вайбкодингом и production.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;На этой неделе — от HTML как формата для AI-агентов и книги по LLM с нуля до ревью AI-сгенерированного кода и опыта превращения вайбкодинг-демки в production.&lt;/p&gt;
&lt;p&gt;Хорошей вам недели!&lt;/p&gt;
&lt;p&gt;Читайте оригинал на странице: &lt;a href="https://www.juev.org/2026/05/30/weblinks-392/" alt="Ссылки #392"&gt;Ссылки #392&lt;/a&gt; (Denis Evsyukov)&lt;/p&gt;</description></item><item><title>Пароль по словам: разбор идеи о многошаговой авторизации</title><link>https://www.juev.org/2026/05/25/multistep-password/</link><pubDate>Mon, 25 May 2026 15:25:00 +0300</pubDate><author>denis@evsyukov.org (Denis Evsyukov)</author><guid>https://www.juev.org/2026/05/25/multistep-password/</guid><description>&lt;p&gt;Обычный вход устроен просто до примитивности. Есть поле для имени и поле для
пароля, вы заполняете оба, нажимаете кнопку — и за один запрос отправляете на
сервер всё сразу. Сервер сверяет и тут же отвечает: пустили или нет. Одна
попытка — один ответ, мгновенно.&lt;/p&gt;
&lt;p&gt;Именно эта мгновенность и не даёт покоя. Раз каждая попытка возвращает сразу
понятный результат, её можно повторять машинально, тысячами в секунду. Так и
работает перебор: берём словарь, скармливаем его форме входа, ждём, когда
сервер скажет «да». Чем быстрее цикл «отправил — получил ответ», тем дешевле
атака.&lt;/p&gt;
&lt;p&gt;Отсюда напрашивается идея, которую я и хочу разобрать. А что если не отправлять
пароль одним куском?&lt;/p&gt;
&lt;h2 id="суть-предложения"&gt;&lt;a href="#%d1%81%d1%83%d1%82%d1%8c-%d0%bf%d1%80%d0%b5%d0%b4%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f" class="post_hash"&gt;Суть предложения&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Пусть пароль — это не строка, а несколько отдельных «слов». Каждое слово
вводится и уходит на сервер само по себе, отдельным шагом. Вход превращается в
цепочку: слово, потом ещё слово, потом ещё. А ответ — пустили или нет —
приходит только в самом конце, на заранее условленном шаге. Скажем, после
третьего слова. Или после восьмого.&lt;/p&gt;
&lt;p&gt;От имени пользователя при этом, возможно, можно вообще отказаться и опознавать
человека только по самой цепочке.&lt;/p&gt;
&lt;p&gt;Логика за этим такая. Чтобы проверить одну догадку, переборщику теперь надо
отправить не один запрос, а целую серию. Промежуточные шаги молчат — нельзя
понять, на каком именно слове ты ошибся. А раз так, рассуждение продолжается,
то и сами слова не обязаны быть особенно сложными.&lt;/p&gt;
&lt;p&gt;Идея красивая. И, что интересно, она нащупывает сразу несколько вещей, которые
в безопасности действительно важны. Но ровно в том месте, где она обещает
главную выгоду, она и разваливается. Давайте по порядку — сначала про то, что
угадано верно, потом про то, что нет.&lt;/p&gt;
&lt;h2 id="что-в-этой-идее-угадано-верно"&gt;&lt;a href="#%d1%87%d1%82%d0%be-%d0%b2-%d1%8d%d1%82%d0%be%d0%b9-%d0%b8%d0%b4%d0%b5%d0%b5-%d1%83%d0%b3%d0%b0%d0%b4%d0%b0%d0%bd%d0%be-%d0%b2%d0%b5%d1%80%d0%bd%d0%be" class="post_hash"&gt;Что в этой идее угадано верно&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Не говорить, где именно ошибся.&lt;/strong&gt; Это не выдумка, а давний принцип. Хорошо
сделанный вход уже сейчас не сообщает, что неверно — имя или пароль. Он отвечает
одинаково расплывчато в обоих случаях, потому что любая подсказка сужает
переборщику пространство поиска. Больше того: грамотная проверка пароля сравнивает
строки за постоянное время, не прерываясь на первом несовпавшем символе.
Иначе появляется тонкая лазейка — атака по времени ответа: по тому, насколько
быстро сервер сказал «нет», можно угадывать пароль по одному символу&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.
Так что «не выдавать, где ошибка» — это правильный инстинкт. Запомним его, он
ещё пригодится.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Секретная последовательность как условие доступа.&lt;/strong&gt; Это тоже не новость — это
буквально существует и называется &lt;em&gt;port knocking&lt;/em&gt;, «стук в порты». Сервис
прячется за наглухо закрытым межсетевым экраном и открывает порт только тому,
кто постучал в заранее условленную последовательность портов. Пока вся
последовательность не пройдена правильно, снаружи всё выглядит закрытым, и —
ключевой момент — сервер ничего не подтверждает на промежуточных шагах, он
вообще не отвечает&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;. Есть и более зрелый вариант, &lt;em&gt;single packet
authorization&lt;/em&gt;, где весь «стук» упакован в один зашифрованный пакет с подписью
и меткой времени&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;. То есть идея «пройди скрытую цепочку, и только тогда
получишь доступ» в мире существует и работает.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пароль из нескольких слов.&lt;/strong&gt; И это давно живёт под именем «парольная фраза».
Современные рекомендации, в том числе NIST, прямо советуют делать ставку на
длину, а не на вычурный набор символов, и не навязывать пользователю обязательные
спецсимволы — длинная фраза из обычных слов стойче к перебору и при этом легче
запоминается&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Так что на прямой вопрос «делает ли кто-то подобное» честный ответ: по духу —
да, по частям. Скрытая последовательность без обратной связи — это port
knocking. Пароль из слов — это парольная фраза. Есть и более экзотика:
в патентах попадаются «многоуровневые матричные пароли» и схемы
последовательной аутентификации, где итоговый вердикт выносится только после
всех шагов&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;. Идея витает в воздухе.&lt;/p&gt;
&lt;p&gt;Вопрос в другом: складывается ли из этих верных кусочков работающая защита от
перебора. И вот тут начинаются проблемы.&lt;/p&gt;
&lt;h2 id="где-идея-ломается"&gt;&lt;a href="#%d0%b3%d0%b4%d0%b5-%d0%b8%d0%b4%d0%b5%d1%8f-%d0%bb%d0%be%d0%bc%d0%b0%d0%b5%d1%82%d1%81%d1%8f" class="post_hash"&gt;Где идея ломается&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Несколько шагов не добавляют ни бита стойкости.&lt;/strong&gt; Это главное. Пароль
«ёлка кофе мост», проверенный только в самом конце, ничем не отличается от одной
строки «ёлкакофемост», по которой выносят единственный вердикт «да/нет».
Стойкость к перебору определяется размером пространства, которое нужно
прочесать, — а оно зависит от того, сколько и каких слов вы выбрали, а не от
того, в скольких запросах их отправили. Разбили вы фразу на три пакета или
послали одним — пространство поиска то же самое. Если слова слабые, слабой будет
и вся комбинация, в один запрос её отправили или в восемь.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;«Не понять, где ошибся» — это и так поведение нормальной системы.&lt;/strong&gt; Мы только
что про это говорили: правильный вход и без всякой многошаговости отвечает
одним битом на весь пароль и не показывает, какой символ не сошёлся. Получается,
многошаговая схема не добавляет это свойство — она лишь заново, дороже и
сложнее, воспроизводит то, что и так есть по умолчанию.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Перебор тормозит совсем другое.&lt;/strong&gt; Не число запросов. Атакующий не сидит за
формой входа руками — он гоняет запросы скриптом, может слать их пачками, не
дожидаясь ответа. Лишние шаги для скрипта почти ничего не стоят. По-настоящему
перебор душат три вещи: ограничение числа попыток с растущей задержкой,
блокировка после серии неудач и намеренно медленный хеш пароля — bcrypt,
Argon2, — когда каждая проверка стоит атакующему ощутимых вычислений. NIST,
к слову, рекомендует именно ограничение попыток как основную меру против
перебора&lt;sup id="fnref1:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;. Многошаговый вход ни одну из этих трёх вещей не усиливает.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Серверу теперь надо помнить незаконченные попытки.&lt;/strong&gt; Чтобы проверять слова по
одному и молчать до конца, сервер обязан хранить состояние каждой начатой
цепочки — в том числе брошенной на полпути или заведомо неверной. Это новая
поверхность для атаки. Достаточно начинать миллионы цепочек и не доводить их до
конца, чтобы засыпать сервер мусорным состоянием, — отказ в обслуживании
получается почти бесплатно. У обычного пароля, который проверяется одним
запросом без всякой памяти о попытке, этой проблемы просто нет.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Отказ от имени делает хуже, а не лучше.&lt;/strong&gt; Имя пользователя — это не секрет,
это указатель, по которому система находит нужную учётную запись. Уберите его —
и пропадёт сама возможность считать попытки на конкретный аккаунт, заблокировать
его, предупредить владельца о подозрительной активности. А ведь ограничение
попыток на учётную запись — это и есть главная защита от перебора. Вдобавок
появляется риск столкновений: если две цепочки слов совпали, второй человек
войдёт в чужой аккаунт. Так что опознавание «только по паролю» не усиливает
защиту, а выбивает из-под неё опору.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;«Слова можно попроще» — самая опасная мысль во всей идее.&lt;/strong&gt; Стойкость по-прежнему
равна суммарной энтропии вашего секрета. Разбиение на шаги не выдаёт скидку на
сложность — её просто неоткуда взять. Хуже того: вводить восемь слов подряд
муторно, и пользователь под этим давлением выберет слова покороче и попроще,
то есть собственными руками уменьшит ту самую энтропию, на которой всё держится.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;И, наконец, удобство.&lt;/strong&gt; Многошаговый вход — это лишние действия, больше
шансов забыть слово или его порядок (исследования парольных фраз показывают, что
сбои припоминания тут не редкость&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;), и совершенно неинформативный
провал: опечатался в первом слове — впустую прошёл всю цепочку и не получил ни
намёка, что не так. Принцип «молчим до конца», который задумывался как защита,
по эту сторону экрана оборачивается раздражением.&lt;/p&gt;
&lt;h2 id="что-решает-ту-же-задачу"&gt;&lt;a href="#%d1%87%d1%82%d0%be-%d1%80%d0%b5%d1%88%d0%b0%d0%b5%d1%82-%d1%82%d1%83-%d0%b6%d0%b5-%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d1%83" class="post_hash"&gt;Что решает ту же задачу&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Если отбросить механику и оставить намерение — «сделать каждую догадку дороже и
не дать атакующему обратной связи», — то у отрасли давно есть инструменты,
которые бьют точно в цель:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Медленный хеш — bcrypt, Argon2.&lt;/strong&gt; Делает каждую проверку пароля вычислительно
дорогой. Для одного честного входа это незаметно, для перебора миллионов
вариантов — стена.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ограничение попыток и растущая задержка.&lt;/strong&gt; После нескольких неудач аккаунт
начинает отвечать всё медленнее или временно закрывается. Бьёт ровно по
скорости цикла перебора.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Второй фактор — одноразовые коды (TOTP).&lt;/strong&gt; Добавляет к секрету ещё и
привязку ко времени, которую не подберёшь словарём.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Passkeys и WebAuthn.&lt;/strong&gt; Самое радикальное: вместо общего секрета — пара
ключей, и перебирать становится просто нечего.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Все они дают то, чего хотела многошаговая идея, — и без хранимого состояния,
без отказа в обслуживании и без мучений на входе.&lt;/p&gt;
&lt;h2 id="вывод"&gt;&lt;a href="#%d0%b2%d1%8b%d0%b2%d0%be%d0%b4" class="post_hash"&gt;Вывод&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Идея «пароль по словам» ценна не как готовая схема, а как способ самому, с нуля,
вывести принципы, на которых стоит современная аутентификация: не выдавать, где
ошибка; прятать сервис за секретной последовательностью; делать секрет длинным,
а не вычурным. Всё это — настоящие, рабочие вещи, и приятно, что интуиция к ним
выводит.&lt;/p&gt;
&lt;p&gt;Но как замена паролю она не складывается. Число шагов не двигает ту единственную
величину, которая определяет стойкость к перебору, — энтропию. А то, что она
двигает — количество запросов, — перебор всё равно не останавливает: его
останавливают медленный хеш и ограничение попыток. Там же, где скрытая
последовательность действительно живёт в дикой природе, в port knocking, её
используют не как пароль, а как дополнительный слой маскировки сервиса, да ещё и
в связке с криптографией, а не вместо неё.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Timing attack — Wikipedia. &lt;a href="https://en.wikipedia.org/wiki/Timing_attack"&gt;https://en.wikipedia.org/wiki/Timing_attack&lt;/a&gt;
; разбор на примере имени пользователя: Brendan Long, «Timing attacks and usernames». &lt;a href="https://www.brendanlong.com/timing-attacks-and-usernames.html"&gt;https://www.brendanlong.com/timing-attacks-and-usernames.html&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;Port knocking — Wikipedia. &lt;a href="https://en.wikipedia.org/wiki/Port_knocking"&gt;https://en.wikipedia.org/wiki/Port_knocking&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;Single Packet Authorization. &lt;a href="https://portguard.net/"&gt;https://portguard.net/&lt;/a&gt;
; Michael Rash, «Port Knocking and Single Packet Authorization». &lt;a href="https://www.cipherdyne.org/"&gt;https://www.cipherdyne.org/&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;NIST Special Publication 800-63B, Digital Identity Guidelines. &lt;a href="https://pages.nist.gov/800-63-4/sp800-63b.html"&gt;https://pages.nist.gov/800-63-4/sp800-63b.html&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;Примеры из патентных заявок: «Multi-level matrix passwords» и «Sequential authentication using error rates». &lt;a href="https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/10395015"&gt;https://image-ppubs.uspto.gov/dirsearch-public/print/downloadPdf/10395015&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;Keith et al., «The usability of passphrases for authentication: An empirical field study». &lt;a href="https://www.sciencedirect.com/science/article/abs/pii/S1071581906001236"&gt;https://www.sciencedirect.com/science/article/abs/pii/S1071581906001236&lt;/a&gt;
&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Читайте оригинал на странице: &lt;a href="https://www.juev.org/2026/05/25/multistep-password/" alt="Пароль по словам: разбор идеи о многошаговой авторизации"&gt;Пароль по словам: разбор идеи о многошаговой авторизации&lt;/a&gt; (Denis Evsyukov)&lt;/p&gt;</description></item><item><title>nebula-mesh: панель управления для Nebula, которую я собрал сам</title><link>https://www.juev.org/2026/05/25/nebula-mesh/</link><pubDate>Mon, 25 May 2026 13:30:00 +0300</pubDate><author>denis@evsyukov.org (Denis Evsyukov)</author><guid>https://www.juev.org/2026/05/25/nebula-mesh/</guid><description>&lt;p&gt;Пару месяцев назад я перевёл инфраструктуру с Tailscale на Nebula&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;. Открытая
лицензия, своя PKI, никакой зависимости от чужих координационных серверов —
всё то, чего мне не хватало раньше. Сеть заработала и работает до сих пор.&lt;/p&gt;
&lt;p&gt;А потом начались будни. Добавить сервер — выпусти сертификат руками, скопируй
конфиг, перезапусти. Сертификат скоро протухнет — вспомни про это до того, как
узел отвалится. Поменялось правило firewall — пройдись по всем хостам. Через
месяц такой ручной возни я понял, что мне нужна панель управления. А готовой,
которая бы меня устроила, не нашлось. Так появился nebula-mesh&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id="что-такое-nebula-если-коротко"&gt;&lt;a href="#%d1%87%d1%82%d0%be-%d1%82%d0%b0%d0%ba%d0%be%d0%b5-nebula-%d0%b5%d1%81%d0%bb%d0%b8-%d0%ba%d0%be%d1%80%d0%be%d1%82%d0%ba%d0%be" class="post_hash"&gt;Что такое Nebula, если коротко&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nebula — overlay-сеть, которую сделали инженеры Slack и открыли под
MIT-лицензией в 2019 году. Подробно я разбирал её в прошлой статье&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;, тут
повторю только суть.&lt;/p&gt;
&lt;p&gt;Это виртуальная сеть поверх обычного интернета. Узлы соединяются между собой
напрямую (P2P), а не гоняют трафик через один центральный VPN-сервер.
Несколько узлов работают как lighthouse — «маяки», к которым обращаются
остальные, чтобы найти друг друга и пробить путь сквозь NAT. Шифрование —
на основе Noise, того же, что в WireGuard и Signal.&lt;/p&gt;
&lt;p&gt;Главное для нашего разговора: у Nebula нет облака. Доверие в сети держится
на сертификатах. Вы заводите собственный центр сертификации (CA), храните его
у себя, и каждый узел получает сертификат, подписанный этим CA. В сертификате
записаны имя хоста, его адрес в виртуальной сети, группы и срок действия.
Никаких сторонних серверов в этой схеме нет — и это же её слабое место,
когда узлов становится много.&lt;/p&gt;
&lt;h2 id="как-это-настраивается-руками"&gt;&lt;a href="#%d0%ba%d0%b0%d0%ba-%d1%8d%d1%82%d0%be-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%b0%d0%b8%d0%b2%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d1%80%d1%83%d0%ba%d0%b0%d0%bc%d0%b8" class="post_hash"&gt;Как это настраивается руками&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Базовая настройка выглядит так. Сначала создаёте центр сертификации:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nebula-cert ca -name &lt;span class="s2"&gt;&amp;#34;Моя сеть&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Получаете два файла: &lt;code&gt;ca.key&lt;/code&gt; — закрытый ключ, который нельзя терять и нельзя
показывать никому, и &lt;code&gt;ca.crt&lt;/code&gt; — публичный сертификат, который поедет на все
узлы.&lt;/p&gt;
&lt;p&gt;Дальше на каждый хост выпускаете свой сертификат с уникальным адресом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nebula-cert sign -name &lt;span class="s2"&gt;&amp;#34;server-1&amp;#34;&lt;/span&gt; -ip &lt;span class="s2"&gt;&amp;#34;192.168.100.1/24&amp;#34;&lt;/span&gt; -groups &lt;span class="s2"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Потом пишете для каждого узла YAML-конфиг: где лежат ключи, по какому адресу
искать lighthouse, какие правила firewall. Копируете конфиг и сертификаты
на сервер. Запускаете. И так для каждого узла.&lt;/p&gt;
&lt;p&gt;Для трёх машин это десять минут. Проблема в том, что машин обычно не три.&lt;/p&gt;
&lt;h2 id="где-это-начинает-болеть"&gt;&lt;a href="#%d0%b3%d0%b4%d0%b5-%d1%8d%d1%82%d0%be-%d0%bd%d0%b0%d1%87%d0%b8%d0%bd%d0%b0%d0%b5%d1%82-%d0%b1%d0%be%d0%bb%d0%b5%d1%82%d1%8c" class="post_hash"&gt;Где это начинает болеть&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Чем больше сеть, тем заметнее, что Nebula не даёт инструментов управления —
только утилиту для выпуска сертификатов и сам бинарник узла. Всё остальное
на вас.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Сертификаты живут год.&lt;/strong&gt; По умолчанию CA выпускается на год, хостовые
сертификаты — тоже. Срок подходит — нужно выпустить новые на всех узлах
и перезапустить Nebula везде. Забыли про один сервер — он молча выпадает
из сети.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конфиги разъезжаются.&lt;/strong&gt; Поменяли правило — обходите хосты руками или
поднимаете Ansible. Для десятка узлов Ansible — уже почти обязателен,
и это отдельная история со своей сложностью.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Нет ни кнопки, ни картинки.&lt;/strong&gt; Какие узлы сейчас в сети, у кого скоро
истекает сертификат, кто не выходил на связь — всё это надо собирать
по логам. Веб-интерфейса нет.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Масштаб умножает рутину.&lt;/strong&gt; Сто новых серверов — это сто запусков
&lt;code&gt;nebula-cert sign&lt;/code&gt; и сто копирований файлов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Создатели Nebula это прекрасно понимают. Поэтому у них есть платный продукт,
который всю эту рутину закрывает.&lt;/p&gt;
&lt;h2 id="готовое-решение-defined-networking"&gt;&lt;a href="#%d0%b3%d0%be%d1%82%d0%be%d0%b2%d0%be%d0%b5-%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-defined-networking" class="post_hash"&gt;Готовое решение: Defined Networking&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Те же люди, что написали Nebula, основали компанию Defined Networking
и сделали Managed Nebula&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; — облачную панель управления. Регистрируете
узел через веб-интерфейс или их агент, сертификат и конфиг прилетают сами,
есть единый вход, мобильные приложения, автоматическая ротация. До 100 хостов
бесплатно, дальше доллар за хост в месяц.&lt;/p&gt;
&lt;p&gt;Решение хорошее. Я честно его рассматривал. Не подошло по одной причине:
это чужое облако.&lt;/p&gt;
&lt;p&gt;Панель управления живёт на серверах в США. А значит, между мной и моей
сетью встаёт всё то, что сейчас встаёт между Россией и зарубежными сервисами:
блокировки Роскомнадзора, санкции, ограничения на облачные услуги.
Доступ к defined.net может пропасть не из-за их сбоя, а из-за того, что
где-то по дороге закрыли очередной диапазон адресов. Строить на этом
инфраструктуру, ради которой я и уходил от Tailscale за независимостью,
смысла нет. Если уж self-host — то self-host до конца.&lt;/p&gt;
&lt;h2 id="а-что-с-готовым-self-host"&gt;&lt;a href="#%d0%b0-%d1%87%d1%82%d0%be-%d1%81-%d0%b3%d0%be%d1%82%d0%be%d0%b2%d1%8b%d0%bc-self-host" class="post_hash"&gt;А что с готовым self-host&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Я искал. Зрелых открытых панелей для Nebula почти нет — экосистема намного
беднее, чем у того же Tailscale, где есть Headscale&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Самое заметное, что нашлось, — Supernova&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;. Это control plane для Nebula:
веб-панель, регистрация по токенам, выдача сертификатов. Но проект завязан
на инфраструктуру AWS (DynamoDB, Lambda), давно не обновлялся и выглядит
скорее как доказательство концепции, чем как то, на что можно положиться.
Остальное, что попадалось, — демки и заброшенные репозитории.&lt;/p&gt;
&lt;p&gt;Ничего, что я мог бы поставить на свой сервер и спокойно эксплуатировать,
не нашлось. Поэтому решил написать сам.&lt;/p&gt;
&lt;h2 id="что-получилось"&gt;&lt;a href="#%d1%87%d1%82%d0%be-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d0%bb%d0%be%d1%81%d1%8c" class="post_hash"&gt;Что получилось&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;nebula-mesh — это панель управления для Nebula, которая целиком живёт
на вашем сервере. Никакого облака. Ставится на самую дешёвую виртуалку,
хранит данные в SQLite, не тянет за собой внешних зависимостей.&lt;/p&gt;
&lt;p&gt;Состоит из двух частей:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nebula-mgmt&lt;/code&gt;&lt;/strong&gt; — сервер управления. Веб-интерфейс, API, центр
сертификации, журнал действий. Запускается в одном экземпляре.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;nebula-agent&lt;/code&gt;&lt;/strong&gt; — лёгкий агент, который ставится на каждый узел сети.
Сам регистрируется, сам забирает обновления конфига и сертификата,
сам перезапускает Nebula, когда нужно.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Написано на Go. Веб-интерфейс — на htmx, без тяжёлого фронтенда.&lt;/p&gt;
&lt;h3 id="что-умеет"&gt;&lt;a href="#%d1%87%d1%82%d0%be-%d1%83%d0%bc%d0%b5%d0%b5%d1%82" class="post_hash"&gt;Что умеет&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Управление сертификатами от начала до конца.&lt;/strong&gt; Выпуск, ротация, отзыв.
Закрытый ключ CA лежит в базе зашифрованным (AES-256-GCM); мастер-ключ
для расшифровки передаётся при старте и на диск не пишется. Сертификаты
обновляются автоматически в фоне, до того как протухнут.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Регистрация узлов по одноразовым токенам.&lt;/strong&gt; Создаёте токен в панели,
агент на новом сервере его предъявляет и получает всё необходимое.
Закрытый ключ узла при этом никогда не покидает сам узел.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Телефоны через QR-код.&lt;/strong&gt; Для iOS и Android конфиг отдаётся QR-кодом —
отсканировал в приложении Nebula и готово.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Несколько администраторов.&lt;/strong&gt; У каждого свой изолированный CA. Можно
заходить локальной учёткой или через OIDC (Keycloak, Authentik и подобные),
есть двухфакторная аутентификация по TOTP с резервными кодами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Правила firewall на уровне сети&lt;/strong&gt; — задаются в панели, разъезжаются
по узлам сами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Журнал всех действий&lt;/strong&gt; — кто, что и когда поменял. Плюс метрики
для Prometheus и health-эндпоинты для мониторинга.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="как-пользоваться"&gt;&lt;a href="#%d0%ba%d0%b0%d0%ba-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d1%8c%d1%81%d1%8f" class="post_hash"&gt;Как пользоваться&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;На управляющем сервере ставите &lt;code&gt;nebula-mgmt&lt;/code&gt; (есть пакеты &lt;code&gt;.deb&lt;/code&gt; и &lt;code&gt;.rpm&lt;/code&gt;,
бинарники под Linux, macOS, FreeBSD, Windows и Docker-образы), задаёте
мастер-ключ и инициализируете:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;NEBULA_MGMT_MASTER_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;openssl rand -base64 32&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -E nebula-mgmt init --config /etc/nebula-mgmt/server.yml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now nebula-mgmt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Дальше открываете панель на &lt;code&gt;http://&amp;lt;сервер&amp;gt;:8080/ui/&lt;/code&gt;, заводите оператора
и сеть. Чтобы подключить узел, создаёте для него токен, ставите на него
&lt;code&gt;nebula-agent&lt;/code&gt; и скармливаете токен. Агент сам зарегистрируется, заберёт
сертификат с конфигом и поднимет Nebula. После этого он будет тихо опрашивать
сервер на предмет обновлений и применять их без вашего участия. Точные команды
и актуальную версию смотрите в README&lt;sup id="fnref1:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; — проект ещё активно развивается,
и я не хочу, чтобы статья устарела вместе с номером релиза.&lt;/p&gt;
&lt;h2 id="текущее-состояние-честно"&gt;&lt;a href="#%d1%82%d0%b5%d0%ba%d1%83%d1%89%d0%b5%d0%b5-%d1%81%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b8%d0%b5-%d1%87%d0%b5%d1%81%d1%82%d0%bd%d0%be" class="post_hash"&gt;Текущее состояние, честно&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Проект совсем молодой — я запустил его в этом месяце. Звёзд на GitHub пока
немного, и это нормально для репозитория, которому несколько недель.
Статус — beta: основные сценарии (инициализация, регистрация, опрос, ротация,
отзыв, журнал, несколько CA) покрыты тестами с детектором гонок, но API
ещё может меняться до версии 1.0.&lt;/p&gt;
&lt;p&gt;При этом сеть на нём уже работает по-настоящему — на ней крутится моя
собственная инфраструктура. И, что меня радует, проект не одинокий: появились
контрибьюторы, которые присылают разумные правки, в том числе закрывают
вопросы по безопасности. За первые недели мы успели починить защиту от CSRF,
сделать устойчивое хранилище nonce против replay-атак, ужесточить проверку
прав операторов и изоляцию данных между ними. Для проекта такого возраста
это хороший знак.&lt;/p&gt;
&lt;p&gt;Лицензия — MIT. Если вам тоже нужна mesh-сеть на Nebula, которую можно
держать целиком у себя, без оглядки на чужое облако и чужие блокировки, —
посмотрите &lt;a href="https://github.com/juev/nebula-mesh"&gt;nebula-mesh&lt;/a&gt;
. Баг-репорты, идеи и pull request&amp;rsquo;ы приветствуются.&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://www.juev.org/2026/04/03/nebula-tailscale/"&gt;Nebula: mesh-сеть поверх интернета и мост в Tailscale&lt;/a&gt;
— предыдущая статья, где Nebula разобрана подробно.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://github.com/juev/nebula-mesh"&gt;github.com/juev/nebula-mesh&lt;/a&gt;
— репозиторий проекта, там же README с командами установки.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;a href="https://www.defined.net/"&gt;Defined Networking&lt;/a&gt;
и их &lt;a href="https://www.defined.net/pricing/"&gt;тарифы&lt;/a&gt;
.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="https://github.com/juanfont/headscale"&gt;Headscale&lt;/a&gt;
— открытый координационный сервер для Tailscale.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;&lt;a href="https://github.com/losfair/supernova"&gt;losfair/supernova&lt;/a&gt;
— control plane для Nebula на инфраструктуре AWS.&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Читайте оригинал на странице: &lt;a href="https://www.juev.org/2026/05/25/nebula-mesh/" alt="nebula-mesh: панель управления для Nebula, которую я собрал сам"&gt;nebula-mesh: панель управления для Nebula, которую я собрал сам&lt;/a&gt; (Denis Evsyukov)&lt;/p&gt;</description></item><item><title>Ссылки #391</title><link>https://www.juev.org/2026/05/23/weblinks-391/</link><pubDate>Sat, 23 May 2026 10:18:31 +0300</pubDate><author>denis@evsyukov.org (Denis Evsyukov)</author><guid>https://www.juev.org/2026/05/23/weblinks-391/</guid><description>&lt;p&gt;За прошедшую неделю собрал 22 ссылки.&lt;/p&gt;
&lt;h2 id="-ai"&gt;&lt;a href="#-ai" class="post_hash"&gt;&#129302; AI&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Kappaemme-git/codex-complexity-optimizer"&gt;Kappaemme-git/codex-complexity-optimizer&lt;/a&gt;
&lt;/strong&gt;
Codex skill для безопасного анализа сложности кодовой базы и отчётов по оптимизации производительности.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://timkellogg.me/blog/2026/05/17/ambient-memory"&gt;Ambient Associative Memory&lt;/a&gt;
&lt;/strong&gt;
Тим Келлог размышляет об ambient associative memory — модели памяти, где ассоциации возникают из окружающего контекста, а не из явного извлечения.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Imbad0202/academic-research-skills"&gt;Imbad0202/academic-research-skills&lt;/a&gt;
&lt;/strong&gt;
Набор skills для Claude Code, выстраивающий академический цикл: research → write → review → revise → finalize.&lt;/p&gt;
&lt;h2 id="-продуктивность"&gt;&lt;a href="#-%d0%bf%d1%80%d0%be%d0%b4%d1%83%d0%ba%d1%82%d0%b8%d0%b2%d0%bd%d0%be%d1%81%d1%82%d1%8c" class="post_hash"&gt;&#128221; Продуктивность&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://micro.chadkohalyk.com/2026/05/18/handwriting-journaling-and-llms.html"&gt;Handwriting, journaling, and LLMs&lt;/a&gt;
&lt;/strong&gt;
Чад Кохалик о том, как рукописный journaling уживается с LLM — где они помогают мышлению, а где мешают рукописной рефлексии.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;На этой неделе — от Codex-скилла для анализа сложности и идеи ambient-памяти до академического пайплайна на Claude Code и размышлений о рукописном journaling в эпоху LLM.&lt;/p&gt;
&lt;p&gt;Хорошей вам недели!&lt;/p&gt;
&lt;p&gt;Читайте оригинал на странице: &lt;a href="https://www.juev.org/2026/05/23/weblinks-391/" alt="Ссылки #391"&gt;Ссылки #391&lt;/a&gt; (Denis Evsyukov)&lt;/p&gt;</description></item></channel></rss>