<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Все посты подряд / Python / Хабр]]></title>
    <link>https://habr.com/ru/hubs/python/posts/</link>
    <description><![CDATA[Python – высокоуровневый язык программирования]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 07 May 2026 12:41:26 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    

  

  
  <item>
    <title><![CDATA[Пост @asrelo — Python — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1030730/</guid>
    <link>https://habr.com/ru/posts/1030730/?utm_campaign=1030730&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>В TOML нет <code>null</code>. У меня — есть (только для Python)</strong></p><p><strong>TLDR: </strong>TOML — удобный формат конфигураций, но ему не хватает поддержки <code>null</code>. Создатели языка осознанно отказались и отказываются добавлять <code>null</code>. Я столкнулся с этой проблемой при слиянии TOML-конфигураций в своём Python-проекте и решил её, форкнув популярные библиотеки и добавив в них поддержку значения <code>null</code>  : <a href="https://pypi.org/project/tomli-null/" rel="noopener noreferrer nofollow">tomli-null</a> (парсер) и <a href="https://pypi.org/project/tomli-w-null/" rel="noopener noreferrer nofollow">tomli-w-null</a> (генератор).</p><p><a href="https://toml.io/" rel="noopener noreferrer nofollow">TOML</a> — популярный с недавних пор язык конфигурационных файлов, <s>сочетающий</s> избегающий проблемы других языков:</p><ul><li><p>TOML стандартизован, имеет типы данных, позволяет кодировать вложенные структуры (привет, INI);</p></li><li><p>TOML относительно прост и парсится без хитростей (привет, YAML),</p></li><li><p>синтаксис TOML легко читаем, поддерживает комментарии и не имеет нюансов вроде ошибок от далёких скобок и лишних запятых (привет, JSON).</p></li></ul><p>TOML, согласно <a href="https://toml.io/en/v1.1.0" rel="noopener noreferrer nofollow">спецификации</a>, "стремится быть минимальным форматом для файлов конфигурации, который легко читается благодаря очевидной семантике". С "минимальностью" языка в принципе можно поспорить — там и отдельные типы для даты/времени (4 штуки, 3 из них имеют варианты синтаксиса), и сахар в числовых литералах вроде <code>0xFF00_0000</code>, и непростой синтаксис для ключей (чтобы допускать и сочетать простые ключи, составные ключи, произвольные ключи в кавычках).</p><p>Но вот что я совершенно не ожидал и проглядел, когда выбирал TOML основным форматом для человеко-редактируемых структур данных в своём проекте, — что <strong>в TOML нет <code>null</code></strong>. Вообще. Это осознанное решение создателей языка. Разные аргументы против <code>null</code>, прозвучавшие за это время:</p><ul><li><p>"<em>Если значение не определено, пару ключ-значение просто нужно не указывать.</em>" <em>Нужно</em>, не <em>можно</em>.</p><p>Случаи, когда в приложении значение по умолчанию отличается от <code>null</code>, игнорируются.</p></li><li><p>"<em><code>null</code> создаёт неоднозначность между значением <code>null</code> и отсутствием пары ключ-значение.</em>"</p></li><li><p>"<em>Если мы разрешим <code>null</code>, это повлияет на всю систему типов; например, целое число теперь будет не "целое число", а "</em><a href="https://github.com/toml-lang/toml/issues/146#issuecomment-14217902" rel="noopener noreferrer nofollow"><em>целое число или null</em></a><em>".</em>"</p><p>???</p></li><li><p>"<em>Если очень нужно, вы можете использовать специальные значения по своему усмотрению: <code>0</code>, <code>-1</code>, <code>""</code>, <code>"null"</code>, <code>[]</code>, <code>{}</code>. Ещё можно использовать дополнительные поля для обозначения наличия значения (типа <code>{ present=true, value=100500 }</code>, или <code>null_values = ["key_a", "key_c"]</code>).</em>"</p><p>Гора разнообразных костылей с барского плеча, на пустом месте добавляющие кучу боли для интероперабельности, спасибо.</p></li></ul><p>Ответственных за спецификацию <a href="https://github.com/toml-lang/toml/issues/30" rel="noopener noreferrer nofollow">годами</a> <a href="https://github.com/toml-lang/toml/issues/802" rel="noopener noreferrer nofollow">просят</a> <a href="https://github.com/toml-lang/toml/discussions/1037" rel="noopener noreferrer nofollow">добавить</a> <code>null</code> в будущей версии, ответственные ушли в глухой отказ.</p><p>Для меня наличие <code>null</code> в подобном языке было само собой разумеющимся, я даже не думал об этом, когда разрабатывал сложный проект на Python, где файлы TOML пишутся и читаются человеком, пишутся и читаются программами, сливаются друг с другом. Когда я наконец-то напоролся на практике на отсутствие <code>null</code> (при слиянии конфигураций), менять всё на YAML было уже слишком поздно, а костыли добавили бы слишком много сложности.</p><p>Поэтому я форкнул пару библиотек и добавил в них поддержку <code>null</code> самым очевидным образом, не нуждающимся даже в примерах — просто литерал <code>null</code> на стороне TOML соответствует <code>None</code> на стороне Python.</p><ul><li><p><a href="https://pypi.org/project/tomli-null/" rel="noopener noreferrer nofollow">tomli-null</a> — парсер, форк <a href="https://pypi.org/project/tomli/" rel="noopener noreferrer nofollow">tomli</a> (<code>tomli</code> включена в Python 3.11 как <a href="https://docs.python.org/3/library/tomllib.html" rel="noopener noreferrer nofollow">tomllib</a>);</p></li><li><p><a href="https://pypi.org/project/tomli-w-null/" rel="noopener noreferrer nofollow">tomli-w-null</a> — генератор, форк <a href="https://pypi.org/project/tomli-w/" rel="noopener noreferrer nofollow">tomli-w</a>.</p></li></ul><p>(100% покрытие тестами прилагается само собой.)</p><p>P.S. PyPI очень... <em>интересным </em>образом показывает информацию об авторах из пакета, несколько раз напоролся, пока пытался убрать автора оригинальных библиотек из поля "для связи" на сайте.</p> <a href="https://habr.com/ru/posts/1030730/?utm_campaign=1030730&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 02 May 2026 20:32:20 GMT</pubDate>
    <dc:creator><![CDATA[asrelo]]></dc:creator>
      
      <category><![CDATA[TOML]]></category><category><![CDATA[Python]]></category><category><![CDATA[конфигурация]]></category><category><![CDATA[open source]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 01.05.2026 20:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1030514/</guid>
    <link>https://habr.com/ru/posts/1030514/?utm_campaign=1030514&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/olalie/tapmap" rel="noopener noreferrer nofollow">TapMap</a>, который следит за всеми подключениями на интерактивной карте и показывает, к серверам в каких странах отправляет запросы ПК пользователя. </p><p>Проект сканирует приложения, сервисы, страны и порты за последние 30 дней. При этом данные никуда не улетают — всё локально на компьютере.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/790/d90/ef7/790d90ef73a6457396065f94f66922cb.gif" width="1916" height="1076"></figure> <a href="https://habr.com/ru/posts/1030514/?utm_campaign=1030514&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 01 May 2026 17:06:55 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[TapMap]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @zdanevich-vitaly — Rust (+4) — 30.04.2026 08:28]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1029870/</guid>
    <link>https://habr.com/ru/posts/1029870/?utm_campaign=1029870&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я давний пользователь <a href="https://github.com/vitaly-zdanevich/geeknote" rel="noopener noreferrer nofollow">Geeknote</a> - это cli для <a href="https://evernote.com/" rel="noopener noreferrer nofollow">Evernote</a>. Несколько лет назад проект застрял на втором Питоне - и никто не хотел его портировать на третий. Я ждал что кто-то займётся этим - но пришлось самому - так что я форкнул, починил, и даже связался с Виталием Роденко - одним из создателей Geeknote и администратора на PyPI, чтобы получить право туда пушить. За десяток лет я видел как Geeknote переходил из одни руки в другие - и как он забрасывался, и через несколько лет находился новый мантейнер. Было забавно осознать, что теперь и я стал мантейнером программного продукта, который всегда установлен на все мои машины.</p><p>Как и большинство из нас, я стал пробовать LLM - как замену поиску, для анализа кодов, советов, и вот наконец - несколько проектов - даже не читая кода - только давая команды и тестируя результат. Известная шутка - переписать на Rust. Почему бы у нет - Geeknote не велик - около пяти тысяч строк на Питоне, что я и попробовал - через <strong>Codex gpt-5.5</strong>. Несколько десятков итераций, "добавь это", "добавь то", "пропали теги", "пропала анимация" - и за несколько часов я получил рабочий Geeknote на Rust, назвал его <a href="https://gitlab.com/vitaly-zdanevich/reeknote" rel="noopener noreferrer nofollow">reeknote</a>. </p><p>Результат: быстрее работает, раза в два. Теперь буду им пользоваться.</p><p>P.S.: CLI хороши для перфоманса, SSH, быстрее разработка без GUI, а ещё похоже и для LLM - можно попросить сохранить ответ в Evernote. Как и прочие интеграции, в том числе в скриптах.</p> <a href="https://habr.com/ru/posts/1029870/?utm_campaign=1029870&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 30 Apr 2026 05:28:25 GMT</pubDate>
    <dc:creator><![CDATA[zdanevich-vitaly]]></dc:creator>
      
      <category><![CDATA[evernote]]></category><category><![CDATA[geeknote]]></category><category><![CDATA[cli]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — Интерфейсы (+2) — 28.04.2026 23:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1029316/</guid>
    <link>https://habr.com/ru/posts/1029316/?utm_campaign=1029316&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что&nbsp;такое magicgui и зачем он нам?</strong></p><p><strong><a href="https://github.com/pyapp-kit/magicgui" rel="noopener noreferrer nofollow">magicgui</a> </strong>— это Python‑библиотека для&nbsp;быстрой разработки простых интерфейсов. Если нужен сложный интерфейс с&nbsp;кастомной вёрсткой и нестандартным поведением&nbsp;— лучше взять PyQt‑Pyside. Когда задача обернуть функцию в&nbsp;окошко за 5&nbsp;минут&nbsp;— magicgui справится.</p><p>В&nbsp;настоящее время&nbsp;<strong>magicgui</strong>&nbsp;поддерживает следующие бэкэнды:</p><ul><li><p><a href="https://www.qt.io/" rel="noopener noreferrer nofollow">Qt</a>&nbsp;(через&nbsp;<a href="https://pypi.org/project/PySide2/" rel="noopener noreferrer nofollow">PySide2</a>&nbsp;/&nbsp;<a href="https://pypi.org/project/PySide6/" rel="noopener noreferrer nofollow">PySide6</a>&nbsp;или&nbsp;<a href="https://pypi.org/project/PyQt5/" rel="noopener noreferrer nofollow">PyQt5</a>&nbsp;/&nbsp;<a href="https://pypi.org/project/PyQt6/" rel="noopener noreferrer nofollow">PyQt6</a>&nbsp;)</p></li><li><p><a href="https://ipywidgets.readthedocs.io/en/latest/" rel="noopener noreferrer nofollow">Виджеты Jupyter</a></p></li></ul><p>API организовано на&nbsp;двух уровнях:</p><figure class="bordered full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/81a/715/c93/81a715c93a49425ee6f7e71fef4a6675.png" alt="слои API magicgui" title="слои API magicgui" width="834" height="1158"><div><figcaption>слои API magicgui</figcaption></div></figure><p>Верхний уровень&nbsp;— магия типов. Декораторы <a class="mention" href="/users/magicgui">@magicgui</a>, <a class="mention" href="/users/guiclass">@guiclass</a>, автоопределение виджетов по&nbsp;аннотациям.</p><p>Нижний уровень&nbsp;— ручная сборка из&nbsp;готовых <a href="https://pyapp-kit.github.io/magicgui/widgets/" rel="noopener noreferrer nofollow">виджетов </a>(SpinBox, Slider, PushButton).</p><p><strong>Примеры работы: </strong><a href="https://pyapp-kit.github.io/magicgui/generated_examples/" rel="noopener noreferrer nofollow">https://pyapp‑kit.github.io/magicgui/generated_examples/</a></p><p><strong>Github: </strong><a href="https://github.com/pyapp-kit/magicgui" rel="noopener noreferrer nofollow">https://github.com/pyapp‑kit/magicgui</a></p> <a href="https://habr.com/ru/posts/1029316/?utm_campaign=1029316&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 20:25:42 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[gui]]></category><category><![CDATA[ui]]></category><category><![CDATA[qt]]></category><category><![CDATA[интерфейсы]]></category><category><![CDATA[python]]></category><category><![CDATA[pyqt]]></category><category><![CDATA[pyside]]></category><category><![CDATA[jupyter]]></category><category><![CDATA[jupyter notebook]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Искусственный интеллект (+4) — 28.04.2026 19:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1029260/</guid>
    <link>https://habr.com/ru/posts/1029260/?utm_campaign=1029260&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему цена почти доходит до TP, но разворачивается</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/82e/760/046/82e76004632d75e862d32dea7c6d7422.png" width="1168" height="784"></figure><p><strong>Будущее это вероятностная функция от прошлого</strong>. ATR это чистая функция от прошлого. Разница в том, что в вероятностной функции есть коэфициент случайности и точно прогнозировать можно только лучший и худший случай</p><p>Именно по этому цена не доходит до TP, если высчитать его на индикаторах. Либо TP слишком низкий и не окупает fees. <strong>Верным решением для вероятностной функции будет прогнозировать лучший и худший случай на лету</strong></p><pre><code class="typescript">//@version=5
strategy("Стратегия с TP по ATR")

...

tpPrice    = entryPrice + atrMultTP * atr // Это не работает</code></pre><p>Выходить из позиции при просадке PNL на заранее известный процент статистически предсказуемо.</p><pre><code class="typescript">listenActivePing(async ({ symbol, data }) =&gt; {
  const peakProfitDistance = await getPositionHighestProfitDistancePnlPercentage(symbol);
  const currentProfit = await getPositionPnlPercent(symbol);

  if (currentProfit &lt; 0) {
    return;
  }

  if (peakProfitDistance &lt; TRAILING_TAKE) {
    return;
  }

  await commitClosePending(symbol, {
    id: "unknown",
    note: str.newline(
      "# Позиция закрыта по trailing take",
    ),
  });
});</code></pre><p>Тут есть разница: в отличие от классического trailing take где выход из позиции ставится на цену, которая каждый раз разная, отклонение PnL - постоянная величина</p> <a href="https://habr.com/ru/posts/1029260/?utm_campaign=1029260&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 16:27:07 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[трейдинг]]></category><category><![CDATA[криптовалюты]]></category><category><![CDATA[мосбиржа]]></category><category><![CDATA[tradingview]]></category><category><![CDATA[pinescript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[python]]></category><category><![CDATA[торговля]]></category><category><![CDATA[биржа]]></category><category><![CDATA[binance]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @VAGNAT — Проектирование и рефакторинг (+4) — 28.04.2026 10:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028926/</guid>
    <link>https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Паттерны проектирования еще актуальны?</strong></p><p>Вокруг все чаще говорят, что ИИ скоро будет писать код за нас. Логичный вопрос — нужны ли тогда паттерны? Зачем разбираться в паттернах GoF, если нейросеть и так сгенерирует рабочий код по описанию?</p><p>У меня ощущение обратное.</p><p>Я плотно вошел в разработку в 2019 году. Переходил из 1С в .NET. Книги по паттернам GoF у меня были, но долго лежали как «книга на полке». Казалось, они оторваны от повседневных задач. Теорию вроде понимал, но не видел, где это реально применяется.</p><p>Все поменялось, когда я стал использовать ИИ как инструмент для обучения. Просил давать задачи, искать проблемы в решениях, объяснять, почему в одном месте уместен Strategy, а в другом лучше Mediator. Через практику и обсуждение паттерны перестали быть абстракцией.</p><p>Чем проще генерировать код, тем важнее понимать его форму и границы. Иначе не ускоришь разработку, а ускоришь накопление технического долга.</p><p>Из этого и вырос мой pet-project <a href="http://gofinsights.com" rel="noopener noreferrer nofollow">gofinsights.com</a>. Я делаю его тренажером по паттернам проектирования. Не просто «прочитал и забыл», а через практику, сравнение решений и постепенное распознавание типовых архитектурных ходов.</p><p>Сейчас там есть интерактивный квиз, где можно проверить базу и не перепутать Factory Method с Abstract Factory. Дальше хочу развивать проект в сторону более глубокого ИИ-разбора. Чтобы можно было не только узнавать паттерн, но и разбирать кодовые запахи, причины проблем и возможную эволюцию решений.</p><p>Как вы это видите? Паттерны проектирования все еще рабочая база для разработчика? Или с появлением ИИ они станут менее важны?</p> <a href="https://habr.com/ru/posts/1028926/?utm_campaign=1028926&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 07:43:49 GMT</pubDate>
    <dc:creator><![CDATA[VAGNAT]]></dc:creator>
      
      <category><![CDATA[паттерны проектирования]]></category><category><![CDATA[паттерны программирования]]></category><category><![CDATA[шаблоны]]></category><category><![CDATA[тренажёр]]></category><category><![CDATA[java]]></category><category><![CDATA[python]]></category><category><![CDATA[csharp]]></category><category><![CDATA[php]]></category><category><![CDATA[go]]></category><category><![CDATA[шаблоны проектирования]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — Python (+2) — 28.04.2026 05:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028848/</guid>
    <link>https://habr.com/ru/posts/1028848/?utm_campaign=1028848&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c26/a3c/8ef/c26a3c8ef1efc23c9278c851cd3e5574.png" width="860" height="578"></figure><p><strong>Разрываем шаблоны: строим график с&nbsp;разрывом всего на 65&nbsp;строк</strong> </p><p>Иногда нужно скрыть часть графика используя&nbsp;линию обрыва, чтобы показать данные с&nbsp;сильно различающимися значениями. Например, когда один язык программирования популярнее остальных в&nbsp;разы.</p><p>Самые ходовые решения этой проблемы&nbsp;— разорванная ось (broken axis) или&nbsp;отдельные бины для&nbsp;аномалий. Проблема в&nbsp;том, что&nbsp;в&nbsp;Matplotlib нет готовой «кнопки» для&nbsp;создания гистограммы с&nbsp;разрывом. Но&nbsp;это легко* собирается руками на&nbsp;уровне нескольких осей.</p><p>Вот три рабочих подхода&nbsp;— выбирайте под&nbsp;свою задачу.</p><ol><li><p>Официальный пример из&nbsp;документации Matplotlib. 🔗 <a href="https://matplotlib.org/stable/gallery/subplots_axes_and_figures/broken_axis.html" rel="noopener noreferrer nofollow">Ссылка на&nbsp;гайд</a>. Отлично работает, когда выбросы зашкаливают по&nbsp;одной оси (X или&nbsp;Y). В&nbsp;посте разбирается как&nbsp;раз такой случай: гистограмма с&nbsp;волнистой&nbsp;линией обрыва.</p></li><li><p>Библиотека <strong>brokenaxes </strong>делает почти всё сама. Устанавливается стандартно через pip. Вариант для&nbsp;тех, кто не&nbsp;хочет углубляться в&nbsp;ручную настройку.</p></li><li><p>Логарифмическая шкала (часто&nbsp;— самый простой выход) Если выбросы строго положительные и отличаются на&nbsp;порядки, иногда достаточно двух строк: plt.xscale(«log») или&nbsp;plt.yscale(«log»). Никаких разрывов, никакой ручной работы&nbsp;— при&nbsp;этом график остаётся чистым и читаемым.</p></li></ol><pre><code class="python">import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path


def plot_broken_axis(
    labels: list[str],
    values: tuple[float, ...],
    ylim_low=(0, 12),
    ylim_high=(20, 25),
    **kwargs,
):
    """
    Строит график с разрывом оси.
    Валидирует входные данные и инкапсулирует логику отрисовки.
    """
    if len(labels) != len(values):
        raise ValueError("Длины labels и values не совпадают")

    fig, (ax_high, ax_low) = plt.subplots(
        nrows=2, figsize=(7, 4), gridspec_kw={"height_ratios": [1, 2]}
    )

    # Настройки столбцов
    kwargs.setdefault("color", "skyblue")
    kwargs.setdefault("edgecolor", "black")
    kwargs.setdefault("alpha", 0.85)

    ax_low.bar(labels, values, **kwargs)
    ax_high.bar(labels, values, **kwargs)
    fig.subplots_adjust(hspace=0.0)

    # Настройка осей
    ax_low.set_ylim(*ylim_low)
    ax_high.set_ylim(*ylim_high)
    ax_high.set_title("График с разрывом")
    ax_low.set_ylabel("Рейтинг в %")
    ax_low.set_xlabel("Языки")
    ax_high.spines["bottom"].set_visible(False)
    ax_low.spines["top"].set_visible(False)
    ax_high.tick_params(axis="x", bottom=False, labelbottom=False)
    # Рисуем разрыв оси (волна)
    offset, n_points = 0.03, 33
    pts = np.linspace(-offset, 1 + offset, n_points)
    wave = np.array([1 + (0, offset, 0, -offset)[i % 4] for i in range(n_points)])
    path = Path(list(zip(pts, wave)), [Path.MOVETO] + [Path.CURVE3] * (n_points - 1))

    opts = dict(transform=ax_low.transAxes, clip_on=False, zorder=10)
    ax_low.add_patch(mpatches.PathPatch(path, lw=6, **opts))
    ax_low.add_patch(mpatches.PathPatch(path, lw=3, edgecolor="white", **opts))
    return fig


if __name__ == "__main__":
    langs = ["Python", "C", "C++", "Asm"]
    pops = (21.8, 11.1, 8.6, 1.1)

    # Стиль xkcd
    with plt.xkcd(scale=1, length=300, randomness=30):
        plt.rcParams["font.family"] = "Comic Sans MS"

        # Вызов функции
        fig = plot_broken_axis(langs, pops)
        plt.show()</code></pre><p>Литература:</p><ul><li><p>Документация Matplotlib. 🔗 <a href="https://matplotlib.org/stable/gallery/subplots_axes_and_figures/broken_axis.html" rel="noopener noreferrer nofollow">Ссылка на&nbsp;гайд</a></p></li><li><p>Bernd Klein. Numerisches Python Arbeiten mit NumPy, Matplotlib und Pandas</p></li><li><p>Sandro Tosi. Matplotlib for Python Developers</p></li></ul> <a href="https://habr.com/ru/posts/1028848/?utm_campaign=1028848&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Apr 2026 02:54:03 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[matplotlib]]></category><category><![CDATA[refactoring]]></category><category><![CDATA[data-visualisation]]></category><category><![CDATA[bestpractices]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — Искусственный интеллект (+1) — 26.04.2026 18:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028172/</guid>
    <link>https://habr.com/ru/posts/1028172/?utm_campaign=1028172&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как&nbsp;читать статьи с&nbsp;arXiv на&nbsp;русском без&nbsp;лишних усилий </strong></p><p>Если вы работаете с&nbsp;машинным обучением или&nbsp;исследовательскими задачами, arXiv, скорее всего,&nbsp;— ваш основной источник свежих идей. </p><p>Но&nbsp;далеко не&nbsp;всегда удобно читать оригинал на&nbsp;английском: устали, хотите&nbsp;быстро пробежаться по&nbsp;статье или&nbsp;просто не&nbsp;готовы сейчас разбираться в&nbsp;длинном PDF. </p><p>В&nbsp;этом посте&nbsp;— два практичных способа читать статьи с&nbsp;arXiv в&nbsp;HTML‑формате прямо в&nbsp;браузере и сразу переводить их на&nbsp;русский с&nbsp;помощью встроенного перевода. Никаких LLM, сторонних ботов и скачивания PDF.</p><p><strong>Зачем вообще HTML, если есть PDF</strong></p><p>Классический сценарий работы с&nbsp;arXiv выглядит так: вы открываете страницу статьи, скачиваете PDF и читаете его в&nbsp;отдельной программе или&nbsp;через встроенный viewer браузера.</p><p>У&nbsp;такого подхода есть несколько минусов:</p><ul><li><p>Неудобно переводить: нужно копировать текст или&nbsp;использовать отдельные инструменты.</p></li><li><p>Плохо искать по&nbsp;странице: текст может&nbsp;быть нераспознанным или&nbsp;разбитым.</p></li><li><p>Тяжелее читать на&nbsp;маленьких экранах, особенно на&nbsp;ноутбуках и планшетах.</p></li></ul><p>HTML‑версия решает эти проблемы: текст становится «живым», браузер может его переводить, а&nbsp;навигация и поиск по&nbsp;странице работают привычным образом.</p><p><strong>Способ 1. Официальный HTML (experimental)</strong></p><p>У&nbsp;части статей на&nbsp;arXiv есть встроенная HTML‑версия.Если она включена, справа на&nbsp;странице вы увидите кнопку «<strong>HTML (experimental)</strong>».</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/027/30e/782/02730e782058741609d9ee14befc3070.png" width="1253" height="516"></figure><p>Что&nbsp;это даёт:</p><ul><li><p>статья открывается как&nbsp;полноценная HTML‑страница;</p></li><li><p>формулы остаются корректными;</p></li><li><p>можно использовать встроенный перевод в&nbsp;браузере.</p></li></ul><p>Ограничения:</p><ul><li><p>HTML‑версии есть не&nbsp;у&nbsp;всех препринтов.</p></li><li><p>Иногда верстка «плывёт», особенно в&nbsp;сложных таблицах.</p></li></ul><p><strong>Способ 2. ar5iv (если HTML нет)</strong></p><p>Если кнопки&nbsp;<strong>HTML (experimental)</strong>&nbsp;нет, можно воспользоваться сторонним сервисом&nbsp;<strong>ar5iv</strong>&nbsp;из&nbsp;экосистемы arXiv Labs. Он автоматически конвертирует TeX‑исходники статей в&nbsp;HTML.</p><p>Идея простая: вы берете обычный URL arXiv и меняете в&nbsp;домене букву&nbsp;<code>x</code>&nbsp;на&nbsp;<code>5</code>.</p><p>Пример:</p><ul><li><p>Было: <a href="https://arxiv.org/abs/1706.03762" rel="noopener noreferrer nofollow">https://arxiv.org/abs/1706.03762</a></p></li><li><p>Стало: <a href="https://ar5iv.labs.arxiv.org/html/1706.03762" rel="noopener noreferrer nofollow">https://ar5iv.labs.arxiv.org/html/1706.03762</a></p></li></ul><p>Такой простой приём заметно снижает «порог входа» в чтение статей и экономит время, особенно если вы регулярно мониторите arXiv.</p> <a href="https://habr.com/ru/posts/1028172/?utm_campaign=1028172&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 26 Apr 2026 15:41:51 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[arxiv.org]]></category><category><![CDATA[arxiv]]></category><category><![CDATA[научные исследования]]></category><category><![CDATA[научные статьи]]></category><category><![CDATA[научные публикации]]></category><category><![CDATA[машинное+обучение]]></category><category><![CDATA[deep research]]></category><category><![CDATA[статьи]]></category><category><![CDATA[python]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — Python (+1) — 26.04.2026 15:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028110/</guid>
    <link>https://habr.com/ru/posts/1028110/?utm_campaign=1028110&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Python на флешке: как собрать портативную среду без установки</strong></p><p>Такой вариант хорошо подходит, если нужно:</p><ul><li><p>показать скрипт на чужом компьютере;</p></li><li><p>поработать на машине без прав администратора;</p></li><li><p>запускать Python в ограниченной среде;</p></li><li><p>держать рядом интерпретатор, проект и зависимости в одном месте.</p></li></ul><p>На корпоративных ПК всё зависит от политики безопасности. Если запуск с USB,&nbsp;<code>.exe</code>&nbsp;или PowerShell ограничен, портативная сборка тоже может не стартовать.</p><p><strong>Что нужно</strong></p><p>Минимальный набор простой:</p><ul><li><p>USB-накопитель;</p></li><li><p>Windows x64;</p></li><li><p>доступ в интернет, если планируете ставить дополнительные пакеты.</p></li></ul><p><strong>Скачиваем Python</strong></p><p>Идём на официальную страницу загрузок Python и берём&nbsp;<strong>Windows embeddable package (64-bit)</strong>&nbsp;для нужной версии, например, <a href="https://www.python.org/ftp/python/3.14.4/python-3.14.4-embed-amd64.zip" rel="noopener noreferrer nofollow">python-3.14.4-embed-amd64.zip</a>.<br>После распаковки вы получите что-то вроде этого:</p><pre><code class="css">F:\
└── python3.14\
    ├── python.exe
    ├── python314.dll
    ├── python314._pth
    ├── python314.zip
    └── ...</code></pre><p>На этом этапе интерпретатор уже можно запускать прямо с флешки.</p><p><strong>Что делает&nbsp;_pth</strong></p><p>Файл&nbsp;<code>python314._pth</code>&nbsp;управляет тем, какие пути Python видит при запуске. По умолчанию embeddable package изолирован от системного окружения, реестра и установленных пакетов.</p><p>Если вам нужно подключить локальные библиотеки, можно прописать пути вручную:</p><pre><code>python314.zip
.
Lib
Lib\site-packages
import site</code></pre><p>Строка&nbsp;<code>import site</code>&nbsp;нужна, чтобы Python начал использовать&nbsp;<code>site</code>-механику и подхватывать дополнительные каталоги.</p><p><strong>Как добавить pip</strong></p><p>У embeddable package&nbsp;<code>pip</code>&nbsp;обычно не идёт «из коробки» как в обычной установке.<br>Его можно добавить вручную через официальный bootstrap-скрипт&nbsp;<code>get-pip.py</code>.</p><p>Сценарий такой:</p><ol><li><p>Скачайте&nbsp;<a href="https://bootstrap.pypa.io/get-pip.py" rel="noopener noreferrer nofollow">get-pip.py</a>.</p></li><li><p>Положите его рядом с&nbsp;<code>python.exe</code>.</p></li><li><p>Запустите:</p></li></ol><pre><code class="bash">PS F:\&gt; cd ./python3.14
PS F:\python3.14&gt; ./python get-pip.py</code></pre><p>После этого проверьте:</p><pre><code class="bash">./python -m pip --version
# Выведет версию pip (например, pip 26.0.1).</code></pre><p><strong>Ставим пакеты</strong></p><p>Когда&nbsp;<code>pip</code>&nbsp;уже доступен, можно ставить нужные библиотеки:</p><pre><code class="bash">PS F:\python3.14&gt; ./python -m pip install numpy pandas matplotlib seaborn requests</code></pre><p>Или сразу из&nbsp;<code>requirements.txt</code>:</p><pre><code class="bash">PS F:\python3.14&gt; ./python -m pip install -r requirements.txt</code></pre><p><strong>Запускаем проект</strong></p><p>Чтобы не помнить длинные пути, удобно сделать&nbsp;<code>run.bat</code>&nbsp;в корне флешки:</p><pre><code class="bash">@echo off
cd /d %~dp0
set PYTHON_HOME=%~dp0python3.14
set PATH=%PYTHON_HOME%;%PATH%

%PYTHON_HOME%\python.exe my_project\main.py
pause</code></pre><p>Плюс такого подхода в том, что он не привязан к букве диска. Сегодня флешка может быть&nbsp;<code>F:</code>, а завтра&nbsp;<code>D:</code>&nbsp;— батник всё равно найдёт себя сам.  </p><p><strong>Типичная структура</strong></p><p>Обычно папка на флешке выглядит так:</p><pre><code class="css">F:\
├── python3.14\
│   ├── python.exe
│   ├── python314.dll
│   ├── python314._pth
│   ├── python314.zip
│   └── Lib\site-packages\
├── my_project\
│   ├── main.py
│   └── requirements.txt
├── run.bat</code></pre> <a href="https://habr.com/ru/posts/1028110/?utm_campaign=1028110&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 26 Apr 2026 12:58:38 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[флешка]]></category><category><![CDATA[портативность]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @andrey_chuyan — DevOps (+4) — 25.04.2026 13:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027802/</guid>
    <link>https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="69ec942542c0bc03ac2e960a" src="https://embedd.srv.habr.com/iframe/69ec942542c0bc03ac2e960a" class="embed_video embed__content" allowfullscreen="true"></iframe><p><strong>🌲 Открываем регистрацию на Дебаг Кемп</strong></p><p>Мы придумали формат, который давно хотели сами: выбираешься из города, два дня в сосновом лесу на Карельском перешейке — маршрут, костёр, мастер-классы по выживанию, нетворкинг без слайдов и питчей. Просто люди, с которыми интересно, и никакого Slack-а.</p><p><strong>📅 6–7 июня 2026 (выходные)</strong> <strong>👥 Всего 25 мест</strong> — маленький формат, это принципиально.</p><p>Цена растёт по мере приближения к дате. Оплатить можно частями через сплит → <a href="https://debug-skills.timepad.ru/event/3936231/#register" rel="noopener noreferrer nofollow">регистрация</a></p><p>Если вы <a href="https://vk.com/polnyistek?w=donut_payment-232485571&amp;levelId=2501" rel="noopener noreferrer nofollow">💎 практик сообщества</a> — скидка 15% применяется при регистрации автоматически. Ещё не практик, но думаете? Сейчас самый разумный момент.</p><p>👀 <a href="https://debugskills.ru/debug-camp/" rel="noopener noreferrer nofollow">Узнать больше</a> · 📝 <a href="https://debug-skills.timepad.ru/event/3936231/" rel="noopener noreferrer nofollow">Регистрация</a></p><p>Вопросы — в чат, мы там живём.</p> <a href="https://habr.com/ru/posts/1027802/?utm_campaign=1027802&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 10:18:16 GMT</pubDate>
    <dc:creator><![CDATA[andrey_chuyan]]></dc:creator>
      
      <category><![CDATA[нетворкинг]]></category><category><![CDATA[оффлайн-мероприятие]]></category><category><![CDATA[кемп]]></category><category><![CDATA[тимбилдинг]]></category><category><![CDATA[выживание]]></category><category><![CDATA[карелия]]></category><category><![CDATA[разработчики]]></category><category><![CDATA[it-сообщество]]></category><category><![CDATA[конференция]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Web_5 — Python (+1) — 15.04.2026 13:34]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1023736/</guid>
    <link>https://habr.com/ru/posts/1023736/?utm_campaign=1023736&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Голем: как в нём устроен анализ кода</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/856/c6d/bbe/856c6dbbe57e293e24cfac3b1f2fb314.png" width="798" height="613"></figure><p>В прошлый раз я рассказал про Голема — кодинг-агента в Telegram. Сейчас хочу показать, что у него под капотом. А именно — как работает анализ кода.</p><p>Первая версия была примитивной: весь код летел в LLM, та читала и выдавала вердикт. Работало паршиво. LLM галлюцинировала про «обрезанные функции», жрала токены как не в себя, а если проект был больше пары файлов — просто захлёбывалась.</p><p>Нужно было что-то менять.</p><p><strong>Гибридный анализ: четыре утилиты вместо одной LLM</strong></p><p>Теперь перед тем, как отдать код модели, его прогоняют четыре статических анализатора:</p><pre><code class="python">bandit, ruff, semgrep, pip_audit = await asyncio.gather(
    run_bandit(project_dir),      # безопасность
    run_ruff(project_dir),        # стиль и баги
    run_semgrep(project_dir),     # глубокий анализ
    run_pip_audit(project_dir)    # зависимости
)</code></pre><p>Каждая утилита отвечает за свою область:</p><ul><li><p><strong>Bandit</strong>&nbsp;ищет уязвимости безопасности: SQL-инъекции, использование&nbsp;<code>eval()</code>, хардкод паролей.</p></li><li><p><strong>Ruff</strong>&nbsp;проверяет стиль и очевидные ошибки: неиспользуемые импорты, синтаксис, голые except.</p></li><li><p><strong>Semgrep</strong>&nbsp;находит сложные паттерны: XSS, утечки данных, опасную десериализацию.</p></li><li><p><strong>pip-audit</strong>&nbsp;сверяет зависимости с базой CVE и сообщает о дырявых пакетах.</p></li></ul><p>Все четыре запускаются параллельно через&nbsp;<code>asyncio.gather</code>. На проекте среднего размера это занимает 10-15 секунд вместо 40-50 при последовательном запуске.</p><p><strong>LLM получает только проблемные строки</strong></p><p>Раньше модель получала первые 1000 символов из каждого файла. Это приводило к двум проблемам: дикий перерасход токенов и галлюцинации. LLM видела обрывок функции и думала, что код незавершённый.</p><p>Теперь всё иначе. Анализаторы возвращают конкретные проблемные строки, и модель получает только их с контекстом в 3-4 строки вокруг:</p><pre><code class="python"># main.py:42 — Bandit HIGH
query = f"SELECT * FROM users WHERE id = {user_input}"  # SQL-инъекция</code></pre><p>Результат:</p><ul><li><p>Расход токенов сократился в 10 раз.</p></li><li><p>Галлюцинации про «незавершённый код» исчезли полностью.</p></li><li><p>Анализ работает одинаково быстро на проекте из 10 файлов и из 500.</p></li></ul><p><strong>Асинхронный режим</strong></p><p>ZIP-архивы и GitHub-репозитории анализируются в фоне. Пользователь отправляет файл и сразу получает ответ «анализ запущен», а результат приходит отдельным сообщением через минуту-две. Бот не висит, можно продолжать с ним работать.</p><pre><code class="python">asyncio.create_task(
    _analyze_directory_async(context, temp_dir, source, llm, user_id)
)
await update.message.reply_text("🔍 Анализ запущен в фоне")</code></pre><p><strong>Что дальше</strong></p><p>Сейчас Голем умеет анализировать только Python-проекты. В ближайших планах:</p><ul><li><p>Поддержка JavaScript/TypeScript (ESLint + npm audit)</p></li><li><p>Поддержка Go (golangci-lint + govulncheck)</p></li><li><p>Поддержка Rust (clipp +cargo-audit ) </p></li></ul><p>Также хочу добавить команду&nbsp;<code>/fix</code>&nbsp;— автоматическое исправление проблем, которые находит Ruff. Часть ошибок можно починить без участия человека, и Голем будет делать это сам.</p><p><strong>Попробовать</strong></p><p>Бот живёт в Telegram:&nbsp;<strong><a href="https://%D0%92%D0%BE%D1%82%20%D0%BD%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D0%BA%D0%BB%D0%B8%D0%BA%D0%B0%D0%B1%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0:%20%20%5Bhttps://t.me/Golem666bot%5D(https://t.me/Golem666bot)" rel="noopener noreferrer nofollow">@Golem666bot</a></strong><br>Там же можно посмотреть другие проекты и следить за разработкой:&nbsp;<strong><a href="https://t.me/+s-UqT7CO9_s3N2I6" rel="noopener noreferrer nofollow">@system_develope</a></strong>  </p> <a href="https://habr.com/ru/posts/1023736/?utm_campaign=1023736&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 15 Apr 2026 10:34:34 GMT</pubDate>
    <dc:creator><![CDATA[Web_5]]></dc:creator>
      
      <category><![CDATA[golem]]></category><category><![CDATA[кодинг-агент]]></category><category><![CDATA[телеграм-бот]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rullwull — Python (+1) — 15.04.2026 10:02]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1023632/</guid>
    <link>https://habr.com/ru/posts/1023632/?utm_campaign=1023632&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как отключить reasoning у локального DeepSeek-R1 и не сойти с ума</strong></p><p>Третий пост из серии про грабли локальных LLM. <a href="https://habr.com/ru/posts/1023042/" rel="noopener noreferrer nofollow">Первый</a> — про микрочанки, отравляющие RAG. <a href="https://habr.com/ru/posts/1023054/" rel="noopener noreferrer nofollow">Второй</a> — про embedding модель, которая не знает русский. Сейчас — про reasoning, который жрёт ресурсы и не выключается.</p><p>Проблема</p><p>DeepSeek-R1-Distill-Qwen-32B — reasoning модель. На каждый запрос она сначала «думает» в блоке <code>&lt;think&gt;...&lt;/think&gt;</code>, потом отвечает. Выглядит так:</p><pre><code>&lt;think&gt;
Хорошо, мне нужно помочь пользователю распределить задачи
для проекта создания цифрового двойника для молочной фермы.
Я новичок в этом, поэтому постараюсь разобраться шаг за шагом.

Сначала, мне нужно понять, что такое цифровой двойник...
&lt;/think&gt;

Разработка цифрового двойника для молочной фермы — это сложный проект...
</code></pre><p>Блок <code>&lt;think&gt;</code> может быть длиннее самого ответа. Это токены, это время, это VRAM. Для задач где рассуждения не нужны — чистый оверхед.</p><p>Наивное решение — не работает</p><p>Первая идея: убрать <code>&lt;think&gt;</code> из ответа регуляркой постфактум.</p><pre><code class="python">response_text = re.sub(r'&lt;think&gt;.*?&lt;/think&gt;', '', response_text, flags=re.DOTALL).strip()
</code></pre><p>Проблема: модель всё равно генерирует рассуждения. Вы просто прячете их от пользователя, но GPU уже потратил время и токены.</p><p>Решение от сообщества</p><p>Пустой блок <code>&lt;think&gt;\n\n&lt;/think&gt;</code> в конце промпта. Модель видит, что фаза рассуждений уже «завершена», и сразу переходит к ответу.</p><pre><code class="python">text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
text = text + "&lt;think&gt;\n\n&lt;/think&gt;\n\n"
</code></pre><p>Попробовал — не работает. Reasoning остаётся.</p><p>Ловушка с токенизатором</p><p>Смотрю в лог что реально уходит модели:</p><pre><code>...ть задачи?&lt;｜Assistant｜&gt;&lt;think&gt;&lt;think&gt;

&lt;/think&gt;
</code></pre><p>Два <code>&lt;think&gt;</code>. Токенизатор DeepSeek при <code>add_generation_prompt=True</code> уже добавляет <code>&lt;think&gt;</code> в конец промпта автоматически. Мой код добавляет второй. Модель видит незакрытый первый тег и начинает думать.</p><p>Причём <code>&lt;｜Assistant｜&gt;</code> — это не обычные символы <code>|</code>, а полноширинные юникодные <code>｜</code>. Специальные токены DeepSeek. Если искать обычный <code>|</code> в строке — не найдёте.</p><p>Правильное решение</p><p>Проверять, что уже есть в промпте, и действовать по ситуации:</p><pre><code class="python">def prepare_prompt_no_thinking(messages, tokenizer):
    text = tokenizer.apply_chat_template(
        messages, 
        tokenize=False, 
        add_generation_prompt=True
    )
    
    if "&lt;think&gt;\n\n&lt;/think&gt;" in text:
        pass  # Уже закрыт
    elif "&lt;think&gt;" in text and "&lt;/think&gt;" not in text:
        text = text + "\n\n&lt;/think&gt;\n\n"  # Закрываем открытый
    else:
        text = text + "&lt;think&gt;\n\n&lt;/think&gt;\n\n"  # Добавляем пустой
    
    return text
</code></pre><p>Три ветки — потому что разные версии токенизатора ведут себя по-разному. Кто-то добавляет <code>&lt;think&gt;</code>, кто-то нет.</p><p>Результат</p><p>Без тегов:</p><pre><code>Хорошо, мне нужно помочь пользователю распределить задачи
для проекта создания цифрового двойника для молочной фермы.
Я новичок в этом, поэтому постараюсь разобраться шаг за шагом...
</code></pre><p>С правильными тегами:</p><pre><code>Разработка цифрового двойника для молочной фермы — это сложный проект,
который требует участия специалистов из разных областей.
Вот примерное распределение задач:
</code></pre><p>Модель сразу отвечает по делу, без вступительных рассуждений. Экономия токенов и времени — в зависимости от запроса от 30% до 60%.</p><p>Вывод</p><p>Если используете DeepSeek-R1-Distill локально и reasoning вам не нужен — не режьте его регуляркой постфактум. Закройте <code>&lt;think&gt;</code> тег до генерации. Но обязательно проверяйте, что токенизатор уже добавил — иначе получите дубль и потратите час на дебаг того, что должно было занять минуту.</p> <a href="https://habr.com/ru/posts/1023632/?utm_campaign=1023632&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 15 Apr 2026 07:02:30 GMT</pubDate>
    <dc:creator><![CDATA[rullwull]]></dc:creator>
      
      <category><![CDATA[ai]]></category><category><![CDATA[deepseek]]></category><category><![CDATA[локальные модели]]></category><category><![CDATA[llm-модели]]></category><category><![CDATA[llm]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rullwull — Python — 13.04.2026 22:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1023054/</guid>
    <link>https://habr.com/ru/posts/1023054/?utm_campaign=1023054&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Идеальная база знаний, а RAG возвращает мусор — проблема не там, где кажется</strong></p><p>Продолжение <a href="https://habr.com/ru/posts/1023042/" rel="noopener noreferrer nofollow">предыдущего поста про микрочанки</a>, где 3 мусорных документа отравили весь RAG. Тогда проблема была в данных. Сейчас — данные идеальные, а поиск всё равно не работает.</p><p>Контекст</p><p>Строю локальную мультиагентную систему. Собрал базу знаний: 85 архитектурных блоков, 160 чанков в ChromaDB, реальный опыт — не синтетика. Embedding модель — стандартная <code>all-MiniLM-L6-v2</code>. Документы на русском с вкраплениями английских терминов (DPO, LoRA, VRAM — как у всех).</p><p>Симптом</p><p>Спрашиваю: <code>"DPO патч для OOM"</code> — в базе есть целый блок про это. RAG возвращает документ про права доступа к Project Context. Вообще мимо.</p><p>Спрашиваю: <code>"positive feedback loop"</code> — в базе есть блок №57 ровно с таким названием. RAG его не находит, dist=0.746.</p><p>Диагностика</p><p>Подозрение — embedding модель не понимает русский текст. Проверяю: один и тот же смысл, три формулировки.</p><pre><code class="python">queries = [
    ("positive feedback loop", "английский"),
    ("петля положительной обратной связи", "русский"),
    ("цикл доверие данные результат", "русский контекст"),
]

for q, lang in queries:
    results = col.query(query_texts=[q], n_results=1, include=["documents", "distances"])
    dist = results['distances'][0][0]
    print(f"[{lang}] dist={dist:.3f} | '{q}'")
</code></pre><pre><code>[английский]       dist=0.746 | 'positive feedback loop'
[русский]           dist=0.566 | 'петля положительной обратной связи'
[русский контекст]  dist=0.504 | 'цикл доверие данные результат'
</code></pre><p>Один смысл — разница в полтора раза. При этом документы в базе на русском. Английский запрос к русским документам — модель не может их сопоставить.</p><p>Почему так</p><p><code>all-MiniLM-L6-v2</code> обучалась на английских текстах. Она превращает текст в вектор из 384 чисел. Для английского — вектор осмысленный, семантически правильный. Для русского — видит буквы, но не понимает смысл. Вектор получается случайный.</p><p>Это как нанять переводчика, который знает только английский, и попросить его искать по русской библиотеке.</p><p>А может перевести всё на английский?</p><p>Первая мысль — перевести все документы на английский, запросы тоже переводить на лету, а результат обратно на русский. Английские embedding модели объективно лучше отточены, больше данных, больше бенчмарков.</p><p>Но для локальной системы с русскими документами это плохой вариант. Технические термины с контекстом теряются при переводе. Появляется двойная задержка — перевод запроса туда, результата обратно. Нужен ещё один сервис (переводчик), а задача — держать всё локально. И главное — ошибки накапливаются: плохой перевод → плохой вектор → плохой результат.</p><p>Для чисто английских доков — да, держите всё на английском. Но когда документы изначально на русском с кучей специфики — мультиязычная модель проще. Меньше движущихся частей.</p><p>Решение</p><p>Заменил <code>all-MiniLM-L6-v2</code> на <code>paraphrase-multilingual-MiniLM-L12-v2</code>. Модель обучена на 50+ языках, включая русский. Понимает смешанный текст типа “DPO обучение на LoRA адаптере” — то, что в локальных ML-проектах встречается на каждом шагу.</p><p>Пересоздал все коллекции с новой моделью. Результат:</p><pre><code class="python"># Было (all-MiniLM-L6-v2):
# 'positive feedback loop' → dist=0.746, нашёл мусор

# Стало (multilingual):
# 'positive feedback loop' → dist=0.35, нашёл именно блок про Feedback Loop
</code></pre><p>Поиск заработал сразу. На все запросы — и русские, и английские, и смешанные.</p><p>Вывод</p><p>Если строите RAG на русском (или любом не-английском) — не берите <code>all-MiniLM-L6-v2</code> по дефолту. Она стоит первой в каждом туториале, но для нелатинских языков это ловушка. Данные могут быть идеальными, чанкинг правильным, а поиск будет возвращать мусор — потому что “переводчик” не знает ваш язык.</p><p>Замена embedding модели на мультиязычную — одна строчка кода и пересоздание коллекций. Пять минут работы, которые сэкономят дни дебага.</p><pre><code class="python"># Было
ef = SentenceTransformerEmbeddingFunction(model_name="all-MiniLM-L6-v2")

# Стало
ef = SentenceTransformerEmbeddingFunction(model_name="paraphrase-multilingual-MiniLM-L12-v2")
</code></pre> <a href="https://habr.com/ru/posts/1023054/?utm_campaign=1023054&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Apr 2026 19:04:15 GMT</pubDate>
    <dc:creator><![CDATA[rullwull]]></dc:creator>
      
      <category><![CDATA[ai]]></category><category><![CDATA[rag]]></category><category><![CDATA[chromadb]]></category><category><![CDATA[llm]]></category><category><![CDATA[embeddings]]></category><category><![CDATA[vectordb]]></category><category><![CDATA[локальные модели]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rullwull — Python — 13.04.2026 21:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1023042/</guid>
    <link>https://habr.com/ru/posts/1023042/?utm_campaign=1023042&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>3 мусорных документа (1.7%) отравили весь мой RAG</p><p>Строю локальную мультиагентную систему с RAG на ChromaDB. В какой-то момент модель начала нести чушь — вставлять в ответы куски маркдауна, генерить мусор вместо нормальных ответов.</p><p>Симптом</p><p>Спрашиваю: «Новый проект: цифровой двойник нефтеперерабатывающего завода. Как декомпозировать?»</p><p>В ответе — рандомные огрызки разметки типа <code>"25*\n*Тип: Инфраструктура и системное администрирование*"</code>. Модель явно копировала что-то из контекста.</p><p>Копаю</p><p>Смотрю что RAG возвращает на этот запрос:</p><pre><code class="python">results = rag.query(query_texts=[query], n_results=3)
for doc in results['documents'][0]:
    print(f"[{len(doc)} chars]: {doc[:50]}")
</code></pre><pre><code>[56 chars]: 25*\n*Тип: Инфраструктура и системное администр...
[15 chars]:  и реализация*...
[11 chars]: ров вместе...
</code></pre><p>Топ-3 — мусор, а не документы.</p><p>Причина</p><p>При загрузке маркдаун-файлов в ChromaDB чанкер резал по 800 символов механически — посередине заголовков, посередине предложений. В итоге появились микро-огрызки типа <code>"ров вместе"</code> (11 символов), которые стали отдельными документами.</p><p>Почему короткие чанки ломают RAG</p><p>Короткий текст → странный эмбеддинг. Вектор ни о чём, без смысла. И именно поэтому он оказывается «близок» к любому запросу случайным образом. Мой 11-символьный огрызок стабильно обгонял нормальные 800-символьные документы в similarity search.</p><p>Фикс</p><p>Нашёл все документы меньше 100 символов:</p><pre><code class="python">all_docs = rag.get(include=["documents"])
short = [(i, doc) for i, doc in enumerate(all_docs['documents']) if len(doc) &lt; 100]
print(f"Мусор: {len(short)}")  # 3
</code></pre><p>Удалил:</p><pre><code class="python">ids_to_delete = [all_docs['ids'][i] for i, _ in short]
rag.delete(ids=ids_to_delete)
# Было: 176 docs → Стало: 173 docs
</code></pre><p>Галлюцинации прекратились сразу.</p><p>Вывод</p><p>Фильтруйте чанки по минимальной длине до загрузки в векторную БД:</p><pre><code class="python">MIN_CHUNK_LENGTH = 100
chunks = [c for c in chunks if len(c) &gt;= MIN_CHUNK_LENGTH]
</code></pre><p>3 документа из 176 — это 1.7%. Процент не имеет значения. Если у мусора странный вектор — он всплывёт. Один плохой документ может отравить весь ваш RAG.</p> <a href="https://habr.com/ru/posts/1023042/?utm_campaign=1023042&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Apr 2026 18:27:23 GMT</pubDate>
    <dc:creator><![CDATA[rullwull]]></dc:creator>
      
      <category><![CDATA[ai]]></category><category><![CDATA[rag]]></category><category><![CDATA[chromadb]]></category><category><![CDATA[llm]]></category><category><![CDATA[embeddings]]></category><category><![CDATA[vectordb]]></category><category><![CDATA[локальные модели]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Web_5 — Python (+1) — 10.04.2026 22:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1022072/</guid>
    <link>https://habr.com/ru/posts/1022072/?utm_campaign=1022072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c1b/48e/a44/c1b48ea440c9d63aff7a0974dc688005.png" width="865" height="303"></figure><p>Как я научил Telegram-бота помнить то, что LLM положено забывать</p><p>LLM по своей природе — без памяти. Каждый новый диалог с ChatGPT, Claude или DeepSeek начинается с чистого листа. Разработчики пытаются решать это костылём: запихивают в контекст последние N сообщений.</p><p>Но это не память. Это дорогое, конечное и очень прожорливое контекстное окно. Хранить всю историю — разоришься на токенах. Учить модель на лету — пока фантастика.</p><p>Поэтому я сделал по-другому.</p><p><strong>Встречайте: настоящая долговременная память для Golem (</strong><em>В том виде, в каком она нужна кодинг-агенту)</em></p><p>Теперь мой кодинг-агент умеет <strong>сохранять только важное</strong> — факты о ваших проектах, привычках, договорённостях и запретах. Не всю переписку, а ровно то, что <strong>вы сами</strong> решите запомнить навсегда.</p><p>Как это работает:</p><ul><li><p>/remember текст — Golem сохраняет факт в SQLite</p></li><li><p>/recall — показывает все ваши заметки</p></li><li><p>/forget ID — удаляет ненужное</p></li></ul><p>Заметки автоматически подгружаются в начало <strong>каждого</strong> запроса, работают в любой сессии и переживают перезапуски бота. Никакой магии — просто грамотная архитектура.</p><p><strong>Реальные примеры из жизни:</strong></p><p>Вы пишете: /remember Я работаю над проектом X на Django + PostgreSQL. Никогда не предлагай MongoDB.</p><p>Через неделю спрашиваете: «Как оптимизировать запросы?» — Golem сразу учитывает стек и не несёт чушь про NoSQL.</p><p>Или: /remember Голем, не отвечай на вопросы про погоду. Это тупо.</p><p>Теперь на «какая погода?» он спокойно посылает вас в Google и не жрёт токены.</p><p>Это сильно круче простого увеличения контекста: <strong>вы сами</strong> решаете, что важно, а что — мусор.</p><p>Хотите видеть, как я дальше развиваю память (<em>векторный поиск, автоматическое извлечение фактов и другие смелые эксперименты, которые я обкатываю прямо сейчас</em>)?</p><p>→ Подписывайся на основной канал <strong><a href="https://t.me/+s-UqT7CO9_s3N2I6" rel="noopener noreferrer nofollow">«СИСТЕМА»</a></strong></p><p>Там я показываю внутреннюю кухню разработки Golem, полные архитектурные разборы и то, что обычно не выношу на Хабр.</p><p><strong>Где потрогать бота прямо сейчас:</strong> <strong><a href="https://t.me/Golem666bot" rel="noopener noreferrer nofollow">https://t.me/Golem666bot</a></strong></p><p>Пробуйте, ломайте, кидайте в комментариях:</p><ul><li><p>Какие факты вы бы хотели, чтобы бот помнил о вас?</p></li><li><p>Каких ещё фич не хватает идеальному AI-ассистенту?</p></li></ul><p>Жду ваших кейсов и идей — лучшие разберём вместе с Golem.</p> <a href="https://habr.com/ru/posts/1022072/?utm_campaign=1022072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 10 Apr 2026 19:03:56 GMT</pubDate>
    <dc:creator><![CDATA[Web_5]]></dc:creator>
      
      <category><![CDATA[ии-агенты]]></category><category><![CDATA[телеграм]]></category><category><![CDATA[телеграм-бот]]></category><category><![CDATA[llm]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @NakataModem — Криптовалюты (+2) — 10.04.2026 05:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1021596/</guid>
    <link>https://habr.com/ru/posts/1021596/?utm_campaign=1021596&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Написал небольшой микросервис на <strong>FastAPI,</strong> помогающий взаимодействовать с блокчейном <strong>Litecoin</strong> для принятия платежей. Сервис напрямую подключается к любой ноде на протоколе <strong>ElectrumX</strong>.<br><br>Список нод можно взять здесь: <a href="https://1209k.com/bitcoin-eye/ele.php?chain=ltc" rel="noopener noreferrer nofollow">https://1209k.com/bitcoin-eye/ele.php?chain=ltc</a><br>Либо же можно захостить свою ноду, но пока нам будет достаточно удалённой.</p><p>Принимая платежи таким способом, мы контролируем "ключи", не зависим от сторонних платежных систем, нам не нужно никому доверять наши средства и отдавать процент от выручки.</p><p>Можем взглянуть на исходный код и перейдём к обзору функционала. <br><a href="https://github.com/CryptoWrapAPI/litecoin-wallet-rpc" rel="noopener noreferrer nofollow">https://github.com/CryptoWrapAPI/litecoin-wallet-rpc</a></p><p>Для начала нужно получить свой ключ к блокчейну, проще говоря, сид-фразу.<br>Но не каждая сид фраза подойдёт, вкратце, нужна сид фраза стандарта <strong>BIP39</strong>. <br>Такую сид фразу можно сгенерировать с помощью <code>new_wallet.py</code></p><p>Для этого нам понадобится <strong>Python</strong> версии <strong>3.12</strong>, потому что библиотека <strong>bip_utils</strong> пока что поддерживает только эту версию.</p><pre><code class="bash">Mnemonic string: 
rather nasty bright aisle craft spare blood room village resource special region winter gesture despair slender tiger wall state fashion grass trophy crack monster

Master key (bytes): 865fcb279555a25bf50e2e33d37ef68b363b3eb322a68456609526f80be28a7e
Master key (extended): zprvAWgYBBk7JR8GkiSjUUwyhei9mSTEMd5ENS9xywYxsf6WLuFvq9eJjE7eFCjw3sT4AreK7cRiBgF4x8CiL5sPUhwZA3rBhFbKD1poA3iWQCg
Master key (WIF): T7ZBZxkT8ebmYHyz1vHdG9G4of2UPJm2hVky1x19kX2xtQSKKCu4</code></pre><p>Далее для деривации (создания отдельных адресов для принятия платежей) нам понадобится extended мастер-ключ. </p><p>Отправляем его вместе с <strong>account index</strong> и <strong>address index</strong> на эндпоинт <code>/derive</code> (запустим тест <code>python tests/test_derive.py</code>)  </p><p>Индексы мы можем представить как координаты адреса по оси <strong>X</strong> и <strong>Y</strong></p><pre><code class="bash">============================================================
TEST: Address Derivation
============================================================
XPRV: zprvAWgYBBk7JR8GkiSj...
Account index: 0
Address index: 0

Status: 200
Response:
{
  "address": "ltc1qt25zdkgj4shgyp4xw770hsjtdph6kn70zz8h06",
  "account_index": 0,
  "address_index": 0,
  "chain": "external"
}

✓ Derived address: ltc1qt25zdkgj4shgyp4xw770hsjtdph6kn70zz8h06
============================================================</code></pre><p>Теперь этот адрес кошелька можно отправить клиенту нашего сервиса.</p><p>Чтобы проверить, поступил ли платеж, мы можем обратиться к методу <code>get_history</code><br><a href="https://electrumx.readthedocs.io/en/latest/protocol-methods.html#blockchain-scripthash-get-history" rel="noopener noreferrer nofollow">https://electrumx.readthedocs.io/en/latest/protocol-methods.html#blockchain-scripthash-get-history</a></p><pre><code class="json">// В этом примере адрес начинается с tltc1 вместо ltc1 
// Потому что это testnet блокчейн :)
// Сменить testnet/mainnet можно в .env

  "tltc1qayq6ppmzztpgy354r45lkp8vjdafnhtf0yhutm": {
    "transactions": [
      {
        "tx_hash": "6803c0769c89e2cd9bbbda1d1e8715c5b11c1e69f8f9a7d46c1cd6adc2103c6a",
        "height": 4672171
      },
      {
        "tx_hash": "10bdb766e7c8a42e468862a97b10260955fafe7a0fcd219f025b4dd105077e5e",
        "height": 4672208
      }
    ],
    "count": 2,
    "timestamp": "2026-04-10T01:23:37.448442+00:00"
  }</code></pre><p>Мы видим две транзакции, <strong>height</strong> здесь - это номер блока, в который включена транзакция, если она всё ещё находится в мемпуле (ожидает подтверждения майнерами), то мы увидим <strong>-1</strong> или <strong>0</strong>.</p><p>Частота блоков в <strong>Litecoin</strong> составляет <em>~2 минуты</em>. То есть примерно через 2 минуты транзакция будет включена в цепочку блоков.</p><p>Узнать детали транзакции можно с помощью эндпоинта <code>/transactions</code><br>Там будет подробное описание транзакции, включая все "входы" и "выходы", количество отправленных монет, комиссию сети, заплаченную отправителем и так далее.</p><p>На этом у меня всё, спасибо за внимание!</p> <a href="https://habr.com/ru/posts/1021596/?utm_campaign=1021596&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 10 Apr 2026 02:01:38 GMT</pubDate>
    <dc:creator><![CDATA[NakataModem]]></dc:creator>
      
      <category><![CDATA[litecoin]]></category><category><![CDATA[fastapi]]></category><category><![CDATA[microservice]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @veta_pf — Блог компании МТС (+3) — 09.04.2026 14:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ru_mts/posts/1021364/</guid>
    <link>https://habr.com/ru/companies/ru_mts/posts/1021364/?utm_campaign=1021364&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Подключайся ко второму онлайн-митапу MWS для Python-разработчиков 🎙️</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/f7b/c05/9e7/f7bc059e7709b757e2d6c680bdcfcb1a.png" width="1920" height="1080"></figure><p>На встрече <strong>узнаешь нюансы разработки с агентом </strong>и сразу <strong>сможешь попрактиковаться</strong>, а еще — <strong>поучаствовать в дискуссии</strong> <strong>с экспертами</strong> о роли ИИ в рабочих процессах.</p><p>Будет интересно Python-разработчикам, аналитикам и другим ИТ-специалистам, кто интересуется применением ИИ в разработке.</p><ul><li><p>📅 Когда: 15 апреля (среда) в 15:00 по мск</p></li><li><p>📍 Где: онлайн&nbsp;</p></li><li><p>👉 <a href="https://mts-digital.ru/events/details?id=72858541?utm_source=habr&amp;utm_medium=post&amp;utm_campaign=vstrecha_python_090426" rel="noopener noreferrer nofollow">Зарегистрироваться</a></p></li></ul> <a href="https://habr.com/ru/posts/1021364/?utm_campaign=1021364&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 09 Apr 2026 11:58:33 GMT</pubDate>
    <dc:creator><![CDATA[veta_pf (МТС)]]></dc:creator>
      
      <category><![CDATA[онлайн-встреча]]></category><category><![CDATA[mws]]></category><category><![CDATA[разработка]]></category><category><![CDATA[ии в разработке]]></category><category><![CDATA[pyton]]></category><category><![CDATA[разработка с ии]]></category><category><![CDATA[ит-сообщество]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ab429 — Искусственный интеллект (+3) — 07.04.2026 10:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1020198/</guid>
    <link>https://habr.com/ru/posts/1020198/?utm_campaign=1020198&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Собери свой OpenClaw за вечер - гайд за 18 шагов</strong></p><p>OpenClaw - самый быстрорастущий опенсорс-проект в истории GitHub. 350k звезд за пять месяцев, обогнал React, Linux и все остальное. Персональный AI-ассистент, который живет на твоей машине, работает через WhatsApp/Telegram/Slack/iMessage, выполняет команды в шелле, управляет браузером, отправляет почту, работает по расписанию. Если еще не слышали, советую попробовать.</p><p>Мне всегда интересно попробовать собрать что-то своими руками, особенно нравится ковыряться и настраивать ИИ агентов - есть в этом ощущение управления собственными сотрудниками. К чему я это, <strong>ловите интересный репозиторий</strong> - <a href="https://github.com/czl9707/build-your-own-openclaw" rel="noopener noreferrer nofollow">build-your-own-openclaw</a>.</p><p><strong>Что за репозиторий</strong></p><p>Это пошаговый туториал из 18 этапов, где ты собираешь свою версию OpenClaw с нуля. Именно послойная сборка - каждый шаг добавляет одну концепцию и содержит работающий код + README с объяснением архитектурных решений. Шанс разобраться как устроен такой популярный бот.</p><p>Можно выделить четыре фазы:</p><p><strong>Фаза 1 - одиночный агент.</strong> Начинаешь с голого чат-лупа. Потом подключаешь инструменты (read/write/bash - вот и основа для уже для большого скоупа задач). Затем навыки через SKILL.md, персистентность сессий, слеш-команды, компактификация истории, веб-инструменты.</p><p><strong>Фаза 2 - event-driven архитектура.</strong> Агент выходит за пределы CLI. Горячая перезагрузка конфигов, каналы (теперь можно писать агенту с телефона), WebSocket для программного взаимодействия.</p><p><strong>Фаза 3 - автономность и мультиагентность.</strong> Маршрутизация задач между агентами, cron + heartbeat (агент работает, пока спим или заняты делами), многослойные промпты, dispatch между агентами.</p><p><strong>Фаза 4 - продакшн.</strong> Контроль конкурентности и долговременная память.</p><p><strong>Почему это полезно может быть полезно?</strong></p><p>В большинстве гайдов по агентным системам тебе дают либо высокоуровневую схему, либо готовый фреймворк, в который не хочется лезть, разбираться, копаться. Здесь этот шаговый подход позволяет проще въехать, заставить себя изучать и по мере усложнения, все больше и больше втягиваешься. Можно изучить:</p><ul><li><p>Как строится цикл принятия решений. </p></li><li><p>Как агент выбирает инструменты.</p></li><li><p>Как компактифицируется контекст, когда история перестает влезать в окно.</p></li><li><p>Как появляется ощущение «интеллекта» из вполне механических частей.</p></li></ul><p>В какой-то момент ловишь себя на мысли, что уже думаешь как оркестратор, как большой начальник, а не как рядовой пользователь модели. <strong>И вот это, пожалуй, самое ценное.</strong></p><p>Туториал написан на Python, использует LiteLLM для абстракции провайдеров. Можно пройти за вечер-два, если не застревать на каждом шаге.</p><p><a href="https://github.com/czl9707/build-your-own-openclaw" rel="noopener noreferrer nofollow">Репозиторий</a> • <a href="https://build-your-own-openclaw.kiyo-n-zane.com/" rel="noopener noreferrer nofollow">Сайт туториала</a></p><blockquote><p>Надеюсь тебе понравилось. Лучшая благодарность - это твоя подписка на мой&nbsp;<a href="https://t.me/idei_iz_doliny" rel="noopener noreferrer nofollow">Telegram-канал</a>&nbsp;😊</p></blockquote> <a href="https://habr.com/ru/posts/1020198/?utm_campaign=1020198&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Apr 2026 07:40:29 GMT</pubDate>
    <dc:creator><![CDATA[ab429]]></dc:creator>
      
      <category><![CDATA[openclaw]]></category><category><![CDATA[ai agent]]></category><category><![CDATA[llm]]></category><category><![CDATA[мультиагентные системы]]></category><category><![CDATA[python]]></category><category><![CDATA[open source]]></category><category><![CDATA[tutorial]]></category><category><![CDATA[ai assistant]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Искусственный интеллект (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018506/</guid>
    <link>https://habr.com/ru/posts/1018506/?utm_campaign=1018506&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Анализ истории сделок на предмет перекоса шортистов/лонгистов</strong></p><blockquote><p><a href="https://github.com/tripolskypetr/volume-anomaly" rel="noopener noreferrer nofollow">Ссылка на GitHub</a></p></blockquote><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2f9/44e/d86/2f944ed86c470704f71741f3c66b0d04.png" width="720" height="480"></figure><p>В <code>backtest-kit</code> модуль <code>volume-anomaly</code> используется как источник в графе сигналов - параллельно с GARCH. Если GARCH отвечает на вопрос «достаточно ли ожидаемое движение», то <code>volume-anomaly</code> отвечает на вопрос «является ли прямо сейчас статистически необычным моментом в микроструктуре рынка».  <br><br><strong>Пример кода</strong></p><pre><code class="typescript">import { sourceNode, outputNode } from '@backtest-kit/graph';
import { predict } from 'volume-anomaly';
import { getCandles } from 'backtest-kit';

const ANOMALY_CONFIDENCE = 0.75;
const N_TRAIN  = 1200; // обучающее окно — должно быть без аномалий
const N_DETECT = 200;  // окно детекции

const reversalSource = sourceNode(
  async (symbol) =&gt; {
    // Важно: recent не должен пересекаться с historical
    const all        = await getAggregatedTrades(symbol, N_TRAIN + N_DETECT);
    const historical = all.slice(0, N_TRAIN);  // старые сделки — baseline
    const recent     = all.slice(N_TRAIN);     // новые — без overlap

    return predict(historical, recent, ANOMALY_CONFIDENCE);
    // {
    //   anomaly:    true,
    //   confidence: 0.81,
    //   direction:  'long' | 'short' | 'neutral',
    //   imbalance:  0.61,
    // }
 },
);

const entrySignal = outputNode(
  async ([reversal, ...]) =&gt; {
    if (!reversal.anomaly) return null;
    if (reversal.direction === 'neutral') return null;

    const position = reversal.direction; // 'long' | 'short'

    return {
      id: randomString(),
      position,
      priceTakeProfit: ...
      priceStopLoss: ...
      minuteEstimatedTime: 60,
    };
  },
  reversalSource,
  ...
);</code></pre><p><strong>Ключевые детали</strong>  </p><ul><li><p><code>Hawkes Process</code> - кластеризация ордеров</p></li><li><p><code>CUSUM</code>- сдвиг buy/sell дисбаланса относительно исторической нормы</p></li><li><p><code>BOCPD</code>- смена режима: момент когда распределение дисбаланса само меняется</p></li></ul><p><strong>Как использовать</strong><br><br>Классическая проблема DCA - ты усредняешься в падающий нож. Цена идёт против, ты докупаешь, а она продолжает падать. <code>volume-anomaly</code> заточен именно под это: докупать не по расписанию или по сетке уровней, а только когда ордерфлоу показывает разворот агрессии.  <br></p> <a href="https://habr.com/ru/posts/1018506/?utm_campaign=1018506&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 04 Apr 2026 08:18:45 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[трейдинг]]></category><category><![CDATA[криптовалюты]]></category><category><![CDATA[мосбиржа]]></category><category><![CDATA[tradingview]]></category><category><![CDATA[pinescript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[python]]></category><category><![CDATA[торговля]]></category><category><![CDATA[биржа]]></category><category><![CDATA[binance]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Web_5 — Python (+1) — 03.04.2026 11:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018840/</guid>
    <link>https://habr.com/ru/posts/1018840/?utm_campaign=1018840&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/78c/028/d30/78c028d30c8eacd2a3e3ef4a3a03c033.png" width="798" height="613"></figure><p><strong>Golem хамоватый кодинг агент  в Telegram</strong></p><p>Представьте: вы кидаете ему .zip с проектом, а он  выдаёт разбор по архитектуре, находит говнокод, утечки ключей, отсутствие индексов и  сообщает, что вся ваша система — «детский сад на колхозе».</p><p>Это и есть <strong>Golem 666</strong> — мой Telegram-бот, который анализирует код жёстко, без соплей и политкорректности.</p><p>Сейчас он уже умеет:</p><ul><li><p>Пожирать проекты в .zip и анализировать их</p></li><li><p>Искать баги, уязвимости и архитектурные косяки</p></li><li><p>Давать конкретные рекомендации по исправлению</p></li><li><p>Работать в стриминговом режиме (сообщения приходят по мере генерации)</p></li><li><p>Сам постить отчёты в свой Telegram-канал</p></li><li><p>Ну и конечно пишет скрипт по запросу</p></li></ul><p>Прямо сейчас я оптимизирую его по расходам и делаю кеш,чтоб не тартить токены юзеров на повторяющие вопросы.</p><p>В ближайших планах:</p><ul><li><p>Автоматическое создание репозитория на GitHub</p></li><li><p>Автодеплой после успешного ревью кода</p></li></ul><p>Если вам тоже иногда хочется, чтобы кто-то жёстко и по делу сказал, то можете пообщаться с <a href="https://t.me/Golem666bot" rel="noopener noreferrer nofollow">Големом</a>. <br>В своем  <a href="https://t.me/+s-UqT7CO9_s3N2I6" rel="noopener noreferrer nofollow">канале </a>я рассказываю о разработке своих ботов более подробно и без цензуры.))</p><p>Кто уже попробовал подобных агентов — поделитесь в комментариях, насколько они у вас живые и наглые. Интересно сравнить.</p><p>#python #ai #telegram #coding #golem</p> <a href="https://habr.com/ru/posts/1018840/?utm_campaign=1018840&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 03 Apr 2026 08:22:17 GMT</pubDate>
    <dc:creator><![CDATA[Web_5]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[ai]]></category><category><![CDATA[codingagent]]></category><category><![CDATA[telegrambot]]></category><category><![CDATA[golem]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Искусственный интеллект (+4) — 02.04.2026 14:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018482/</guid>
    <link>https://habr.com/ru/posts/1018482/?utm_campaign=1018482&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>О прогнозе нейтрального тренда актива</strong></p><blockquote><p><a href="https://github.com/tripolskypetr/garch" rel="noopener noreferrer nofollow">Ссылка на GitHub</a></p></blockquote><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3db/e7f/1d0/3dbe7f1d0c62bf6514f14deea8b29c35.png" alt="Две полоски - лучший и худший случай, его можно прогнозировать" title="Две полоски - лучший и худший случай, его можно прогнозировать" width="720" height="483"><div><figcaption>Две полоски - лучший и худший случай, его можно прогнозировать</figcaption></div></figure><p>В <code>backtest-kit</code> GARCH используется как один из источников в графе сигналов. Идея: вход открывается только если GARCH-канал достаточно широк, чтобы TP и SL уместились с запасом над комиссиями.<br><br>Например, этим можно законтрить боковик, который был на BTCUSDT в Феврале 2024</p><ul><li><p>5–10&nbsp;февраля, 73% нейтральных баров </p></li><li><p>11–16&nbsp;февраля, 63% нейтральных баров </p></li><li><p>19–24&nbsp;февраля, 75% нейтральных баров </p></li><li><p>26–29&nbsp;февраля, 69% нейтральных баров </p></li></ul><p><strong>Пример кода</strong></p><pre><code class="typescript">import { sourceNode, outputNode } from '@backtest-kit/graph';
import { predict } from 'garch';
import { getCandles } from 'backtest-kit';

const CANDLES_FOR_GARCH = 300;
const GARCH_CONFIDENCE = 0.6827; // ±1σ

const garchSource = sourceNode(
  Cache.fn(
    async (symbol) =&gt; {
      const candles = await getCandles(symbol, '8h', CANDLES_FOR_GARCH);
      return predict(candles, '8h', null, GARCH_CONFIDENCE);
    },
    { interval: '8h', key: ([symbol]) =&gt; symbol },
  ),
);

const entrySignal = outputNode(
  async ([trend, volume]) =&gt; {
    // Пропускаем если модель не сошлась
    if (!volume.reliable) return null;

    // Проверяем что до границ канала достаточно места
    const upperDiff = percentDiff(trend.close, volume.upperPrice);
    const lowerDiff = percentDiff(trend.close, volume.lowerPrice);

    if (upperDiff &lt; TAKE_PROFIT_PERCENT) return null;
    if (lowerDiff &lt; STOP_LOSS_PERCENT) return null;

    // TP и SL по границам GARCH-канала
    const tp = trend.position === 'long' ? volume.upperPrice : volume.lowerPrice;
    const sl = trend.position === 'long' ? volume.lowerPrice : volume.upperPrice;

    return { position, priceOpen: trend.close, priceTakeProfit: tp, priceStopLoss: sl };
  },
  trendSource,
  garchSource,
);</code></pre><p>GARCH здесь не генерирует направление. Он отвечает только на вопрос «достаточно ли ожидаемое движение». Направление приходит от другого источника (это может быть Pine Script через <code>@backtest-kit/pinets</code> или LLM через <code>@backtest-kit/ollama</code>)</p><p><strong>Ключевые детали</strong></p><ul><li><p><strong>Parkinson estimator</strong> для per-candle RV: <code>(1/4ln2) · ln(H/L)²</code> — в ~5× эффективнее squared returns</p></li><li><p><strong>Log-normal bands</strong>: <code>P·exp(±z·σ)</code> — не линейное приближение, правильное маппирование в ценовое пространство</p></li><li><p><strong><code>reliable: true</code></strong> когда: оптимизатор сошёлся + persistence &lt; 0.999 + Ljung-Box p ≥ 0.05</p></li><li><p><strong>Оптимизация</strong>: multi-start Nelder-Mead, GARCH — 4 рестарта, NoVaS — 7 (11-мерная задача)</p></li><li><p><strong>932 теста</strong>, включая ground-truth тест с синтетическими данными известной волатильности</p></li></ul> <a href="https://habr.com/ru/posts/1018482/?utm_campaign=1018482&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Apr 2026 11:58:06 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[трейдинг]]></category><category><![CDATA[криптовалюты]]></category><category><![CDATA[мосбиржа]]></category><category><![CDATA[tradingview]]></category><category><![CDATA[pinescript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[python]]></category><category><![CDATA[торговля]]></category><category><![CDATA[биржа]]></category><category><![CDATA[binance]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vldmrmlkv — Python (+1) — 01.04.2026 22:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018216/</guid>
    <link>https://habr.com/ru/posts/1018216/?utm_campaign=1018216&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Краткая версия <a href="https://habr.com/ru/articles/1017676/" rel="noopener noreferrer nofollow">Интервью Гвидо ван Роуссума с core-разработчиком Python Бреттом Кэнноном</a>:</p><pre><code class="python">import textwrap


def print_bubble(text: str, name: str, side="left"):
    wrapped = textwrap.wrap(text, width=45)
    max_len = max(len(line) for line in wrapped)
    width = max_len + 2

    if side == "left":
        indent = ""
        tail = "╲|"
        bottom = indent + "╰" + "─" * (width - 1) + tail
    else:
        indent = " " * 52
        tail = "|/"
        bottom = indent + tail + "─" * (width - 1) + "╯"

    print(indent + "╭" + "─" * width + "╮")
    print(indent + name)
    for line in wrapped:
        print(indent + "│ " + line.ljust(max_len) + " │")
    print(bottom)


dialog = [
    ("left", "Гвидо:", "Как ты нашёл Python?"),
    ("right", "Бретт:", "Искал язык для ООП в 2000-м, попробовал Python — сразу зашло."),
    ("left", "Гвидо:", "И что дальше?"),
    ("right", "Бретт:", "Через Python Cookbook попал в сообщество, потом в python-dev."),
    ("left", "Гвидо:", "Быстро втянулся?"),
    ("right", "Бретт:", "Да, начал писать обзоры, отправлять патчи, добавил strptime, стал core-разработчиком в 2003."),
    ("left", "Гвидо:", "Каким было сообщество тогда?"),
    ("right", "Бретт:", "Небольшим, всё держалось на энтузиастах."),
    ("left", "Гвидо:", "А позже?"),
    ("right", "Бретт:", "Участвовал в переходе на Python 3, развитии стандартной библиотеки и управлении."),
    ("left", "Гвидо:", "Самый сложный момент?"),
    ("right", "Бретт:", "Твой уход и кризис управления помогли перейти к другой модели руководства."),
    ("left", "Гвидо:", "В итоге?"),
    ("right", "Бретт:", "Случайно попробовал Python и стал ключевым участником проекта."),
]

print("Нажимайте ENTER (или пробел) для следующего сообщения.\n")

for side, name, text in dialog:
    input()
    print_bubble(text, name, side)

print("\n Вы прочитали краткую версию. Подробнее читайте на https://habr.com/ru/articles/1017676/ \n")
</code></pre> <a href="https://habr.com/ru/posts/1018216/?utm_campaign=1018216&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 01 Apr 2026 19:11:32 GMT</pubDate>
    <dc:creator><![CDATA[vldmrmlkv]]></dc:creator>
      
      <category><![CDATA[tldr]]></category><category><![CDATA[python3]]></category><category><![CDATA[интервью]]></category><category><![CDATA[гвидо ван россум]]></category><category><![CDATA[бретт кэннон]]></category><category><![CDATA[ненормальное программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dKosarevsky — Блог компании Open Data Science (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1016390/</guid>
    <link>https://habr.com/ru/posts/1016390/?utm_campaign=1016390&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем привет. Начал писать открытую книгу про архитектуру безопасных AI-агентов.</p><p>Делаю не обзор фреймворков и не коллекцию «магических демо», а практический инженерный reference: control plane, policy boundaries, tool gateway, memory, observability, evals, approval flows, governance и production-подход к агентным системам.</p><p>Уже выложил первые главы и каркас книги - <a href="https://agent-axiom.github.io/agent-arch" rel="noopener noreferrer nofollow">https://agent-axiom.github.io/agent-arch</a></p><p>Репозиторий - <a href="https://github.com/agent-axiom/agent-arch" rel="noopener noreferrer nofollow">https://github.com/agent-axiom/agent-arch</a></p><p>Буду очень рад критике по существу:</p><ul><li><p>где архитектура спорная,</p></li><li><p>где не хватает важных разделов,</p></li><li><p>где формулировки слишком сырые,</p></li><li><p>что стоит добавить из практики эксплуатации и безопасности.</p></li></ul><p>Если тема близка - вливайся: issues, comments, corrections, PRs, ссылки на сильные источники и контрпримеры из реальных production-систем.</p><p>Хочется сделать не просто набор заметок, а полезный community-driven reference для тех, кто строит надежных и безопасных AI-агентов.</p> <a href="https://habr.com/ru/posts/1016390/?utm_campaign=1016390&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 29 Mar 2026 08:00:46 GMT</pubDate>
    <dc:creator><![CDATA[dKosarevsky]]></dc:creator>
      
      <category><![CDATA[ai agent]]></category><category><![CDATA[agent]]></category><category><![CDATA[agents]]></category><category><![CDATA[agents.md]]></category><category><![CDATA[agentic ai]]></category><category><![CDATA[agentic coding]]></category><category><![CDATA[agentic engineering]]></category><category><![CDATA[agentic workflows]]></category><category><![CDATA[agentic protocol]]></category><category><![CDATA[architecture]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dorif11 — Python (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1013782/</guid>
    <link>https://habr.com/ru/posts/1013782/?utm_campaign=1013782&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как я писал софт для фрагментного анализа ДНК</strong></p><p>Всем привет! Меня зовут Александр Дориф, я химик, молекулярный генетик и сисадмин-инфраструктурщик в компании WebHostMost, многие знают меня по нику Father Nurgle.</p><p>Итак, на дворе осень 2022 года, я, на тот момент аспирант, разрабатываю способы диагностики болезней экспансии коротких повторов (хорея Хантингтона, синдром ломкой Х хромосомы...) или с изменением количества локусов в геноме (инсерции/делеции, анеуплоидии). Я активно использую капиллярный электрофорез на ABI 3500 Dx и фрагментный анализ с помощью GeneMapper 5. И это стало проблемой. Компов в лабе мало, денег тоже, лицензия GeneMapper одна (а дополнительная стоит больше 10к$), комп с GeneMapper часто занят, софт сам по себе прибит к венде и БД Oracle. А сам я работаю на ноуте, устаревшем ещё в конце нулевых. Да, есть NCBI OSIRIS, но для него нужен Wine, а это лишний слой абстракции, да и интерфейс у него переусложнён на мой взгляд, Fragman не поддерживал импорт файлов с 3500, fatools не развивались и автор не отвечал на сообщения.</p><p>Так я решил писать FragalyseQt. Я изначально видел его как кроссплатформенный и свободный софт, поэтому выбрал за основу Python (для него есть много полезного типа BioPython) и Qt для интерфейса. Учитывая то, что у меня не было опыта написания десктопных приложений, несколько дней я изучал мануалы, после чего тёмным вечером 6 октября 2022 выпустил самую первую версию FragalyseQt с номером 0.1 и кодовым именем «Huntington». Это была смотрелка файлов FSA, умеющая селективно скрывать выбранные каналы флуоресценции и экспортировать данные внутреннего анализа (для ABI 3500 и SeqStudio) в CSV.</p><p>В версии 0.2&nbsp;«Friedreich», добавилась возможность независимого от прибора поиска и базового анализа пиков на электрофореграммах, я познакомился со SciPy и табличными возможностями Qt.</p><p>Версия 0.3&nbsp;«DiGeorge» принесла возможность правки базовой линии и тонкой настройки поиска пиков. И... Я упёрся в фундаментальную проблему: определение размера фрагментов на электрофореграммах требовало теории приблизительных вычислений, которую нам в своё время не давали, давая математику по остаточному принципу. Без сайзинга, FragalyseQt будет всего лишь смотрелкой. Я начал ботать матан. Мозги плавились, времени не хватало, к аспирантуре добавились заботы о дочке, но я учил. Здесь же случилось знакомство с реальностью: не каждая декларация «мы поддерживаем формат ABIF» значит «мы поддерживаем ПОЛНУЮ спецификацию ABIF». Также пришлось столкнуться с древними вариантами ABIF, полученными до его стандартизации. Была работа в Okteta, написание парсеров, FragalaseQt стал читать и старый ABIF, и его криминалистическое подмножество&nbsp;— HID.</p><p>1&nbsp;сентября 2024&nbsp;вышла FragalyseQt 0.4&nbsp;«Jeffreys» с&nbsp;сайзингом пиков методами степенных сплайнов, взвешенных степенных сплайнов и МНК. README стал подробнее, стремясь к полноценному мануалу. Позже добавил локальный и глобальный методы Саузерна. Софт стал реально аналитическим, с его помощью была опубликована работа на ESHG 2025 ( <a href="https://doi.org/10.13140/RG.2.2.14637.81123" rel="noopener noreferrer nofollow">https://doi.org/10.13140/RG.2.2.14637.81123</a> ). Потом развитие опять затянулось&nbsp;— задержки ЗП в начале года по 3-4 месяца не способствовали размышлениям о чём-то, кроме выживания. В сентябре я перешёл в WebHostMost и, внезапно, у меня появились адекватные задачи, время и поддержка коллег. Была переработанна структура для соответствия PEP 517, добавлен гибкий интерфейс и экспериментальная поддержка импорта сырых данных российского Нанофор-05 (формат реверсил).</p><p>20 марта 2026 вышла FragalyseQt 0.5&nbsp;«Southern» с&nbsp;импортом панелей GeneMapper, GeneMarker и NCBI OSIRIS, фильтрацией статтеров, экспортом в CODIS XML. Для скриншота мне было скучно использовать стандартные заглушки для данных (и ясно, что невозможно взять реальные данные дел), поэтому демо сделано как опознание тел после Резни в Зоне Высадки, Исстваан 5.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c33/c1c/64e/c33c1c64e270e50ed98ea8982760ff6d.png" alt="FragalyseQt 0.5 - экспорт данных после применения панелей в формат CODIS XML: выбираются вкладки с данными для экспорта, назначаются роли в рамках дела (жертва, персонал, подозреваемый, предполагаемый родитель и т.д.), заполняются данные лаборатории и экспортируются. Экспортированные данные могут быть внесены в совместимую с CODIS систему (например, SmallPond)." title="FragalyseQt 0.5 - экспорт данных после применения панелей в формат CODIS XML: выбираются вкладки с данными для экспорта, назначаются роли в рамках дела (жертва, персонал, подозреваемый, предполагаемый родитель и т.д.), заполняются данные лаборатории и экспортируются. Экспортированные данные могут быть внесены в совместимую с CODIS систему (например, SmallPond)." width="1920" height="1080"><div><figcaption>FragalyseQt 0.5 - экспорт данных после применения панелей в формат CODIS XML: выбираются вкладки с данными для экспорта, назначаются роли в рамках дела (жертва, персонал, подозреваемый, предполагаемый родитель и т.д.), заполняются данные лаборатории и экспортируются. Экспортированные данные могут быть внесены в совместимую с CODIS систему (например, SmallPond).</figcaption></div></figure><ul><li><p><a href="https://github.com/Dorif/fragalyseqt" rel="noopener noreferrer nofollow">Репозиторий</a></p></li><li><p><a href="https://github.com/Dorif/fragalyseqt/releases/tag/southern_initial" rel="noopener noreferrer nofollow">Текущий релиз</a></p></li><li><p>Планы: поддержка работы с БД и ролевая аутентификация</p></li></ul> <a href="https://habr.com/ru/posts/1013782/?utm_campaign=1013782&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 23 Mar 2026 16:16:26 GMT</pubDate>
    <dc:creator><![CDATA[dorif11]]></dc:creator>
      
      <category><![CDATA[STR]]></category><category><![CDATA[криминалистика]]></category><category><![CDATA[PCR]]></category><category><![CDATA[пцр]]></category><category><![CDATA[фрагментный анализ]]></category><category><![CDATA[forensics]]></category><category><![CDATA[днк]]></category><category><![CDATA[dna]]></category><category><![CDATA[TP-PCR]]></category><category><![CDATA[repeat expansion]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Kisel_n — Python (+4) — 16.03.2026 21:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011024/</guid>
    <link>https://habr.com/ru/posts/1011024/?utm_campaign=1011024&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Зелёные тесты ≠ хорошие тесты</strong></p><p>Впервые в&nbsp;истории писать тесты стало легко и совсем не&nbsp;страшно. Вокруг теперь у&nbsp;всех покрытие 80%, 90%, а&nbsp;то и вовсе 100%. И вот тут начинается проблема: зелёные тесты ≠ хорошие тесты.</p><p>Проблема в&nbsp;метрике, которой мы все привыкли доверять. Code coverage считает строку протестированной, если она выполнилась во&nbsp;время теста. Всё. Не «поймает&nbsp;ли тест баг в&nbsp;этой строке», не «проверяет&nbsp;ли он правильность результата»&nbsp;— просто выполнилась. Можно написать тест без&nbsp;единого assert, и покрытие вырастет. 500&nbsp;тестов, 90% coverage, а&nbsp;пользы ноль.</p><p>Мутационное тестирование&nbsp;— это совершенно другой путь. В&nbsp;простейшей реализации этот инструмент тупо берёт твой код и намеренно ломает его: меняет &gt; на &gt;=, + на ‑, True на&nbsp;False. Каждая такая поломка&nbsp;— мутант. Если после мутации все тесты по‑прежнему зелёные&nbsp;— значит они ничего не&nbsp;проверяют. Покрытие есть, защиты нет.</p><p><strong>Почему это важно именно сейчас?</strong></p><p>Потому что&nbsp;нейронка любит зелёненькое. Чем больше зелёных тестов&nbsp;— тем субъективно лучше. 100&nbsp;тестов внушают больше доверия, чем 10, правда? А&nbsp;внутри там assert response.status_code == 200. assert result is not None. assert len(items) &gt; 0. Тест проверяет, что&nbsp;функция вернула хоть что‑то&nbsp;— и радостно зеленеет. Поменяй логику условия, перепутай знак, сломай граничный случай&nbsp;— тест всё равно зелёный. Потому что&nbsp;он проверяет не&nbsp;правильность, а&nbsp;наличие.</p><p>Мутационное тестирование&nbsp;— единственный автоматический способ это поймать. Метрика называется mutation score: процент убитых мутантов. 60%&nbsp;— плохо. 90%+&nbsp;— тесты реально что‑то защищают.</p><p>Кое‑какие инструменты для&nbsp;такого тестирования уже есть: mutmut и cosmic‑ray для&nbsp;Python, Stryker для&nbsp;JS/TS, PIT для&nbsp;Java. Медленно? Да, значительно медленнее обычного тест‑рана. Но&nbsp;запускать его не&nbsp;нужно на&nbsp;каждый коммит&nbsp;— достаточно на&nbsp;PR в&nbsp;критические модули.</p><p>Но&nbsp;есть нюансы. А&nbsp;где их нет, правда?</p><p>Первый: мутации рандомные. Замена &gt; на &gt;=&nbsp;— это не&nbsp;баг, который кто‑то реально допустит. Это синтетическая поломка. Половина мутантов генерирует код, который в&nbsp;реальности никогда не&nbsp;появится. Ты тратишь время на&nbsp;убийство мутантов, которые не&nbsp;имеют отношения к&nbsp;настоящим ошибкам. Это как&nbsp;тестировать замок, ковыряя его вилкой&nbsp;— формально проверка, по&nbsp;факту мимо.</p><p>Второй&nbsp;— ещё хуже. Чтобы убить мутанта, тест должен зафиксировать конкретное поведение. Каждую ветку, каждое значение, каждый edge case. Доведи mutation score до 100%&nbsp;— и ты прибил гвоздями каждую строчку кода. Буквально. Теперь попробуй отрефакторить. Переименовал внутренний метод&nbsp;— 40&nbsp;тестов красные. Поменял порядок полей в&nbsp;ответе&nbsp;— ещё 20. Тесты превращаются из&nbsp;страховки в&nbsp;кандалы: код работает правильно, но&nbsp;тесты падают, потому что&nbsp;они проверяют не&nbsp;поведение, а&nbsp;реализацию.</p><p>Это реально ловушка. Слишком гонишься за&nbsp;mutation score&nbsp;— получаешь хрупкие тесты. Не&nbsp;гонишься&nbsp;— получаешь видимость тестирования.</p><p><strong>Перемены&nbsp;— впереди!</strong></p><p>И вот тут становится по‑настоящему интересно. Представь, что&nbsp;мутации генерирует не&nbsp;тупой набор правил «замени плюс на&nbsp;минус», а&nbsp;нейронка, которая понимает контекст. Которая знает, какие баги реально встречаются в&nbsp;таком коде. Которая мутирует не&nbsp;синтаксис, а&nbsp;логику: меняет порядок проверок, путает граничные условия, забывает обработать edge case&nbsp;— ровно так, как&nbsp;ошибается человек. Или&nbsp;другая нейронка.</p><p>Сейчас есть явный сдвиг в&nbsp;сторону таких инструментов, но&nbsp;всё еще ничего достойного не&nbsp;вышло. Но&nbsp;уже скоро точно появится. И это будет совсем другой уровень. Не «выжили&nbsp;ли тесты после рандомной поломки», а «выжили&nbsp;ли тесты после правдоподобной ошибки».</p><p>Парадокс в&nbsp;том, что&nbsp;мутационное тестирование&nbsp;было нишевым инструментом, пока тесты писали люди. Когда тесты пишет нейронка&nbsp;— идея становится обязательной. Правда инструменты пока не&nbsp;успели дозреть.</p><p>Ждём, когда мутанты станут умнее.</p> <a href="https://habr.com/ru/posts/1011024/?utm_campaign=1011024&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 18:06:43 GMT</pubDate>
    <dc:creator><![CDATA[Kisel_n]]></dc:creator>
      
      <category><![CDATA[mutation testing]]></category><category><![CDATA[мутационное тестирование]]></category><category><![CDATA[code coverage]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[AI]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[mutmut]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myshkin_does_it — Python (+1) — 14.03.2026 14:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010186/</guid>
    <link>https://habr.com/ru/posts/1010186/?utm_campaign=1010186&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Два факта об int в</strong> <strong>Python</strong></p><p>Один забавный факт привел меня к открытию другого :)</p><p>Читал Fluent Python и наткнулся на пример кода, который меня заинтересовал (помимо миллиона других, книга – топ). В главе про конкурентность и работу GIL была константа <code>NUMBERS</code> с необычным значением:</p><pre><code class="python">NUMBERS = 5_000_111_000_222_021</code></pre><p><strong>Нижние подчеркивания</strong></p><p>Если не встречали в работе или документации, то вряд ли знаете (как и я): в числах можно использовать <code>_</code> для читаемости. Интерпретатор их игнорирует:</p><pre><code class="bash">&gt;&gt;&gt; x = 1_2
&gt;&gt;&gt; y = 12
&gt;&gt;&gt; x == y
True
&gt;&gt;&gt; x is y
True</code></pre><p>Особенно удобно в высокоразрядных числах. Согласитесь <code>5_000_111_000_222_021</code> куда проще читать, чем <code>5000111000222021</code></p><p><strong>Кеш малых чисел</strong></p><p>Примеры ниже разбирал на домашнем ноуте с Cpython 3.13.11 и 3.14.3.</p><p>Пока игрался, меня заинтересовал один прикол. Я попробовал тот же пример с большими числами:</p><pre><code class="bash">&gt;&gt;&gt; x = 100_500
&gt;&gt;&gt; y = 100500
&gt;&gt;&gt; x == y
True
&gt;&gt;&gt; x is y
False # Но ведь в примере выше было True..</code></pre><p>Почему переменные больше не ссылаются на один объект?</p><p>В Cpython есть кеш для маленьких чисел, чтобы частые значения переменных не занимали много памяти и код был отзывчивее.</p><p>Ответ на вопрос: «где граница, до которой числа закешированы?» я решил не гуглить, проверил небольшим скриптом:</p><pre><code class="bash">&gt;&gt;&gt; x = 0
&gt;&gt;&gt; y = 0
&gt;&gt;&gt; for n in range(1000):
... &nbsp; &nbsp; print(f'If {x=} and {y=}, x is y: {x is y}')
... &nbsp; &nbsp; x += 1
... &nbsp; &nbsp; y += 1

# Пропустим часть строк
If x=254 and y=254, x is y: True
If x=255 and y=255, x is y: True
If x=256 and y=256, x is y: True
If x=257 and y=257, x is y: False # Вот и граница
If x=258 and y=258, x is y: False&nbsp;
...</code></pre><p>Сначала я сделал эмпирически вывод, что закеширован диапазон 0 – 256. Но после самопроверки с гуглом узнал, что также в амортизированный диапазон входят числа от -5 до -1. Итого : от -5 до 256 включительно.</p><p><strong>UPD 15.03.2026.</strong>  Добрый <a href="https://habr.com/ru/users/zzzzzzerg/" rel="noopener noreferrer nofollow">дядя</a> в комментах принес ссылку на <a href="https://github.com/python/cpython/pull/133160/changes" rel="noopener noreferrer nofollow">pr</a> в Cpython 3.15, где кеш малых чисел увеличен  до 1024 :). Ух, заживем..</p><p>Для присвоения переменным чисел вне диапазона, интерпретатор начнет выделять уже раздельные области памяти и <code>is</code> станет возвращать <code>False</code>.</p><p>Так то. В оптимизации пригодится вряд ли, но удивить друзей в баре сможете.</p> <a href="https://habr.com/ru/posts/1010186/?utm_campaign=1010186&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 14 Mar 2026 11:57:09 GMT</pubDate>
    <dc:creator><![CDATA[myshkin_does_it]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[integer]]></category><category><![CDATA[оптимизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JDTapp — Блог компании Doubletapp (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/doubletapp/posts/1008940/</guid>
    <link>https://habr.com/ru/companies/doubletapp/posts/1008940/?utm_campaign=1008940&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как проверить HTTP-запросы на Backend</strong></p><p>Разрабатываете VK Mini Apps и хотите быть уверены, что HTTP-запросы на backend приходят именно из приложения VK, а не откуда угодно? Для этого нужна корректная проверка Init Data.</p><p>Наш backend-разработчик <a href="https://habr.com/ru/users/dmvasiliev/" rel="noopener noreferrer nofollow">@dmvasiliev</a> выложил Open Source-проект, который упрощает эту задачу. Это Python-пакет с готовыми алгоритмами проверки подлинности данных, передаваемых из VK Mini Apps. Он помогает быстро и безопасно настроить авторизацию и аутентификацию на backend-стороне приложения.</p><p>👉 <a href="https://github.com/swimmwatch/vk-mini-app-auth" rel="noopener noreferrer nofollow">Репозиторий</a><a href="https://github.com/swimmwatch/vk-mini-app-auth%EF%BF%BC%F0%9F%93%98" rel="noopener noreferrer nofollow"><br>📘</a> <a href="https://swimmwatch.github.io/vk-mini-app-auth/" rel="noopener noreferrer nofollow">Документация</a> с примерами интеграции для Django и FastAPI.</p><p>Когда мы только начинали работать с VK Mini Apps, информации было немного: редкие кейсы, почти не у кого было спросить совета. За это время мы запустили несколько приложений, разобрались в нюансах платформы и накопили собственную экспертизу. Теперь делимся ею с сообществом через Open Source-проекты и вносим вклад в развитие технологии.</p><p>Репозиторий открыт — берите в работу, делитесь постом с коллегами.&nbsp;</p><blockquote><p>А если вам нужен VK, Telegram Mini App или спецпроект на другой платформе — команда Doubletapp поможет пройти путь от идеи до работающего продукта. <br>Примеры наших проектов — <a href="https://doubletapp.ai/miniapp/?utm_source=habr&amp;utm_medium=post&amp;utm_campaign=vk_mini_apps_repo" rel="noopener noreferrer nofollow">на сайте</a>.</p></blockquote> <a href="https://habr.com/ru/posts/1008940/?utm_campaign=1008940&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 11 Mar 2026 09:11:30 GMT</pubDate>
    <dc:creator><![CDATA[JDTapp (Doubletapp)]]></dc:creator>
      
      <category><![CDATA[mini app]]></category><category><![CDATA[mini apps]]></category><category><![CDATA[mini apps telegram]]></category><category><![CDATA[mini app authorization]]></category><category><![CDATA[vk mini apps]]></category><category><![CDATA[python]]></category><category><![CDATA[authorization]]></category><category><![CDATA[open-source]]></category><category><![CDATA[библиотека компонентов]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @men10577 — Python (+1) — 09.03.2026 18:35]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008220/</guid>
    <link>https://habr.com/ru/posts/1008220/?utm_campaign=1008220&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/526/f60/c41/526f60c419677b594fcd68c2e70732cf.jpeg" width="1280" height="408"></figure><p>В <a href="https://habr.com/ru/posts/1005478/" rel="noopener noreferrer nofollow">продолжение</a> прошлого поста, собрал новый трек <a href="https://ai.arckep.ru/track-4/" rel="noopener noreferrer nofollow">курса</a> из вашей обратной связи. Углубил тему, сделал ориентир на уже более опытных.<br>Если есть куда еще копать - пишите в комментарии.</p><p>P.S. Все также бесплатно и таким останется, пока у меня есть деньги на поддержку и развитие ресурса.  </p> <a href="https://habr.com/ru/posts/1008220/?utm_campaign=1008220&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 15:35:35 GMT</pubDate>
    <dc:creator><![CDATA[men10577]]></dc:creator>
      
      <category><![CDATA[LangGraph]]></category><category><![CDATA[CrewAI]]></category><category><![CDATA[Dify]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Ollama]]></category><category><![CDATA[vLLM]]></category><category><![CDATA[llama.cpp]]></category><category><![CDATA[Anthropic]]></category><category><![CDATA[OpenAI]]></category><category><![CDATA[Vercel]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DariRinch — Искусственный интеллект (+4) — 09.03.2026 15:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008158/</guid>
    <link>https://habr.com/ru/posts/1008158/?utm_campaign=1008158&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Сделать ИИ подотчетным? Теперь это реально</strong></p><p>Пока <a href="https://habr.com/ru/users/DariRinch/articles/" rel="noopener noreferrer nofollow">статья</a> набирает просмотры, выкатили DCL Evaluator - v1.1.0 с webhook API. Любой LLM pipeline получает криптографическое доказательство каждого решения за 3 строки кода. Tamper-evident. Offline-capable. 🔗 <a href="http://fronesislabs.com" rel="noopener noreferrer nofollow">fronesislabs.com</a> ⭐ <a href="https://github.com/DariRinch/dcl-app/releases/tag/v1.1.0" rel="noopener noreferrer nofollow">GitHub</a></p> <a href="https://habr.com/ru/posts/1008158/?utm_campaign=1008158&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 12:51:21 GMT</pubDate>
    <dc:creator><![CDATA[DariRinch]]></dc:creator>
      
      <category><![CDATA[искусственный интеллект]]></category><category><![CDATA[LLM]]></category><category><![CDATA[аудит]]></category><category><![CDATA[криптография]]></category><category><![CDATA[compliance]]></category><category><![CDATA[EU AI Act]]></category><category><![CDATA[webhook]]></category><category><![CDATA[API]]></category><category><![CDATA[информационная безопасность]]></category><category><![CDATA[open source]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Python (+4) — 09.03.2026 11:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008078/</guid>
    <link>https://habr.com/ru/posts/1008078/?utm_campaign=1008078&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Команда разработчиков языка программирования Python <a href="https://blog.python.org/2026/03/cpython-codebase-growth/" rel="noopener noreferrer nofollow">визуализировала</a> изменение кодовой базы интерпретатора CPython в&nbsp;привязке к&nbsp;основным событиям, произошедшим за 36&nbsp;лет существования проекта. За&nbsp;последние 10&nbsp;лет объём кода на&nbsp;языках Python и Си в&nbsp;CPython практически удвоился. Для&nbsp;подсчёта числа строк кода использовалась утилита <a href="https://github.com/AlDanial/cloc" rel="noopener noreferrer nofollow">cloc</a>. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/730/5d0/cde/7305d0cdedf5a461fdad2ae337f4e9b2.png" width="1345" height="659"></figure> <a href="https://habr.com/ru/posts/1008078/?utm_campaign=1008078&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 08:39:24 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[CPython]]></category><category><![CDATA[Python]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nomanhero — Исследования и прогнозы в IT (+4) — 04.03.2026 15:26]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1006460/</guid>
    <link>https://habr.com/ru/posts/1006460/?utm_campaign=1006460&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>44 собеса за месяца </strong>— <strong>Жив ли рынок QA/AQA на самом деле?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/625/aec/d2b/625aecd2b7d3521b695ab2d5c33b465e.png" alt="Календарь AQA собесов за декабрь" title="Календарь AQA собесов за декабрь" width="1280" height="814"><div><figcaption>Календарь AQA собесов за декабрь</figcaption></div></figure><p>Последний год в IT регулярно обсуждают одну и ту же тему — рынок стал сложнее.<br>Вакансий меньше, требования выросли, конкуренция усилилась.</p><p>Особенно часто это можно услышать от специалистов из QA/AQA:<br>Мол, тестирование переполнено, вакансий мало, а найти новую работу стало почти нереально.</p><p>Я давно консультирую ребят в сфере QA и автоматизации тестирования (AQA) и регулярно наблюдаю, как специалисты выходят на рынок. Поэтому иногда вижу довольно наглядные примеры того, как ситуация выглядит на практике.</p><p>Как раз недавно один из ребят показал в нашем чатике свой календарь собеседований за декабрь — этот календарь приложил выше.</p><p>И, честно говоря, даже меня это немного удивило. За месяц у него набралось <strong>44 собеседования</strong>.</p><p>Причём:<br>Во-первых, всё это происходило <strong>параллельно с основной работой</strong>.<br>Человек не уходил в отпуск и не ставил поиск работы на полный день — все интервью проходили между рабочими задачами.</p><p>Во-вторых, это был <strong>декабрь</strong>.<br>Если смотреть на рынок найма в IT, конец года традиционно считается не самым активным периодом: компании закрывают бюджеты, команды уходят в отпуска, процессы замедляются.</p><p>Тем не менее календарь получился очень плотным.</p><p>Иногда у него было <strong>по несколько интервью в день</strong>:<br>HR, технички, финалки, снова HR.</p><p>А если представить его лицо 11го декабря — то лучше не надо)</p><p>P.S. Выходил на рынок он как <strong>Fullstack QA/AQA</strong>, если что. В ручном тестировании естественно ситуация похуже. Но наверное основной моей задачей и являлось помочь ему с этим переходом (QA-&gt;AQA), т.к. именно тут наилучшая конверсия для QA.</p><p><strong>И что по итогу? Оправдались ли такие усилия?</strong></p><p>Думаю, всем это тоже будет интересно. Стоило ли оно вообще того.<br><br>Вы реально думаете, что человек, который проходил по 6 собесов в день, мог не добиться своего?)</p><p>Всё-таки в подобной ситуации очень быстро прокачиваются навыки интервью. С каждым новым собеседованием ответы становятся точнее, технические вопросы разбираются быстрее, а уверенность растёт.</p><p>В итоге этот кандидат получил <strong>6 офферов</strong>.</p><p>Один из них оказался особенно сильным — <strong>около 490 000 рублей gross</strong> для позиции в автоматизации тестирования.</p><p>На мой взгляд, это хороший пример того, как сейчас устроен рынок.</p><p>Да, он действительно стал сложнее.<br>Да, требования выросли.</p><p>Но при этом рынок <strong>далеко не мёртв</strong>. Он просто стал требовательнее к кандидатам.</p><p>Те, кто активно выходят на рынок, много собеседуются, анализируют обратную связь и продолжают двигаться дальше — как правило, всё равно получают результат.</p><p>А те, кто не пытается, чаще находят объяснение, почему сейчас «не время».</p><p>Поэтому, когда в очередной раз услышите, что <strong>рынок QA/AQA окончательно умер</strong>, просто вспомните календарь из <strong>44 собеседований за один месяц</strong>.</p><p>Спасибо, что дочитали пост до конца! Надеюсь, смог зарядить вас мотивацией, это была моя основная цель 🙂<br><br>В комментариях готов подискутировать на эту и смежные темы! Ну а в своем&nbsp;<strong><a href="https://t.me/+5QJp6nMO4qcwOThi" rel="noopener noreferrer nofollow">блоге Telegram</a></strong>&nbsp;также пишу про тестирование и автоматизацию, иногда затрагивая и общие темы развития в сфере IT. Всегда рад новым читателям!) </p> <a href="https://habr.com/ru/posts/1006460/?utm_campaign=1006460&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 04 Mar 2026 12:26:45 GMT</pubDate>
    <dc:creator><![CDATA[nomanhero]]></dc:creator>
      
      <category><![CDATA[тестирование]]></category><category><![CDATA[автоматизация]]></category><category><![CDATA[автоматизация тестирования]]></category><category><![CDATA[hh.ru]]></category><category><![CDATA[поиск работы в it]]></category><category><![CDATA[поиск работы в рф]]></category><category><![CDATA[карьера]]></category><category><![CDATA[qa]]></category><category><![CDATA[qa auto]]></category><category><![CDATA[qa automation]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dmitriy_offermate — Исследования и прогнозы в IT (+4) — 02.03.2026 17:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005620/</guid>
    <link>https://habr.com/ru/posts/1005620/?utm_campaign=1005620&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Война с алгоритмами </strong>—<strong> как обойти шизу HRов.</strong></p><p>Привет, Хабр.</p><p>Меня зовут Дима. Я разработчик и последние пару лет занимаюсь карьерным консультированием. Через меня прошло множество кейсов и за это время я чётко увидел одну вещь: поиск работы стал слишком выматывающим.</p><p>Не потому что люди слабые, а потому что процесс стал сложным, долгим и алгоритмическим.</p><p>Отклики уходят в пустоту. Резюме читают секунды. При этом сопроводительные письма либо не читают вообще, либо одним глазом.</p><p>В какой-то момент я понял: советов уже недостаточно. Нужен инструмент, который сам будет применять эти советы.</p><p>Так я решил заняться своим проектом — ИИ-ассистентом для поиска работы.</p><p><strong>С чего всё начиналось</strong></p><p>Идея была простой:<br>Находим вакансии → анализируем → генерируем письмо → отправляем отклик.</p><p>Технически всё работало.<br>По факту — конверсия почти не изменилась. (Кто бы мог ожидать)</p><p>Быстро стало понятно, что делать быстрее — не значит лучше.</p><p>Шаблон (даже написанный нейросетью) рекрутеры считывают мгновенно.</p><p><strong>Что пришлось переосмыслить</strong></p><p>То, что мы быстро поняли: ассистент должен работать как человек, а не как скрипт.</p><p>Это значит:</p><ul><li><p>учитывать контекст, а не просто ключевые слова;</p></li><li><p>вытаскивать релевантные кейсы, а не перечислять стек;</p></li><li><p>писать живым языком, без «я обладаю навыками» и списков из пяти пунктов;</p></li><li><p>не создавать подозрительных паттернов поведения.</p></li></ul><p><strong>Как мы это переосмыслили</strong></p><p>Засев на несколько недель мы перепилили всю инфраструктуру платформы и создали нечто  новое.</p><p>Не буду вдаваться в подробности, но поделюсь примерным итоговым списком функций разработки:</p><p><strong>1. Поиск релевантных вакансий</strong></p><p>Ассистент анализирует требования и ваш опыт на уровне задач. Если компании важно «ускорить релизы», система поднимет ваш кейс про оптимизацию CI/CD.</p><p><strong>2. Написание персонализированных сопроводительных писем</strong></p><p>Это была самая сложная часть.</p><p>Базовая LLM пишет слишком «правильно»: канцеляризмы, одинаковая структура, списки.<br>Мы долго работали над стилистикой и вариативностью, чтобы письмо выглядело так, будто кандидат реально вчитался в вакансию.</p><p><strong>3. Отчетность</strong></p><p>У нас нет режима, который всё делает за спиной.</p><p>Вы видите какие вакансии найдены, какие письма сформированы, какие отклики отправляются, какие результаты получены.</p><p>При этом можно настраивать стратегию, скоро добавляем чёрный список компаний — по запросу пользователей.</p><p><strong>4. Работает аккуратно</strong></p><p>Мы сознательно внедрили естественные паузы, человеческую скорость действий, защиту от перегрузок, контроль стабильности.</p><p>В день первого запуска мы словили такую нагрузку, что пришлось экстренно масштабировать обработчик взаимодействия с hh. Это был хороший урок.</p><p><strong>Зачем это всё</strong></p><p>Как карьерный консультант я вижу главное: люди тратят слишком много энергии на рутину.</p><p>Этот проект (он, кстати, называется OfferMate) не волшебная кнопка «оффер».<br>Это инструмент, который:</p><ul><li><p>снимает техническую нагрузку,</p></li><li><p>ускоряет касание с рынком,</p></li><li><p>делает процесс управляемым.</p></li></ul><p><strong>Если интересен такой подход, то вот ссылки:</strong></p><p><strong><a href="https://cutt.ly/jtEZittn" rel="noopener noreferrer nofollow">Блог проекта</a></strong> — здесь можно принять участие в тестировании и уточнить важные для себя моменты<br><strong><a href="https://cutt.ly/5tEZyowD" rel="noopener noreferrer nofollow">Лэндинг проекта</a></strong> — тут базовая информация, можно почитать про функции и т.д.</p><p>Новую работу гарантировать не могу, но рутину из поиска точно уберет)</p><p>Буду рад критике. На Хабре без неё нельзя 🙂</p> <a href="https://habr.com/ru/posts/1005620/?utm_campaign=1005620&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Mar 2026 14:10:49 GMT</pubDate>
    <dc:creator><![CDATA[dmitriy_offermate]]></dc:creator>
      
      <category><![CDATA[Поиск работы в it]]></category><category><![CDATA[стартап]]></category><category><![CDATA[поиск работы в рф]]></category><category><![CDATA[карьера]]></category><category><![CDATA[карьера программиста]]></category><category><![CDATA[искусственный интеллект]]></category><category><![CDATA[ai]]></category><category><![CDATA[hh.ru]]></category><category><![CDATA[отклики]]></category><category><![CDATA[автоматизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nomanhero — Тестирование IT-систем (+4) — 02.03.2026 15:26]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005538/</guid>
    <link>https://habr.com/ru/posts/1005538/?utm_campaign=1005538&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Русский FAANG: карьерный буст или выгорание за 400к? Что выбрать QA/AQA  </strong></p><p>В русском IT регулярно всплывает формулировка «русский FAANG» и многие хотят туда попасть. В этом посте на основе своего опыта разберу, стоит ли оно того.</p><p>Начнем с того, что каждый под словосочетанием русский FAANG подразумевает разное. Есть как минимум:<br>1. ВАСЯ: ВК, Альфа, Сбер, Яндекс<br>2. МЯСОВАТА: Mail (VK), Яндекс, Сбер, Озон, Валдберрис, Авито, Теле2, Альфа<br>3. Мой любимый - ОБОСРАЛСЯ: Озон, Билайн, ОККО, Сбер, Рамблер, Атол, ЛамодаТех, Совкомбанк, Яндекс</p><p>В целом есть множество различных вариаций и аббревиатур, но нет одной единственно правильной. Почему - везде есть свои проблемы и преимущества. Всё в большей степени зависит от проекта. Внутри одной и той же компании может быть и круто, и очень плохо.<br>Поэтому и нет четкого списка "топ компаний", все оценивают по разным критериям.</p><p>Так стоит ли QA/AQA и другим стремится в ВАСЯ или можно ограничится ОБОСРАЛСЯ или даже обычными мелкими компаниями / стартапами?</p><p><strong>Чего стоит попасть туда (насколько это сложно)</strong></p><p>У многих есть ощущение, что российский бигтех - это нечто недосягаемое. Почти как западный FAANG.</p><p>Если говорить про автоматизацию тестирования и смежные роли, картина выглядит иначе. Я скажу больше, выходя на рынок как AQA - вы с большей долей вероятности попадете именно в бигтех.</p><p>Автоматизация сегодня - одна из самых востребованных зон в крупных компаниях. Большой продукт, частые релизы, много интеграций - без автотестов это сложно поддерживать.</p><p>Плюс последние годы усилили тренд на оптимизацию затрат.<br>Ручное тестирование постепенно сокращается, а автоматизация растет. Считается, что один AQA может закрывать задачи нескольких QA.</p><p>Поэтому спрос на автоматизаторов в бигтехе стабильно высокий.<br>И в этом смысле двери туда открыты куда шире, чем кажется со стороны.</p><p><strong>Где лучше и стоит ли оно того</strong></p><p>Я поработал много где как AQA - Ozon, WB, VK, несколько российских и западных стартапов, бигтех US.<br>И могу с уверенностью сказать, что тут не угадаешь, везде всё по разному. Например, в одном из криптостартапов я встретил лучшие процессы, что видел в жизни, а в двух из бигтехов - миллион токсиков, невероятную бюрократию и в целом не очень классные процессы.</p><p>Поэтому мое личное мнение - умирать ради работы в конкретной компании вообще того не стоит.</p><p>Проекты могут быть плохие и хорошие как в бигтехах, так и в мелких компаниях. Да, в бигтехах часто процессы получше, но это далеко не всегда так.<br>Ну а хороший оффер могут дать и там, и там.</p><p>В общем, тут стоит выбирать по сумме условий и не руководствоваться именем компании, т.к. оно часто ничего не значит.</p><p>Те же самые "интересные задачи" есть везде, а в стартапах они часто даже круче и челленджовее.</p><p><strong>Что в сухом остатке</strong></p><p>При прочих равных условиях кроме записи в резюме работа в бигтехе не дает ровным счетом ничего.<br>Везде всё по разному и может оказаться так, что в стартапе проект будет в миллион раз лучше по всем параметрам.<br>Ну а строчку в резюме всегда можно придумать, если так уж хочется.</p><p>Всем спасибо за внимание! В комментариях готов подискутировать на эту и смежные темы!<br>В своем&nbsp;<strong><a href="https://cutt.ly/ctcVkvtn" rel="noopener noreferrer nofollow">блоге Telegram</a></strong>&nbsp;также пишу про тестирование и автоматизацию, ну и в целом про карьеру в сфере IT. Всегда рад новым читателям!)</p> <a href="https://habr.com/ru/posts/1005538/?utm_campaign=1005538&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Mar 2026 12:26:09 GMT</pubDate>
    <dc:creator><![CDATA[nomanhero]]></dc:creator>
      
      <category><![CDATA[qa]]></category><category><![CDATA[qa engineer]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[автоматизация тестирования]]></category><category><![CDATA[hh.ru]]></category><category><![CDATA[поиск работы в it]]></category><category><![CDATA[поиск работы в рф]]></category><category><![CDATA[каьрера]]></category><category><![CDATA[qa auto]]></category><category><![CDATA[qa automation]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @men10577 — Python (+1) — 02.03.2026 13:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005478/</guid>
    <link>https://habr.com/ru/posts/1005478/?utm_campaign=1005478&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1f6/b3a/fce/1f6b3afce509aede1da88232f4155e07.jpeg" alt="Главная" title="Главная" width="1280" height="1010"><div><figcaption>Главная</figcaption></div></figure><p>Собрал и перевел на русский большой гайд из разных источников по ИИ.<br>P.S. это не реклама платного ресурса, будьте сдержаны.</p><p>Бесплатно. Потрачено много часов работы. <br>Буду благодарен за фидбек и предложения.<br><br><a href="https://ai.arckep.ru" rel="noopener noreferrer nofollow">https://ai.arckep.ru</a></p><p><strong>ТРЕК 1 / NO-CODE</strong><br> 1.1 Введение в AI-агентов<br> 1.2 Промпт-инжиниринг<br> 1.3 Платформы и модели<br> 1.4 Практика no-code<br> 1.5 Безопасность и этика AI<br> 1.6 Финальный проект<br><strong>ТРЕК 2 / РАЗРАБОТЧИКИ</strong><br> 2.1 Введение в AI-кодинг<br> 2.2 Claude Code<br> 2.3 Gemini CLI<br> 2.4 Codex CLI<br> 2.5 Cursor и IDE-агенты<br> 2.6 AGENTS.md и документация<br> 2.7 MCP<br> 2.8 Российские модели<br> 2.9 Воркфлоу и OpenClaw<br> 2.10 Финальный проект<br><strong>ТРЕК 3 / OPENCLAW</strong><br> 3.1 Знакомство с OpenClaw<br> 3.2 Подключение каналов<br> 3.3 Настройка и автоматизация<br> 3.4 Мультиагентная архитектура</p> <a href="https://habr.com/ru/posts/1005478/?utm_campaign=1005478&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Mar 2026 10:41:16 GMT</pubDate>
    <dc:creator><![CDATA[men10577]]></dc:creator>
      
      <category><![CDATA[гайд]]></category><category><![CDATA[обучение]]></category><category><![CDATA[claude]]></category><category><![CDATA[gemini]]></category><category><![CDATA[codex]]></category><category><![CDATA[бесплатно]]></category><category><![CDATA[курсы]]></category><category><![CDATA[ai]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Feizerr — Блог компании Selectel (+4) — 02.03.2026 12:36]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1005442/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1005442/?utm_campaign=1005442&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Задача о сравнении чисел </strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c61/e19/c73/c61e19c731fab27e255e5938d243e150.jpg" width="1560" height="880"></figure><p>Привет, Хабр!&nbsp;Как насчет небольшой задачи, чтобы вкатиться в рабочую неделю?</p><p><strong>Условие</strong></p><p>В IT-компанию N привезли экспериментальное устройство для автоматизации расчетов. Оно работает на урезанном интерпретаторе Python: никаких условий, сравнений или встроенных функций — только арифметика и битовые операции. <br><br>Знаки сравнения (&gt;, &lt; == и другие) использовать не получится, интерпретатор их не поймет и выдаст ошибку. Однако без них писать код довольно сложно. Придется реализовать базовую логику выбора большего из двух чисел.</p><p><strong>Задача</strong></p><p>Есть два числа: a и b. Найдите наибольшее из них, используя только сложение, вычитание, деление и умножение, а также битовые операции.</p><p>Нельзя использовать операторы сравнения (&gt;, &lt;, ==, != и т. д.), тернарный оператор, функции вроде max(), min() и прочее.<br><br>Попробуйте справиться с заданием. А один из вариантов решения показываем <a href="https://selectel.ru/blog/number-comparison-problem/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_comparisonproblem_020326_content" rel="noopener noreferrer nofollow">в Академии Selectel</a>. </p> <a href="https://habr.com/ru/posts/1005442/?utm_campaign=1005442&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Mar 2026 09:36:40 GMT</pubDate>
    <dc:creator><![CDATA[Feizerr (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[задачи]]></category><category><![CDATA[python]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[код]]></category><category><![CDATA[битовые операции]]></category><category><![CDATA[обучение]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DariRinch — Машинное обучение (+4) — 02.03.2026 08:50]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005322/</guid>
    <link>https://habr.com/ru/posts/1005322/?utm_campaign=1005322&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Детерминистический аудит-слой для LLM-агентов — открытое демо</strong></p><p>Мультиагентные системы уже работают в финтехе и госсекторе — но их решения остаются чёрным ящиком. Я собрала eval pipeline, который аудирует поведение агентов в реальном времени:</p><p>→ Нарушения KYC/AML правил → Зацикливание в цепочках решений → Галлюцинированные обоснования</p><p>Архитектура: LangGraph агент → структурированные логи → метрики (consistency, anomaly detection) → audit report с PASS/FAIL по каждой цепочке.</p><p>Работает на любой модели через LiteLLM — меняешь модель одной строкой в config.yaml. API-ключ не нужен, есть рабочий Jupyter notebook.</p><p>Ориентировано на финтех и госсектор: EU AI Act, ФСТЭК.</p><p>Демо: github.com/DariRinch/dcl-eval-pipeline-demo</p> <a href="https://habr.com/ru/posts/1005322/?utm_campaign=1005322&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Mar 2026 05:50:31 GMT</pubDate>
    <dc:creator><![CDATA[DariRinch]]></dc:creator>
      
      <category><![CDATA[LLM]]></category><category><![CDATA[AI]]></category><category><![CDATA[agents]]></category><category><![CDATA[multi-agent]]></category><category><![CDATA[audit]]></category><category><![CDATA[LangGraph]]></category><category><![CDATA[fintech]]></category><category><![CDATA[observability]]></category><category><![CDATA[anomaly detection]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myshkin_does_it — Python (+2) — 01.03.2026 21:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005252/</guid>
    <link>https://habr.com/ru/posts/1005252/?utm_campaign=1005252&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Экономия памяти со <code>__slots__</code></strong></p><p>В Python атрибуты классов по-умолчанию хранятся в специальном dunder-атрибуте  <code>__dict__</code>. В описании класса его задавать не надо, он есть неявно и доступен для просмотра при необходимости. Каждый экземпляр класса также имеет свой <code>__dict__</code>:</p><pre><code class="python">class Standard:
	def __init__(self, x, y):
		self.x = x
		self.y = y
		
std = Standard(100, 200)
std.__dict__ # {'x': 100, 'y': 200}
</code></pre><p>Помимо того, что и класс и экземпляры отдельно занимают своими <strong><code>__dict__</code></strong> место в памяти, хранение данных в словарях само по себе несет большие накладные расходы. Хеш-таблица в основе словаря хранит служебные структуры и растёт скачками при увеличении числа атрибутов, поэтому на больших количествах объектов затраты памяти ощутимы:</p><pre><code class="python">from sys import getsizeof

std_size = getsizeof(std) + getsizeof(std.__dict__)
std_size # 344 байта
</code></pre><p>Один из эффективных способов сэкономить память, это реализовать в классе  специальный атрибут <code>__slots__</code> и объявить в нем последовательность атрибутов  экземпляра. Тогда вместо <code>__dict__</code>, Python будет использовать альтернативную структуру хранения атрибутов с помощью дескрипторов.  <code>__slots__</code> для экземпляров классов отдельно не создается и хранится только на уровне класса:</p><pre><code class="python">class Slot:
	__slots__ = ('x', 'y') # Неизменный кортеж из имен атрибутов
	
	def __init__(self, x, y): # Остальное – без изменений
		self.x = x
		self.y = y
		
slt = Slot(100, 200)
slt.__dict__ # **AttributeError**: 'Slot' object has no attribute '__dict__'. Did you mean: '__dir__'?

slt_size = getsizeof(slt)
slt_size # 48 байтов
</code></pre><p>Так добавив одну строчку кода, можно сэкономить расходы памяти в  приложении, где требуется создавать миллионы одинаковых объектов.</p><p>---<br><strong>Важные ограничения</strong></p><ol><li><p>Стоит отметить, что реализация <code>__slots__</code> запрещает динамически добавлять экземпляру класса атрибуты, в отличие от <code>__dict__</code>. В ситуациях, где такое необходимо, <code>__slots__</code> не подойдет.</p><pre><code class="python">std.z = 300
std.__dict__ # {'x': 100, 'y': 200, 'z': 300}

slt.z = 300 # **AttributeError**: 'Slot' object has no attribute 'z' and no __dict__ for setting new attributes
</code></pre></li><li><p>Важно, не забывать расширять слоты, если мы добавляем в код класса новые атрибуты:</p><pre><code class="python">class PartialSlots:
	__slots__ = ('x', 'y') # Не добавили атрибут экземпляра 'z'
	
	def __init__(self, x, y, z):
		self.x = x
		self.y = y
		self.z = z

p = PartialSlots(100, 200, 300) # **AttributeError**: 'PartialSlots' object has no attribute 'z' and no __dict__ for setting new attributes
</code></pre></li><li><p>В подклассах от класса со <code>__slots__</code> наследование этого атрибута проходит лишь частично. Для полноценного использования, его стоит определить еще раз, включив новые атрибуты подкласса:</p><pre><code class="python"># Подкласс без доп. логики
class InheritSlot(Slot):
&nbsp; &nbsp; pass


inh_slt = InheritSlot(100, 200)

inh_slt.__dict__ # {}, атрибут снова доступен
inh_slt.z = 300 # Нет ошибок при динамическом расширении атрибутов
inh_slt.__dict__ # {'z': 300}, словарь подкласса снова занимает память

# Поправим
class InheritSlot(Slot):&nbsp;
&nbsp;&nbsp; &nbsp; __slots__ = ('z', ) # Слоты суперкласса добавятся в начало кортежа. В конце не забываем запятую, так как это кортеж из одного элемента.


inh_slt2 = InheritSlot(100, 200, 300)
inh_slt2.__dict__ # AttributeError ... теперь слоты используются корректно в подклассе</code></pre></li></ol> <a href="https://habr.com/ru/posts/1005252/?utm_campaign=1005252&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 01 Mar 2026 18:30:33 GMT</pubDate>
    <dc:creator><![CDATA[myshkin_does_it]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[память]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @LamedGroup — Программирование (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1004216/</guid>
    <link>https://habr.com/ru/posts/1004216/?utm_campaign=1004216&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Не пойму — чего за кипишь? Или почему ИИ — это просто новый «питон»</p><p>Последнее время из каждого утюга кричат: «ИИ заменит программистов!», «Джуны больше не нужны!», «Учитесь на сантехников, пока не поздно!».</p><p>Давайте выдохнем, отставим смузи и разберемся по-простому, «на пальцах», что вообще происходит.</p><p>1. Программист — это не «печатающая машинка»</p><p>Главная ошибка паникеров в том, что они путают <strong>набор текста</strong> с <strong>программированием</strong>. Если ваша работа заключалась в том, чтобы копипастить методы из Stack Overflow и менять там названия переменных — да, у меня для вас плохие новости. ChatGPT делает это быстрее и без обеденного перерыва.</p><p>Но программист — это не тот, кто знает, где поставить точку с запятой. Программист — это <strong>переводчик</strong>. Мы переводим смутные человеческие «хотелки» на жесткий язык логики, понятный машине.</p><p>2. Эволюция «костылей»</p><p>Вспомните историю. Раньше писали на перфокартах. Потом на Ассемблере. Потом на Си, потом на Питоне. Каждый раз кричали: «Ну всё, теперь порог входа стал таким низким, что программисты не нужны!». И что? Программистов стало только больше. Просто мы перестали думать о том, в какой регистр положить байт, и начали думать о том, как построить архитектуру сервиса.</p><p>ИИ — это просто <strong>следующий уровень абстракции</strong>. Это новый «язык программирования», где вместо скобочек мы используем новый язык -<strong>конструкты</strong> <strong>чистого смысла</strong></p><p>3. Проблема «идеального мусора»</p><p>ИИ — это зеркало вашего мышления. Если вы дадите нейронке кривое, логически дырявое задание — она выдаст вам идеально написанный, быстрый, оптимизированный... <strong>мусор</strong>. Чтобы управлять ИИ, вам нужно иметь в голове структуру еще более четкую, чем раньше. Теперь цена ошибки в логике выросла. Если раньше вы ошибались в синтаксисе — программа не заводилась. Теперь она заведется, но уедет не туда.</p><p>4. ИТ-поликлиника</p><p>Представьте, что в больнице появился робот-санитар, который идеально моет полы и делает уколы. Означает ли это, что врачи-хирурги или диагносты больше не нужны? Наоборот! Теперь им не нужно отвлекаться на мытье полов.</p><p><strong>А кого вообще не заденет? (Спойлер: Работы будет завались)</strong></p><p>Если вы думаете, что ИИ — это такой терминатор, который выкосит всё ИТ-отделение, то вы плохо представляете, как устроена реальная «цифровая больница». Есть куча специализаций, где человеческий фактор — это не баг, а фича.</p><ul><li><p><strong>Архитекторы сложных систем (System Architects):</strong> ИИ может нарисовать типовой домик. Но построить небоскрёб на болоте, учитывая старое «дырявое» железо, бюджет заказчика и планы на 10 лет вперёд... ИИ не видит контекста «выживания» системы, он видит только код.</p></li><li><p><strong>Инженеры кибербезопасности (SecOps):</strong> Тут идёт вечная война хитрости. ИИ может искать паттерны, но он не может предугадать нестандартный «выверт» хакера-человека. Безопасность — это интуиция и паранойя, а у нейронок с этим туго. Гы)))</p></li><li><p><strong>SRE и DevOps (Те, кто спасают сервера в 3 часа ночи):</strong> Когда у системы «инфаркт», данные текут, а клиенты кричат — нужен человек с железными нервами, который примет решение «резать или шить». ИИ в критической ситуации может просто выдать ошибку 404, потому что такого случая не было в его обучающей выборке.</p></li><li><p><strong>Бизнес-аналитики и «Психотерапевты заказчика»:</strong> Это те, кто переводят с «бреда руководства» на человеческий. ИИ никогда не поймет, почему директор хочет «кнопку как у конкурентов, но чтобы она была синей, но красной».   </p></li><li><p><strong>Процессные аналитики (BPM):</strong> Они рисуют, как ходят бумажки и данные между отделами. ИИ учтёт, что бухгалтер Марья Ивановна просто не отдаст отчёт вовремя, потому что обижена на айтишников?</p><p><strong>Итог</strong></p></li></ul><p>Ребята, расслабьтесь. Программирование не умирает, оно <strong>взрослеет</strong>. Уходит эпоха «кодинга ради кодинга». Наступает эпоха <strong>Качества Мышления</strong>. Теперь важно не то, насколько быстро ты стучишь по клавишам, а то, насколько структурированно ты умеешь формулировать смыслы.</p><p>ИИ — это просто наш новый, очень мощный экзоскелет. Но куда в нем идти и зачем — решать всё равно вам.</p><p>Так что идите пить чай, делайте зарядку для мозгов и учитесь <strong>формулировать</strong>. Это единственный навык, который у вас никто не отберет.</p> <a href="https://habr.com/ru/posts/1004216/?utm_campaign=1004216&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Feb 2026 16:55:00 GMT</pubDate>
    <dc:creator><![CDATA[LamedGroup]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[программисты]]></category><category><![CDATA[программист]]></category><category><![CDATA[программы]]></category><category><![CDATA[искусственный интеллект]]></category><category><![CDATA[история it]]></category><category><![CDATA[ит-индустрия]]></category><category><![CDATA[ит-аутсорсинг]]></category><category><![CDATA[ит гильдия]]></category><category><![CDATA[итераторы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dmitriy_offermate — Исследования и прогнозы в IT (+4) — 26.02.2026 17:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1004148/</guid>
    <link>https://habr.com/ru/posts/1004148/?utm_campaign=1004148&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как я написал 87 000 сопроводительных писем - про разработку помощника для поиска работы.</p><p>Сразу уточню - писал сопроводительные само собой не сам.<br>Мы с командой работаем над ИИ-ассистентом для поиска работы и эти 87 000 писем были отправлены пользователями сервиса в рамках бета-тестирования.<br><br>За этой цифрой - месяцы экспериментов, правок и неудачных гипотез. В этом посте поделюсь, с какими сложностями мы столкнулись и как их решили.</p><p><strong>Задача</strong></p><p>Изначально мы хотели решить довольно простую на первый взгляд проблему: автоматизировать написание сопроводительных писем.</p><p>Но быстро стало понятно, что «просто генерировать текст» - бессмысленно.</p><p>Цель изменилась.<br>Нужно было не просто прикладывать письмо к отклику, а сделать его:</p><ul><li><p>релевантным конкретной вакансии</p></li><li><p>не шаблонным</p></li><li><p>не выглядящим как типовой текст нейросети</p></li><li><p>понятным для HR за несколько секунд</p></li></ul><p>И вот тут начались сложности.</p><p>С чем столкнулись</p><ol><li><p><strong>Шаблонность моделей.</strong><br>Даже при хорошем промптинге тексты начинали повторяться по структуре и формулировкам.</p></li><li><p><strong>Разные ожидания HR.</strong><br>Кто-то предпочитает краткость, кто-то - структуру, кто-то - конкретные достижения в цифрах.</p></li><li><p><strong>Изменяющиеся требования вакансий.</strong><br>Один и тот же стек может быть описан по-разному, и формальное совпадение по ключевым словам не гарантирует релевантности.</p></li><li><p><strong>Ограничения платформ.</strong><br>Изменения на стороне hh влияли на логику работы системы, и часть архитектуры приходилось пересобирать.</p></li></ol><p>В какой-то момент стало ясно, что проблема глубже.</p><p><strong>Главный вывод</strong></p><p>После десятков тысяч писем стало очевидно:</p><p>Проблема не в том, что сопроводительные «плохие».<br>Проблема в том, что в них не видно релевантности.</p><p>HR тратит на письмо буквально несколько секунд.<br>Если за это время не становится понятно, почему кандидат подходит - письмо закрывается.</p><p>Поэтому мы изменили подход.</p><p>Система теперь не «пишет красиво».<br>Она сначала сопоставляет требования вакансии с опытом пользователя и только потом формирует текст, где это соответствие явно показано.</p><p>Что изменилось в результате</p><p>После 87 000 отправленных писем тексты стали короче, конкретнее, привязанными к требованиям вакансии, менее шаблонными.</p><p>Ну а параллельно дорабатывались и другие части системы:</p><ul><li><p>фильтрация релевантных вакансий</p></li><li><p>автоматизация откликов</p></li><li><p>работа с онлайн-тестами</p></li><li><p>механизмы приоритизации</p></li></ul><p><strong>Что по итогу имеем сейчас</strong><br><br>Проект находится в стадии бета-тестирования. Мы продолжаем собирать фидбек и корректировать логику, особенно в части сопоставления опыта и требований.<br><br>История с сопроводами по большей части пройдена, но осталось ещё множество аспектов для улучшений.</p><p>Кому интересно - могут попробовать бота бесплатно. В блоге можно найти более подробную информацию. Также там пишу про развитие проекта и проблемы, с которыми сталкиваемся.</p><p>Welcome: <a href="https://t.me/offermatecrew" rel="noopener noreferrer nofollow">https://t.me/offermatecrew</a></p> <a href="https://habr.com/ru/posts/1004148/?utm_campaign=1004148&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Feb 2026 14:12:47 GMT</pubDate>
    <dc:creator><![CDATA[dmitriy_offermate]]></dc:creator>
      
      <category><![CDATA[поиск работы в it]]></category><category><![CDATA[стартап]]></category><category><![CDATA[поиск работы в рф]]></category><category><![CDATA[карьера]]></category><category><![CDATA[карьера программиста]]></category><category><![CDATA[искусственный интеллект]]></category><category><![CDATA[ai]]></category><category><![CDATA[hh.ru]]></category><category><![CDATA[отклики]]></category><category><![CDATA[автоматизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+3) — 22.02.2026 12:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1002394/</guid>
    <link>https://habr.com/ru/posts/1002394/?utm_campaign=1002394&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/danielgatis/rembg" rel="noopener noreferrer nofollow">rembg</a>&nbsp;— легковесный скрипт на&nbsp;Python, который поможет убрать фон даже с&nbsp;самых сложных картинок. Удаляет фон за секунды и не грузит ПК. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/098/b2e/091/098b2e091269bc7d7ccf6d5d705a1efb.jpg" width="1754" height="1252"></figure> <a href="https://habr.com/ru/posts/1002394/?utm_campaign=1002394&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 22 Feb 2026 09:27:34 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[rembg]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
