<?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>Sun, 09 Aug 2026 19:35:49 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[Пост @denis-19 — Python (+4) — 09.08.2026 07:47]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1068294/</guid>
    <link>https://habr.com/ru/posts/1068294/?utm_campaign=1068294&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>П</strong>редставлен открытый проект <a href="https://github.com/agentic-box/memora" rel="noopener noreferrer nofollow">Memora</a>, который сохраняет работу Codex и Claude Code между сессиями. Внутри решения находится локальная база SQLite или синхронизация через S3, R2 и Cloudflare D1. Есть также семантический поиск, TODO, документы и связи между воспоминаниями. ИИ-агент запрашивает тему и получает готовый комплект данных: важный контекст, незакрытые задачи, связанные факты и ссылки на источники. Причём всю память можно открыть как интерактивный граф и изучать через встроенный RAG-чат.</p><iframe id="6a78054b06bbbc8001838e50" src="https://embedd.srv.habr.com/iframe/6a78054b06bbbc8001838e50" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1068294/?utm_campaign=1068294&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 09 Aug 2026 04:47:20 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Memora]]></category><category><![CDATA[claude code]]></category><category><![CDATA[codex]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Исследования и прогнозы в IT (+4) — 08.08.2026 19:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1068240/</guid>
    <link>https://habr.com/ru/posts/1068240/?utm_campaign=1068240&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Попросил ИИ чат нарисовать ИИ агента</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/986/4b8/eb7/9864b8eb7341e14c451d73fbf1a80930.jpg" width="1568" height="672"></figure> <a href="https://habr.com/ru/posts/1068240/?utm_campaign=1068240&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 08 Aug 2026 16:31:28 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[исскуственный интеллект]]></category><category><![CDATA[ии]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[openai]]></category><category><![CDATA[chatgpt]]></category><category><![CDATA[claude]]></category><category><![CDATA[claude-code]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @220-380 — SQL (+1) — 07.08.2026 12:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1067860/</guid>
    <link>https://habr.com/ru/posts/1067860/?utm_campaign=1067860&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет!<br><br>Заметка о том как работает алгоритм инкрементальной загрузки, она же дельта, в  ETL процессах. Полезно будет для тех кто только погружается.<br>Для загрузки данных в хранилище данных мы выполняем два отдельных процесса: первоначальную загрузку исторических данных и инкрементальную загрузку. Первый процесс делается разово, а второй выполняется периодически.<br>Инкрементальная загрузка выбирает только новые, еще не загруженные данные из источника в цель.<br>Например, пользователи постоянно генерируют новые данные, бизнес работает. Система запускалась час назад и забрала новые на тот момент данные. При следующем  запуске алгоритм определяет максимальную дату в цели:<br><strong>max_timestamp </strong>= <code>SELECT MAX(timestamp) FROM target_table</code><br><br>и выбирает все записи из источника которые новее max_timestamp  </p><p><code>SELECT * FROM source_table WHERE timestamp &gt; </code><strong>max_timestamp</strong></p><p>При следующем запуске алгоритм снова заберет новые данные. И так далее, бесконечный цикл. Колонка по которой определяются новые данные бывает не только типом timestamp, но и просто датой и числовым значением.<br>В виде наглядно показан процесс.</p><iframe id="6a75a6337f52e38032ecb146" src="https://embedd.srv.habr.com/iframe/6a75a6337f52e38032ecb146" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1067860/?utm_campaign=1067860&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 07 Aug 2026 09:40:15 GMT</pubDate>
    <dc:creator><![CDATA[220-380]]></dc:creator>
      
      <category><![CDATA[ELT]]></category><category><![CDATA[etl]]></category><category><![CDATA[etl-процессы]]></category><category><![CDATA[delta]]></category><category><![CDATA[инкрементальная загрузка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 07.08.2026 09:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1067740/</guid>
    <link>https://habr.com/ru/posts/1067740/?utm_campaign=1067740&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Nvidia представила открытый проект <a href="https://github.com/NVIDIA-NeMo/Speech/tree/nemotron-labs-voicechat" rel="noopener noreferrer nofollow">Nemotron VoiceChat</a>. Это голосовой ИИ‑агент, способный открывать любые инструменты по&nbsp;команде пользователя в&nbsp;реальном времени:</p><ul><li><p>Nemotron говорит с&nbsp;вами без&nbsp;пауз и умеет в&nbsp;эмоции;</p></li><li><p>разрешает вам перебивать себя с&nbsp;задержкой всего 480&nbsp;мс;</p></li><li><p>умеет вызывать инструменты посреди диалога&nbsp;— поиск в&nbsp;сети, календарь и так далее;</p></li><li><p>поддерживает сложные сценарии использования;</p></li><li><p>обучен на 550&nbsp;тысячах часов речь;</p></li><li><p>умеет слушать, говорить, прерывать ответы и вызывать инструменты в&nbsp;рамках одного диалога. </p></li></ul><iframe id="6a7581aac563c642bb1c174a" src="https://embedd.srv.habr.com/iframe/6a7581aac563c642bb1c174a" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1067740/?utm_campaign=1067740&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 07 Aug 2026 06:57:52 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Nemotron VoiceChat]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Python (+4) — 06.08.2026 09:26]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1067290/</guid>
    <link>https://habr.com/ru/posts/1067290/?utm_campaign=1067290&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/repowise-dev/repowise" rel="noopener noreferrer nofollow">repowise</a>&nbsp;— оптимизатор кодовых баз, который экономит токены в&nbsp;кодинге и работает с&nbsp;Claude Code, Cursor, Copilot:</p><ul><li><p>не читает каждый файл, а сразу индексирует весь репозиторий;</p></li><li><p>создаёт документацию для каждого файла;</p></li><li><p>строит графы зависимости и анализирует историю Git с слабыми местами;</p></li><li><p>неиспользуемый код и устаревшие зависимости чистит сам;</p></li><li><p>результат: минимальная задокументированная экономия — 36%. </p></li></ul><iframe id="6a756c04d2be537fa3901f89" src="https://embedd.srv.habr.com/iframe/6a756c04d2be537fa3901f89" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1067290/?utm_campaign=1067290&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 06 Aug 2026 06:26:29 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[repowise]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DenisDenisMIS — Python (+1) — 05.08.2026 16:36]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1067102/</guid>
    <link>https://habr.com/ru/posts/1067102/?utm_campaign=1067102&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>SmileLadder. Как трилогия  про "память и мозг" привела к циклу про управление вниманием. Пост №1 - от синтетической к реальной ЭЭГ</strong></p><p>В&nbsp;<a href="https://habr.com/ru/articles/1060758/" rel="noopener noreferrer nofollow">прошлой статье</a>&nbsp;я попробовал описать внимание как динамическое распределение весов в графе. Тогда нейронная активность, оцениваемая по ЭЭГ, были синтетическими: граф состоял из модельных узлов, а сигнал генерировался осцилляторами в модели Хиндмарша-Роуза.</p><p>Публикация получилась сложная и я этим постом попытаюсь перейти к разбору исследования вопроса управления вниманием. Первое, что я попробую - это возьму реальную <strong>ЭЭГ: </strong>Для проверки я использовал открытый датасет&nbsp;<a href="https://dx.doi.org/10.21227/44r8-ya50" rel="noopener noreferrer nofollow">STEW — Simultaneous Task EEG Workload</a>. В нём 48 участников: для каждого записаны состояние покоя и работа с многозадачным тестом SIMKAP.</p><p>На реальной EEG индекс ASI (по которому я выдвигал гипотезу, что он может быть оценкой уровня внимания) различает покой и высокую когнитивную нагрузку. Но есть важные ограничения, о которых скажу ниже.</p><p>Берём реальную EEG - там 14 EEG-каналов, частота дискретизации 128 Гц. Всего 96 записей.</p><figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/cb5/9d9/77f/cb59d977f53e472f844b11c4d23a0afb.png" alt="Кортикальные узлы я представил 14-тью реально измеренными каналами:&nbsp;AF3,&nbsp;F7,&nbsp;F3,&nbsp;FC5,&nbsp;T7,&nbsp;P7,&nbsp;O1,&nbsp;O2,&nbsp;P8,&nbsp;T8,&nbsp;FC6,&nbsp;F4,&nbsp;F8,&nbsp;AF4. " title="Кортикальные узлы я представил 14-тью реально измеренными каналами:&nbsp;AF3,&nbsp;F7,&nbsp;F3,&nbsp;FC5,&nbsp;T7,&nbsp;P7,&nbsp;O1,&nbsp;O2,&nbsp;P8,&nbsp;T8,&nbsp;FC6,&nbsp;F4,&nbsp;F8,&nbsp;AF4. " width="492" height="244"><div><figcaption>Кортикальные узлы я представил 14-тью реально измеренными каналами:&nbsp;<code>AF3</code>,&nbsp;<code>F7</code>,&nbsp;<code>F3</code>,&nbsp;<code>FC5</code>,&nbsp;<code>T7</code>,&nbsp;<code>P7</code>,&nbsp;<code>O1</code>,&nbsp;<code>O2</code>,&nbsp;<code>P8</code>,&nbsp;<code>T8</code>,&nbsp;<code>FC6</code>,&nbsp;<code>F4</code>,&nbsp;<code>F8</code>,&nbsp;<code>AF4</code>. </figcaption></div></figure><p>Каналы сгруппированы по областям: префронтальной, фронтальной, фронтоцентральной, височной, теменной и затылочной. Полная таблица соответствий лежит&nbsp;<a href="https://github.com/D2718281828nis/neuro-STEW-EEG-subject-identification/blob/master/Model%20GAT/results/ctx_node_mapping.csv" rel="noopener noreferrer nofollow">в репозитории</a>.</p><p><strong>Вот так использую свою модель</strong></p><p>EEG делится на окна по 4 секунды с шагом 2 секунды. Для каждого окна рассчитываются четыре компонента:</p><ol><li><p>спектральная вовлечённость - отношение активности beta к theta и alpha;</p></li><li><p>alpha gating - изменение задней alpha-активности;</p></li><li><p>фазовая организация - согласованность theta-ритма между передними и задними каналами;</p></li><li><p>пространственная селективность - насколько неравномерно распределена вовлечённость по каналам.</p></li></ol><p>На этих 14 каналах обучается графовый attention-readout. В коде он называется&nbsp;узел<code>THAL</code>  - это&nbsp;<strong>скрытый вычислительный узел-оркестратор</strong>.</p><p><strong>Практический результат: </strong>у 48 участников из этого датасета медиана&nbsp;<code>ASI-EEG</code>&nbsp;составила:</p><ul><li><p><strong>0,5129</strong>&nbsp;в покое;</p></li><li><p><strong>0,5311</strong>&nbsp;при высокой нагрузке.</p></li></ul><p>Медианный парный сдвиг равен&nbsp;<strong>+0,0218</strong>, 95% bootstrap-интервал —&nbsp;<strong>[0,0049; 0,0533]</strong>. Парный критерий Уилкоксона дал&nbsp;<strong>p = 0,00182</strong>. Это означает, что нулевая гипотеза об отсутствии различий отвергается, так как&nbsp;p-value меньше стандартного уровня значимости 0,05.&nbsp;</p><p>На этих данных ASI-EEG действительно реагирует на изменение когнитивного состояния. Это уже не результат виртуальной EEG, а эффект, полученный на записях реальных тестов.</p><p>Есть и второй пруф: графовый классификатор проверялся с разделением участников между фолдами. На уровне целой записи он различил покой и нагрузку с точностью&nbsp;<strong>88,5%</strong>, а&nbsp;<code>ROC AUC</code>&nbsp;составил&nbsp;<strong>0,969</strong>.</p><p>Все числа сохранены в&nbsp;<a href="https://github.com/D2718281828nis/neuro-STEW-EEG-subject-identification/blob/master/Model%20GAT/results/summary.json" rel="noopener noreferrer nofollow">summary.json</a>, а расчёт можно повторить по&nbsp;<a href="https://github.com/D2718281828nis/neuro-STEW-EEG-subject-identification/blob/master/Model%20GAT/stew_asi_gat_experiment.py" rel="noopener noreferrer nofollow">исходному коду</a>:</p><pre><code>python "Model GAT/stew_asi_gat_experiment.py" \
  --dataset dataset \
  --output "Model GAT/results" \
  --bootstrap 5000</code></pre><p>Практический цикл управления вниманием я теперь вижу так:</p><p><code>задачи и контекст → оценка ожидаемого фокуса → EEG-маркер фактической нагрузки → обратная связь → корректировка списка задач</code></p><p>Текущий репозиторий закрывает только один фрагмент этого цикла: показывает, что реальная EEG содержит воспроизводимый сигнал изменения нагрузки. Следующий шаг - не «читать мысли», а научиться замечать момент, когда нагрузка перестаёт быть продуктивной мобилизацией и превращается в распад селективности.</p><p>Код, данные расчёта и графики:&nbsp;<a href="https://github.com/D2718281828nis/neuro-STEW-EEG-subject-identification/tree/master" rel="noopener noreferrer nofollow">GitHub-репозиторий</a> - его я форкнул от задачи идентификации и дописал свою часть. </p> <a href="https://habr.com/ru/posts/1067102/?utm_campaign=1067102&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 05 Aug 2026 13:36:25 GMT</pubDate>
    <dc:creator><![CDATA[DenisDenisMIS]]></dc:creator>
      
      <category><![CDATA[Управление вниманием]]></category><category><![CDATA[DataScience EEG]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Prikalel — 3D-графика (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1066758/</guid>
    <link>https://habr.com/ru/posts/1066758/?utm_campaign=1066758&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>unreal‑assets‑to‑glb</strong></p><p>Это небольшой pip пакет, позволяющий вам конвертировать ресурсы unreal engine времени редактирования (не сборки игры) в модели формата glb.</p><iframe id="6a72b3d6c563c642bb1b0b22" src="https://embedd.srv.habr.com/iframe/6a72b3d6c563c642bb1b0b22" class="embed_video embed__content" allowfullscreen="true"></iframe><p>особенности:</p><ul><li><p>интерфейс cli с поддержкой команды help </p></li><li><p>поддерживает предварительный просмотр уровней (umap)</p></li><li><p>фильтрация ассетов для экспорта только определенных моделей</p></li><li><p>кэширование текстур для ускорения экспорта в будущем (если несколько раз выполняете экспорт)</p></li><li><p>извлечение текстур базового цвета / альбедо, а также других текстур путем сохранения в формате png </p></li><li><p>базовая поддержка сеток без анимации или костей без автоматического масштабирования с коэффициентом 100 к 1</p></li></ul><p>В видео я показываю, как модель отображается в другом игровом движке после импорта конвертированных uasset-файлов</p><p>главное преимущество: вообще не требуется устанавливать UE</p><p>исходный код: <a href="https://github.com/Prikalel/unreal-assets-to-glb" rel="noopener noreferrer nofollow">https://github.com/Prikalel/unreal-assets-to-glb</a>. пакет pip: <a href="https://pypi.org/project/unreal-assets-to-glb/" rel="noopener noreferrer nofollow">https://pypi.org/project/unreal-assets-to-glb/</a></p><p>сгенерированные файлы могут быть легко импортированы в другие движки, такие как godot / unity и т.д.</p><p>в настоящее время поддерживаются 2 версии UE engine: 5.5 и 4.27.2</p><p>вы также можете заметить, что некоторые материалы в тестовой сцене частично затемнены - это связано с тем, что пакет не позволяет вам правильно экспортировать все настройки материалов / все настройки шейдеров (ограничения перечислены на странице github, это освещение, положение камеры и другие параметры, но базовое извлечение 3d-сетки работает идеально).</p><p>но вы, очевидно, можете редактировать материалы после экспорта вручную в движке, в который вы их импортировали, изменяя размеры текстур / нормалей / добавляя пользовательские общие элементы и т.д.</p><p>Лицензия GPL-3.0</p> <a href="https://habr.com/ru/posts/1066758/?utm_campaign=1066758&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 05 Aug 2026 03:54:19 GMT</pubDate>
    <dc:creator><![CDATA[Prikalel]]></dc:creator>
      
      <category><![CDATA[glb]]></category><category><![CDATA[uasset]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dKosarevsky — Developer Relations (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1065862/</guid>
    <link>https://habr.com/ru/posts/1065862/?utm_campaign=1065862&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>MCP 2026-07-28: что действительно изменилось</p><p>Главное изменение — MCP стал stateless на уровне протокола. Убрали обязательные <code>initialize</code>, <code>initialized</code> и <code>Mcp-Session-Id</code>. Версия протокола и возможности клиента теперь передаются в каждом запросе, а сведения о сервере можно получить через <code>server/discover</code>. Любой запрос может обработать любой экземпляр сервера — без sticky sessions и общего хранилища сессий. Состояние приложения никто не запрещает: просто передавай явные идентификаторы вроде <code>browser_id</code> в аргументах инструментов.</p><p>Что ещё важно:</p><ol><li><p>Долгие операции получили нормальный жизненный цикл. <a href="https://modelcontextprotocol.io/extensions/tasks/overview" rel="noopener noreferrer nofollow">Tasks</a> позволяют вернуть <code>taskId</code>, а затем проверять состояние через <code>tasks/get</code>, передавать дополнительные данные через <code>tasks/update</code> и отменять работу через <code>tasks/cancel</code>. Но Tasks не появились с нуля — раньше это была экспериментальная часть ядра, теперь её переработали и вынесли в официальное расширение.</p></li><li><p>Протокол стал удобнее для эксплуатации. Заголовки <code>Mcp-Method</code> и <code>Mcp-Name</code> позволяют маршрутизировать запросы, не разбирая JSON. Появились стандартные подсказки для кеширования — <code>ttlMs</code> и <code>cacheScope</code>, а также единые поля для передачи <code>OpenTelemetry Trace Context</code>.</p></li><li><p>Переработано общение сервера с клиентом. Вместо произвольных <code>server-to-client</code> запросов сервер теперь может вернуть <code>input_required</code>, после чего клиент повторяет исходный запрос с ответом пользователя. Подписки на изменения вынесены в <code>subscriptions/listen</code>.</p></li><li><p>Extensions стали полноценной частью экосистемы. Новые возможности теперь можно развивать отдельно от ядра. Первые заметные расширения — <code>Tasks</code> и <code>MCP Apps</code>. Последнее позволяет серверу отдавать интерактивный HTML-интерфейс, который клиент показывает в изолированном <code>iframe</code>.</p></li><li><p>Есть важные ломающие изменения. Все результаты теперь содержат <code>resultType</code>. <code>Roots</code>, <code>Sampling</code>, <code>Logging</code> и старый <code>HTTP+SSE</code> объявлены устаревшими. Схемы инструментов получили полноценную поддержку <code>JSON Schema 2020-12</code>. Если ты пишешь MCP-клиент или SDK, этот пункт может оказаться важнее <code>MCP Apps</code>.</p></li><li><p>Авторизацию подтянули ближе к реальному OAuth/OIDC. Добавили проверку <code>iss</code>, привязку учётных данных к конкретному issuer и уточнили регистрацию клиентов и работу с refresh-токенами.</p></li></ol><p>В сухом остатке: <code>remote MCP</code> перестал требовать обязательную протокольную сессию и стал гораздо больше похож на нормальный <code>stateless JSON-RPC</code> поверх <code>HTTP</code>. Для продакшена это означает более простое горизонтальное масштабирование, маршрутизацию и кеширование. Остальные изменения полезны, но в основном касаются новых возможностей и миграции клиентов.</p><ul><li><p><a href="https://modelcontextprotocol.io/specification/2026-07-28" rel="noopener noreferrer nofollow">спецификация MCP 2026-07-28</a></p></li><li><p><a href="https://modelcontextprotocol.io/specification/2026-07-28/changelog" rel="noopener noreferrer nofollow">ключевые изменения в деталях </a></p></li></ul><p><a href="https://t.me/data_engi/1186" rel="noopener noreferrer nofollow">tg</a></p> <a href="https://habr.com/ru/posts/1065862/?utm_campaign=1065862&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 03 Aug 2026 05:08:53 GMT</pubDate>
    <dc:creator><![CDATA[dKosarevsky]]></dc:creator>
      
      <category><![CDATA[mcp]]></category><category><![CDATA[agentic ai]]></category><category><![CDATA[llm-агент]]></category><category><![CDATA[mcp-server]]></category><category><![CDATA[mcptools]]></category><category><![CDATA[architecture]]></category><category><![CDATA[protocols]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Сетевое оборудование (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1065490/</guid>
    <link>https://habr.com/ru/posts/1065490/?utm_campaign=1065490&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>«Bad Apple!! Но&nbsp;это&nbsp;же traceroute! В&nbsp;продолжение <a href="https://jssfr.de/2026-07-25-messing-with-traceroute.html" rel="noopener noreferrer nofollow">моего поста</a> о&nbsp;том, как&nbsp;заставить инструменты traceroute отображать произвольное содержимое, и вдохновлённый выходом на&nbsp;днях <a href="https://www.youtube.com/watch?v=zcGdKK_cQbE" rel="noopener noreferrer nofollow">ещё одной кавер‑версии Bad Apple</a>, я просто не&nbsp;мог не&nbsp;сделать это»,&nbsp;— <a href="https://jssfr.de/" rel="noopener noreferrer nofollow">пояснил</a> Йонас Шефер.</p><blockquote><p>Используя функцию numgen из библиотеки nftables, мы можем изменять количество переходов каждый раз при генерации пакета ICMPv6. Функция numgen возвращает либо случайные числа, либо монотонный счетчик. С помощью счётчика мы можем легко настроить каждый переход так, чтобы он возвращал разный IPv6-адрес при генерации ответного пакета.</p><p>Для этого потребовалось ещё две вещи. Во-первых, необходимо отключить ограничение скорости ядра (по умолчанию 1/с) для исходящего трафика ICMPv6 с помощью команды sysctl net.ipv6.icmp.ratelimit=0, иначе всё закончится очень быстро. Вторая проблема заключается в том, что mtr обычно показывает несколько адресов для каждого узла, поскольку это указывает на использование нескольких разных путей для пакета, и это обычно полезная информация. </p><p>После всего этого я использовал ffmpeg для передискретизации видео до 8 кадров в секунду (что соответствует интервалу в 125 мс между кадрами) и экспорта уменьшенных (до 30x11 пикселей) отдельных кадров в файлы PNG. Затем я написал скрипт на Python для чтения файлов изображений и преобразования их в набор правил nftables для генерации соответствующих ответов ICMPv6. В результате получается чуть более мегабайта правил nftables, но это определённо того стоит.</p></blockquote><iframe id="6a6d6a70c563c642bb196388" src="https://embedd.srv.habr.com/iframe/6a6d6a70c563c642bb196388" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1065490/?utm_campaign=1065490&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 01 Aug 2026 03:39:34 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[traceroute]]></category><category><![CDATA[bad apple]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @amaksimovv — Блог компании CodeScoring (+3) — 31.07.2026 08:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/codescoring/posts/1065144/</guid>
    <link>https://habr.com/ru/companies/codescoring/posts/1065144/?utm_campaign=1065144&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>PyPI готовится закреплять префиксы имен пакетов за организациями</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/efe/1b5/d64/efe1b5d647184b3f630f09320718cb8d.jpg" width="780" height="440"></figure><p>29 июня 2026 года был<a href="https://peps.python.org/pep-0752/" rel="noopener noreferrer nofollow"> принят PEP 752</a>. Он описывает механизм, с помощью которого пакетные репозитории смогут закреплять префиксы имен за определенными организациями. Например, новые пакеты с префиксом <code>google-cloud-</code> смогут публиковать только организации, получившие соответствующее право.</p><p>Сейчас пространство имен PyPI остается плоским. Если название свободно, пользователь может зарегистрировать пакет, который выглядит частью известного проекта, например, google-cloud-something, opentelemetry-something или apache-airflow-providers-something. Знакомый префикс повышает доверие к названию, хотя реального отношения к организации у пакета может не быть.</p><p>PEP 752 предлагает закреплять за владельцем <strong>как сам префикс, так и новые названия, которые включают префикс и дефис после него</strong>. Попытка опубликовать такой пакет без разрешения будет завершаться ошибкой. При этом уже существующие проекты можно не блокировать. Репозиторий вправе разрешить их владельцам выпускать новые версии и после появления защищенного префикса.</p><p>Синтаксис имен не изменится, поэтому дорабатывать pip, uv и другие менеджеры пакетов ради обычной установки не потребуется. Вместе с тем в API репозитория появятся сведения о связи проекта с защищенным префиксом. В дальнейшем менеджеры пакетов и прокси смогут учитывать их в собственных политиках.</p><p>Принятый PEP пока описывает стандарт, а не уже работающую функцию PyPI. Правила подачи и рассмотрения заявок вынесены в<a href="https://peps.python.org/pep-0755/" rel="noopener noreferrer nofollow"> PEP 755</a>, который остается черновиком. Срок запуска механизма также<a href="https://discuss.python.org/t/pep-752-implicit-namespaces-for-package-repositories/63192/96" rel="noopener noreferrer nofollow"> пока не объявлен</a>.</p><p>PEP 752 переносит часть проверки на самый ранний этап, когда в репозитории только появляется новое имя. Для семейств пакетов вроде google-cloud-* или apache-airflow-providers-* это позволяет остановить постороннего издателя до того, как правдоподобно названная подделка станет доступна пользователям.</p><p>У такой защиты есть довольно четкие ограничения. Право на префикс подтверждает, что издатель может использовать такое имя в конкретном репозитории, но ничего не говорит о безопасности содержимого. Если учетную запись доверенного издателя скомпрометируют или он сам выпустит вредоносную версию, резервирование не поможет. На другой репозиторий выданное право тоже не распространяется.</p><p>Когда механизм заработает, новые метаданные можно будет использовать не только на страницах PyPI. Менеджеры пакетов и корпоративные прокси смогут пропускать пакеты с защищенным префиксом, только если издатель имеет на него право. Это точечная защита от одного семейства атак на имена; остальные сценарии неймсквоттинга мы разбирали в статье<a href="https://habr.com/ru/companies/codescoring/articles/1011358/" rel="noopener noreferrer nofollow"> «Атаки на цепочку поставки ПО: виды угроз и как с ними бороться»</a>.</p><p>Подписывайтесь на CodeScoring в<a href="https://t.me/codescoring" rel="noopener noreferrer nofollow"> Telegram</a>,<a href="https://vk.com/codescoring" rel="noopener noreferrer nofollow"> VK</a>,<a href="https://www.youtube.com/@codescoring" rel="noopener noreferrer nofollow"> YouTube</a> и<a href="https://max.ru/id7813227385_biz" rel="noopener noreferrer nofollow"> Макс</a>.</p> <a href="https://habr.com/ru/posts/1065144/?utm_campaign=1065144&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 31 Jul 2026 05:43:20 GMT</pubDate>
    <dc:creator><![CDATA[amaksimovv (CodeScoring)]]></dc:creator>
      
      <category><![CDATA[pypi]]></category><category><![CDATA[python]]></category><category><![CDATA[безопасность зависимостей]]></category><category><![CDATA[пакетные репозитории]]></category><category><![CDATA[цепочка поставки ПО]]></category><category><![CDATA[неймсквоттинг]]></category><category><![CDATA[подмена пакетов]]></category><category><![CDATA[пространства имен]]></category><category><![CDATA[open source]]></category><category><![CDATA[PEP 752]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @hauserich — Small Basic (+2) — 29.07.2026 15:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1064492/</guid>
    <link>https://habr.com/ru/posts/1064492/?utm_campaign=1064492&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Сначала хотел написать комментарий <a href="https://habr.com/ru/companies/bothub/articles/1063660/" rel="noopener noreferrer nofollow">к этой статье</a>, но потом подумал, что пост лучше.</p><p>Наверно, просто каждый язык предназначен для решения своего круга задач. Когда-то фортран был языком для вычислений. Паскаль - для обучения. Си - для системных разработок. А вот Бейсик (я про компилируемые варианты) был универсален. :) Оттого, наверно, я его и выбрал в начале 90-х. Хотя с тех пор от него ничего не осталось, даже в плане синтаксиса, не говоря про огромные возможности...</p><p>А вот вопрос: какой язык может быть выбран в качестве "бытового"? Это не шутка. Лично я регулярно сталкиваюсь с необходимостью написать "одноразовую" программу, маленькую и не сложную. Для этого нужен простой язык и легкий транслятор.<br>Раньше я использовал VB3, но он на новых системах не работает. Потом "открыл для себя" SmallBasic и даже написал по нему <a href="https://erichware.com/litvor/uniling.htm" rel="noopener noreferrer nofollow">некое пособие</a>. Язык хороший, реально! Но есть один огромный минус, в силу чего он не годился для искомой роли: не работает с двоичными файлами.<br>Свой собственный язык (<a href="https://erichware.com/inform/ellochka.htm" rel="noopener noreferrer nofollow">"Ellochka"</a>) я так и не удосужился до сих пор перевести под Виндовс (остался интерпретатор для ДОС).<br>Питон, увы, тоже не подходит: язык не очень прост, а главное - среда огромная, с флешки запускать несерьезно (а надо).<br><br>Так вот и вопрос: есть сейчас язык, подходящий для описанной задачи? Простой, легкий (в мегабайтах), без лишних наворотов, но "все что нужно есть"? Может, кто подскажет?</p> <a href="https://habr.com/ru/posts/1064492/?utm_campaign=1064492&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 29 Jul 2026 12:43:43 GMT</pubDate>
    <dc:creator><![CDATA[hauserich]]></dc:creator>
      
      <category><![CDATA[выбор языка]]></category><category><![CDATA[бытовые задачи]]></category><category><![CDATA[программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+1) — 28.07.2026 16:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/1064056/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/1064056/?utm_campaign=1064056&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5fb/eff/5e1/5fbeff5e14281b530e5c9ea6aec7e188.jpg" width="1125" height="720"></figure><p>Ваш проект живёт дольше трёх месяцев? Код начинает сопротивляться изменениям: одна фича тянет правки в пяти файлах, тесты падают без внятного объяснения. Знакомо?</p><p>На бесплатном вебинаре&nbsp;<strong><a href="https://ibs-training.ru/training/seminar/161328/" rel="noopener noreferrer nofollow">«Антипаттерны в Python: как не превратить код в спагетти»</a></strong>&nbsp;разберём, где именно возникают эти точки напряжения, и что с ними делать.</p><p>📆&nbsp;<strong>Когда</strong>: 30 июля, 16:00–17:00 (Мск)</p><p>👨‍🎓&nbsp;<strong>Спикер</strong>: Читалов Дмитрий, специалист в области Python разработки</p><p><strong>В программе</strong>:</p><p>✔️&nbsp;Глобальные переменные</p><p>✔️&nbsp;God Object</p><p>✔️&nbsp;Spaghetti Code</p><p>✔️&nbsp;Наследование ради наследования</p><p>✔️&nbsp;Primitive Obsession</p><p>✔️&nbsp;except: pass</p><p>✔️&nbsp;Копипаста</p><p>✔️&nbsp;Магические числа</p><p>✔️&nbsp;Вложенные циклы O(n²)</p><p>✔️&nbsp;Over-engineering</p><p>По каждому пункту — плохой код, разбор проблемы и готовый рефакторинг.</p><p>✍️&nbsp;<strong><a href="https://ibs-training.ru/training/seminar/161328/" rel="noopener noreferrer nofollow">Регистрация</a></strong></p> <a href="https://habr.com/ru/posts/1064056/?utm_campaign=1064056&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 28 Jul 2026 13:25:50 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[вебинар]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Feizerr — Блог компании Selectel (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1063592/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1063592/?utm_campaign=1063592&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Задача о вирусе и 1 000 серверах</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0ec/591/91e/0ec59191e2e855c1e46889090de7f36f.jpg" width="1560" height="880"></figure><p>Представим, что в вычислительном кластере из 1 000 серверов одна машина заражена неизвестным вирусом. Он не нагружает процессор, не генерирует подозрительный сетевой трафик и не оставляет следов в системных журналах. Только раз в сутки вирус незаметно повреждает один файл резервной копии.</p><p>Для поиска зараженного узла начинающий сисадмин Олег написал анализатор логов. Скрипт проверяет любое количество серверов одновременно, объединяя их журналы в единый пул. Результат проверки может быть только двух видов:</p><ul><li><p>Status: 500 — если среди проверяемых серверов есть зараженный;</p></li><li><p>Status: 200 — если зараженного сервера в группе нет.</p></li></ul><p>При этом анализатор нагружает сеть и системы хранения данных, поэтому его разрешено запускать не более 10 раз в сутки. Все проверки должны быть спланированы заранее и отправлены в расписание на весь день. Изменять состав очередной проверки после получения результатов предыдущей нельзя.</p><p><strong>Задача</strong></p><p>Помогите Олегу определить — предложите решение, которое позволит определить один зараженный сервер из 1 000 возможных за 10 запусков анализатора. Напишите код на Python, который по результатам проверок сможет определить номер зараженного узла.</p><p><strong><a href="https://selectel.ru/blog/virus-and-1000servers/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_1000servers_270726_content" rel="noopener noreferrer nofollow">Посмотреть решение</a></strong></p> <a href="https://habr.com/ru/posts/1063592/?utm_campaign=1063592&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 27 Jul 2026 14:10:23 GMT</pubDate>
    <dc:creator><![CDATA[Feizerr (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[задачи]]></category><category><![CDATA[разработка]]></category><category><![CDATA[python]]></category><category><![CDATA[код]]></category><category><![CDATA[it-компании]]></category><category><![CDATA[задачи для программистов]]></category><category><![CDATA[системное администрирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Dozorova_Alyona — .NET (+4) — 25.07.2026 20:28]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062982/</guid>
    <link>https://habr.com/ru/posts/1062982/?utm_campaign=1062982&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет!</p><p>Появилась идея: локальная база знаний, строящаяся по коду проекта на вашем компе и способная человеческим языком отвечать на вопросы по проекту, помогающая джунам быстро вкатиться в суть, а синьорам бегло проверить что они сломают очередным обновлением. Интересно ли было вам таким пользоваться? Помогло ли бы оно?</p><p>Поделитесь в комментариях)</p><p>Upd. Спасибо за комментарий, важная оговорка: проект работает локально на вашем компе, без утечек в инет)</p> <a href="https://habr.com/ru/posts/1062982/?utm_campaign=1062982&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Jul 2026 17:28:56 GMT</pubDate>
    <dc:creator><![CDATA[Dozorova_Alyona]]></dc:creator>
      
      <category><![CDATA[Опрос]]></category><category><![CDATA[идея проекта]]></category><category><![CDATA[мнение народа]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Python (+4) — 25.07.2026 19:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062978/</guid>
    <link>https://habr.com/ru/posts/1062978/?utm_campaign=1062978&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/Osmantic/ODS" rel="noopener noreferrer nofollow">ODS (Osmantic Deployment System)</a>. Это проект, который превращает ПК в&nbsp;приватный ИИ‑сервер. Решение само определяет характеристики ПК, подберёт под&nbsp;них подходящую модель, скачает её и запустит локальный инференс:</p><ul><li><p>все локально и приватно: можно работать с&nbsp;документами, кодом и другими важными данными;</p></li><li><p>через одну панель можно подключить голосовых помощников, агентов вроде Hermes, RAG, поиск, генерацию изображений и десятки других инструментов;</p></li><li><p>без&nbsp;облачного сервиса. Без&nbsp;подписки.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/002/690/764/00269076453fe7e8990ffcc6e4e9b016.jpg" width="1280" height="1113"></figure> <a href="https://habr.com/ru/posts/1062978/?utm_campaign=1062978&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Jul 2026 16:43:36 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[ODS]]></category><category><![CDATA[Osmantic Deployment System]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @it_police — Python — 25.07.2026 12:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062904/</guid>
    <link>https://habr.com/ru/posts/1062904/?utm_campaign=1062904&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Агент Ануфрий получил красивый вывод в терминал (отключаемый через конфиг). </p><p>Как всегда, ничего сложного, используются две библиотечки Rich + Prompt Toolkit. Вся эта красота хранится в отдельном модуле <code>console</code>, легко сможете разобраться, переделать, или подчерпнуть что-то для своих проектов. Кода там совсем немного. </p><p>Репозиторий: <a href="https://github.com/Bednyakov/AgentAnufry" rel="noopener noreferrer nofollow">AgentAnufry</a></p><p>Есть идея в отдельной ветке Ануфрия запилить “кибербезопасника”, вырезав все лишнее и напихав скилов под инструменты Kali Linux. Мне кажется, тут LLM может проявить себя с хорошей стороны, если грамотно предоставить инструментарий. </p><p>Возможно что-то похожее уже кто-то реализовывал? Если да, поделитесь информацией об успехах.</p><p>P.S.: Ануфрий - это мой проект простого конструктора для создания собственных ассистентов на Python.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/fcf/ff7/1a6/fcfff71a644162703f781de3f8ee01e1.png" width="1910" height="458"></figure> <a href="https://habr.com/ru/posts/1062904/?utm_campaign=1062904&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Jul 2026 09:37:43 GMT</pubDate>
    <dc:creator><![CDATA[it_police]]></dc:creator>
      
      <category><![CDATA[AI]]></category><category><![CDATA[AI agent]]></category><category><![CDATA[LLM]]></category><category><![CDATA[Python]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @akdengi — Управление продажами (+2) — 24.07.2026 20:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062810/</guid>
    <link>https://habr.com/ru/posts/1062810/?utm_campaign=1062810&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Выкатил релиз 1.3.1 моей простой товароучетной системы с поддержкой Честного Знака:</p><p><a href="https://github.com/akdengi/sklad-cz" rel="noopener noreferrer nofollow">https://github.com/akdengi/sklad-cz</a></p><p>Что нового:</p><ul><li><p>Выбор товарной группы для работы в настройках (одиночный выбор из справочника). Реализованы 22 доступные группы (исключены алкоголь, табак, мех, ветпрепараты и др.)</p></li><li><p>Запрос и отображение баланса денежных средств в ЧЗ на дашборде. Кнопка «Обновить баланс» для ручного обновления.</p></li><li><p>Загрузка данных МОД из API Честный Знак по кнопке.  Автоматическое заполнение адреса и FIAS ID. Предупреждение при отсутствии МОД со ссылкой на ЛК ЧЗ.</p></li><li><p>Сканирование: проверка GTIN КМ для SKU, авто-определение правильного SKU, онлайн-проверка статуса ЧЗ сразу после добавления</p></li><li><p>При импорте теперь выдает детальный отчёт об ошибках с модальным окном и экспортом в CSV (дубликаты, структура, GTIN, статус ЧЗ).</p></li><li><p>Продажа: блокировка поиска по GTIN/Артикулу/EAN для товаров с маркировкой (только поиск по КМ).</p></li><li><p>Склады: улучшенное отображение — таблица SKU с колонками Остаток/Продано.</p></li></ul><p>Далее планирую заняться работой с отчетами: вывод из оборота, аннулирование отчета о выводе и ввод назад в оборот</p><p>А там глядишь и до заказа КМ доберусь и вводе в оборот :)</p> <a href="https://habr.com/ru/posts/1062810/?utm_campaign=1062810&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Jul 2026 17:16:39 GMT</pubDate>
    <dc:creator><![CDATA[akdengi]]></dc:creator>
      
      <category><![CDATA[честный знак]]></category><category><![CDATA[github]]></category><category><![CDATA[python]]></category><category><![CDATA[flask]]></category><category><![CDATA[учет товаров]]></category><category><![CDATA[склад]]></category><category><![CDATA[отчетность]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nightweb — Веб-разработка (+1) — 24.07.2026 05:44]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062516/</guid>
    <link>https://habr.com/ru/posts/1062516/?utm_campaign=1062516&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Начал писать тесты для бота. Оказалось не так страшно как думал</p><p>Долго откладывал тесты для своих ботов. Казалось что это боль: нужно мокать API, имитировать апдейты, непонятно с чего начать.</p><p>Начал с малого. Вынес всю бизнес-логику в отдельные функции которые не знают ничего про Telegram. Просто принимают данные, возвращают результат.</p><p>python</p><pre><code># Не так
async def handle_payment(message: types.Message):
    amount = int(message.text)
    if amount &gt; 10000:
        await message.answer("Сумма слишком большая")

# А так
def validate_amount(amount: int) -&gt; tuple[bool, str]:
    if amount &gt; 10000:
        return False, "Сумма слишком большая"
    return True, ""

async def handle_payment(message: types.Message):
    is_valid, error = validate_amount(int(message.text))
    if not is_valid:
        await message.answer(error)</code></pre><p>Теперь validate_amount тестируется обычным pytest без всяких моков. Вызываешь функцию, проверяешь результат.</p><p>Звучит очевидно. Но я долго писал всю логику прямо в хендлерах и потом удивлялся почему тестировать неудобно. Оказывается проблема была не в тестах, а в архитектуре.</p><p>Покрытие пока небольшое, но уже несколько раз тесты поймали регрессию которую я бы заметил только в продакшене.</p><p>Кто тестирует ботов, как организуете?</p> <a href="https://habr.com/ru/posts/1062516/?utm_campaign=1062516&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Jul 2026 02:44:29 GMT</pubDate>
    <dc:creator><![CDATA[nightweb]]></dc:creator>
      
      <category><![CDATA[Python]]></category><category><![CDATA[pytest]]></category><category><![CDATA[тесты]]></category><category><![CDATA[Telegram]]></category><category><![CDATA[бот]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[aiogram]]></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[Пост @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[Пост @tooshcan4ik — Python — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1061302/</guid>
    <link>https://habr.com/ru/posts/1061302/?utm_campaign=1061302&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Сегодня произошла интересная штука: я встретил вживую новый вид сотрудника - "Оператор ЛЛМ", это как "Оператор ЭВМ", он "жмакает" кнопки, но не понимает зачем.</p><p>Суть: собесил сегодня чувака на инженерную позицию. Туда-сюда, вроде все складно, тимлиду вроде нравится. Потом дали мне слово, как софтверному инженеру, и я задал ровно два вопроса, после которых все стало понятно.</p><p>1 - чувак говорил, что у него есть хоум лаба, но не смог рассказать из чего она состоит (контейнеры/виртуалки/гипервизор).</p><p>2 - чувак показал свой пет-проект, но не смог рассказать как он работает под капотом.</p><p>Почему? - потому что он "кнопкодав", "оператор ЛЛМ" - называйте как хотите.</p><p>Это очень опасная тенденция, все больше людей называют себя "архитекторами" приложений, не понимая основ технологий которые их ЛЛМ пытается применять.</p> <a href="https://habr.com/ru/posts/1061302/?utm_campaign=1061302&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 22 Jul 2026 04:24:46 GMT</pubDate>
    <dc:creator><![CDATA[tooshcan4ik]]></dc:creator>
      
      <category><![CDATA[холивар]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Deal-overcomer — JavaScript (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1061582/</guid>
    <link>https://habr.com/ru/posts/1061582/?utm_campaign=1061582&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/ec0/9f5/f1c/ec09f5f1ce4d56bf10d420fbd4df1e37.JPG" alt="Мастер по разводу холивар" title="Мастер по разводу холивар" width="7168" height="5376"><div><figcaption>Мастер по разводу холивар</figcaption></div></figure><p>Были приняты меры погрузиться под воду дабы показать серьезность моих намерений в данной щепетильной теме.</p><p>Фронтенд весь такой разносторонний, креативный, местами легкий, местами настолько сложный что ломаешь голову. Напрашивается клеймо "для любителей".</p><p>Бэкенд наоборот поддерживает порядок и структурность. Меньше экспериментов и больше проверенных решений, самое то для "сделал работу - пошел спокойно домой".</p> <a href="https://habr.com/ru/posts/1061582/?utm_campaign=1061582&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 21 Jul 2026 17:56:02 GMT</pubDate>
    <dc:creator><![CDATA[Deal-overcomer]]></dc:creator>
      
      <category><![CDATA[холивар]]></category><category><![CDATA[холивары]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[бэкенд]]></category><category><![CDATA[фуллстек]]></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[Пост @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[Пост @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[Пост @nightweb — Веб-разработка (+1) — 17.07.2026 09:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1060062/</guid>
    <link>https://habr.com/ru/posts/1060062/?utm_campaign=1060062&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Понял asyncio только когда бот начал зависать под нагрузкой</p><p>Писал на Python и честно говоря asyncio воспринимал как магию. Работает и ладно.</p><p>Пока однажды бот не завис.</p><p>Пользователей было немного, штук двадцать одновременно, но один запустил команду которая делала тяжёлый запрос к внешнему API. Пока запрос выполнялся, бот молчал. Остальные подвисли в ожидании.</p><p>Начал разбираться. Оказалось я вызывал синхронную функцию прямо внутри async хендлера. requests.get внутри async def. Это блокирует весь event loop. Все корутины ждут пока эта одна функция не завершится.</p><p>Решение простое: либо заменить requests на aiohttp, либо обернуть синхронный вызов через <a href="http://asyncio.to" rel="noopener noreferrer nofollow">asyncio.to</a>_thread. Второй вариант проще когда менять библиотеку лень:</p><p>python</p><pre><code>result = await asyncio.to_thread(requests.get, url)</code></pre><p>После замены бот перестал зависать. Все одновременные запросы к внешнему API обрабатываются параллельно без проблем, но теперь когда вижу синхронный вызов внутри async функции ощущение что что-то не так.</p><p>Кто сталкивался с похожим, как отлаживали?</p> <a href="https://habr.com/ru/posts/1060062/?utm_campaign=1060062&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 17 Jul 2026 06:54:37 GMT</pubDate>
    <dc:creator><![CDATA[nightweb]]></dc:creator>
      
      <category><![CDATA[Python]]></category><category><![CDATA[asyncio]]></category><category><![CDATA[Telegram]]></category><category><![CDATA[бот]]></category><category><![CDATA[асинхронность]]></category><category><![CDATA[aiogram]]></category><category><![CDATA[опыт]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @TrexSelectel — Блог компании Selectel (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1058446/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1058446/?utm_campaign=1058446&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что делать, если Python-сервер падает из-за утечки памяти?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/73d/602/b0b/73d602b0be753ad1908bc01c0d0dbb95.jpg" width="1175" height="661"></figure><blockquote><p>Привет, Хабр! Это наша экспериментальная рубрика, в которой мы даем новичкам быстрые ответы на четкие вопросы. Писать статью будет излишним, а некоторую пользу до аудитории донести, возможно, получится.</p></blockquote><p>Итак, допустим, агент спустя время начинает расти по памяти и в итоге все падает. Где копать и как временно ограничить ущерб, пока ищете утечку?</p><p>Первое, что нужно сделать — измерить и локализовать.&nbsp;<code>tracemalloc</code>&nbsp;показывает, какие строки выделяют больше всего памяти, <code>gc</code> — количество объектов.&nbsp;</p><p>Часто проблема в неограниченных кэшах, списках или в C-расширениях. Сначала стоит включить&nbsp;<code>tracemalloc</code>, дать процессу поработать и снять снапшот:</p><pre><code class="python">import tracemalloc
tracemalloc.start()
# после нагрузки
snapshot = tracemalloc.take_snapshot()
top = snapshot.statistics('lineno')[:10]
for stat in top:
    print(stat)</code></pre><p>Параллельно делайте&nbsp;<code>gc.collect()</code>&nbsp;и логируйте число объектов&nbsp;<code>len(gc.get_objects())</code>, чтобы увидеть рост. На время расследования применяйте эксплуатационные меры: для WSGI-сервисов используйте Gunicorn с&nbsp;<code>--max-requests</code>&nbsp;и&nbsp;<code>--max-requests-jitter</code>, чтобы процессы периодически перезапускались и не накапливали мусор. А в контейнерах ставьте cgroup-пределы (<code>--memory</code>) и настраивайте restart-политику, чтобы платформа автоматически перезапускала упавшие поды.</p><p>Пример запуска Gunicorn:</p><pre><code class="bash">gunicorn myapp:app --workers 4 --max-requests 1000 --max-requests-jitter 50</code></pre><p>Если утечка в C-расширении или сторонней библиотеке, то временно автоматический перезапуск и мониторинг позволяют сохранить сервис работоспособным, пока вы находите корень проблемы и исправляете код.</p><blockquote><p>Если хотите освоить инструменты Python, то в Академии Selectel у нас есть отдельная <a href="https://selectel.ru/blog/courses/course-python/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_pythonserver_130726_content" rel="noopener noreferrer nofollow">подборка статей</a>. Там мы рассказываем, как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга.</p></blockquote> <a href="https://habr.com/ru/posts/1058446/?utm_campaign=1058446&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 13 Jul 2026 09:30:55 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[Пост @denis-19 — Python (+4) — 10.07.2026 14:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1057900/</guid>
    <link>https://habr.com/ru/posts/1057900/?utm_campaign=1057900&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Разработчик Тарун Гупта представил открытый проект <a href="https://github.com/tarunlnmiit/autopilot-jobhunt" rel="noopener noreferrer nofollow">autopilot-jobhunt</a>. Это&nbsp;— ИИ-инструмент, который автоматически ищет вакансии в&nbsp;интернете, сравнивает их&nbsp;с&nbsp;профилем пользователя и&nbsp;присылает наиболее подходящие варианты в&nbsp;Telegram.</p><p>Перед запуском пользователь указывает желаемые должности, требования к&nbsp;работе и&nbsp;условия, которые считает неприемлемыми. После этого система сканирует сайты компаний и&nbsp;площадки с&nbsp;вакансиями, оценивает каждое объявление по&nbsp;степени соответствия резюме и&nbsp;формирует рейтинг.</p><p>По&nbsp;запросу ИИ-инструмент может адаптировать резюме под конкретную вакансию и&nbsp;подготовить сопроводительное письмо. При этом решение не&nbsp;отправляет отклик автоматически: пользователь должен самостоятельно проверить документы и&nbsp;решить, подавать&nbsp;ли заявку.</p><p>Сервис задуман как бесплатный. Для поиска вакансий он&nbsp;использует веб-агента TinyFish, а&nbsp;для анализа&nbsp;— бесплатные модели через OpenRouter. По&nbsp;умолчанию система переключается между Llama, Nvidia Nemotron, Google Gemma 4 и&nbsp;Alibaba Qwen3, если у&nbsp;одной из&nbsp;моделей заканчивается лимит. Вместо OpenRouter можно подключить Claude Code и&nbsp;API Anthropic, но&nbsp;в&nbsp;этом случае понадобится подходящая подписка или оплаченные токены.</p><p>Разработчик отдельно описал меры защиты данных. Файл с&nbsp;настройками и&nbsp;ссылкой на&nbsp;локальное резюме исключён из&nbsp;Git, поэтому его нельзя случайно опубликовать вместе с&nbsp;кодом проекта. Однако содержимое резюме все равно передаётся моделям, подключённым через OpenRouter. Тем, кто не&nbsp;хочет отправлять данные через этот сервис, автор предлагает использовать Claude Code.</p><p>По&nbsp;умолчанию autopilot‑jobhuntt настроен на&nbsp;поиск вакансий для&nbsp;разработчиков, но&nbsp;список профессий, компаний и&nbsp;требований можно изменить&nbsp;— нужно отредактировать файл конфигурации проекта.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/93c/8a0/746/93c8a07466fd8cd6a5edf258c20d2f06.png" width="708" height="801"></figure> <a href="https://habr.com/ru/posts/1057900/?utm_campaign=1057900&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 10 Jul 2026 11:48:31 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[autopilot-jobhunt]]></category><category><![CDATA[ии]]></category><category><![CDATA[поиск работы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nightweb — Веб-разработка (+1) — 03.07.2026 10:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1055108/</guid>
    <link>https://habr.com/ru/posts/1055108/?utm_campaign=1055108&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p> <strong>Два часа потерял из-за того, что не написал один хендлер</strong></p><p>Делал платежи в Telegram-боте. Нативные, через sendInvoice и ЮKassa.</p><p>Всё настроил: токен от BotFather получил, инвойс отправляется, кнопка оплаты появляется. Пользователь нажимает - и платёж падает с ошибкой. Молча. Без подробностей.</p><pre><code>Payment failed</code></pre><p>И всё. Telegram не говорит что именно не так.</p><p>Полез гуглить. Первая мысль - provider_token неверный. Проверил три раза, скопировал заново. Нет, токен правильный.</p><p>Потом решил что проблема в суммах - они передаются в копейках, не в рублях. 500 рублей = 50000. Перепроверил, у меня было правильно.</p><p>Потом подумал на webhook - может HTTPS не настроен как надо. Потратил минут сорок на проверку сертификата, перенастройку ngrok. Всё работает, но платежи всё равно падают.</p><p>Уже хотел идти спать, случайно наткнулся на строчку в документации:</p><blockquote><p>Your bot must reply to this query in 10 seconds</p></blockquote><p>Это про pre_checkout_query. Когда пользователь нажимает «Оплатить» - Telegram сначала отправляет боту запрос на подтверждение. Бот должен ответить в течение 10 секунд. Если не ответил - платёж автоматически отклоняется.</p><p>У меня хендлера для этого не было вообще. Бот просто молчал.</p><p>Добавил три строки:</p><p>python</p><pre><code>@dp.pre_checkout_query()
async def pre_checkout(query: types.PreCheckoutQuery):
    await query.answer(ok=True)</code></pre><p>Платёж прошёл с первого раза.</p><p>Два часа отладки из-за трёх строк кода которые я не написал.</p><p>Если кто-то тоже делает платежи в Telegram-боте и получает молчаливый отказ - проверьте pre_checkout_query первым делом, до всего остального.</p> <a href="https://habr.com/ru/posts/1055108/?utm_campaign=1055108&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 03 Jul 2026 07:06:04 GMT</pubDate>
    <dc:creator><![CDATA[nightweb]]></dc:creator>
      
      <category><![CDATA[telegram]]></category><category><![CDATA[telegram bot]]></category><category><![CDATA[python]]></category><category><![CDATA[платежи]]></category><category><![CDATA[pre_checkout_query]]></category><category><![CDATA[aiogram]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dKosarevsky — Python (+2) — 02.07.2026 15:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1054882/</guid>
    <link>https://habr.com/ru/posts/1054882/?utm_campaign=1054882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>В дополнение к <a href="https://habr.com/ru/posts/1051172/" rel="noopener noreferrer nofollow">посту</a> по albu-mcp</p><p>В доке Albumentations появился отдельный раздел про мой AlbumentationsX MCP - <a href="https://albumentations.ai/docs/integrations/mcp/" rel="noopener noreferrer nofollow">https://albumentations.ai/docs/integrations/mcp/</a></p><p>Теперь есть официальный integration guide, где показано, как ты можешь подключить MCP-сервер к AI-assistant’у и использовать его для нормального HITL workflow вокруг CV-аугментаций: подобрать pipeline, провалидировать его, отрендерить локальные previews, сравнить baseline и candidate, дать feedback вроде too_noisy:high и экспортировать финальный pipeline.</p><p>Приятно видеть, что проект стал частью экосистемной документации Albumentations. 🙂</p><p>AlbumentationsX MCP это конечно же не замена Python API, а assistant-facing review layer для тех случаев, когда ты хочешь быстрее и безопаснее работать с augmentation pipelines.</p> <a href="https://habr.com/ru/posts/1054882/?utm_campaign=1054882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Jul 2026 12:10:27 GMT</pubDate>
    <dc:creator><![CDATA[dKosarevsky]]></dc:creator>
      
      <category><![CDATA[mcp]]></category><category><![CDATA[mcp-server]]></category><category><![CDATA[albumentations]]></category><category><![CDATA[augmentation]]></category><category><![CDATA[agents]]></category><category><![CDATA[ai]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[deeplearning]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Python (+4) — 02.07.2026 13:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1054824/</guid>
    <link>https://habr.com/ru/posts/1054824/?utm_campaign=1054824&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/iamnetuseragent/ghostprovider" rel="noopener noreferrer nofollow">Ghostprovider</a>&nbsp;— терминальный инструмент для&nbsp;быстрого запуска GitHub‑проектов у&nbsp;себя на localhost.</p><p>Принцип работы проекта: предоставляется ссылка на&nbsp;репозиторий, а&nbsp;инструмент сам анализирует проект: ищет Dockerfile, docker‑compose, package.json, requirements.txt, Go/Rust/Python/Node‑признаки, определяет тип приложения и пытается развернуть его в&nbsp;Docker. После запуска показывает локальный URL, контейнеры, логи и дает управлять сервисами прямо из&nbsp;TUI: старт, стоп, рестарт, удаление. По&nbsp;сути это автоматизированная оболочка над git clone, docker build, docker run и docker compose up, только с&nbsp;автоанализом проекта и удобным интерфейсом в&nbsp;терминале.</p><p>Важно: инструмент реально запускает код из&nbsp;чужих репозиториев, поэтому случайные проекты лучше гонять в&nbsp;VM/песочнице и внимательно смотреть Dockerfile/docker‑compose перед запуском. Сам Ghostprovider выглядит прозрачным, но&nbsp;риск всегда в&nbsp;том, что&nbsp;именно вы через него запускаете.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/b2d/ab0/d21/b2dab0d21f704ff180b754162f90cb04.png" width="704" height="802"></figure> <a href="https://habr.com/ru/posts/1054824/?utm_campaign=1054824&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Jul 2026 10:58:48 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Ghostprovider]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Careviolan — Git (+2) — 29.06.2026 19:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1053572/</guid>
    <link>https://habr.com/ru/posts/1053572/?utm_campaign=1053572&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как я перестал бояться опенсорсить свои поделки</p><p>для тех, кто пишет код в VS Code, не помнит наизусть флаги <code>git filter-repo</code> и считает, что IDE — нормально. Если ты из лагеря «настоящие программисты сидят в vim и пишут всё в Makefile» — просто пролистай<br><br><code>git-private2public</code> как .gitignore, но чтобы сделать зеркало приватного репо одной git push. </p><p><strong>Что это</strong></p><p>CLI-тулза. Держит два репо в синхроне: приватный (ваш рабочий бардак) и публичный (чистая версия). При пуше автоматически вычищает секреты и обновляет публичный mirror.</p><p>Конфиг — папка <code>.gitpublic/</code>, как <code>.gitignore</code>. По одной маске на строку, без YAML.</p><pre><code>.gitpublic/
  config      — source / target / push
  ignore      — что НЕ публиковать
  replace     — что заменить (==&gt; без кавычек)
  scan        — что не должно попасть, иначе падаем
  allow       — но конкретно эти можно пропускать в пуш,  
</code></pre><p>Файла нет → настройки нет. Просто.</p><p>Автопуш через git hook</p><pre><code>pip install git-private2public
cd ~/my-private-repo
git-private2public init
</code></pre><p><code>init</code> создаёт пять пустых файлов с закомментированными примерами. Дальше правите то, что нужно:</p><p><strong>Easy</strong> — только <code>ignore</code>:</p><pre><code>.env
secrets/
*.key
credentials.json
</code></pre><p><strong>Medium</strong> — добавляете <code>replace</code>:</p><pre><code>10.0.0.5          ==&gt; 203.0.113.5
real-token-here   ==&gt; ***
</code></pre><p><strong>Hard</strong> — добавляете <code>scan</code> (защита от факапов):</p><pre><code># scan
regex:github_pat_[A-Za-z0-9_]{30,}
regex:192\.168\.
</code></pre><p>Если в коде найдётся паттерн из <code>scan</code> — <code>publish</code> падает, ничего не пушится.</p><pre><code>git-private2public scan      # dry-run
git-private2public publish   # реальный пуш
</code></pre><p><strong>Автопуш через git hook</strong></p><p>Это та фича, ради которой я и начал. Никакого CI, никаких GitHub Actions.</p><pre><code>git-private2public hook enable
</code></pre><p>Ставит pre-push хук. Теперь обычный <code>git push</code> — отправляет в приватный репо <strong>и</strong> автоматически чистит-пушит в публичный mirror.</p><pre><code>git-private2public hook status    # проверить
git-private2public hook disable   # выключить
</code></pre><p>Работает офлайн, на любом хостинге.</p><p><strong>Почему не <code>git filter-repo</code> или BFG</strong></p><p>Я ими пользовался. Они мощнее, но мне нужны были четыре вещи в одной тулзе:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/cfc/ed6/7d7/cfced67d7d7b7d28c264a9cbd6e022f9.png" width="1172" height="470"></figure><p>Не нашёл — написал.</p><p><strong>Установка (ещё раз, коротко)</strong></p><pre><code>pip install git-private2public</code></pre><p>Если pip не вариант — single-file: скачал <a href="https://github.com/megamen32/git-private2public/raw/refs/heads/main/git_private2public.py" rel="noopener noreferrer nofollow"><code>git_private2public.py</code></a>, <code>chmod +x</code>, готово (нужны <code>git-filter-repo</code> и <code>pyyaml</code>).</p><p><strong>Ссылки</strong></p><ul><li><p>Репо: <a href="https://github.com/megamen32/git-private2public" rel="noopener noreferrer nofollow">https://github.com/megamen32/git-private2public</a></p></li><li><p>MIT, форкайте, шлите PR</p></li><li><p>README на русском: <a href="https://github.com/megamen32/git-private2public/blob/main/README.ru.md" rel="noopener noreferrer nofollow"><code>README.ru.md</code></a></p></li></ul><p><strong>TL;DR</strong></p><p><code>pip install git-private2public</code> → <code>init</code> → редактируешь <code>.gitpublic/ignore</code> → <code>publish</code>. Если хочешь автопуш — <code>hook enable</code>.git push.  Всё.</p> <a href="https://habr.com/ru/posts/1053572/?utm_campaign=1053572&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Jun 2026 16:48:43 GMT</pubDate>
    <dc:creator><![CDATA[Careviolan]]></dc:creator>
      
      <category><![CDATA[git]]></category><category><![CDATA[publishing]]></category><category><![CDATA[secrets]]></category><category><![CDATA[redacting]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 28.06.2026 12:56]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1052868/</guid>
    <link>https://habr.com/ru/posts/1052868/?utm_campaign=1052868&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый сервис Aliens Eye, который ищет всевозможную информацию в&nbsp;соцсетях, на&nbsp;сайтах и других ресурсах, предоставляя полный отчёт:</p><ul><li><p>840&nbsp;различных  OSINT-инструментов для&nbsp;анализа сайтов, соцсетей, других ресурсов, хостингов, доменов и даже физических устройства;</p></li><li><p>все сервисы работают по&nbsp;одному клику. При&nbsp;этом интерфейс интуитивно понятен;</p></li><li><p>отчёты предоставляет в&nbsp;JSON, CSV, HTML и Markdown форматах;</p></li><li><p>без&nbsp;ограничений, без&nbsp;дополнительных установок.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/430/e44/088/430e440881ae02531a6949d8f7c3c7bb.png" width="706" height="711"></figure> <a href="https://habr.com/ru/posts/1052868/?utm_campaign=1052868&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 28 Jun 2026 09:56:47 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Aliens Eye]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Работа с видео (+4) — 27.06.2026 10:15]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1052582/</guid>
    <link>https://habr.com/ru/posts/1052582/?utm_campaign=1052582&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект ИИ‑студии для&nbsp;видеомонтажа <a href="https://github.com/calesthio/OpenMontage" rel="noopener noreferrer nofollow">OpenMontage</a>&nbsp;— комбайн из&nbsp;ИИ‑агентов для&nbsp;полноценного выпуска видеороликов. Проект помогает превратить доступ к  Claude Code, Cursor, Copilot, Windsurf или Codex в&nbsp;киностудию:</p><ul><li><p>агенты берут на&nbsp;себя всё&nbsp;— от&nbsp;исследований и сценария до&nbsp;генерации видео, монтажа и озвучивания;</p></li><li><p>12&nbsp;пайплайнов под&nbsp;любой тип контента&nbsp;— трейлеры, анимации, реклама, туториалы и так далее;</p></li><li><p>500 скиллов&nbsp;— генерация видео, аудио, музыки и картинок;</p></li><li><p>умеет работает с&nbsp;лучшими генераторами&nbsp;— Kling, Runway, FLUX, ElevenLabs и Suno.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c48/75a/423/c4875a4236647935858c483b0b92b7da.png" width="703" height="648"></figure> <a href="https://habr.com/ru/posts/1052582/?utm_campaign=1052582&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 27 Jun 2026 07:15:25 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[OpenMontage]]></category><category><![CDATA[claude code]]></category><category><![CDATA[Cursor]]></category><category><![CDATA[codex]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Анализ и проектирование систем (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1049888/</guid>
    <link>https://habr.com/ru/posts/1049888/?utm_campaign=1049888&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>5 граблей, на которых умирают торговые боты</strong></p><p>Большинство торговых ботов умирают не потому, что стратегия оказалась неверной. Они умирают потому, что бэктест втихую прочитал завтрашнюю свечу. Потому что процесс упал посреди исполнения ордера и открыл позицию дважды. Потому что биржа отвергла ордер, а бот продолжил торговать призрак.</p><p>Стратегия - никогда не была сложной частью. Сложной частью была <strong>инфраструктура</strong>.</p><blockquote><p><u>«Это работало в бэктесте» ничего не значит, если в live крутится другой код</u></p></blockquote><p>Стандартный путь продакшенизации стратегии - это её <strong>переписывание</strong>: исследовательский ноутбук превращается во вторую, собранную руками боевую систему со своей логикой ордеров, своими багами, своим расхождением. Теперь у вас две стратегии, которые <em>выглядят</em> одинаково, а ведут себя по-разному ровно тогда, когда это важнее всего. Например, на момент бектеста все свечи уже закрыты, а в live текущая свеча всегда в статусе pending и её параметры меняются</p><blockquote><p><u>Ошибка, которая открывает позицию дважды</u></p></blockquote><p>Бот, обновляющий позицию в момент, когда процесс умирает - OOM, деплой, скачок питания, просыпается с испорченным состоянием: наполовину открытая позиция, неправильный cost basis, выход, который так и не зарегистрировался. Восстановление руками - это место, где утекают деньги.</p><blockquote><p><u>Ордер, который биржа молча отвергла</u></p></blockquote><p>Тихий убийца live-торговли: биржа отвергает, отваливается по таймауту или наливает частично - и внутреннее состояние вашего бота больше не совпадает с реальностью. Фикс из учебника - рукописный <code>try/catch</code> с откатом вокруг каждого ордера - это ровно тот код, который ломается на том краевом случае, который вы не предусмотрели.</p><blockquote><p><u>Десять стратегий, один счёт, экспозиция 100%</u></p></blockquote><p>Проверки риска по каждой стратегии в отдельности упускают очевидную портфельную истину: десять стратегий, каждая «рискует 10%», - это один счёт, рискующий всем. Открыть сразу 10 позиций не хватит капитала</p><blockquote><p><u>Получение внешних данных через Crontab</u></p></blockquote><p>Cron с парсингом внешних данных работает в другом процессе по системным часам - бесполезно в бэктесте, который проигрывает месяц за секунды. Так же как неполные свечи в live, на момент backtest база данных содержит больше записей, так как момент в прошлом уже завершен</p> <a href="https://habr.com/ru/posts/1049888/?utm_campaign=1049888&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 25 Jun 2026 11:13:33 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[typescript]]></category><category><![CDATA[javascript]]></category><category><![CDATA[python]]></category><category><![CDATA[исскуственный интеллект]]></category><category><![CDATA[машинное+обучение]]></category><category><![CDATA[алгоритмическая торговля]]></category><category><![CDATA[трейдинг]]></category><category><![CDATA[tradingview]]></category><category><![CDATA[pinescript]]></category><category><![CDATA[datascience]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dKosarevsky — Big Data (+3) — 23.06.2026 22:26]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1051172/</guid>
    <link>https://habr.com/ru/posts/1051172/?utm_campaign=1051172&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я сделал AlbumentationsX MCP — MCP-сервер для работы с аугментациями в computer vision.</p><p>Идея простая: когда ты собираешь augmentation pipeline, не хочется бесконечно вручную перебирать transforms, гадать с параметрами и проверять глазами десятки вариантов. Хотелось, чтобы MCP-host мог помочь: найти подходящие transforms, собрать консервативный baseline, провалидировать pipeline, отрендерить локальные previews, сравнить результаты, собрать feedback вроде too_noisy:high и экспортировать принятый вариант.</p><p>Проект работает поверх AlbumentationsX и не пытается делать магию вместо тебя. Он помогает быстрее пройти цикл: recommend → validate → preview → compare → adjust → export.</p><p>Особенно полезно, если ты делаешь classification, detection, segmentation, OCR или просто хочешь быстрее проверять качество аугментаций на локальных примерах.</p><p>Запуск:</p><pre><code class="bash">uvx --from albumentationsx-mcp albumentationsx-mcp
</code></pre><p>Репозиторий: <a href="https://github.com/dKosarevsky/albu-mcp" rel="noopener noreferrer nofollow">albu-mcp</a></p> <a href="https://habr.com/ru/posts/1051172/?utm_campaign=1051172&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Jun 2026 19:26:53 GMT</pubDate>
    <dc:creator><![CDATA[dKosarevsky]]></dc:creator>
      
      <category><![CDATA[mcp]]></category><category><![CDATA[mcp-server]]></category><category><![CDATA[albumentations]]></category><category><![CDATA[augmentation]]></category><category><![CDATA[agents]]></category><category><![CDATA[ai]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tripolskypetr — Python (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1049882/</guid>
    <link>https://habr.com/ru/posts/1049882/?utm_campaign=1049882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Чеклист перед запуском торгового бота  </strong></p><blockquote><p>Заперли физика, химика и экономиста,на необитаемом острове с банкой консервов. &nbsp;Физик предлагает разбить её камнем, химик — нагреть на костре. Экономист говорит: «Предположим, у нас есть открывашка».  </p></blockquote><ul><li><p><strong>Path-aware exits</strong><br><br><u>Плохо:</u> PnL считается по&nbsp;<code>close</code>, ни одна сделка не закрыта по SL<br><u>Хорошо:</u> OHLC-реплей внутри свечи, intra-candle SL/TP  <br></p></li><li><p><strong>Look-ahead bias</strong>  <br><br><u>Плохо:</u> Ручной параметр времени, индикатор на всём массиве<br><u>Хорошо:</u> Ambient-контекст, данные только до текущего тика  <br></p></li><li><p><strong>Комиссии + слиппедж</strong> + <strong>leverage </strong><br><br><u>Плохо:</u> PnL по миду, без комиссий, +0.3% это минусовая статегия ниже комиссии<br><u>Хорошо:</u> На момент холда считается стоимость обслуживания leverage, fees <br></p></li><li><p><strong>Размер выборки</strong><br><br><u>Плохо:</u> &lt;30 сделок, Sharpe Ratio в космосе, tail-driven<br><u>Хорошо:</u> <code>N/A</code>&nbsp;вместо фейка при недостатке данных, гейты ≥10 сигналов / ≥14 дней<br></p></li><li><p><strong>Crash-recovery</strong>  <br><br><u>Плохо:</u> Нет атомарной записи, рестарт с нуля<br><u>Хорошо:</u> Atomic writes, graceful shutdown  <br></p></li><li><p><strong>Адаптер биржи</strong>  <br><br><u>Плохо:</u> Не отправлял реальный ордер  <br><u>Хорошо:</u> Если покупателя/продавца не нашлось, не закрываем позицию и в бд</p></li></ul> <a href="https://habr.com/ru/posts/1049882/?utm_campaign=1049882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Jun 2026 10:38:06 GMT</pubDate>
    <dc:creator><![CDATA[tripolskypetr]]></dc:creator>
      
      <category><![CDATA[матанализ]]></category><category><![CDATA[бектестинг]]></category><category><![CDATA[статистика]]></category><category><![CDATA[аналитика]]></category><category><![CDATA[big data]]></category><category><![CDATA[data science]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myshkin_does_it — Python (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1050090/</guid>
    <link>https://habr.com/ru/posts/1050090/?utm_campaign=1050090&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Язык, с которым у ИИ плохо</strong></p><p>В подкасте Радио-Т 1018 был интересный момент, что у ИИ сейчас гораздо меньше опенсорсных репозиториев и&nbsp;датасетов на Swift, чем условно на Python или Go. И поэтому, как Claude Code, так и Codex хреново пишут нативные iOS приложения. А ведь API языка обновляется, имеющиеся данные в нейронках устаревают с каждым WWDC.</p><p>Я как бэкендер с этой темой не сталкиваюсь. Стало интересно, как в Apple вайбкодят разрабы и влияет ли это как-то на темпы разработки по сравнению с конкурентами. Apple Intelligence пока пытались запустить для обычных потребителей, или когда анонсировали переход на Gemini-бэкенд, это повлияло как-то на пайплайн разработчиков? Есть ли у их моделей какой-то секретный проприетарный датасет, чтобы повысить качество работы с их экосистемой?</p><p>Мне короткий гуглеж выдал, что анонсировался Swift Assist в 2024, но в 2025 году от него отказались в пользу доступа к любым моделям с помощью API-ключей. То есть сама компания не может предоставить продакшн тулинг за счет доступа к самому большому в мире закрытому репозиторию Swift-кода. Получается, Apple со своей закрытой инфраструктурой не может оставаться верной своей концепции. В эпоху агентской разработки у компании не получается замыкать на своем решении инженеров, чтобы не уступать конкурентам.</p><p>Тут у меня котелок начал накидывать вопросы. </p><p>Apple ладно, а какое будущее у новых языков программирования? Будут ли авторы новых языков задаваться вопросом «как мой язык будут поддерживать нейросети?» Их популяризация будет целиком и полностью за счет опен-сорс коммьюнити теперь, пока остальные языки будут писать агенты? Сообщества сами генерят синтетические данные для языков программирования, чтобы локальные модели лучше умели в определенный скилл? Или может для языков будут сразу разрабатываться скиллы или MCP? Какую роль в адаптации к агентсткой разработке будут играть компилируемые языки со строгой типизацией по сравнению с нестрогими, скриптовыми языками? А поддержка нового языка агентами на сносном уровне, - это повод для флекса в презентации у компании? </p><p>В интересное время живем.</p> <a href="https://habr.com/ru/posts/1050090/?utm_campaign=1050090&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 22 Jun 2026 16:00:56 GMT</pubDate>
    <dc:creator><![CDATA[myshkin_does_it]]></dc:creator>
      
      <category><![CDATA[claude]]></category><category><![CDATA[codex]]></category><category><![CDATA[swift]]></category><category><![CDATA[apple]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[chatgpt]]></category><category><![CDATA[языки программирования]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Искусственный интеллект (+2) — 21.06.2026 00:12]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1050016/</guid>
    <link>https://habr.com/ru/posts/1050016/?utm_campaign=1050016&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Извлекаем любые данные из&nbsp;документов - представлен открытый сервис <a href="https://github.com/datalab-to/lift" rel="noopener noreferrer nofollow">Datalab</a> (<a href="https://huggingface.co/datalab-to/lift" rel="noopener noreferrer nofollow">Hugging Face</a>), который помогает «общаться» со всевозможными файлами и работает на&nbsp;уровне Gemini 3.5&nbsp;Flash и опережает все открытые аналоги:</p><ul><li><p>Вытягивает структурированный и понятный JSON из&nbsp;PDF, изображений и других файлов.</p></li><li><p>Обрабатывает десятки страниц за&nbsp;секунды. Нейронке можно скармливать даже огромные файлы.</p></li><li><p>Сохраняет все поля оригинала.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/56c/7ca/09e/56c7ca09e2aaefbd01aca67829057968.png" width="796" height="750"></figure> <a href="https://habr.com/ru/posts/1050016/?utm_campaign=1050016&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 20 Jun 2026 21:12:18 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Datalab]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vibecodingai — Python — 19.06.2026 04:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1049348/</guid>
    <link>https://habr.com/ru/posts/1049348/?utm_campaign=1049348&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Python Парсинг: большой  гайд 2026 + топ 20 ошибок при парсинге</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c68/790/7d3/c687907d350ffb8a6047b2f72a536f52.jpg" width="1254" height="1254"></figure><p><a href="https://github.com/justxor/Pythonparsing-/tree/main" rel="noopener noreferrer nofollow">Это полноценный бесплатный практический курс </a>от базы до production-подхода.</p><p>Внутри разбираются:<br></p><p>- как работает HTTP, HTML и DOM</p><p>- <code>requests</code>, <code>BeautifulSoup</code>, <code>lxml</code></p><p>- CSS-селекторы и XPath</p><p>- работа с API, JSON и авторизацией</p><p>- динамические сайты через Playwright и Selenium</p><p>- асинхронный парсинг на <code>aiohttp</code> и <code>asyncio</code></p><p>- Scrapy как промышленный фреймворк</p><p>- обход антибот-защит</p><p>- хранение, валидация и экспорт данных</p><p>- ретраи, логирование и обработка ошибок</p><p>- тестирование парсеров</p><p>- архитектура production-парсера</p><p>- типовые ошибки и антипаттерны</p><p>Можно понять базу, как получить страницу, извлечь данные, почистить, проверить, сохранить и сделать это так, чтобы проект не развалился через неделю.<br></p><p> Материал для тех, кто хочет прокачать Python-парсинг не на уровне игрушечных примеров, а ближе к реальным задачам.</p><p><a href="https://github.com/justxor/Pythonparsing-/tree/main" rel="noopener noreferrer nofollow">https://github.com/justxor/Pythonparsing-/tree/main</a></p><p>#junior #python #парсинг</p><p><br></p> <a href="https://habr.com/ru/posts/1049348/?utm_campaign=1049348&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 19 Jun 2026 01:27:29 GMT</pubDate>
    <dc:creator><![CDATA[vibecodingai]]></dc:creator>
      
      <category><![CDATA[парсинг]]></category><category><![CDATA[python]]></category><category><![CDATA[базы_данных]]></category><category><![CDATA[скрейпинг]]></category><category><![CDATA[bs4]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
