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

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

  <channel>
    <title><![CDATA[Все посты подряд / Программирование / Хабр]]></title>
    <link>https://habr.com/ru/hubs/programming/posts/</link>
    <description><![CDATA[Программирование – искусство создания компьютерных программ]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sat, 25 Jul 2026 21:25:16 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[Пост @Kisel_n — Программирование (+2) — 24.07.2026 15:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062710/</guid>
    <link>https://habr.com/ru/posts/1062710/?utm_campaign=1062710&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Slopsquatting: ИИ в тандеме со злоумышленником</strong></p><p>Интересно смотреть, как ИИ меняет разные сферы - и кибербезу тоже досталось. Недавно наткнулся на термин <strong>slopsquatting</strong> и удивился: он живёт уже больше года, просто прошёл мимо меня - придумал его в 2025 Сет Ларсон из Python Software Foundation. Разбираемся, что это и почему это не страшилка ради красивых заголовков.</p><p>Начнём издалека - с более старого трюка, <strong>typosquatting</strong> (опечатка + захват). Атакующий регистрирует в PyPI, npm или другом репозитории пакет с именем, почти неотличимым от популярного - на одну букву, на дефис, на порядок слов. Классика: в декабре 2019 в PyPI нашли <code>jeIlyfish</code> - настоящий <code>jellyfish</code>, только строчная <code>l</code> заменена на заглавную <code>I</code>, визуально похожую в большинстве шрифтов. Пакет воровал SSH- и GPG-ключи. Рядом ехал <code>python3-dateutil</code> под <code>python-dateutil</code>; в npm похожая история - <code>crossenv</code> вместо <code>cross-env</code> (2017).</p><p>Внутри - вредоносный код, который срабатывает в момент установки, ещё до того, как вы обратились к пакету. Достаточно опечататься при установке зависимости - и всё, попался, голубчик.</p><p>Дальше - расчёт на человеческий фактор: кто-то опечатался вручную, кто-то скопировал команду из туториала с опечаткой. Охотиться за конкретной жертвой не нужно - зарегистрировал похожие имена под топовые пакеты и жди, кто ошибётся.</p><p>Slopsquatting - тот же трюк с апгрейдом под эпоху AI-кодинга. Когда LLM пишет вам код, она время от времени советует <code>import</code> библиотеки или <code>pip install</code>, которой на самом деле не существует - модель её выдумала, потому что название звучит правдоподобно.</p><p>Раньше на это смотрели как на безобидный баг: заметишь, попросишь исправить, и всё. Но в 2025-м исследователи UTSA опубликовали работу на USENIX Security: 16 моделей, 576 тыс. сэмплов на Python и JS. Результат - <strong>19,7% рекомендованных пакетов не существовало</strong>. </p><p>Результаты правда относятся к моделям предыдущего поколения, актуальных метрик пока нет. Но нам интересно другое: 500 галлюцинирующих промптов прогнали по десять раз каждый. <strong>43% выдуманных имён повторялись во всех десяти прогонах</strong>, ещё 58% - больше одного раза. Список фейковых имён воспроизводимый, а не случайный.</p><p>А воспроизводимость - подарок для атакующего. Не нужно брутфорсить: достаточно позадавать модели типичные вопросы вроде «напиши скрипт парсинга CSV», собрать частые несуществующие названия и зарегистрировать их с вредоносной начинкой. Дальше сценарий тот же: разработчик видит незнакомую библиотеку, не всегда успевает загуглить - и ставит то, что подсунула модель.</p><p>Это не теория. В 2024-м Бар Ланьядо из Lasso Security зарегистрировал пакет-пустышку <code>huggingface-cli</code>, который модели упорно советовали. За три месяца - больше 15 тысяч загрузок, а <code>pip install huggingface-cli</code> заехал в README репозитория Alibaba GraphTranslator. Никакого взлома - люди просто ставили то, что продиктовал ИИ.</p><p>Второй случай свежее и неприятнее: в январе 2026-го Чарли Эриксен (Aikido Security) заметил, что LLM склеила <code>jscodeshift</code> и <code>react-codemod</code> в несуществующий <code>react-codeshift</code>. Имя попало в коммит с 47 сгенерированными Agent Skills и через форки разошлось по 237 репозиториям - никто не вычитывал. Эриксен зарегистрировал пакет превентивно и сразу увидел загрузки. По его словам, вектором атаки это не стало только потому, что он успел первым.</p><p>Почему это стало проблемой именно сейчас:</p><ul><li><p>AI-агенты стали привычным способом писать рутинный код, и вопрос «а точно ли существует эта библиотека?» многие перестали задавать в принципе;</p></li><li><p>галлюцинации разных моделей пересекаются - есть 127 имён пакетов (109 в PyPI, 18 в npm), которые независимо выдумывают сразу несколько ведущих моделей. Один зарегистрированный пакет ловит пользователей всех сразу;</p></li><li><p>репозитории пакетов по-прежнему пускают регистрировать что угодно и от кого угодно, никак не проверяя, зачем вам это имя.</p></li></ul><p>Короче: <strong>slopsquatting - история про то, как одна безобидная особенность модели превращается в готовый вектор атаки.</strong> Старый как мир supply-chain риск получил новый, куда более дешёвый вход.</p><p>Пользуясь случаем, пришлашаю в мой <a href="https://t.me/kisel_it" rel="noopener noreferrer nofollow">Telegram-канал</a>.</p> <a href="https://habr.com/ru/posts/1062710/?utm_campaign=1062710&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Jul 2026 12:27:27 GMT</pubDate>
    <dc:creator><![CDATA[Kisel_n]]></dc:creator>
      
      <category><![CDATA[slopsquatting]]></category><category><![CDATA[typosquatting]]></category><category><![CDATA[ai безопасность]]></category><category><![CDATA[supply chain attack]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @gluck59 — Программирование (+2) — 24.07.2026 13:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062660/</guid>
    <link>https://habr.com/ru/posts/1062660/?utm_campaign=1062660&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Чудный маразм прислали мне вчера под видом трудового договора...</p><p>Речь о заказной разработке/развитии кастомной CRM с замашкой на ERP, но это не суть важно. Оцените, как гритца, масштаб разрушений:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c30/382/cc9/c30382cc9e026f25d02322f6820b5783.png" alt="Абзац прям достоин..." title="Абзац прям достоин..." width="675" height="145"><div><figcaption>Абзац прям достоин...</figcaption></div></figure><p>Я не подписал, попытался рассказать о лицензиях и о софте, уже установленном на сервере заказчика, но тщетно. "Работодаватель" в ответ фыркнул и сообщил в моих услугах больше не нуждается. </p><p>Надеюсь, он обязательно найдет себе согласного...</p> <a href="https://habr.com/ru/posts/1062660/?utm_campaign=1062660&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Jul 2026 10:54:28 GMT</pubDate>
    <dc:creator><![CDATA[gluck59]]></dc:creator>
      
      <category><![CDATA[вакансия]]></category><category><![CDATA[работодатели]]></category><category><![CDATA[fishing]]></category><category><![CDATA[закон]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Popou — C# (+3) — 23.07.2026 17:00]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062352/</guid>
    <link>https://habr.com/ru/posts/1062352/?utm_campaign=1062352&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/ac6/00e/949/ac600e94961cbe80c79de768d7dfed33.jpg" width="1187" height="527"></figure><p>Первая версия генератора кода готова. Сделал я его через <code>IIncrementalGenerator</code> и она очень сильно не оптимизирована, но да ладно он мне все ровно нужен был только ради следующей статьи про диагностику dsl</p> <a href="https://habr.com/ru/posts/1062352/?utm_campaign=1062352&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Jul 2026 14:00:57 GMT</pubDate>
    <dc:creator><![CDATA[Popou]]></dc:creator>
      
      <category><![CDATA[dsl]]></category><category><![CDATA[c#]]></category><category><![CDATA[avalonia]]></category><category><![CDATA[компиляторы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @akdengi — Программирование (+3) — 23.07.2026 15:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062292/</guid>
    <link>https://habr.com/ru/posts/1062292/?utm_campaign=1062292&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>С момента написания <a href="https://habr.com/ru/articles/1058282/" rel="noopener noreferrer nofollow">прошлой статьи</a> про мою самописную товароучетную систему для работы с маркировкой «Честный Знак», я добавил новых фич и поправил существующие ошибки. <a href="https://github.com/akdengi/sklad-cz" rel="noopener noreferrer nofollow">Основные изменения</a> следующие:</p><ol><li><p> В Остатках в карточке товара появилась кнопка «Списать», позволяя сделать быстрое списание с нулевой ценой и выбором причины: утеря, собственные нужды, производственные цели, безвозмездная передача, отзыв с рынка. Данные нужно подавать также вручную, но для учета полезно.</p></li><li><p>Добавлен вид документа в продаже: поле «Вид док-та» в шапке заказа (Прочее, УПД, Товарная накладная, Акт приёма-передачи, Кассовый чек).</p></li><li><p>Появилась кнопка «Скачать КМ в CSV» в корзине Продаж для скачивания КМ в формате «для ввода/вывода из оборота» для вставке в ЭДО при передаче УПД.</p></li><li><p>Дропдаун «Статус» теперь показывает статус ЧЗ для проданных товаров.</p></li><li><p>Появилась возможность выделить и произвести массовую проверку статуса ЧЗ для выделенных товаров (чекбоксы + кнопка) на вкладках Остатки, Продано, Вывод из оборота.</p></li><li><p>Появилась колонка «Статус в ЧЗ» в таблицах Остатки и Вывод из оборота</p></li><li><p>Сделано автоподтверждение отчёта о выбытии при статусе ЧЗ равном «Выбыл» (RETIRED/WITHDRAWN/WRITTEN_OFF)</p></li><li><p>Сделано сохранение активной вкладки при перезагрузке страницы</p></li><li><p>Введена новая логика быстрой продажи: в шапку заказа: номер заказа, склад списания, дата продажи, добавление нескольких товаров по КМ/артикулу/EAN-13 с ценой за позицию в корзину с одинаковым номером заказа, КМ для Маркетплейсов отображается в корзине и копируется кликом, сделан Live-поиск при вводе кода с полной информацией о товаре.</p></li></ol><p>ПО я писал для своей товарной группы «Игры и игрушки», но оно должно подходить и для других товарных групп потребительских товаров.</p><p>Сразу напишу про API: авторизация по ЭЦП и получение общего статуса по КМ все еще ведется <a href="https://docs.crpt.ru/gismt/True_API/#_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BE%D0%B1%D1%89%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE%D0%B9_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8_%D0%BE_%D0%BA%D0%B8_%D0%BF%D0%BE_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D1%83" rel="noopener noreferrer nofollow">по 3 версии API</a> Честного Знака, как и например работа с МОД, а что-то уже работает только по 4 версии API (например ввод-вывод из оборота).</p> <a href="https://habr.com/ru/posts/1062292/?utm_campaign=1062292&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Jul 2026 12:21:38 GMT</pubDate>
    <dc:creator><![CDATA[akdengi]]></dc:creator>
      
      <category><![CDATA[честный знак]]></category><category><![CDATA[api]]></category><category><![CDATA[python]]></category><category><![CDATA[flask]]></category><category><![CDATA[sqlalchemy]]></category><category><![CDATA[sqlite]]></category><category><![CDATA[маркировка товаров]]></category><category><![CDATA[автоматизация склада]]></category><category><![CDATA[настольные игры]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+2) — 23.07.2026 12:47]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062200/</guid>
    <link>https://habr.com/ru/posts/1062200/?utm_campaign=1062200&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>T-shaped снова в моде?</strong></p><p>Подняли тут вопрос, о том что мы снова движемся от специализации в T-shaped специалистов. Компании планируют сокращать персонал и одновременно с тем надеятся на усиление текущих специалистов за счет ИИ. В некоторых случаях это потребует замены текущих команд или как минимум отдельных людей, на агентно-ориентированных.</p><p>В обиход входит слово tiny teams. По представлениям сбера (это их инициатива), это компактные команды в несколько человек с большой степенью автономности находящиеся внутри ai sdlc, где все процессы изменены, где все знания доступны агентам и так далее. В общем ai native организации, вместо (зачеркни ненужное) бирюзовых, agile и других слов.</p><p>Пару мыслей про это от меня и других ребят, с которыми мы кулуарно общались. Во-первых сама тенденция возврата к фулстек режиму, во многом определяется не тем что у нас появился ИИ, а тем что идет общий экономический спад и компании сжимаются. А в таких случаях обязанности перераспределяются среди оставшихся. И наоборот, когда все активно развивается, происходит дробление обязанностей так как людей становится все больше и процессы становятся все сложнее.</p><p>Сейчас же ИИ действительно позволяет увеличить производительность, что само по себе приводит к укрупнению зон ответственности, но это явление временное. Когда агенты станут такой же обыденностью как персональные компьютеры (представьте разницу между теми у кого они были и у кого их не было в 80 годы), то для увеличения производительности труда снова придется дробить ответственности и брать больше людей.</p><p>Во-вторых, есть серьезные опасения, что сильных спецов в принципе всегда было мало, а тут мы как будто бы хотим лучших их лучших. Откуда их брать? И насколько людей действительно хватит? Мы не можем бесконечно масштабироваться, ИИ очень быстро уперся в ограничения кожанных. А комфотная работа для многих превратилась в изматывающий марафон на скорости стометровки.</p><p><br>Через 5 лет мы будем оглядываться назад и говорить о том, как все было очевидно, вот это работает, а вот это бы не заработало никогда. Как говорится, знал бы прикуп жил бы в Омске</p> <a href="https://habr.com/ru/posts/1062200/?utm_campaign=1062200&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Jul 2026 09:47:25 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[многорук]]></category><category><![CDATA[октопус]]></category><category><![CDATA[фулстек]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AvrGavr — Управление разработкой (+2) — 23.07.2026 11:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062142/</guid>
    <link>https://habr.com/ru/posts/1062142/?utm_campaign=1062142&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как мы закрываем задачу: тесты, диптрак, аудит и ещё пара рубежей</strong></p><p><em>Продолжение серии про работу с ИИ-агентом. В </em><a href="https://habr.com/ru/posts/1061216/" rel="noopener noreferrer nofollow"><em>прошлый</em></a><em> раз разбирали, где живёт задача. Теперь — что с ней происходит, прежде чем она станет <code>done</code>.</em></p><p>«Готово» у агента наступает подозрительно рано — примерно в ту секунду, когда дописана последняя строчка кода. Поэтому между «я закончил писать» и «задача закрыта» у нас стоит несколько рубежей. Часть из них — детерминированные хуки: их агент физически не обойдёт, они возвращают ошибку и не дают закрыть ход. Часть — процедуры-скиллы, которые агент обязан прогнать сам. По порядку.</p><p><strong>1. Автоформат — молча и сразу.</strong> После каждого Edit/Write срабатывает хук: Pint для PHP, Prettier для JS/TS правят изменённый файл. Не блокирует, ничего не спрашивает. Форматирование просто снято с повестки — про пробелы и переносы мы не спорим никогда.</p><p><strong>2. Приёмка «прогнал — работает» (скилл verify-task).</strong> Финал задачи — не «по идее работает», а таблица. Перечитываем Definition of Done, по каждому пункту: как проверено → PASS/FAIL. Внутри:</p><ul><li><p>прогон тестов затронутой области (Pest/PHPUnit) — зелёные, а не «вроде есть»;</p></li><li><p>smoke живого сценария через <code>tinker</code> или artisan-команду;</p></li><li><p>корнер-кейсы: пусто, граница, null, таймаут внешнего сервиса;</p></li><li><p>в diff нет ключей и <code>.env</code>.</p></li></ul><p>Любой FAIL — задача не закрыта. Без «ну это мелочь, потом починим».</p><p><strong>3. Deptrac — границы слоёв (Stop-хук).</strong> На попытке закрыть ход прогоняется анализатор архитектуры. Уехала логика из сервиса в контроллер, модель полезла напрямую во внешний API — <code>exit 2</code>, ход не закрывается, пока не переложишь код в правильный слой. Тот же гейт стоит в CI, а легаси-долг зафиксирован baseline’ом, чтобы старые грехи не блокировали новую работу. Правило в конфиге кажется неверным? Правь конфиг явно и объясняй — обходить молча нельзя.</p><p><strong>4. Секреты не текут (guard-secrets).</strong> Отдельный хук стережёт, чтобы содержимое <code>.env</code>, ключей и дампов не улетело в чат: <code>cat</code>/<code>grep</code> по секретному файлу блокируются, <code>Read</code> на него — тоже. Править такие файлы можно (Edit/scp), а вываливать в переписку — нет.</p><p><strong>5. Рефлексия — иначе не закрыть (guard-discipline).</strong> Код менялся, а записи в <code>task/history</code> за сегодня нет? Снова <code>exit 2</code>. Хук требует короткий разбор: что ставили, как решал, решено да/нет/частично, что можно было лучше. Следующая сессия начнёт с этих заметок и не наступит на те же грабли.</p><p><strong>6. Независимый аудит — по коду, а не по рассказу.</strong> После нетривиальной доработки запускается отдельный агент, который не видел, как ты решал. Ему дают diff и чек-лист: все ли call-сайты покрыты, нет ли регрессий, есть ли тесты, скрытые баги, не уехали ли слои, не утекли ли секреты. Вердикт — APPROVE или CHANGES NEEDED со списком «файл:строка — почему». Нашёл проблему — не чинит молча, возвращает автору. Без аудита мёрдж не предлагаем.</p><p><strong>7. И только теперь — в <code>done</code> и на мёрдж.</strong> Задача переезжает в <code>task/done</code> <em>до</em> открытия MR, в той же ветке. Прямой push в <code>main</code> закрыт хуком — только через merge request. А прод-pull делает человек: <code>guard-prod</code> fail-closed не пускает агента мутировать боевой сервер, агент лишь готовит команды.</p><p>Тут важно, кто есть кто. Автоформат, Deptrac, защита секретов, рефлексия, запрет пуша в <code>main</code> и защита прода — это <strong>хуки</strong>. Они срабатывают автоматически на события (после правки файла, при попытке закрыть ход, перед bash-командой) и возвращают <code>exit 2</code>, если что-то не так. Их нельзя «забыть» или уговорить — они не читают промпт, они перехватывают действие. А приёмка и аудит — это <strong>скиллы</strong>, процедуры, которые агент запускает сам: тут уже нужна голова, а не только стенка. Стенки ловят механику, скиллы — смысл.</p><p>Звучит как гора бюрократии — но пять рубежей из семи срабатывают сами и молча. Человека дёргают только там, где цена ошибки настоящая: на аудите и на проде.</p><p>«Готово» — не когда агент дописал код, а когда код прошёл все рубежи.</p> <a href="https://habr.com/ru/posts/1062142/?utm_campaign=1062142&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Jul 2026 08:04:39 GMT</pubDate>
    <dc:creator><![CDATA[AvrGavr]]></dc:creator>
      
      <category><![CDATA[вайбкодинг]]></category><category><![CDATA[скилы]]></category><category><![CDATA[claude.md]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ira-k — Блог компании Яндекс Практикум (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/yandex_praktikum/posts/1056902/</guid>
    <link>https://habr.com/ru/companies/yandex_praktikum/posts/1056902/?utm_campaign=1056902&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Must-read для Python-разработчика: 5 статей от практика с сотнями интервью за плечами&nbsp;</strong></p><p>Делимся подборкой статей от Евгения Бартенева, эксперта курсов Практикума и разработчика с 20-летним опытом.<strong> </strong>А ещё он активно занимается созданием образовательного контента: является автором и техлидом курса <a href="https://practicum.yandex.ru/backend-developer/?utm_source=content&amp;utm_medium=media&amp;utm_campaign=habr_media_RF_Prog_backDe_b2c_Post_Catalog_podborka-python&amp;utm_content=23-07-26" rel="noopener noreferrer nofollow">«Python-разработчик»</a>, пишет статьи и проводит бесплатные мок-интервью для всех желающих <a href="https://boreesych.com/" rel="noopener noreferrer nofollow">в рамках проекта Boreesych</a>.</p><p><a href="https://habr.com/ru/companies/yandex_praktikum/articles/940622/" rel="noopener noreferrer nofollow">Особенности Python, о которых вас точно спросят на техническом собеседовании</a>. Евгений прособеседовал сотни кандидатов и сам неоднократно побывал в роли собеседуемого, поэтому хорошо представляет, какие именно знания проверяют на интервью и где чаще всего проваливаются не только джуны, но и опытные разработчики.&nbsp;</p><p><a href="https://habr.com/ru/companies/yandex_praktikum/articles/960812/" rel="noopener noreferrer nofollow">Особенности Python, о которых вас точно спросят на техническом собеседовании. Часть 2</a>. Евгений выпустил продолжение, так как первая часть вызвала оживлённое обсуждение: в комментариях читатели делились собственным опытом и задавали отличные уточняющие вопросы. В этой части ещё больше подводных камней Python — уже традиционно без абстракций и банальщины.</p><p><a href="https://habr.com/ru/companies/yandex_praktikum/articles/1031556/" rel="noopener noreferrer nofollow">Строки в Python: всё не так просто, как кажется</a>. Начинающим разработчикам строки обычно кажутся едва ли не самым простым, что есть в языке программирования, но для Python это не совсем так. Евгений разбирает, какие бывают строки, чем они отличаются друг от друга, какие возможности дают и какие подводные камни могут встретиться в работе с ними. Здесь и о базовом использовании, и о важных деталях, которые стоит помнить каждому разработчику.&nbsp;</p><p><a href="https://habr.com/ru/companies/yandex_praktikum/articles/956618/" rel="noopener noreferrer nofollow">От джуна к эксперту: как карта навыков и план развития помогают профессиональному росту Python-разработчика</a>. Евгений размышляет, почему «стать мидлом, потом синьором» — плохая цель, которая не помогает расти. Затем рассказывает, что такое план профессионального развития, зачем он нужен и как его использовать на собеседованиях, в обучении и в реальной работе. А также делится примером карты навыков и шаблоном плана.</p><p><a href="https://habr.com/ru/companies/yandex_praktikum/articles/822379/" rel="noopener noreferrer nofollow">Книжная полка разработчика в эпоху интернета и искусственного интеллекта</a>. Евгений объясняет, почему книги остаются незаменимым инструментом для изучения программирования даже в эпоху нейросетей, и делится личной подборкой — как для начинающих разработчиков, так и для тех, кто пишет код не первый день.</p><p>Если хотите освоить профессию Python-разработчика с нуля, сделать это можно на курсе <a href="https://practicum.yandex.ru/backend-developer/?utm_source=content&amp;utm_medium=media&amp;utm_campaign=habr_media_RF_Prog_backDe_b2c_Post_Catalog_podborka-python&amp;utm_content=23-07-26" rel="noopener noreferrer nofollow">«Python-разработчик»</a> в Практикуме. Первые 30 уроков доступны бесплатно: вы попробуете себя в роли разработчика, познакомитесь с образовательной платформой и поймёте, подходит ли вам курс.</p> <a href="https://habr.com/ru/posts/1056902/?utm_campaign=1056902&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Jul 2026 06:30:45 GMT</pubDate>
    <dc:creator><![CDATA[ira-k (Яндекс Практикум)]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[python-разработчик]]></category><category><![CDATA[программирование на python]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @EditorF6 — Блог компании F6 (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/F6/posts/1061408/</guid>
    <link>https://habr.com/ru/companies/F6/posts/1061408/?utm_campaign=1061408&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Type-driven development в Rust: делаем недопустимые состояния невыразимыми</strong> </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3e4/977/0fc/3e49770fcf6ca093875f04b9b92e861b.png" width="2880" height="1440"></figure><p>В своей работе наша инженерная команда довольно часто сталкивается с уникальными и сложными задачами —&nbsp;мы решили поделиться своей экспертизой и практическими наработками. В том числе и теми задачами, которые напрямую не связанны с информационной безопасностью.</p><p>Начинаем с <strong>type-driven development</strong> в <strong>Rust </strong>— подхода, при котором правила предметной области выражаются в типах, а код, нарушающий эти правила, не компилируется. О том, как применять его на практике расскажет <strong>Никита Тимофеенко, </strong>разработчик команды <a href="https://www.f6.ru/products/managed-xdr/" rel="noopener noreferrer nofollow">MXDR</a> компании F6.</p><p>Серия рассчитана на тех, кто уже пишет на Rust и хочет от системы типов большего, чем борьба с borrow checker-ом. Теории типов не будет — только приёмы и шаблоны для рабочего кода, почти всё на стабильном Rust.</p><p>После первой части вы сможете посмотреть на свои структуры с флагами и Option-ами, посчитать, сколько недопустимых состояний они позволяют собрать, перепроектировать их так, чтобы эти состояния перестали компилироваться, и удалить часть defensive-проверок.</p><p>В первой статье — пять техник, каждая разобрана по схеме «проблема -&gt; решение -&gt; хорошие практики -&gt; как это используют известные крейты или std библиотека».</p><p>Примеры во всей серии — из биржевой торговли, но сами приёмы работают в любом домене со сложными состояниями и правилами их изменения:</p><ul><li><p>newtype — свой тип для каждой роли вместо голого примитива: значения разных типов не перепутать местами, а инварианты проверяются один раз — при создании (smart constructor);</p></li><li><p>ADT — «одно из» через enum с данными в вариантах вместо булевых флагов и Option-ов, допускающих бессмысленные комбинации;</p></li><li><p>uninhabited types — типы без значений: как убрать ветку ошибки, которая «никогда не случится», так, чтобы это гарантировал компилятор, а не unreachable!();</p></li><li><p>phantom types — параметры-маркеры без рантайм-представления: одна generic-обёртка с типом-тегом вместо семейства одинаковых newtype-ов;</p></li><li><p>typestate — состояние объекта в его типе: у каждого состояния свой набор методов, переход возвращает новый тип, а неверный порядок шагов не компилируется.</p></li></ul><p>Первая статья — «<a href="https://github.com/niktimf/type_driven_development_rust/blob/master/articles/01-foundations.md" rel="noopener noreferrer nofollow">Type-driven development в Rust. Часть 1/5: делаем недопустимые состояния невыразимыми</a>» — уже на GitHub. Там же — компилируемые примеры ко всем приёмам: Cargo workspace, который собирается и проходит тесты.</p> <a href="https://habr.com/ru/posts/1061408/?utm_campaign=1061408&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 22 Jul 2026 08:08:40 GMT</pubDate>
    <dc:creator><![CDATA[EditorF6 (F6)]]></dc:creator>
      
      <category><![CDATA[rust]]></category><category><![CDATA[разработка]]></category><category><![CDATA[type-driven development]]></category><category><![CDATA[качество кода]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AvrGavr — Программирование (+2) — 21.07.2026 10:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1061216/</guid>
    <link>https://habr.com/ru/posts/1061216/?utm_campaign=1061216&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Задача — это файл в git, а не сообщение в чате</strong></p><p><em>Предисловие. За год плотной работы с ИИ-агентами — пять проектов доехали до продакшна — у нас сложился набор практик. Разбираем по одной. Первая и базовая: где живёт задача.</em></p><p>Приходит, значит, товарищ к агенту: сделай, милый, вот такую фичу. Агент кивает, бодро пишет код, всё замечательно. Проходит два дня. Товарищ открывает новый чат — а там пусто. Агент не помнит ни фичи, ни уговора, ни что «готово» вообще должно было означать. У него каждое утро чистый лист. И сидит наш товарищ, восстанавливает контекст по диффу, как археолог по черепкам.</p><p>Причина простая: задача жила в переписке, а переписка не версионируется и сессию не переживает. Поэтому у нас задача — это файл в git, рядом с кодом. Он коммитится вместе с кодом, который его закрывает, и едет в той же feature-ветке.</p><p>Структура папок</p><p>Всё, что касается задач, лежит в репозитории и отслеживается git (у нас — 294 файла):</p><pre><code>task/                  ← активные задачи (сейчас в работе)
├── done/              ← закрытые
└── history/           ← рефлексия по сессиям (отдельная практика)
plans/                 ← длинные roadmap'ы</code></pre><ul><li><p><strong><code>task/</code></strong> — только то, что сейчас в работе. Незакрытое и без хвостов. У нас тут обычно 1–3 файла.</p></li><li><p><strong><code>task/done/</code></strong> — задача переезжает сюда, как только выполнен Definition of Done. Не после деплоя, а сразу как критерий закрыт. Это архив сделанного: сейчас 121 задача, каждую можно открыть и посмотреть, что и как решали.</p></li><li><p><strong><code>plans/</code></strong> — большие направления, которые не влезают в одну задачу. Roadmap режется на пачку мелких task-файлов; агент читает общий план, потом берёт из него конкретный кусок. Сейчас 9 роадмапов.</p></li><li><p><strong><code>task/history/</code></strong> — рефлексия по сессиям. Это уже про память агента, отдельная практика; здесь только упоминаю, чтобы структура была полной.</p></li></ul><p>Имя файла — <code>YYYY-MM-DD_</code><a href="http://HH-MM-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.md" rel="noopener noreferrer nofollow"><code>HH-MM-название.md</code></a>, с датой и временем создания. Даёт хронологию из коробки: задачи сортируются по возникновению, имена не конфликтуют, ничего не перетирается.</p><p>Что внутри задачи</p><ul><li><p><strong>Одна задача = одна функция.</strong> Она же — одна feature-ветка и один MR. Есть задача на эту фичу — работаем с ней, вторую не заводим: два файла на одно дело — и потом сам не разберёшь, который из них настоящий.</p></li><li><p><strong>Фазы со статусом.</strong> Внутри — шаги, у каждого <code>[ ]</code> или <code>[x]</code>. Сессия оборвалась — следующая открывает файл и видит, где остановились: что сделано, что ждёт, что готово, но не проверено. Состояние читается из файла, а не восстанавливается по памяти.</p></li><li><p><strong>Definition of Done — перечисляемым списком.</strong> Не «сделать фичу», а конкретные пункты: что именно должно работать. Без списка «готово» у каждого своё. Этот же список потом становится чек-листом приёмки: пункт → проверка → PASS/FAIL, любой FAIL — задача не закрыта.</p></li><li><p><strong>Итоговый блок.</strong> В конце — реализовано целиком или нет, что осталось, какие решения приняли и почему.</p></li></ul><p>Скелет реальной задачи из проекта:</p><pre><code># Фаза 7 — калибровка порога confidence
**Тип:** chore + small feat
**Ветка:** chore/retrieval-calibration
**Зависимости:** фаза 6 в проде
**Статус:** Шаг 1 готов; Шаги 2-3 ждут трафика

## Прогресс
- [x] Шаг 1 — инструментовка. Тесты зелёные.
- [ ] Шаг 2 — сбор датасета с прода (ждёт трафика).
- [x] Шаг 3 — эвал-команда готова. Осталось прогнать на реальных данных.

## Контекст
Почему пороги пока с потолка и что от них зависит.
</code></pre><p>Что это даёт</p><ul><li><p><strong>Переживает сессию и машину.</strong> Контекст не теряется между чатами: новый агент читает файл и продолжает с той же точки.</p></li><li><p><strong>Едет в ревью вместе с кодом.</strong> Ревьюер видит не только дифф, но и зачем он и по каким критериям принимать.</p></li><li><p><strong>Имеет историю.</strong> Кто завёл, когда, что и почему решили — в git-логе, а не в чьей-то памяти. Через полгода понятно без археологии.</p></li><li><p><strong>Держит остальные практики.</strong> Приёмку не сверить, если непонятно, что считалось «сделано». DoD из файла и есть этот критерий.</p></li></ul><p>Мораль простая. Пока в файле не прописано, что считается «готово», любое «готово» — вопрос веры. Вера в хозяйстве вещь неплохая, но к продакшну отношения не имеет. Список превращает её в проверяемый факт.</p> <a href="https://habr.com/ru/posts/1061216/?utm_campaign=1061216&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 21 Jul 2026 07:20:37 GMT</pubDate>
    <dc:creator><![CDATA[AvrGavr]]></dc:creator>
      
      <category><![CDATA[вайбкодинг]]></category><category><![CDATA[скилы]]></category><category><![CDATA[claude.md]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DimanODG — LaTeX (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1061060/</guid>
    <link>https://habr.com/ru/posts/1061060/?utm_campaign=1061060&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем привет!</p><p>Сегодня поделюсь своим проектом, где использовал возможности открытых моделей LLM для создания автоматизированного конвейера по переводу англоязычных pdf-файлов в русскоязычные pdf. Как человек, интересующийся именно технологиями в области ИИ мне особенно было интересно максимальное приближенное к оригиналу сохранение содержимого переведенного материала, включая схемы, математические  формулы, блоки кода (python) и bash-команд, рисунков (само собой), сохранение сносок, ссылок и пр. метаданных. Целью проекта было применение всевозможных доступных стеков и программ, использующих LLM в конкретной практической задаче. И как оказалось, на первый взгляд, простая задача перевода, с которой современная LLM, созданная и обученная на архитектуре трансформеров справляется на сегодняшний день блестяще, для pdf-формата оказалась не совсем простой (но и не скажу, что особо сложной).</p><p>О выборе программного стека технологий. Здесь во многом все определило глубина моих познаний и практических умений работать с LLM-моделями и тем оборудованием (потребительским, конечно), которое имеется дома. Поэтому, исходя из пары-тройки (пары) вычислительных узлов (ноутбуков) в домашней локалке мой выбор определил следующие программные и аппаратные компоненты.</p><p>Программные компоненты. Прежде всего это среда выполнения wsl. Просто работает в windows, удобна мне как новичку.   В wsl установка обычной env стандартным python. И далее уже конкретные ПО для выполнения задачи перевода pdf на русский. Тут пришлось почитать в сети что есть свободное (исходя из цели использования только открытого ПО и LLM, чтобы оценить уровень их развития). Были опробованы такие программы как Docling,  Marker-pdf и еще какую-то). В итоге, для извлечения из pdf в markdown формат я использовал Marker-pdf. У него имеется целый набор специализированных ocr-моделей для парсинга содержимого pdf. Marker в режиме конвейера осуществляет извлечение в указанную папку все содержимое исходного pdf в виде отдельных jpg-файлов, файла метаданных и итогового англоязычного .md файла. Для обратного процесса конвертации переведенного на русский язык <em>ru.md я использовал WeasyPrint и Pandoc. Мой выбор - Pandoc. Сложнее, но поддержка xeLatex и куча настроек через опции командной строки и переменных окружения wsl. Pandoc - единственное ПО в моем конвейере, которое не использует LLM. И собственно, середина - перевод. Готовый скрипт на python. Перевод разбитых на части (chanks) в endpoint LLM - requests.post. Фишкой является url, который через специальный балансировщик, управляющий вычислительными узлами в локалке отправляется в requests.post. Получается параллельный перевод на нескольких узлах с &nbsp;развернутыми OpenAI-совместимыми LLM. Количество узлов - сколько найдется в домашней ИИ лаборатории))). До и после отправки на перевод в LLM - чистка регулярками от различных костылей и защиты от перевода не нужных элементов (чистка колонтитулов, пагинация, сглаживание двойных переносов строк, изоляция спец. блоков от LLM блоков кода, мат. формул, кода внутри строк, приведение кода к pep8), подготовка переведенного _</em>ru.md к сборке pdf-файла в Pandoc. В итоге - pipeline в 3 шага: Marker-pdf, Скрипт-переводчик на python, Pandoc.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/756/856/d5f/756856d5feecbc8a80ca96bb4854a5c9.png" alt="Основные шаги перевода (marker, python скрипт, pandoc)" title="Основные шаги перевода (marker, python скрипт, pandoc)" width="1206" height="750"><div><figcaption>Основные шаги перевода (marker, python скрипт, pandoc)</figcaption></div></figure><p>Все вместе также можно запустить скриптом bash-сценария: </p><blockquote><p>Использование: ./<a href="http://pipeline.sh" rel="noopener noreferrer nofollow">pipeline.sh</a> &lt;path_to_input_pdf&gt; &lt;output_path&gt; [page_range] </p><p>Пример1: перевод всего Pdf-файла </p><p>./<a href="http://pipeline.sh" rel="noopener noreferrer nofollow">pipeline.sh</a> /mnt/project/raw_data/embeddings.pdf /mnt/project/rendered/embeddings</p><p>Пример1: перевод первых 21 страниц Pdf-файла </p><p>./<a href="http://pipeline.sh" rel="noopener noreferrer nofollow">pipeline.sh</a> /mnt/project/raw_data/embeddings.pdf /mnt/project/rendered/embeddings 0-20</p></blockquote><p>Репозиторий на github <a href="https://github.com/DemonODG/pdf-translator" rel="noopener noreferrer nofollow">DemonODG/pdf-translator: English-to-Russian PDF Translation Pipeline</a>  </p><p>Это мой первый пост на тему применения современных LLM моделей в различных практических задачах. Если это вызовет интерес в более подробном описании данного pipeline - напишу статью поподробнее. </p><p>Всем добра!</p> <a href="https://habr.com/ru/posts/1061060/?utm_campaign=1061060&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Jul 2026 17:01:32 GMT</pubDate>
    <dc:creator><![CDATA[DimanODG]]></dc:creator>
      
      <category><![CDATA[translate api]]></category><category><![CDATA[llm-модели]]></category><category><![CDATA[llm-приложения]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Ra2007 — Искусственный интеллект (+2) — 20.07.2026 13:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1060888/</guid>
    <link>https://habr.com/ru/posts/1060888/?utm_campaign=1060888&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Greenfield по технологии, brownfield по бизнес-правилам</p><p>Сегодня в комментариях к чужой статье про greenfield и brownfield в эпоху AI вспомнил свою миграцию 200К строк JS в TypeScript. Тогда я не думал в этих терминах. Теперь вижу: проект был greenfield и brownfield одновременно, и путаница между ними стоила нам двух недель дебага в середине миграции.</p><p><strong>Я думал: раз меняем весь стек, это чистый лист</strong></p><p>Оказалось: технология была greenfield, стек новый, границы модулей новые, тесты новые. Бизнес-правила остались brownfield на все сто. Восемь лет продакшена, часть логики нигде не задокументирована, живёт только в поведении старого кода. Агент писал типобезопасный, красивый TypeScript и с той же уверенностью ломал правило, о существовании которого никто в команде уже не помнил.</p><p><strong>Я думал: раз тесты зелёные, поведение сохранилось</strong></p><p>Оказалось: существующее покрытие было тонким именно там, где пряталась история. Странный if с комментарием «не трогать, тут баг у клиента X» тестами не покрывался, потому что баг был найден руками три года назад и с тех пор просто жил в коде. Агент видел if без контекста и оптимизировал его как мёртвый код.</p><p><strong>Что сработало: golden-master тесты перед тем, как подпускать агента</strong></p><p>Не юнит-тесты на новую логику, а снимок текущего поведения на самых страшных модулях. Прогнали типичные и граничные кейсы через старый код, зафиксировали вывод, потом сравнивали с новым на каждом шаге. Разница ловилась мгновенно, до ревью, до продакшена. Три раза снапшот показал расхождение, которое человек на ревью пропустил бы, слишком похоже на «просто более чистый код».</p><p><strong>Главный вывод</strong></p><p>В greenfield-части задачи вопрос «правильно ли мы строим» решается быстрой обратной связью и итерацией. В brownfield-части вопрос другой: «сохранили ли мы то, что уже работает». Агент одинаково уверенно предлагает и то, и другое решение, разницу видно только через инструмент вроде golden-master, не через код-ревью на глаз.</p><p>Если в проекте есть куски старше пары лет, перед тем как звать агента туда, стоит сначала спросить не «как сделать красиво», а «что именно нельзя сломать, и как я об этом узнаю раньше продакшена».</p><p>Пишу об этом подробнее в канале <a href="https://t.me/ai_in_prod" rel="noopener noreferrer nofollow">@ai_in_prod</a>.</p> <a href="https://habr.com/ru/posts/1060888/?utm_campaign=1060888&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Jul 2026 10:57:21 GMT</pubDate>
    <dc:creator><![CDATA[Ra2007]]></dc:creator>
      
      <category><![CDATA[greenfield]]></category><category><![CDATA[brownfield]]></category><category><![CDATA[claude code]]></category><category><![CDATA[легаси]]></category><category><![CDATA[миграция]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @TrexSelectel — Блог компании Selectel (+4) — 20.07.2026 13:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1060884/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1060884/?utm_campaign=1060884&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как управлять окружениями — venv / pip vs pipenv vs poetry?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6b0/8d9/d64/6b08d9d64aa9d30b6e722430b3e6d4a8.jpg" width="1191" height="669"></figure><p>Привет, Хабр! Продолжаем нашу рубрику с быстрыми ответами на некоторые часто встречающиеся вопросы. Сегодня разберем такую проблему: проекты постоянно ломаются из-за конфликтов зависимостей. Что выбрать для новых проектов и как сделать так, чтобы код работал одинаково, в том числе в CI?</p><p>Обычно начало всех проблем — смешение глобальных и локальных пакетов или отсутствие фиксированных версий библиотек. Главный совет: у каждого проекта должно быть собственное окружение с явно указанными зависимостями и сохраненным lock‑файлом в репозитории.</p><p>Если говорить о базе, то это связка venv и pip. Плюс она встроена в сам Python. Вы вручную создаете окружение, устанавливаете нужные пакеты и фиксируете их в&nbsp;<code>requirements.txt.&nbsp;</code></p><p>Но подход со временем может стать неудобным — особенно когда в проекте десятки зависимостей и несколько разработчиков. Поэтому, на смену ручным методам пришел Poetry.&nbsp;</p><p>Сейчас это, пожалуй, наиболее сбалансированное решение: он создает и управляет окружениями, отслеживает версии, собирает wheel‑пакеты и умеет публиковать их в PyPI. Lock‑файл (poetry.lock) обеспечивает воспроизводимость сборок, а сам формат&nbsp;<code>pyproject.toml</code>&nbsp;— это стандарт. В итоге вы получаете чистое окружение, детерминированные зависимости и понятное поведение CI.</p><p>Вот пример рабочего цикла:</p><pre><code class="bash">python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install poetry
poetry install
poetry run pytest</code></pre><p>В CI чаще используют схему с экспортом зависимостей:</p><pre><code class="bash">poetry export -f requirements.txt --without-hashes -o reqs.txt
pip install -r reqs.txt
pytest</code></pre><p>Отдельно стоит упомянуть uv — относительно новый инструмент, созданный командой Astral (авторы Ruff). Он написан на Rust и совместим с Python. По сути, это те же функции pip, venv и частично poetry, но быстрее. От Poetry он отличается отсутствием публикации пакетов, но при этом умеет сам устанавливать и менять версии Python через&nbsp;<code>.python-version</code>.&nbsp;</p><p>UV работает с pyproject.toml и имеет собственный uv.lock. Может использоваться вместе с Poetry, но лучше создавать единый uv.lock для строгой воспроизводимости. Для CI это удобно, вы пишите:</p><pre><code class="bash">pip install uv</code></pre><p>Далее есть два варианта:</p><ul><li><p><code>uv venv</code> — создает виртуальное окружение. Это аналог&nbsp;<code>python3.13 -m venv .venv</code>, но работает быстрее и с автоустановкой версии Python.</p></li><li><p><code>uv init</code> — помимо .venv, добавляет шаблон проекта с pyproject.toml для зависимостей, Git-репозиторий и базовые файлы. Идеально для нового проекта.</p></li></ul><p>И окружение в CI полностью совпадает с локальным, а билд воспроизводится без сюрпризов. Но чаще всего комбинируют два решения: Poetry для разработки и uv — для быстрых сборок и деплоймента.</p><blockquote><p>Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная&nbsp;<a href="https://selectel.ru/blog/courses/course-python/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_pythonenv_200726_content" rel="noopener noreferrer nofollow">подборка статей</a>. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.  </p></blockquote> <a href="https://habr.com/ru/posts/1060884/?utm_campaign=1060884&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Jul 2026 10:54:01 GMT</pubDate>
    <dc:creator><![CDATA[TrexSelectel (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[python]]></category><category><![CDATA[окружения]]></category><category><![CDATA[зависимости]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MaxRokatansky — Блог компании OTUS (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/otus/posts/1060186/</guid>
    <link>https://habr.com/ru/companies/otus/posts/1060186/?utm_campaign=1060186&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что&nbsp;изучить на&nbsp;неделе: 23&nbsp;бесплатных урока по&nbsp;разработке, ИИ и инфраструктуре</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e03/a9e/6eb/e03a9e6eb9c291ce0ab194f93637ea0b.png" width="1800" height="980"></figure><p>С 20&nbsp;по 23&nbsp;июля пройдут открытые уроки по&nbsp;разработке, тестированию, архитектуре, сетям, управлению и работе с&nbsp;ИИ. На&nbsp;них можно разобрать конкретную тему с&nbsp;практикующим экспертом, задать вопросы и закрыть отдельные пробелы в&nbsp;знаниях.</p><p>Все занятия бесплатные. Это возможность посмотреть, как&nbsp;устроено обучение: оценить подачу материала, познакомиться с преподавателями и понять, насколько программа соответствует вашим задачам.</p><p><strong>ИИ и машинное обучение</strong></p><ul><li><p>20&nbsp;июля, 20:00. «ИИ для&nbsp;продуктового discovery: как&nbsp;анализировать рынок, конкурентов и пользователей&nbsp;быстрее». <a href="https://otus.pw/LwQa/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>21&nbsp;июля, 20:00. «Алгоритм DQN&nbsp;— учим нейросеть принимать решение без&nbsp;помощи человека». <a href="https://otus.pw/3CniC/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>21&nbsp;июля, 20:00. «Разработка ИИ‑приложений с&nbsp;Claude Code». <a href="https://otus.pw/e8TJ/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>21&nbsp;июля, 20:00. «Выбор между Serverless и Kubernetes для&nbsp;AI‑ворклоадов: как&nbsp;определить оптимальную платформу под&nbsp;задачу». <a href="https://otus.pw/NSKY/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «Что надо знать про&nbsp;работу LLM‑моделей». <a href="https://otus.pw/3RgT/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «От рутины к&nbsp;влиянию: как&nbsp;HR использовать ИИ в&nbsp;ежедневной работе». <a href="https://otus.pw/xG2f/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>23&nbsp;июля, 20:00. «Когнитивные архитектуры: ReAct, Reflection и RAG». <a href="https://otus.pw/Y326/" rel="noopener noreferrer nofollow">Записаться</a></p></li></ul><p><strong>Разработка и архитектура</strong></p><ul><li><p>20&nbsp;июля, 20:00. «Асинхронное программирование в&nbsp;Android». <a href="https://otus.pw/veO3/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>20&nbsp;июля, 20:00. «Как перестать писать на&nbsp;Java внутри Go‑проекта». <a href="https://otus.pw/zhLfB/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>21&nbsp;июля, 20:00. «Данные в&nbsp;TOGAF. Где скрыты? Разбираемся в&nbsp;деталях». <a href="https://otus.pw/vyv1/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «Архитектура программ на&nbsp;C++: как&nbsp;управлять разработкой и функциями приложения». <a href="https://otus.pw/957R/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «DAO на&nbsp;Spring JDBC». <a href="https://otus.pw/gVRK/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>23&nbsp;июля, 20:00. «Основы многопоточности в&nbsp;Java». <a href="https://otus.pw/rTrF/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>23&nbsp;июля, 20:00. «malloc&nbsp;— кто&nbsp;же ты на&nbsp;самом деле?». <a href="https://otus.pw/AVAT/" rel="noopener noreferrer nofollow">Записаться</a></p></li></ul><p><strong>Тестирование и безопасность</strong></p><ul><li><p>21&nbsp;июля, 19:00. «Оценка трудозатрат в&nbsp;QA: как&nbsp;перестать ошибаться в&nbsp;сроках». <a href="https://otus.pw/sqcmN/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>21&nbsp;июля, 20:00. «UI‑ и API‑тестирование с&nbsp;Java и Playwright». <a href="https://otus.pw/L8R0/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>23&nbsp;июля, 20:00. «Тестирование интернет‑магазина: от&nbsp;каталога до&nbsp;оплаты».<a href="https://otus.pw/3zb0/" rel="noopener noreferrer nofollow"> Записаться</a></p></li><li><p>23&nbsp;июля, 20:00. «Фаззинг и реверс: как&nbsp;понять, что&nbsp;делает программа, и найти в&nbsp;ней ошибки». <a href="https://otus.pw/zIo2/" rel="noopener noreferrer nofollow">Записаться</a></p></li></ul><p><strong>Инфраструктура и сети</strong></p><ul><li><p>20&nbsp;июля, 20:00. «Проектирование адресного пространства. Основы сетей ЦОД». <a href="https://otus.pw/L2N3/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «VLAN на&nbsp;пальцах: изоляция трафика и маршрутизация». <a href="https://otus.pw/xGwDp/" rel="noopener noreferrer nofollow">Записаться</a></p></li></ul><p><strong>Управление продуктами и командами</strong></p><ul><li><p>22&nbsp;июля, 20:00. «Как CTO управляет неопределённостью: оценки, планы и ожидания бизнеса». <a href="https://otus.pw/FLm5/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «Как собрать полный CJM&nbsp;— карту клиентского пути». <a href="https://otus.pw/Sy9X/" rel="noopener noreferrer nofollow">Записаться</a></p></li><li><p>22&nbsp;июля, 20:00. «Операция "Воркшоп": как&nbsp;получить поддержку руководства для&nbsp;новой инициативы». <a href="https://otus.pw/IwvU/" rel="noopener noreferrer nofollow">Записаться</a></p></li></ul><blockquote><p>Больше открытых уроков июля смотрите&nbsp;<a href="https://otus.pw/db5w/" rel="noopener noreferrer nofollow">в&nbsp;дайджесте.</a>  </p></blockquote> <a href="https://habr.com/ru/posts/1060186/?utm_campaign=1060186&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Jul 2026 07:50:31 GMT</pubDate>
    <dc:creator><![CDATA[MaxRokatansky (OTUS)]]></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><category><![CDATA[обучение в IT.]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @TrexSelectel — Блог компании Selectel (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1058620/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1058620/?utm_campaign=1058620&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как настроить TLS в клиенте Python при HTTPS-запросах?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/06f/7e1/2c3/06f7e12c335316147483d76e2102be10.jpeg" width="1191" height="669"></figure><p>Бывает так, что после обновления OpenSSL часть HTTPS-вызовов к внешним сервисам падает с ошибкой <code>ssl.SSLError</code>. Сейчас разберемся, как настроить Python, чтобы handshake проходил успешно и соединение оставалось безопасным.</p><p>После апдейтов OpenSSL часто отключают старые протоколы и слабые шифры — старые серверы не проходят handshake. Решение на клиенте — явно создать ssl.SSLContext, задать минимальную версию TLS и, при необходимости, набор шифров, а затем передать этот контекст в HTTP-клиент (например, httpx).</p><pre><code class="python">import ssl
import httpx

ctx = ssl.create_default_context(purpose=ssl.Purpose.SERVER_AUTH)
ctx.minimum_version = ssl.TLSVersion.TLSv1_2
ctx.set_ciphers('ECDHE+AESGCM:!ECDSA:!aNULL:!eNULL')

with httpx.Client(verify=ctx, timeout=10.0) as client:
    r = client.get('https://api.example.com')
    r.raise_for_status()
    print(r.status_code)</code></pre><p>В коде мы указываем <code>TLSv1_2</code> как минимальный порог. Это удобно: если сервер уже поддерживает TLS 1.3, все само заработает на самой новой версии. Но если какой-то внешний сервис еще не успел обновиться, соединение не разорвется, и все продолжит работать на стабильном 1.2. Так мы получаем универсальный код, который не сломается при работе со старыми API.</p><p>Для отладки TLS handshake применяйте&nbsp;<code>openssl s_client -connect host:443 -tls1_2</code>&nbsp;чтобы увидеть, какие шифры поддерживает сервер. Временное ослабление&nbsp;<code>minimum_version</code>&nbsp;даст совместимость, но хуже для безопасности — лучше апгрейдить серверную часть. Сертификаты и ключи храните вне кода (секреты/volumes), не логируйте их, и при работе в контейнерах используйте безопасные механизмы передачи секретов.</p><blockquote><p>Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная&nbsp;<a href="https://selectel.ru/blog/courses/course-python/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_pythontls_170726_content" rel="noopener noreferrer nofollow">подборка статей</a>. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.  </p></blockquote> <a href="https://habr.com/ru/posts/1058620/?utm_campaign=1058620&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 17 Jul 2026 10:00:21 GMT</pubDate>
    <dc:creator><![CDATA[TrexSelectel (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[python]]></category><category><![CDATA[tls]]></category><category><![CDATA[ssl]]></category><category><![CDATA[безопасность]]></category><category><![CDATA[requests]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @veta_pf — Блог компании МТС (+3) — 15.07.2026 18:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ru_mts/posts/1059552/</guid>
    <link>https://habr.com/ru/companies/ru_mts/posts/1059552/?utm_campaign=1059552&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Участвуй в МТС True Tech Champ 2026 — всероссийском чемпионате по программированию с призовым фондом 10 250 000 рублей&nbsp;</strong>🔥  </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/923/8e0/55f/9238e055f6b97304fe735db2b4120106.png" width="2048" height="1365"></figure><p>Выбирай, какой трек тебе интереснее 👇</p><ul><li><p><strong>Алгоритмический</strong> (индивидуальный зачет, 2 750 000 ₽). Решай задачи по алгоритмам и структурам данных, которые помогут прокачать навыки для технических собеседований и работы в ведущих ИТ-командах. Лучшие участники пройдут в финал, где в режиме реального времени будут соревноваться в правильности решений и скорости мышления.</p></li><li><p><strong>Программирование роботов</strong> (командный формат, 7 500 000 ₽). Напиши алгоритмы для робособаки и робота-манипулятора и проведи их через три этапа соревнований. Сначала — через цифровой симулятор, где нужно пройти трассу и выполнить задания по передаче предметов. Затем — подключись к реальному полигону через удаленный доступ и выполни задания на физических роботах дистанционно. А в очном финале лучшим командам предстоит управлять роботами на площадке, дорабатывать алгоритмы под новые условия и бороться за победу на глазах у зрителей.</p></li></ul><p>Шоу-финал с кодерскими челленджами и выступлениями спикеров состоится 22 октября в МТС Live Холл. А лучшие участники получат <strong>шанс на стажировку</strong> в MTC Web Services (MWS).</p><blockquote><p><em>Так после МТС True Tech Hack 2026 к команде присоединились три стажера:</em></p><p><em>1. Илья Матвеев из команды MCLover, 18 лет, студент 1-го курса бакалавриата Института интеллектуальных кибернетических систем (НИЯУ МИФИ). Вышел на позицию стажера frontend-разработчика в MWS Octapi.</em></p><p><em>2. Роман Субботин из команды DEP_IT_MISIS, 19 лет, студент 2-го курса бакалавриата НИТУ МИСИС по направлению «Прикладная математика» в институте компьютерных наук. Вышел на позицию стажера Python-разработчика в MWS Octapi.</em></p><p><em>3. Кирилл Ефимович из команды Моторный шуруповерт, 20 лет, студент третьего курса бакалавриата направления «Разработка ПО», Университет Иннополис, GPA: 4.6. Вышел на позицию стажера DevOps в MWS Tables.</em></p></blockquote><p>➡️ <a href="https://truetechchamp.ru/?utm_source=habr&amp;utm_medium=post&amp;utm_campaign=champ26_150726" rel="noopener noreferrer nofollow">Зарегистрируйся</a> и стань участником масштабного ИТ-чемпионата.</p> <a href="https://habr.com/ru/posts/1059552/?utm_campaign=1059552&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 15 Jul 2026 15:11:27 GMT</pubDate>
    <dc:creator><![CDATA[veta_pf (МТС)]]></dc:creator>
      
      <category><![CDATA[true tech champ]]></category><category><![CDATA[алгоритмический трек]]></category><category><![CDATA[алгоритмы]]></category><category><![CDATA[программирование роботов]]></category><category><![CDATA[робособака]]></category><category><![CDATA[манипулятор]]></category><category><![CDATA[стажировка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Coppermine — Компьютерная анимация (+3) — 13.07.2026 16:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1058658/</guid>
    <link>https://habr.com/ru/posts/1058658/?utm_campaign=1058658&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<iframe id="6a54e5fd6358d8af3156306c" src="https://embedd.srv.habr.com/iframe/6a54e5fd6358d8af3156306c" class="embed_video embed__content" allowfullscreen="true"></iframe><p> Давненько ничего не писал здесь. В свободное время засел за работу, которую хотел взять в качестве дипломной, но не взял, так как тогда не был уверен в собственных силах. Если кратко, что здесь происходит: я нахожу на лице модели белые маркеры (свзяка из LoG-фильтра и поиска локальных экстремумов методом Китчена-Розенфельда) и пытаюсь отследить их движение в кадре (венгерский алгоритм, он же метод Куна-Манкерса в связке с фильтром Калмана). Модель отслеживания обладает инерцией (в реальности маркер не может телепортироваться и двигается согласно законам реального мира) - требуется стабилизация первые несколько кадров, есть запаздывание и возможна путаница, если движения напоминают конвульсии :) В остальном результат достаточно стабилен. Я хочу прикрутить к получившемуся Proof of Concept графический интерфейс, оптимизировать код (в черновом варианте я создаю кучу лишних объектов, что приводит к частой сборке мусора) и использовать записи с нескольких камер для восстановления положения маркеров в пространстве. Полученные данные в свою очередь можно отправить в любимый графический пакет. Это конечно не коммерческое решение для захвата движений уровня Vicon Nexus, скорее забавный велосипед, но всё же. Ждите эпичного результата и подробной статьи.</p> <a href="https://habr.com/ru/posts/1058658/?utm_campaign=1058658&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Jul 2026 13:19:57 GMT</pubDate>
    <dc:creator><![CDATA[Coppermine]]></dc:creator>
      
      <category><![CDATA[компьютерное зрение]]></category><category><![CDATA[машинное зрение]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ImagineTables — Программирование (+2) — 13.07.2026 09:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1058420/</guid>
    <link>https://habr.com/ru/posts/1058420/?utm_campaign=1058420&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Корпорация ценой в три триллиона силами целой армии разработчиков выпустила свою фирменную IDE (<em>Visual&nbsp;Studio&nbsp;2026</em>) после четырёх лет упорной разработки (предыдущая <em>Visual&nbsp;Studio</em> была <em>2022</em>):</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/996/b90/129/996b901296e3265538a57280fd7de475.png" alt="«Как, и что-то не готово?!» «Не готово, что ж такого»." title="«Как, и что-то не готово?!» «Не готово, что ж такого»." width="962" height="545"><div><figcaption>«Как, и что-то не готово?!» «Не готово, что ж такого».</figcaption></div></figure><p>В наши дни если ты не успевал к релизу перевести настройки в новый формат, тебя били до тех пор, пока ты не успевал. Теперь в мажорном релизе после многих лет разработки можно просто написать: <em>Лифт не работает, пользуйтесь пожарной лестницей</em>. Кажется, это называется «<a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D0%B2%D0%B0%D1%8F_%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C" rel="noopener noreferrer nofollow">новая искренность</a>»?</p> <a href="https://habr.com/ru/posts/1058420/?utm_campaign=1058420&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Jul 2026 06:57:47 GMT</pubDate>
    <dc:creator><![CDATA[ImagineTables]]></dc:creator>
      
      <category><![CDATA[visual studio 2026]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MaxRokatansky — Блог компании OTUS (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/otus/posts/1057968/</guid>
    <link>https://habr.com/ru/companies/otus/posts/1057968/?utm_campaign=1057968&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Ошибки, которых не видно в сигнатуре: зачем C++ нужен <code>std::expected</code></strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/73e/512/044/73e51204476db192fd7dca7dbff0395b.jpg" width="2048" height="768"></figure><p>Функция выглядит предсказуемо, пока один из вызовов не бросает исключение, о котором никто не вспомнил. Типы ошибок остаются в документации, управление расползается по <code>try/catch</code>, а изменение глубоко в стеке неожиданно ломает обработку выше.</p><p>Недавно в <a href="https://otus.pw/MLMk/" rel="noopener noreferrer nofollow">статье</a> разобрали <code>std::expected</code> из C++23: как сделать ошибку частью сигнатуры, собирать цепочки через <code>and_then</code> и <code>transform</code>, разделять типы ошибок между слоями и постепенно внедрять подход в legacy-код. Заодно увидели, где <code>std::expected</code> действительно полезен, а где добавит лишнюю сложность.</p><p><strong>16 июля в 20:00</strong> продолжим тему на бесплатном уроке «Выразительный C++: кодируем намерения». На практике разберём, как переносить неявные договорённости в типы, сигнатуры и структуру программы. <a href="https://otus.pw/hShj/" rel="noopener noreferrer nofollow">Присоединяйтесь</a>.</p><blockquote><p><em>Полный список бесплатных уроков июля смотрите </em><a href="https://otus.pw/89kk/" rel="noopener noreferrer nofollow"><em>в дайджесте.</em></a></p></blockquote> <a href="https://habr.com/ru/posts/1057968/?utm_campaign=1057968&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 11 Jul 2026 10:21:59 GMT</pubDate>
    <dc:creator><![CDATA[MaxRokatansky (OTUS)]]></dc:creator>
      
      <category><![CDATA[C++]]></category><category><![CDATA[обработка ошибок]]></category><category><![CDATA[исключения]]></category><category><![CDATA[сигнатура функции]]></category><category><![CDATA[типизация ошибок]]></category><category><![CDATA[c++23]]></category><category><![CDATA[функциональный стиль]]></category><category><![CDATA[архитектура приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @academicmaslow — Робототехника (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1057590/</guid>
    <link>https://habr.com/ru/posts/1057590/?utm_campaign=1057590&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Робот Физтеха попытается установить мировой рекорд по сборке мегаминкса</strong></p><p>15 июля в Физтехе пройдет официальная попытка установить мировой рекорд по сборке головоломки мегаминкс роботом. Команда лаборатории интеллектуальных технологий робототехники МФТИ готовится к финальной стадии <a href="https://habr.com/ru/articles/1004990/" rel="noopener noreferrer nofollow">проекта</a>, о котором я писал в начале весны.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2d6/2cf/05f/2d62cf05f31c6fa82269dbd347e7dfc3.png" alt="Робот-солвер МФТИ для сборки мегаминкса" title="Робот-солвер МФТИ для сборки мегаминкса" width="1625" height="917"><div><figcaption>Робот-солвер МФТИ для сборки мегаминкса</figcaption></div></figure><p>Инженеры физтеха сконструировали робота, способного собирать одну из самых сложных механических головоломок в мире. Пространство состояний додекаэдра под названием "мегаминкс" оценивается примерно в 10⁶⁸, что на порядки превышает сложность классического кубика Рубика. Проект прошел путь от инженерного прототипа до полноценной системы, объединяющей робототехнику и продвинутые алгоритмы поиска на графах состояний.</p><p><strong>Что известно о рекорде</strong></p><p>По данным разработчиков, текущая версия системы показывает результаты, которые:</p><ul><li><p><strong>в 68 раз превосходят предыдущий мировой результат среди роботов</strong>, который был установлен роботом Megaminxer Дэвида Гилдея 15 лет назад и составляет 8 минут 4 секунды;</p></li><li><p><strong>примерно вдвое быстрее лучшего результата человека </strong>(текущий рекорд принадлежит спидкуберу из Китая Ziyu Wu и составляет 21.04 секунды). </p></li></ul><p><strong>За счет чего достигается скорость</strong></p><p>Рекордные показатели планируется обеспечить не только быстрым манипулятором, но и глубокой алгоритмической работой:</p><ul><li><p><strong>Оптимизация планирования движений.</strong> Робот выполняет вращения независимых граней параллельно, что критично на коротких дистанциях.</p></li><li><p><strong>Сокращение длины решения.</strong> Вокруг проекта сформировалось сообщество энтузиастов, которые через open-source проект <a href="https://github.com/cayleypy/cayleypy" rel="noopener noreferrer nofollow">CayleyPy</a> и соревнования на <a href="https://www.kaggle.com/competitions/cayley-py-megaminx" rel="noopener noreferrer nofollow">Kaggle</a> работают над поиском кратчайших путей в графах Кэли. Участники применяют Pattern Databases, алгоритм Корфа, Beam Search и другие методы. За последние недели среднюю длину решений на тестовых выборках удалось уменьшить на 15–20% до ~90 ходов. Лучшие решения сейчас дают порядка 70 ходов (правда считаются долго).</p></li></ul><p><strong>Место встречи </strong></p><p>Установление рекорда запланировано на 15 июля, 17:30–21:30 в Физтех.Клубе МФТИ в Долгопрудном. </p><p>Кроме того, разработчики расскажут о своих инженерных решениях: кинематика, захват, конструкция манипулятора. А также раскроют алгоритмическую часть: как графы Кэли и методы поиска помогают роботу «думать». </p><p>Если хотите стать свидетелями рекорда в стенах МФТИ, то <a href="https://forms.yandex.ru/u/6a46235a6d2d732b25a0e775" rel="noopener noreferrer nofollow">регистрируйтесь по ссылке</a>. </p><p>Количество мест, как понимаете, ограничено, поэтому будет организована <a href="https://youtube.com/live/iHPZkN1a2Oo" rel="noopener noreferrer nofollow">трансляция</a> на YouTube. </p><p>Присоединяйтесь и к <a href="https://t.me/starkitmega" rel="noopener noreferrer nofollow">группе проекта</a> в Telegram.</p><p>&nbsp;</p> <a href="https://habr.com/ru/posts/1057590/?utm_campaign=1057590&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 09 Jul 2026 16:17:24 GMT</pubDate>
    <dc:creator><![CDATA[academicmaslow]]></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[физтех]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AndreyMoskalew — Блог компании PVS-Studio (+4) — 08.07.2026 12:55]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1056934/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1056934/?utm_campaign=1056934&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Cтaтья «BotSharp изнyтpи: ищeм cлaбыe мecтa в&nbsp;кoдe ИИ‑плaтфopмы нa.NET»</strong></p><p>Пpинятo cчитaть, чтo в&nbsp;AI и ML бeз Python никyдa, a.NET&nbsp;— этo иcключитeльнo иcтopия пpo enterprise, вeб‑paзpaбoткy и гeймдeв. Ho пpoeкт BotSharp гoтoв пocпopить c этим cтepeoтипoм, пpeдлaгaя ИИ‑плaтфopмy нa экocиcтeмe Microsoft.</p><p>Mы peшили зaглянyть пoд кaпoт BotSharp и пpoвepить, какие <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1391/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">ошибки есть в&nbsp;его иcxoдном кoде</a>.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/337/836/c5f/337836c5f1ed36e24e48c2c62602adad.png" width="973" height="548"></figure> <a href="https://habr.com/ru/posts/1056934/?utm_campaign=1056934&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 08 Jul 2026 09:55:26 GMT</pubDate>
    <dc:creator><![CDATA[AndreyMoskalew (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[BotSharp]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[PVS-Stuido]]></category><category><![CDATA[статический анализатор кода]]></category><category><![CDATA[C#]]></category><category><![CDATA[AI agent framework]]></category><category><![CDATA[open source]]></category><category><![CDATA[.NET]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
