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

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

  <channel>
    <title><![CDATA[Все посты подряд / C++ / Хабр]]></title>
    <link>https://habr.com/ru/hubs/cpp/posts/</link>
    <description><![CDATA[C++ – типизированный язык программирования]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Mon, 12 Oct 2026 18:37:02 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[Пост @SAIREX53 — Linux (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1093434/</guid>
    <link>https://habr.com/ru/posts/1093434/?utm_campaign=1093434&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Что изменилось в <code>task_struct</code> между двумя ядрами? Написал diff для BTF</p><p><code>bpftool</code> умеет показывать BTF-структуры, но сравнивать их между двумя ядрами уже приходится самому. Можно, конечно, открыть два дампа и искать отличия глазами. Только когда в них тысячи строк, а идентификаторы типов отличаются, занятие быстро надоедает.</p><p>Особенно если интересует одна конкретная структура и хочется понять, поменялся ли её размер, сместилось ли поле или появилось что-то новое.</p><p>Решил написать для этого небольшую утилиту - <a href="https://github.com/sairex53/btf-layout-diff" rel="noopener nofollow">btf-layout-diff</a></p><p>Что она делает?</p><p>Это CLI-инструмент на C++20, который читает raw-дампы <code>bpftool</code> и сравнивает layout именованных <code>STRUCT</code> и <code>UNION</code></p><p>Смотрит на размер структуры, поля, их битовые смещения и размеры bitfield. При этом не учитывает BTF <code>type_id</code>: идентификаторы могут отличаться между дампами, даже если сама структура не изменилась.</p><p>Получить дамп можно так:</p><pre><code>bpftool btf dump file /sys/kernel/btf/vmlinux format raw &gt; kernel.raw</code></pre><p>Снимаем его на двух Linux-хостах, переносим файлы на одну машину и запускаем:</p><pre><code>./build/btf-layout-diff kernel-old.raw kernel-new.raw --type task_struct</code></pre><p>Для примера в репозитории есть две тестовые фикстуры. В одной <code>task_struct</code> занимает 24 байта, в другой - 32. Заодно добавлено поле <code>new_field</code>.</p><p>Вывод получается таким:</p><pre><code>~ STRUCT task_struct  size: 24 -&gt; 32 bytes  + new_field at 192 bits</code></pre><p>Никакого настоящего изменения <code>task_struct</code> между версиями Linux здесь нет - оба дампа синтетические. Они нужны, чтобы пример можно было запустить без двух разных ядер.</p><p>А как насчёт CO-RE?</p><p>Собственно, из-за CO-RE мне и стало интересно сравнивать BTF.</p><p>Когда BPF-программа работает на одном ядре, но возникают проблемы на другом, хочется посмотреть, какие типы и смещения отличаются. CO-RE как раз использует BTF для адаптации обращений к структурам, но это не значит, что любые изменения layout автоматически ломают программу.</p><p>И наоборот: одинаковый layout ещё не гарантирует, что программа успешно загрузится.</p><p>Поэтому <strong>btf-layout-diff не проверяет совместимость CO-RE</strong>. Он не анализирует релокации из ELF, не отслеживает рекурсивно типы полей и ничего не знает о решениях verifier.</p><p>Задача гораздо проще: показать разницу между описаниями структур, чтобы не искать её вручную.</p><p>Что проверил?</p><p>Я добавил тесты на изменение размеров структур, смещений полей и bitfield. Отдельно проверил случай, когда меняются только <code>type_id</code>: ложных отличий в отчёте быть не должно.</p><p>Есть проверки неполной записи структуры и неоднозначных имён.</p><p>Локально собирал проект на macOS. В GitHub Actions сборка и тесты проходят на Linux и macOS.</p><p>Запустить можно из репозитория: <a href="https://github.com/sairex53/btf-layout-diff" rel="noopener nofollow">sairex53/btf-layout-diff</a>.</p><p>Пока следующий шаг — сравнить BTF двух реальных ядер, взять BPF-программу, которая обращается к изменившейся структуре, и посмотреть, как с этим работают её CO-RE-релокации.</p><p>Сейчас инструмент решает только первую часть задачи. Но для неё мне и хотелось иметь отдельный diff, а не разбирать два больших вывода <code>bpftool</code> вручную.</p> <a href="https://habr.com/ru/posts/1093434/?utm_campaign=1093434&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 12 Oct 2026 15:25:18 GMT</pubDate>
    <dc:creator><![CDATA[SAIREX53]]></dc:creator>
      
      <category><![CDATA[eBPF]]></category><category><![CDATA[BTF]]></category><category><![CDATA[CO-RE]]></category><category><![CDATA[bpftool]]></category><category><![CDATA[Linux kernel]]></category><category><![CDATA[C++20]]></category><category><![CDATA[libbpf]]></category><category><![CDATA[task_struct]]></category><category><![CDATA[open source]]></category><category><![CDATA[BTF diff]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Игры и игровые консоли (+4) — 28.09.2026 09:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1087318/</guid>
    <link>https://habr.com/ru/posts/1087318/?utm_campaign=1087318&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект конвертера <a href="https://github.com/boykopovar/AnyPS5" rel="noopener nofollow">AnyPS5</a>, который автоматом портирует исполняемые файлы из&nbsp;PlayStation на&nbsp;Windows и Linux. Таким образом уже удалось запустить консольную версию Dead Cells: на&nbsp;сборке с&nbsp;Ryzen 7 5800×3D и RTX 5070&nbsp;Ti и получить на&nbsp;ПК около 55–60&nbsp;FPS.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/893/3fe/731/8933fe731e341e816e4bd952e0bd315f.png" width="797" height="534"></figure> <a href="https://habr.com/ru/posts/1087318/?utm_campaign=1087318&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 28 Sep 2026 06:13:14 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[AnyPS5]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 18.09.2026 11:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1083710/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1083710/?utm_campaign=1083710&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/47a/e6b/bc4/47ae6bbc43325b4aa704a6ef2faeb7cf.png" width="1920" height="1080"></figure><p>На вебинаре рассмотрели реальные фрагменты кода из открытых проектов на языке C++, нашли в них проблемные места с помощью статического анализа, и разобрали более 10 идиом и паттернов, которые позволят защитить ваш код.</p><p>Посмотреть запись можно тут:</p><ul><li><p><a href="https://vkvideo.ru/video-11805870_456239797" rel="noopener nofollow">VK Video</a></p></li><li><p><a href="https://rutube.ru/video/4b907ec9764a7b113c1f23143166897f/" rel="noopener nofollow">Rutube</a></p></li><li><p><a href="https://youtu.be/GvAC_UESLrY" rel="noopener nofollow">YouTube</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/video/11887/" rel="noopener nofollow">Наш сайт</a></p></li></ul><p>Приятного просмотра! Ждём ваши комментарии!</p> <a href="https://habr.com/ru/posts/1083710/?utm_campaign=1083710&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 18 Sep 2026 08:30:34 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[cpp]]></category><category><![CDATA[вебинар]]></category><category><![CDATA[идиома]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[статический анализатор]]></category><category><![CDATA[качество кода]]></category><category><![CDATA[надежность кода]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+4) — 14.09.2026 14:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1082022/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1082022/?utm_campaign=1082022&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Делимся записью вебинара <strong>"Применение ЗОСРВ "Нейтрино" и PVS-Studio для разработки ПО согласно требованиям МЭК 61508"</strong>! 🔥</p><p>На вебинаре разобрали подходы к разработке функционально безопасного ПО для ЗОСРВ «Нейтрино» в соответствии с требованиями МЭК 61508 и показали, какую роль в этом процессе играют инструменты статического анализа.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/f3e/4b5/a53/f3e4b5a5395d1cfde11b3a1fb95c3f4b.png" width="1920" height="1080"></figure><p><strong>В первой части</strong> поговорили о принципах разработки ПО для «Нейтрино», рассмотрели требования МЭК 61508 к инструментальным средствам, и продемонстрировали работу PVS-Studio в комплекте разработчика «Нейтрино».</p><p><strong>Во второй части</strong> подробнее остановились на статическом анализе как инструменте для обеспечения безопасности. Разобрали требования МЭК 61508 и МЭК 26262, их связь со стандартами MISRA и рассмотрели, как PVS-Studio помогает контролировать качество и соответствие кода требованиям стандартов.</p><p><strong>В завершение</strong> рассказали о новой мажорной версии PVS-Studio 8.0: рассмотрели ключевые изменения и нововведения релиза и обозначили дальнейшие направления развития инструмента, включая функциональную безопасность.</p><p><strong>Посмотреть можно тут: </strong><br>- <a href="https://vkvideo.ru/video-11805870_456239794" rel="noopener nofollow">VK Video</a><br>- <a href="https://rutube.ru/video/aeb3fe3f61eb940acbd4d292c8c4405a/" rel="noopener nofollow">Rutube</a><br>- <a href="https://youtu.be/qXRsCOHE7FI" rel="noopener nofollow">YouTube</a><br>- <a href="https://pvs-studio.ru/ru/blog/video/11885/" rel="noopener nofollow">Наш сайт</a></p> <a href="https://habr.com/ru/posts/1082022/?utm_campaign=1082022&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 14 Sep 2026 11:38:35 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[вебинар]]></category><category><![CDATA[разработка по]]></category><category><![CDATA[безопасная разработка]]></category><category><![CDATA[статический анализатор]]></category><category><![CDATA[нейтрино]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Учебный процесс в IT (+4) — 10.09.2026 08:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1080606/</guid>
    <link>https://habr.com/ru/posts/1080606/?utm_campaign=1080606&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/hyperfield/ai-file-sorter/" rel="noopener nofollow">AI File Sorter</a>. Решение раскладывает файлы по папкам и меняет названия. Приложение анализирует содержимое картинок и документов: test123.jpg превращается в фото_в_деревне.jpg, а файл PDF получает имя по тексту внутри. Перед сортировкой можно проверить и поправить предложения, а последний запуск с изменениями можно откатить. Проект работает на Windows, macOS и Linux, при этом бесплатно, если использовать локальную ИИ-модель.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6ba/79a/4d5/6ba79a4d518badb2586d75c66ccb975b.png" width="1002" height="832"></figure> <a href="https://habr.com/ru/posts/1080606/?utm_campaign=1080606&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 10 Sep 2026 05:40:35 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[AI File Sorter]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1080154/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1080154/?utm_campaign=1080154&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/059/8ac/f23/0598acf23deb70df9708090f94623bc8.png" width="1600" height="902"></figure><p>Мы разрабатываем и продаём статический анализатор PVS-Studio. В самом продукте есть множество всякого интересного: утилиты командной строки, диагностические правила разных категорий, вспомогательные утилиты и тому подобное.</p><p>За не самым красивым оборотом “тому подобное” мы обычно скрываем наши многочисленные интеграции со сторонними продуктами (плагины, расширения, сценарии работы). Вы можете спросить: “А зачем скрывать?” Смотрите сами: первой нашей интеграцией был плагин для Visual Studio 2005, вышедший 18 лет назад. Сегодня же анализатор интегрируется с более чем <a href="https://pvs-studio.ru/ru/pvs-studio/#integration" rel="noopener nofollow">тремя десятками других инструментов для разработки</a>: плагины для IDE, игровые движки, платформы контроля качества кода, сборочные системы, платформы CI/CD и т. п.</p><p>Поддерживать всё это в актуальном и рабочем состоянии — большая работа, и <a href="https://pvs-studio.ru/ru/blog/posts/1410/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener nofollow">в новой статье</a> расскажем, зачем мы вообще этим занимаемся.</p> <a href="https://habr.com/ru/posts/1080154/?utm_campaign=1080154&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 09 Sep 2026 07:50:19 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[интеграции]]></category><category><![CDATA[c]]></category><category><![CDATA[c++]]></category><category><![CDATA[c#]]></category><category><![CDATA[java]]></category><category><![CDATA[javascript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[go]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 03.09.2026 15:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1078158/</guid>
    <link>https://habr.com/ru/posts/1078158/?utm_campaign=1078158&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/charlie754/Game-Optimizer-CPUs-Threads-Optimizer" rel="noopener nofollow">Game Optimizer</a>, который оптимизирует работу CPU под&nbsp;игры&nbsp;в&nbsp;Windows (распределяет потоки и кэш, чтобы разделить нагрузку). </p><p>На&nbsp;примере Overwatch у&nbsp;тестеров получилось увеличить FPS вдвое с 210&nbsp;до 450&nbsp;кадров. Утилита грамотно распределяет ресурсы, как&nbsp;работает:</p><ul><li><p>Снижает нагрузку на&nbsp;ваш ПК, которую создают фоновые приложения и утилизируют ресурсы CPU, в&nbsp;которых нуждается игра. Особенно актуально, если у&nbsp;процессора есть кэш нескольких уровней (L1, L2, L3).</p></li><li><p>CPU Game Optimizer создаёт маски для&nbsp;игр, которые разделяют ресурсы.</p></li><li><p>Маски можно создавать самому или&nbsp;использовать пресеты.</p></li></ul><p>Проект хорошо сочетается с такими процессорами:</p><ul><li><p>Intel Core Ultra 9 285K, Ultra 7 265K, Ultra 5 245K, Core i9-14900K, i7-14700K, i5-14600K, i5-14400F, Core i9-13900K, i7-13700K, i5-13600K, Core i9-12900K, i7-12700K, i5-12600K.</p></li></ul><ul><li><p>AMD Ryzen 9 9950×3D• Ryzen 9 9900×3D, Ryzen 9 7950×3D, 7900×3D, Ryzen 9 9950X, 9900X, PRO 9965, PRO 9955, PRO 9945, Ryzen 9 9950×3D2&nbsp;Dual Edition, Ryzen 9 7950X, 7900X, 7900, PRO 7945, Ryzen 9 5950X, 5900X, 5900XT, 5900, PRO 5945, Ryzen 9 3950X, 3900X, Ryzen 7 3700X, 2700X.</p></li></ul><p>Даёт небольшой прирост с этими процессорами:</p><ul><li><p>Intel i5-12400, i3-12100, i3-13100, i3-14100, i9-9900K, i7-9700K, i5-9600K, i7-2600K.</p></li><li><p>AMD Ryzen 7 9700X, 9700F and Ryzen 5 9600X, 9600, 9500F, Ryzen 7 7700X, 7700, Ryzen 5 7600X, 7600, 7500F, Ryzen 7 5800X, 5800XT, 5700X and Ryzen 5 5600X, 5600, Ryzen 7 8700G, Ryzen 5 8600G, monolithic APU: 9800×3D, 9850×3D, 7800×3D, 5800×3D, 5700×3D, 5600×3D.</p></li></ul><iframe id="6a9965527be4fe805a86f91e" src="https://embedd.srv.habr.com/iframe/6a9965527be4fe805a86f91e" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1078158/?utm_campaign=1078158&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 03 Sep 2026 12:25:34 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Game Optimizer]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @shagunov — C++ — 02.09.2026 19:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1077796/</guid>
    <link>https://habr.com/ru/posts/1077796/?utm_campaign=1077796&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Рефакторинг 22 000 строк C++: Как победить класс-монстр в Vulkan-движке [Анонс стрима]</p><p>Привет, Хабр!</p><p>Меня зовут Shagu, и последние несколько месяцев я в одиночку пишу <strong>Shuttle Engine</strong> — экспериментальный 3D-рендерер и редактор сцен на C++20 и Vulkan 1.3/1.4. Проект ориентирован на современные графические технологии: GPU-driven pipeline (Indexed Indirect Drawing, Compute-пассы для подготовки геометрии), Bindless Descriptors, Buffer Device Address (BDA) и PBR/IBL освещение.</p><p>Но, как это часто бывает в инди-разработке, за быстрым прогрессом и красивой картинкой скрывается технический долг.</p><p>История одной боли: Эволюция монолита</p><p>Изначально весь проект начинался как прототип, и вся инициализация Vulkan, окон и отрисовки находилась… в одной гигантской функции <code>main()</code>. Когда масштабы стали критическими, я перенес этот код в класс <code>Application</code>.</p><p>Но теперь и <code>Application</code> превратился в классический <strong>«Класс-Бог» (God Class)</strong>. В одном месте у меня намешано всё:</p><ul><li><p>Инициализация устройств и очередей Vulkan;</p></li><li><p>Создание Swapchain и управление кадрами;</p></li><li><p>Запись барьеров (<code>pipelineBarrier2</code>) прямо внутри кадра рендеринга;</p></li><li><p>Редакторский интерфейс ImGui и логика загрузки ассетов.</p></li></ul><p>Добавление любого нового пасса рендеринга (например, теней или SSAO) превращается в ручное дописывание сотен строк кода в этот монолит и риск сломать синхронизацию Vulkan. Пора это исправить.</p><p>Что будем делать на стриме?</p><p>В эту пятницу, <strong>5 сентября в 19:00 по МСК (UTC+3)</strong>, я проведу свой первый <strong>LIVE-стрим</strong>, который будет полностью посвящен фундаментальному архитектурному рефакторингу Shuttle Engine.</p><p>Мы превратим класс <code>Application</code> в легкий и понятный оркестратор (Mediator), разбив его на три независимых модуля:</p><ol><li><p><strong>Application Module (PAL):</strong> Полностью изолируем работу с ОС (Win32/SDL), событиями ввода и созданием нативных окон.</p></li><li><p><strong>Engine Module (Vulkan Runtime):</strong> Перенесем туда всю работу с графическим API, VMA, RenderGraph и сценой.</p></li><li><p><strong>UI Module (RmlUi + ImGui):</strong> Выделим интерфейс в отдельный слой.</p></li></ol><p>Этот рефакторинг — критически важный шаг, который подготовит фундамент для следующих тем: <strong>асинхронного многопоточного рендеринга</strong> и перехода на полноценную архитектуру <strong>RenderGraph</strong>.</p><p>Детали трансляции:</p><ul><li><p>📅 <strong>Дата:</strong> 5 сентября (Суббота)</p></li><li><p>⏰ <strong>Время:</strong> 19:00 MSK (UTC+3) | 18:00 CEST | 12:00 PM EDT</p></li><li><p>📍 <strong>Где смотреть:</strong> <a href="https://www.youtube.com/watch?v=pb2xrhutEqA" rel="noopener nofollow">https://www.youtube.com/watch?v=pb2xrhutEqA</a></p></li><li><p>💻 <strong>Репозиторий проекта:</strong> <a href="https://github.com/EuShag/ShuttleEngine" rel="noopener nofollow">https://github.com/EuShag/ShuttleEngine</a></p></li></ul><p>Если вам интересны низкоуровневая графика, Vulkan, C++ и проектирование сложных систем реального времени — подключайтесь к трансляции. Это будет живой, нерепетированный процесс написания кода, обсуждения архитектурных компромиссов и поиска решений.</p><p><em>P.S. Проект разрабатывается независимо. Если вы хотите поддержать создание Shuttle Engine и помочь автору в обустройстве новой рабочей базы в это непростое время, вы можете сделать это на моей странице поддержки: </em><a href="https://boosty.to/shagunov" rel="noopener nofollow">https://boosty.to/shagunov</a><em>. Любой вклад очень помогает продолжать работу над движком!</em></p><p>До встречи на стриме!</p> <a href="https://habr.com/ru/posts/1077796/?utm_campaign=1077796&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 02 Sep 2026 16:03:51 GMT</pubDate>
    <dc:creator><![CDATA[shagunov]]></dc:creator>
      
      <category><![CDATA[vulkan api]]></category><category><![CDATA[vulkan]]></category><category><![CDATA[c++]]></category><category><![CDATA[shuttle engine]]></category><category><![CDATA[opensourse]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @KudryashovDA — C++ — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1076412/</guid>
    <link>https://habr.com/ru/posts/1076412/?utm_campaign=1076412&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Простой способ вычислить размер структуры/класса</strong></p><p>Возьмем такой объект:</p><pre><code class="cpp">struct Object {
    bool b;     // std::alignment_of&lt;bool&gt;::value == 1
    double d;   // std::alignment_of&lt;double&gt;::value == 8
    int i;      // std::alignment_of&lt;int&gt;::value == 4
    char c;     // std::alignment_of&lt;char&gt;::value == 1
};</code></pre><p>В комментарии к каждому типу данных указано требование к его выравниванию в памяти процесса на примере архитектуры x86_64 (спасибо <a href="https://habr.com/ru/users/Coder007/" rel="noopener nofollow">Coder007</a> за комментарий). Не путать с размером типа данных. Начнем с первого поля структуры с типом <strong>bool</strong> – поместим его по нулевому адресу на импровизированной линейке памяти где каждая клетка занимает один байт (рис. 1).</p><p>У следующего поля типа <strong>double</strong> значение выравнивания 8, т.е. его начало должно располагаться на кратном 8 адресе памяти (рис. 2).</p><p>Для <strong>int</strong> с выравниваем 4 ближайший кратный 4 адрес это 16 (рис. 3).</p><p>А для <strong>char</strong> по той же схеме поставим его по адресу 20 (рис. 4).</p><p>Но это не все. Если допустить, что размер структуры 21 байт, то следующая такая же структура Object будет располагаться следом - по адресу 21. Для ее поля типа bool допустимо находиться на 21-й позиции, однако тогда поле типа double будет уже 29-й, которая не кратна 8, т.е. нарушится правило выравнивания (рис. 5).</p><p>Для данного примера наиболее простой способ разместить в памяти все объекты и при этом учесть их выравнивание это добавить в конец структуры 3 байта (рис. 6).</p><p>Таким образом, размер структуры равен 24 байта. Если хотите уменьшить ее размер, то придется переставить поля.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/00f/72f/76b/00f72f76bd559fb1234831a33b0e5dea.png" width="782" height="613"></figure> <a href="https://habr.com/ru/posts/1076412/?utm_campaign=1076412&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 30 Aug 2026 16:11:17 GMT</pubDate>
    <dc:creator><![CDATA[KudryashovDA]]></dc:creator>
      
      <category><![CDATA[Выравнивание]]></category><category><![CDATA[padding]]></category><category><![CDATA[структуры данных]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 28.08.2026 14:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1075796/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1075796/?utm_campaign=1075796&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Мы кое-что спрятали 👀</strong></p><p>В честь выхода PVS-Studio 8.0 — <a href="https://pvs-studio.ru/ru/blog/posts/1406/?utm_source=habr&amp;utm_medium=pvsteam&amp;utm_campaign=article&amp;utm_content=1406" rel="noopener nofollow">а это поддержка новых языков и серьёзные улучшения анализатора</a> — мы решили устроить небольшую охоту.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/61b/021/e99/61b021e99142d30bc322b276b390f868.png" width="1920" height="1080"></figure><p>Нами спрятано несколько пасхалок. Всем, кто активно использует анализатор, будет несложно отыскать хотя бы одну из них. Если же вы еще не пробовали проверять свой проект, самое время. <a href="https://pvs-studio.ru/pashalka" rel="noopener nofollow">Забирайте пробную лицензию</a> и участвуйте в охоте.</p><p>Первые 10 человек, которые найдут спрятанные нами пасхалки и <a href="https://pvs-studio.ru/ru/about-feedback/" rel="noopener nofollow">напишут нам</a>, получат две бумажные книги по C++ в подарок. Не забудьте указать в сообщении, где вы отыскали нашу пасхалку.</p><p>Как искать? Просто! Скачивайте PVS-Studio, анализируйте свой код — и, возможно, найдёте кое-что интересное по дороге.</p><p>👉 Подробные условия и как забрать приз — <a href="https://pvs-studio.ru/ru/rules/" rel="noopener nofollow">здесь</a></p> <a href="https://habr.com/ru/posts/1075796/?utm_campaign=1075796&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 28 Aug 2026 11:19:37 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[книги]]></category><category><![CDATA[релиз]]></category><category><![CDATA[пасхалка]]></category><category><![CDATA[подарок для разработчика]]></category><category><![CDATA[cpp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Weronika_Saturday — Open source (+4) — 27.08.2026 20:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1075460/</guid>
    <link>https://habr.com/ru/posts/1075460/?utm_campaign=1075460&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я создала <a href="https://github.com/weronika-saturday/OrangeQPC" rel="noopener nofollow">красивый GUI</a> для Qemu для запуска древних MacOS начиная с версии 9.0 до 10.5 Leopard. Для удобной эмуляции для простых пользователей ПК. Доступен для всех Linux, в том числе Raspberry Pi, chromeOS, SteamDeck и Steam Machine. Программа создана на Qt6 и C++, из-за чего программа потребляет максимум полтора килобайта ОЗУ.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/622/a01/954/622a0195420519e4bfc4db7656c45aef.png" width="685" height="811"></figure><p>Я не просто создала программу и выложила на GitHub и всё, я настроила автоматическую сборку бинарного файла на сервере, поэтому вам не нужно компилировать. Бинарная сборка в одном файле AppImage <a href="https://github.com/weronika-saturday/OrangeQPC/releases/tag/v1.0" rel="noopener nofollow">доступна</a> для всех. Работает как минимум на Debian 13 (я проверяла), так что программа будет работать и на Ubuntu, и на Fedora, и на ArchLinux</p> <a href="https://habr.com/ru/posts/1075460/?utm_campaign=1075460&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 27 Aug 2026 17:01:58 GMT</pubDate>
    <dc:creator><![CDATA[Weronika_Saturday]]></dc:creator>
      
      <category><![CDATA[qemu]]></category><category><![CDATA[macos]]></category><category><![CDATA[linux]]></category><category><![CDATA[программирование]]></category><category><![CDATA[qt6]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alexsey_p — Операционные системы (+3) — 22.08.2026 13:32]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1073260/</guid>
    <link>https://habr.com/ru/posts/1073260/?utm_campaign=1073260&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Привет, Хабр! </p><p>Я хотел бы рассказать о моем главном проекте - операционная система. Заранее прошу сильно не судить, это моя первая статья на хабаре :)</p><p>Операционной системе я дал название FuturaOS. Она является проприетарной ос  с собственной файловой системой, оконным менеджером и бесконечным холстом. Несмотря на то, что проект базируется на коде ToaruOS (которая, в свою очередь, черпает вдохновение из идей UNIX), файловая система, загрузчик, экосистема приложений, графический стек и уникальные подсистемы FuturaOS разработаны с нуля и закрыты. Также база ToaruOS была очень сильно переделана. </p><p>Одна из главных фич - это Infinite Mode, бесконечный холст в духе Figma, который работает на собственном языке разметки IDSL (возможно в будущем я смогу рассказать подробнее про этот простой язык разметки). Вместо статичных обоев у нас живая солнечная система: планеты с пиксельными текстурами, орбитами, системами освещения. Причем это не просто картинка - объекты масштабируются с при зуме и двигаются вокруг Солнца на своих орбитах. На данный момент ядро поддерживает три режима работы с окнами: классический, тайлинг для продуктивности и упомянутый Infinite. Композитор построен на собственной реализации Yutani, а оконный менеджер позволяет переключаться между режимами прямо на лету, без перезагрузки сессии. </p><p>Отдельного упоминания заслуживает проделанный огромный путь по поддержке железа. Мы смогли запустить Doom и Quake через аппаратный рендеринг (DRM/KMS), хотя в самом стеке еще много работы. Порты USB 3.0 работают стабильно, а USB 2.0 находятся в разработке (как бы странно это не звучало - спустя месяцы работы у меня заработали порты SS, однако порт 2.0 на данный момент не получает питание на моем устройстве). Звуковая подсистема построена на HDA и  работает. Также реализован свой загрузчик, работающий напрямую с UEFI, без GRUB и без VESA-заглушек, что дает четкий и быстрый вывод изображения без ошибок. </p><p>Ключевая особенность системы — это собственная файловая система FFS (Futura File System), которая поддерживает шифрование, Copy-on-Write и снапшоты. Это не просто абстракция над ext4, а самостоятельный проект с уникальными свойствами, как у ZFS или Btrfs, но заточенный под небольшие и быстрые устройства. </p><p>Для разработчиков у нас есть SDK, позволяющий собирать сторонние приложения, а пакеты распространяются в формате .fos. Программа установки пакетов и магазин приложений уже присутствуют, хотя ещё является незаконченной. </p><p>Сейчас самым острым вопросом остается поддержка полноценных Wi-Fi и Bluetooth адаптеров. На данный момент Wi-Fi стек работает в бета-режиме с поддержкой ряда чипсетов и уже умеет сканировать сети, но полноценное подключение к WPA2-сетям требует доработки. </p><p>Впереди у нас ещё много работы: планируется расширить поддержку ACPI, сделать мониторинг температуры и заряда батареи, а также включить кроссплатформенные жесты для тачпада и нативной поддержки USB-адаптеров</p> <a href="https://habr.com/ru/posts/1073260/?utm_campaign=1073260&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 22 Aug 2026 10:32:27 GMT</pubDate>
    <dc:creator><![CDATA[alexsey_p]]></dc:creator>
      
      <category><![CDATA[операционная система]]></category><category><![CDATA[toaruos]]></category><category><![CDATA[FuturaOS]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+3) — 07.08.2026 11:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1067792/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1067792/?utm_campaign=1067792&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Элегантность кода благодаря C++23</strong></p><p>Продолжим разбирать приёмы рефакторинга и посмотрим, как <code>std::ranges::views::enumerate</code> помогает сделать код более элегантным.</p><p>В статье "<a href="https://habr.com/ru/companies/pvs-studio/articles/1062330/" rel="noopener noreferrer nofollow">C++: Пиши, сокращай, оптимизируй</a>" я рассматривал рефакторинг и оптимизацию кода за счёт объединения циклов. В итоге я остановился на следующем варианте кода:</p><pre><code class="cpp">static TensorImpl make_contiguous_tensor(const std::vector&lt;int64_t&gt;&amp; sizes)
{
  auto q = sizes.size();
  std::vector&lt;int64_t&gt; strides(q);
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto sz : std::ranges::views::reverse(sizes))
  {
    strides[--q] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}</code></pre><p>Его недостаток в том, что всё равно необходимо использовать переменную <code>q</code> для работы с контейнером <code>strides</code>. Как можно написать ещё лаконичнее, я не сообразил, но такой способ есть!</p><p>После публикации мне подсказали про <a href="https://en.cppreference.com/cpp/ranges/enumerate_view" rel="noopener noreferrer nofollow">enumerate</a>. Эта штука появилась в C++23, и я как-то её пропустил. Сложно уследить за всеми нововведениями C++.</p><p>С помощью <code>enumerate</code> можно сразу перебирать и элементы, и их индексы:</p><pre><code class="cpp">constexpr static auto v = {'A', 'B', 'C', 'D'};
for (auto const [index, letter] : std::views::enumerate(v))
    std::cout &lt;&lt; '(' &lt;&lt; index &lt;&lt; ':' &lt;&lt; letter &lt;&lt; ") ";</code></pre><p>Будет напечатано: <code>(0:A) (1:B) (2:C) (3:D)</code>.</p><p>Но нам нужен обратный порядок, и такой вариант не подходит:</p><pre><code>for (auto const [i, sz] :
  std::views::enumerate(
    std::ranges::views::reverse(sizes)))</code></pre><p>Этот цикл будет <a href="https://godbolt.org/z/aoxKMbhE5" rel="noopener noreferrer nofollow">перебирать</a> элементы с конца, а индексы — по возрастанию от <code>0</code>. Можно сделать, чтобы значения <code>i</code> также шли в обратном порядке? Можно. Это <a href="https://godbolt.org/z/PYx59Yvhq" rel="noopener noreferrer nofollow">делается</a> с помощью <code>std::views::enumerate(sizes) | std::views::reverse</code>.</p><p>В итоге можно сократить код ещё на одну строчку:</p><pre><code>static TensorImpl make_contiguous_tensor(const std::vector&lt;int64_t&gt;&amp; sizes)
{
  std::vector&lt;int64_t&gt; strides(sizes.size());
  int64_t acc = 1;
  int64_t ne = 1;
  for (auto const [i, sz] : std::views::enumerate(sizes) | std::views::reverse)
  {
    strides[i] = acc;
    acc *= (sz == 0 ? 1 : sz);
    ne *= sz;
  }
  //....
}</code></pre><p>Нельзя назвать это большим достижением, но зато на практике применили одну из новых возможностей C++23.</p><p>Что со скоростью кода? Замер показал, что в рамках погрешности его скорость не изменилось. Т.е. этот вариант работает так же, как вариант №2 — "Мой вариант одним циклом" (см. замер скорости работы в <a href="https://habr.com/ru/companies/pvs-studio/articles/1062330/" rel="noopener noreferrer nofollow">статье</a>). Это не удивительно, так как по сути код идентичен предыдущему.</p><p>Спасибо за внимание и <a href="https://pvs-studio.ru/ru/subscribe/" rel="noopener noreferrer nofollow">подписывайтесь</a> на наш дайджест, чтобы не пропустить интересное. Например, у нас грядёт выпуск PVS-Studio 8.0 с поддержкой новых языков.</p> <a href="https://habr.com/ru/posts/1067792/?utm_campaign=1067792&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 07 Aug 2026 08:11:49 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[enumerate]]></category><category><![CDATA[рефакторинг]]></category><category><![CDATA[рефакторинг кода]]></category><category><![CDATA[си++]]></category><category><![CDATA[c++23]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 04.08.2026 18:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1066614/</guid>
    <link>https://habr.com/ru/posts/1066614/?utm_campaign=1066614&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/pg83/shitty/releases" rel="noopener noreferrer nofollow">Представлен</a> первый релиз эмулятора терминала под необычным названием <a href="https://github.com/pg83/shitty" rel="noopener noreferrer nofollow">Shitty</a>. Автор проекта считает его «серьёзным эмулятором терминала с&nbsp;глупым названием». Код решения написан с помощью ИИ-ассистента на C++23 (сbundled libstd, требующей -std=c++26) и <a href="https://github.com/pg83/shitty/" rel="noopener noreferrer nofollow">распространяется</a> под двойной лицензией MIT и GPL-3.0. Поддерживаются macOS и Linux. </p><p>Проект делает ставку на&nbsp;обеспечение низких задержек,&nbsp;быстрого запуска и предсказуемого потребления ресурсов: состояние терминала обрабатывается на&nbsp;CPU, а&nbsp;отрисовка выполняется через бэкенды на&nbsp;базе Vulkan в&nbsp;Linux и Metal в&nbsp;macOS, без&nbsp;использования стороннего графического тулкита. При&nbsp;тестировании производительности вывод 100&nbsp;МБ ASCII через терминал Shitty показывает ~118&nbsp;МБ/с, обгоняя alacritty (0.81&nbsp;с&nbsp;против 0.96&nbsp;секунд), kitty и ghostty. На «случайных байтах» с&nbsp;некорректным UTF-8&nbsp;отрыв от&nbsp;alacritty ещё заметнее (~51&nbsp;МБ/с против ~31&nbsp;МБ/с). Корректность работы Shitty обеспечивается более чем 5000&nbsp;тестами, собранными из&nbsp;десятка с&nbsp;лишним внешних наборов&nbsp;— kitty, esctest, vttests из&nbsp;xterm, vttest, tack, libvterm, libtsm, alacritty, ghostty, contour, konsole, mosh. Тесты выполняются с&nbsp;проверкой работы на&nbsp;реальном PTY. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/650/210/677/650210677ade3ca0f28ea2d055960bd9.png" width="709" height="752"></figure> <a href="https://habr.com/ru/posts/1066614/?utm_campaign=1066614&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 04 Aug 2026 15:04:19 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Shitty]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Tesmio — C++ — 25.07.2026 22:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1062996/</guid>
    <link>https://habr.com/ru/posts/1062996/?utm_campaign=1062996&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем привет. Потребовались для моего градостроя дороги, которые можно было бы удобным образом по всякому пересекать и под разными углами строить и чтобы не было это большой проблемой. В целом, все сделано было успешно, но остался артефакт (после гуглежа и обсуждения с нейронкой как я понимаю, стандартный)возникающий на перекрестках и в целом на узлах, где дороги пересекаются (на дорогу накладывается PBR материал - тайлящиеся текстуры. Я пытался сделать сверху “заплатки” и как то замаскировать это непотребство, но все стало еще хуже - наиболее отчетливо это видно если переключить отображение в режим UV. Что с этим делать, как побеждать?</p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/81c/483/fa4/81c483fa4c303d03059bd103c54c01a5.png" alt="image"><div><figcaption>image</figcaption></div></figure><p>Визуально в обычном режиме это конечно выглядит ужасно… Тем более непонятно, что дальше делать с разметкой перекрестка?</p> <a href="https://habr.com/ru/posts/1062996/?utm_campaign=1062996&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Jul 2026 19:10:44 GMT</pubDate>
    <dc:creator><![CDATA[Tesmio]]></dc:creator>
      
      <category><![CDATA[дороги]]></category><category><![CDATA[перекрестки]]></category><category><![CDATA[sdf]]></category><category><![CDATA[signed distance fields]]></category>
  </item>
  

	
  

  

  

    

  

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

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @armani-boi — Amazon Web Services (+4) — 10.07.2026 12:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1057804/</guid>
    <link>https://habr.com/ru/posts/1057804/?utm_campaign=1057804&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как и многие подобные истории, эта началась с ночного парсинга, который к утру превратился в тыкву.</p><p>Я запустил скрапер вечером, он собрал пару тысяч страниц, я ушёл спать. Утром в логах сплошные 403 и капчи, а в базе за ночь легло страниц двести. Ок, думаю, прокси спалили. Поменял пул на резидентный, накинул puppeteer-stealth, сверху ещё пачку заплаток с гитхаба. Проработало ровно до следующего вечера. Потом опять тыква.</p><p>Так продолжалось полгода. В какой-то момент мне надоело в сотый раз докидывать заплатку, и я решил разобраться, что конкретно меня палит. Не прокси. Не поведение. Сам браузер.</p><p>Осмотрим пациента</p><p>Любой стелс устроен одинаково: поверх Chrome вешается слой JavaScript, который переписывает то, на что смотрит антибот. navigator, canvas, WebGL и ещё десятки поверхностей. И вот тут первая засада.</p><p>Берём подменённую функцию и просим показать её исходник через toString(). Настоящая функция браузера отвечает [native code]. А моя заплатка честно показывает мой же JavaScript. Спалился на первой строчке.</p><p>Ладно, стелс это тоже патчит. Но детектор не дурак и лезет глубже.</p><ul><li><p>Сверяет главный фрейм с воркером и iframe. Заплатка живёт в одном контексте, а тот же объект, вытащенный из другого, её не видит.</p></li><li><p>Ловит утечку Runtime.enable, по ней сразу понятно, что браузером кто-то рулит по CDP.</p></li><li><p>Смотрит на форму TLS-хендшейка (JA3/JA4) и сверяет её с тем, что обещает User-Agent. Заявляешь Chrome на Windows, а рукопожатие выдаёт питоновский клиент.</p></li><li><p>Перерисовывает один и тот же холст дважды и смотрит, стабилен ли отпечаток, или заплатка подмешивает случайный шум, которого у настоящего железа нет.</p></li></ul><p>Где-нибудь да разъедется. И так будет всегда, потому что я крашу браузер сверху, а не меняю его изнутри. Это не «кривая заплатка», это тупик подхода: маскировка и то, что её просвечивает, написаны на одном языке. Тот, кто читает страницу, всегда на уровень ниже того, кто патчит её из той же страницы.</p><p>Вскрытие</p><p>Раз проблема в слое поверх браузера, надо убрать слой и лезть в сам браузер. Я взял исходники Chromium и пошёл править фингерпринт прямо в C++, в Blink, V8 и BoringSSL.</p><p>Идея простая. Каждое значение, которое читает детектор, должно быть не подменено сверху, а просто другим внутри, ровно как оно было бы на чужой машине. Тогда никакого слоя нет. Подменённый геттер это настоящий C++ геттер, поэтому toString() в любом реалме честно отдаёт [native code]. Сверка «фрейм против воркера» ничего не находит, потому что находить нечего: значение одно и то же везде, оно вкомпилировано в движок. Браузер, который изучает сам себя, видит обычный Chrome. Потому что это и есть обычный Chrome, просто с другими числами внутри.</p><p>Что заработало, а что нет</p><p>Сразу оговорю, чего не заявляю, потому что именно на этом обычно и врут. Это про фингерпринт браузера, а не про поведение сессии. Серверный антифрод конкретной площадки, поведенческий анализ, скорость и траектория мышки, тут я вам не помощник. Fortress чинит браузер, а не то, как вы им управляете.</p><p>А что заявляю, можно проверить руками, не веря мне на слово. Я прогнал сборку по публичным</p><ul><li><p>CreepJS: 0% headless, 0% stealth.</p></li><li><p>Sannysoft: всё зелёное.</p></li><li><p>BrowserScan: пишет «Normal».</p></li><li><p>Живой Cloudflare Turnstile: проходит без клика мышкой.</p></li></ul><p>Всё это воспроизводится одним скриптом tools/<a href="http://gauntlet.py" rel="noopener noreferrer nofollow">gauntlet.py</a> из репозитория, так что можно прогнать самому и убедиться. Персона при этом собирается когерентно: платформа, GPU, таймзона, язык, набор голосов, раскладка клавиатуры и форма TLS съезжаются в один правдоподобный Windows-девайс, а не в ме</p><p>По коду менять нечего</p><p>Движок поднимает сырой CDP на порту 9222, без утечки Runtime.enable. Я цепляю к нему свой ж остальной код работает как работал. Меняется одна строчка, адрес подключения.</p><p>Патчей тридцать четыре, каждый маленький и на одну задачу, читается за минуту. Всё открыто  единому слову, соберите движок сами и проверьте, что внутри ровно то, что заявлено.</p><p>github.com/tiliondev/fortress</p> <a href="https://habr.com/ru/posts/1057804/?utm_campaign=1057804&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 10 Jul 2026 09:13:18 GMT</pubDate>
    <dc:creator><![CDATA[armani-boi]]></dc:creator>
      
      <category><![CDATA[scrapping]]></category><category><![CDATA[browser]]></category><category><![CDATA[data]]></category><category><![CDATA[data mining]]></category><category><![CDATA[antibot]]></category><category><![CDATA[chromium]]></category><category><![CDATA[patch]]></category><category><![CDATA[selenium]]></category><category><![CDATA[opensource]]></category><category><![CDATA[opensource projects]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dirvika — Блог компании Veai (+4) — 07.07.2026 18:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/veai/posts/1056666/</guid>
    <link>https://habr.com/ru/companies/veai/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Почему ИИ-агент для кода промахивается мимо нужного метода</strong></p><p>Несколько последних постов об ИИ-агентах,&nbsp;которые я читала на этой неделе,&nbsp;сошлись в одну мысль:&nbsp;агенты часто ведут себя по-разному на одной и той же задаче,&nbsp;и разгадка почему&nbsp;-&nbsp;находится не там,&nbsp;где ожидаешь.&nbsp;Вот конкретный пример,&nbsp;на котором это видно сразу.</p><p>Агент,&nbsp;который ищет код текстом,&nbsp;физически не отличает <code>OrderService.validate</code> от&nbsp;<code>UserDto.validate</code>:&nbsp;для него это просто совпадение символов «validate». Агент,&nbsp;который спрашивает у IDE&nbsp;«кто на самом деле вызывает этот метод»,&nbsp;получает точный ответ,&nbsp;потому что IDE знает типы,&nbsp;разрешённые ссылки и видимость каждого символа.&nbsp;Разница между этими двумя подходами не абстрактная,&nbsp;она измеряется в конкретных цифрах.</p><p><strong>Точка отсчёта: почему grep и RAG промахиваются</strong></p><p>Кодовый агент ищет по проекту двумя способами:&nbsp;grep/ripgrep по содержимому файлов и векторный поиск по эмбеддингам кусков кода.&nbsp;На маленьком проекте оба варианта работают сносно.&nbsp;На enterprise-репозитории на миллионы строк с десятками модулей поведение ломается одинаково:&nbsp;запрос&nbsp;«найди использования метода&nbsp;<code>validate</code>»&nbsp;возвращает тысячу с лишним совпадений,&nbsp;из которых подавляющее большинство&nbsp;-&nbsp;другие методы с тем же именем в других классах.&nbsp;Векторный поиск находит куски кода,&nbsp;которые&nbsp;«похожи по смыслу»,&nbsp;но это может быть валидация в совершенно другом домене.</p><p><strong>Что показали цифры на 27 задачах</strong></p><p>Мы сравнили <strong>три версии агента</strong> на <strong>27 задачах вида</strong>&nbsp;«найди все места,&nbsp;где используется метод X»&nbsp;из реальных тикетов трёх внутренних репозиториев на Java и Kotlin:&nbsp;агент на ripgrep,&nbsp;агент на ripgrep с векторным RAG и агент на PSI-индексе IntelliJ&nbsp;(<code>find_usages</code>,&nbsp;<code>find_declaration</code>,&nbsp;<code>class_hierarchy</code>&nbsp;вместо текстового поиска).</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/70d/d43/514/70dd4351465ec1abac0efd433b5d47d5.png" alt="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" title="Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21" width="3200" height="1400"><div><figcaption>Вариант поискаPrecisionRecallF1Контекст, токенов$/ответripgrep0,410,820,5578 4001,12ripgrep + векторный RAG0,580,790,6792 1001,38PSI-индекс0,960,930,9416 7000,21</figcaption></div></figure><p>Precision показывает,&nbsp;сколько из найденного агентом оказалось реальными использованиями метода,&nbsp;а не случайным совпадением имён.&nbsp;Recall показывает,&nbsp;сколько из всех реальных использований в коде агент вообще нашёл,&nbsp;ничего не пропустив.</p><p>У ripgrep recall высокий&nbsp;(0,82):&nbsp;текстовый поиск почти никогда не пропускает совпадения по имени.&nbsp;Но precision низкий&nbsp;(0,41):&nbsp;больше половины найденного&nbsp;-&nbsp;чужие методы с тем же именем,&nbsp;и их приходится разбирать вручную.&nbsp;У PSI-индекса высоки обе величины&nbsp;(0,96 и 0,93):&nbsp;агент находит почти все нужные места и почти не приносит лишнего.&nbsp;F1 сводит обе величины в одно число,&nbsp;и у ripgrep он проседает именно из-за мусора в выдаче,&nbsp;хотя нужные места он и находит.</p><p>Отсюда пятикратная экономия контекста и в пять с лишним раз более дешёвый ответ при кратно более высокой точности:&nbsp;агент на PSI-индексе не читает тысячи лишних строк,&nbsp;которые вернул бы текстовый поиск.</p><p><strong>Точный поиск не отменяет проверку</strong></p><p>Даже когда агент точно нашёл все места,&nbsp;где используется метод,&nbsp;и внёс правку во все,&nbsp;это не гарантирует,&nbsp;что правка корректна:&nbsp;<strong>точный поиск решает только задачу&nbsp;«найти нужные места»</strong>,&nbsp;а не&nbsp;«проверить,&nbsp;что код после правки работает».&nbsp;Поэтому прежде чем объявить об успехе,&nbsp;агент должен прогнать компилятор и тесты:&nbsp;тест зелёный,&nbsp;ошибок компиляции нет,&nbsp;покрытие не просело.&nbsp;Пока в выводе компилятора или тестового прогона есть хоть одна ошибка,&nbsp;агент обязан либо исправить её,&nbsp;либо сообщить о проблеме,&nbsp;а не писать об успехе.</p><p>Но точный поиск снимает с агента часть ручной работы:&nbsp;не нужно самому перепроверять по всему проекту,&nbsp;все ли использования метода он нашёл&nbsp;-&nbsp;эту проверку берёт на себя IDE,&nbsp;как это устроено в Veai,&nbsp;а оставшуюся часть верификации&nbsp;-&nbsp;компилятор и тесты.</p> <a href="https://habr.com/ru/posts/1056666/?utm_campaign=1056666&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jul 2026 15:08:33 GMT</pubDate>
    <dc:creator><![CDATA[dirvika (Veai)]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии]]></category><category><![CDATA[java]]></category><category><![CDATA[ai-агенты]]></category><category><![CDATA[ai]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[аналитика]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Windows (+4) — 07.07.2026 15:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1056584/</guid>
    <link>https://habr.com/ru/posts/1056584/?utm_campaign=1056584&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый сервис <a href="https://github.com/mrT4ntr4/NtWarden" rel="noopener noreferrer nofollow">NtWARden</a> (Windows Analysis and Research Toolkit), который распознает любые вредоносы и проблемное ПО, даже если эти компоненты находятся глубоко в системе Windows.</p><p>Проект NtWARden:</p><ul><li><p>сканирует процессы, службы, сеть, внутренние механизмы ядра;</p></li><li><p>обнаруживает скрытые вредоносы;</p></li><li><p>убивает майнеры и трояны;</p></li><li><p>показывает реальную картину нагрузки на&nbsp;процессор;</p></li><li><p>помогает контролировать, что&nbsp;находится в&nbsp;системе прямо сейчас: службы, сетевые соединения, скрытые процессы;</p></li><li><p>может подключиться к&nbsp;другому ПК и также отслеживать его процессы.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/478/1ca/982/4781ca9826406b9edf32499f866bc939.jpg" width="1280" height="900"></figure> <a href="https://habr.com/ru/posts/1056584/?utm_campaign=1056584&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jul 2026 12:39:09 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[NtWARden]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 02.07.2026 14:14]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1054832/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1054832/?utm_campaign=1054832&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как все так ловко ИИ пользуются... Обзоры кода делают...</strong></p><p>Не знаю, то ли я туповат, то ли невезучий, то ли кругом сказочники. Пытаюсь исследовать, какие новые интересные виды ошибок может находить ИИ в С++ коде, о которых не знает PVS-Studio. Claude Opus то нормально мне про интересные баги рассказывает, то на ровном месте с ума сходит.</p><p>Даю файл на вход, а он тревожно:</p><blockquote><p>В присланном файле есть места, где содержимое обрезано/повреждено вставкой <code>&lt;/context&gt;</code>, поэтому их я не рассматриваю как «баги кода» — это артефакты форматирования. Разберу реальные логические ошибки.</p></blockquote><p>Шо? Какой <code>context</code>? Там максимум — это <code>#include "context.hxx"</code>. Ну ладно, давай ошибки посмотрим.</p><p>Так, парочка сообщений по делу. Например, найден лишний аргумент при использовании функции форматирования.</p><pre><code class="cpp">addErrorMessage(&amp;sciErr, API_ERROR_CREATE_ZDOUBLE_IN_NAMED_LIST,
    _("%s: Unable to create list item #%d in Scilab memory"),
    "createComplexZMatrixOfDoubleInNamedList", _iItemPos + 1, _pstName);</code></pre><p>В строке форматирования два спецификатора <code>%s</code> и <code>%d</code>, а передаются три аргумента: <code>funcName</code>, <code>_iItemPos+1</code>, <code>_pstName</code>. Да, это баг. Про подобные паттерны PVS-Studio уже <a href="https://pvs-studio.ru/ru/blog/examples/v576/" rel="noopener noreferrer nofollow">знает</a>, хотя, возможно, нужно подсказать, что <code>addErrorMessage</code> — это printf-подобная функция. В целом, тут неинтересно, идём дальше.</p><p>Ооо, и тут начинается...</p><blockquote><p><code>checkListItemPosition</code> — неправильное сравнение границы:</p></blockquote><pre><code class="cpp">// check a valid item
if (_iItemPos &gt; iItem)
{
    addErrorMessage(...);
    return sciErr;
}
</code></pre><blockquote><p>Здесь проверка «позиция валидна» использует <code>&gt;</code>, хотя позиции 1-based, а <code>iItem</code> — количество элементов. Это выглядит как граничный дефект, но по сути <code>_iItemPos == iItem</code> допустимо, <code>_iItemPos &gt; iItem</code> — ошибка. Это в порядке — правильная граница. Не баг. (Указываю, чтобы было понятно, что я это проверил.)</p></blockquote><p>Так баг или не баг? Я три раза прочитал текст и посмотрел функцию с кодом. В итоге я не только не понимаю, есть ли здесь ошибка, но и не понимаю, что Claude пытается мне сказать.</p><p>Дальше ещё хуже шарики за ролики зашли.</p><blockquote><p>Баг 5 (реальный): утечка в readCommonMatrixOfPolyInNamedList и др. — нет, это API отдаёт указатели наружу. Не баг.</p></blockquote><p>Это всё описание пятого бага, больше ничего нет. Комментировать — только портить.</p><p>Я не понимаю, как на всём этом можно строить хоть сколько-то надёжные процессы автоматических обзоров кода, про которые в последнее время из разных утюгов вещают.</p><p>На сегодня мне ИИ достаточно. Пойду лучше пройдусь по парку, пока погода хорошая.</p> <a href="https://habr.com/ru/posts/1054832/?utm_campaign=1054832&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Jul 2026 11:14:24 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[обзор кода]]></category><category><![CDATA[code review]]></category><category><![CDATA[ии]]></category><category><![CDATA[что-то пошло не так]]></category><category><![CDATA[галлюцинации]]></category><category><![CDATA[галлюцинации ии]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[статический анализ кода]]></category><category><![CDATA[claude]]></category><category><![CDATA[claude opus]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AleksandraUvarova — Блог компании PVS-Studio (+4) — 01.07.2026 11:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1054290/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1054290/?utm_campaign=1054290&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Нарезка кода: что скрывает OrcaSlicer</strong></p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/269/d89/3df/269d893df78c3d35065f65dbc07fa297.png"></figure><p>Как не пропустить опасные участки кода при ревью? Можно воспользоваться инструментами статического анализа. Возьмём для примера OrcaSlicer — популярную программу, которая подготавливает 3D-модель к печати. Заглянем внутрь и посмотрим, какие сюрпризы нас ждут.</p><p>Посмотрим на одно из предупреждений статического анализатора <a href="https://pvs-studio.ru/ru/pvs-studio/" rel="noopener noreferrer nofollow">PVS-Studio</a>:</p><p><a href="https://pvs-studio.ru/ru/docs/warnings/v1047/" rel="noopener noreferrer nofollow">V1047</a> Lifetime of the lambda is greater than lifetime of the local variable ‘do_stop’ captured by reference. <a href="https://github.com/OrcaSlicer/OrcaSlicer/blob/a167702038496b97e8495cc79f0c62660063ac87/src/slic3r/GUI/Jobs/FillBedJob.cpp#L250" rel="noopener noreferrer nofollow">FillBedJob.cpp 250</a></p><pre><code class="cpp">void FillBedJob::process(Ctl &amp;ctl)
{
  // ....
  bool do_stop = false;
  // ....
  params.on_packed = 
    [&amp;do_stop] (const ArrangePolygon &amp;ap)
    {
      do_stop = ap.bed_idx &gt; 0 &amp;&amp; ap.priority == 0;
    };
  // ....
}
</code></pre><p>Лямбда-выражение захватывает локальную переменную <code>do_stop</code> по ссылке, а затем сохраняется в <code>params.on_packed</code>. При этом <code>do_stop</code> уничтожается при выходе из метода <code>process</code>, так как заканчивается время жизни локального объекта. Если лямбда будет вызвана после выхода из этой функции-члена, произойдёт обращение к разрушенному объекту, и поведение в этой ситуации не определено.</p><p>Можно было бы сделать захват по значению, но в этой лямбде происходит перезапись переменной <code>do_stop</code>, а значит такой вариант не подходит. Поэтому можно сделать <code>do_stop</code> членом класса <code>FillBedJob</code>.</p><p>Это лишь один фрагмент, показывающий, что даже в работающем продукте могут быть ошибки. А <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1389/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">другие опасные места в коде OrcaSlicer</a> разобрали в новой статье.</p><p>Если вы тоже хотите минимизировать ошибки в своих проектах, сделайте статический анализ частью <a href="https://pvs-studio.ru/ru/pvs-studio/algoritm/" rel="noopener noreferrer nofollow">регулярного процесса</a>, а поможет с этим <a href="https://pvs-studio.ru/ru/pvs-studio/download/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=manual&amp;utm_content=Post_OrcaSlicer_ru" rel="noopener noreferrer nofollow">PVS-Studio</a>.</p> <a href="https://habr.com/ru/posts/1054290/?utm_campaign=1054290&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 01 Jul 2026 08:19:16 GMT</pubDate>
    <dc:creator><![CDATA[AleksandraUvarova (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[c++]]></category><category><![CDATA[программирование]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[ошибки программистов]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[безопасная разработка]]></category><category><![CDATA[3d графика]]></category><category><![CDATA[3d-печать]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Dan-Spec — Блог компании Спецлаб (+4) — 30.06.2026 09:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/speclab/posts/1053732/</guid>
    <link>https://habr.com/ru/companies/speclab/posts/1053732/?utm_campaign=1053732&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Илон Маск отдал приоритет видеокамерам. Радар и ультразвуковые датчики были ошибкой, от них больше помех</strong></p><p>Мы тоже часто спорим с коллегами о выборе средства распознавания объектов. С одной стороны, лидары и ультразвук лучше камер работают в темное время суток, что безусловный плюс. С другой, освещение в 21 веке – не экзотика или всегда можно применить ИК-прожекторы. Сегодняшние нейросети неплохо справляются и в ночных условиях. Тем более, что полной темноты в наше время не бывает, видеокамерам хватает света даже от сигареты.</p><p>Сегодняшние&nbsp;<a href="https://www.goal.ru/neuronet/" rel="noopener noreferrer nofollow">нейросети</a>&nbsp;совершают&nbsp;<a href="https://www.goal.ru/hi-tech-security/i-snova-revolyutsiya-v-videonablyudenii-/" rel="noopener noreferrer nofollow">революцию в видеонаблюдении</a>, распознавая даже мелкие объекты и даже в темноте. Наверное, поэтому Илон Маск в интервью про свои беспилотники высказал буквально следующее:</p><iframe id="6a436680a269d5af84018824" src="https://embedd.srv.habr.com/iframe/6a436680a269d5af84018824" class="embed_video embed__content" allowfullscreen="true"></iframe><p>«Честно говоря, радар и ультразвуковые датчики были ошибкой. Особенно радар. Потому что радар позволяет приблизиться к решению задачи и решать задачу в большинстве случаев, кроме тех моментов, когда невозможно соединить радар и нейросеть для визуального распознавания. То есть радар и “зрение” расходятся - кто прав? По сути, нужно избавляться от радара. И как только мы избавились от радара - и кстати команда автопилота была сильно против такого решения - теперь никто не хочет возвращать радар.</p><p>Мне пришлось настоять на своем. Радару тут не место. Радар был костылем, и, если тащить костыль за собой, бежать не получится. Радар - просто сигнал. В конечном счете от радара было больше помех, чем сигналов. Иногда это было очень полезно, но помех от него было больше. От него нужно было избавляться. Как только мы убрали радар, стало очевидно, что наши нейросети гораздо хуже, чем мы думали. Радар им слишком сильно помогал.&nbsp;<strong>Использование компьютерного зрения предполагает, что ни на что больше полагаться нельзя, оно должно работать. Нейросеть должна работать.</strong>&nbsp;Большим изменением стал переход от алгоритма «Bag of points» к его интерпретации нейросетью для определения центра полосы.&nbsp;</p><p>Раньше мы все это делали на «Си». Сейчас архитектура нейросети очень сложна, там много слоев. Какие-то слои удаляются, какие-то добавляются. Мы уже столько раз меняли архитектуру.”</p><p><a href="https://habr.com/ru/post/edit/1053732/" rel="noopener noreferrer nofollow">Доступно на Ютьюб</a></p><p><em>Кстати, программисты Спецлаб тоже, в основном, всё разрабатывают на “C++”. И тоже предпочитают использование видеокамер для объяснения компьютеру окружающего мира.</em></p><p><em>Даниил Гришанин</em><br><em>=Спецлаб=</em></p> <a href="https://habr.com/ru/posts/1053732/?utm_campaign=1053732&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 30 Jun 2026 06:52:22 GMT</pubDate>
    <dc:creator><![CDATA[Dan-Spec (Спецлаб)]]></dc:creator>
      
      <category><![CDATA[нейронные сети]]></category><category><![CDATA[лидары]]></category><category><![CDATA[лидар]]></category><category><![CDATA[нейросеть]]></category><category><![CDATA[умная видеокамера]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @eoanermine — Программирование (+1) — 29.06.2026 20:10]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1053592/</guid>
    <link>https://habr.com/ru/posts/1053592/?utm_campaign=1053592&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Листая на&nbsp;C++ Reference <a href="https://cppreference.com/cpp/29" rel="noopener noreferrer nofollow">список</a> принятых в&nbsp;C++29&nbsp;фичей, увидел в&nbsp;нем пропозал с&nbsp;знакомым названием, <a href="https://wg21.link/P2019" rel="noopener noreferrer nofollow">«Thread attributes» (P2019R9)</a>. И, оказалось, действительно, я <a href="https://t.me/stateofub_shorts/22" rel="noopener noreferrer nofollow">уже читал</a> этот пропозал 4&nbsp;года назад, но&nbsp;не&nbsp;в 9-й его редакции, а&nbsp;в&nbsp;самой первой. 4&nbsp;года понадобилось комитету по&nbsp;стандартизации, чтобы принять пустячный пропозал, позволяющий задать имя и размер стека потока при&nbsp;его создании&nbsp;— востребованную фичу, реализованную в&nbsp;куче библиотек C++.</p><pre><code class="cpp">void f();
int main() {
  // Такой вид задания атрибутов предлагался в первой ревизии
  std::jthread P2019R1(
    f, std::thread_name("Worker"),
    std::thread_stack_size(512*1024));
  // А такой приняли 8 ревизий спустя
  std::jthread P2019R9(
    std::thread::name_hint("Worker"),
    std::thread::stack_size_hint(512*1024), f);
}</code></pre><p>Не безумие ли это? И сколько действительно правильных пропозалов не вошло в C++ лишь по той причине, что их автор не был готов 4 года подряд защищать свое предложение, отвечая на все мелкие придирки различных подкомитетов?</p> <a href="https://habr.com/ru/posts/1053592/?utm_campaign=1053592&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Jun 2026 17:10:16 GMT</pubDate>
    <dc:creator><![CDATA[eoanermine]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[c++29]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AI-CMO — Java (+2) — 16.06.2026 15:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1048194/</guid>
    <link>https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Риски ИИ- генерируемого кода - качество, производительность, “УСПЕВАЮ ЛИ Я ЗА ТЕМПОМ”&nbsp;</strong></p><p>ИИ генерирует код быстрее, чем мы успеваем ловить его реальные проблемы.<br>В JPA/Hibernate это особенно больно: код компилируется, тесты зелёные — а внутри N+1 и лишние запросы. Veai проверяет такие гипотезы на фактах проекта прямо в IDE: семантические usages, реальные прогоны тестов, coverage, debugger, доступ к исходникам Hibernate.</p><p>Не “этот код, возможно, тормозит”, а проверка через запуск. Скорость растёт — контроль над качеством остаётся. Большой разбор продукта <a href="https://habr.com/ru/companies/veai/articles/1043752/" rel="noopener noreferrer nofollow">сделан в статье </a></p> <a href="https://habr.com/ru/posts/1048194/?utm_campaign=1048194&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 16 Jun 2026 12:24:28 GMT</pubDate>
    <dc:creator><![CDATA[AI-CMO]]></dc:creator>
      
      <category><![CDATA[программирование]]></category><category><![CDATA[программирование для начинающих]]></category><category><![CDATA[ide]]></category><category><![CDATA[idea]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @dugalb — C (+2) — 12.06.2026 17:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1046906/</guid>
    <link>https://habr.com/ru/posts/1046906/?utm_campaign=1046906&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>graphics.h в 2026 году: зачем и как запустить</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e60/96d/99f/e6096d99fb18aa79173335c4d842f03e.png" width="1071" height="628"></figure><p><code>graphics.h</code> — это часть библиотеки BGI (Borland Graphics Interface) родом из 1990-х. В современных IDE её нет: она несовместима с 64-битными системами и не является частью стандарта C++. Тем не менее в учебных задачах она до сих пор встречается — особенно там, где нужно быстро визуализировать алгоритм или сдать лабораторную.</p><p><strong>Когда это оправдано</strong></p><ul><li><p>изучение основ C/C++ и хочется видеть результат за пределами консоли</p></li><li><p>разбор алгоритмов компьютерной графики</p></li><li><p>подготовка к экзамену по предмету, где преподаватель требует именно <code>graphics.h</code></p></li></ul><p>Для production-кода и серьёзных учебных проектов лучше сразу смотреть в сторону актуальных библиотек: <strong>SDL2</strong> (2D, кроссплатформенная), <strong>SFML</strong> (ООП-подход, проще в освоении) или <strong>OpenGL/GLFW</strong> (если нужна 3D-графика и аппаратное ускорение).</p><p><strong>О библиотеке</strong></p><p>Адаптация для современных Windows называется <strong>WinBGIm</strong> — её разработал и поддерживает <a href="https://home.cs.colorado.edu/~main/" rel="noopener noreferrer nofollow">Майкл Мэйн</a>, профессор Колорадского университета в Боулдере. Библиотека открыта для использования и модификации. Скачать можно на официальном сайте: <a href="http://winbgim.codecutter.org" rel="noopener noreferrer nofollow">winbgim.codecutter.org</a>.</p><p>Если хочется сначала почитать вводный разбор — на Хабре есть <a href="https://habr.com/ru/articles/455056/" rel="noopener noreferrer nofollow">статья с обзором WinBGIm</a>, здесь же показан небольшой практический пример-скриншот: инженерная утилита с графическим выводом, которая впоследствии была переписана с использованием современного UI на C++.</p><p><strong>Как запустить: общий принцип</strong></p><p>Для работы используется адаптация WinBGIm — три файла: <code>graphics.h</code>, <code>winbgim.h</code> и <code>libbgi.a</code>.</p><p>Линкер-флаги одинаковы для всех сред:</p><pre><code>-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32</code></pre><p>Известный баг: в оригинальном <code>graphics.h</code> на строке 302 встречается <code>int right=0</code> — это вызывает ошибку компиляции. Исправляется заменой на <code>int txtright=0</code>.</p><p><strong>Dev-C++</strong></p><ol><li><p>Скопировать <code>graphics.h</code> и <code>winbgim.h</code> в <code>MinGW64\x86_64-w64-mingw32\include</code></p></li><li><p>Скопировать <code>libbgi.a</code> в <code>...\lib</code></p></li><li><p><code>Tools → Compiler Options → Parameters → Linker</code> — вставить флаги</p></li><li><p>Переключить профиль компилятора на <strong>32-bit Release</strong></p></li></ol><p><strong>Code::Blocks</strong></p><ol><li><p>Файлы — в соответствующие папки <code>include</code> и <code>lib</code> компилятора MinGW</p></li><li><p><code>Settings → Compiler → Linker settings → Other linker options</code> — вставить флаги</p></li></ol><p><strong>VS Code</strong></p><p>Файлы хранятся внутри проекта. Структура:</p><pre><code>project/
  include/  ← graphics.h, winbgim.h
  lib/      ← libbgi.a</code></pre><p>В <code>.vscode/tasks.json</code> в массив <code>args</code> добавить:</p><pre><code class="json">"-I${workspaceFolder}/include",
"-L${workspaceFolder}/lib",
"-l"-I${workspaceFolder}/include",
"-L${workspaceFolder}/lib",
"-lbgi", "-lgdi32", "-lcomdlg32", "-luuid", "-loleaut32", "-lole32"
bgi", "-lgdi32", "-lcomdlg32", "-luuid", "-loleaut32", "-lole32"</code></pre><p>Компилятор MinGW (<code>g++</code>) должен быть прописан в <code>PATH</code>.</p><p>По материалам видео-инструкции CodeWar</p><p><strong>Тест</strong></p><pre><code class="cpp">#include &lt;graphics.h&gt;
#include &lt;conio.h&gt;

int main() {
    int gd = DETECT, gm;
    initgraph(&amp;gd, &amp;gm, (char*)"");
    circle(250, 250, 100);
    getch();
    closegraph();
    return 0;
}</code></pre><p> Должно открыться окно с белым кругом на чёрном фоне. Если компиляция падает с ошибкой <code>cannot find -lbgi</code> — проверьте путь до <code>libbgi.a</code>. Ошибка <code>undefined reference</code> обычно означает, что флаги линкера не подхватились.  </p> <a href="https://habr.com/ru/posts/1046906/?utm_campaign=1046906&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 12 Jun 2026 14:06:19 GMT</pubDate>
    <dc:creator><![CDATA[dugalb]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[cpp]]></category><category><![CDATA[программирование]]></category><category><![CDATA[graphics]]></category><category><![CDATA[graphics2d]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 05.06.2026 09:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1043882/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1043882/?utm_campaign=1043882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Наш архитектор C++ анализатора, Юрий Минаев, выступил в прошлом году на C++ Russia с докладом "<strong>Семантика C++ изнутри компилятора</strong>". </p><p><strong>О чём рассказал Юра:</strong>  </p><ul><li><p>о семантике C++ с точки зрения статического анализатора или фронтенда компилятора;</p></li><li><p>как устроена таблица символов и как происходит поиск имен, а также как семантика влияет на парсинг;</p></li><li><p>о том, как происходит выбор перегрузок и каким образом компилятор находит функции, которые даже не видны в текущей точке программы; </p></li><li><p>о шаблонах и их инстанцировании. </p></li></ul><iframe id="6a226bab6b85845d00f4d02c" src="https://embedd.srv.habr.com/iframe/6a226bab6b85845d00f4d02c" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Посмотреть доклад можно ещё на этих площадках: </p><ul><li><p><a href="https://pvs-studio.ru/ru/blog/video/11740/" rel="noopener noreferrer nofollow">Наш сайт</a></p></li><li><p><a href="https://youtu.be/7P9GkZvnnzU" rel="noopener noreferrer nofollow">YouTube</a></p></li><li><p><a href="https://rutube.ru/video/9c356eeda4ec2efe056d4db6d699cc61/" rel="noopener noreferrer nofollow">Rutube</a></p></li></ul><p>Приятного просмотра! Ждём ваши комментарии!</p> <a href="https://habr.com/ru/posts/1043882/?utm_campaign=1043882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 05 Jun 2026 06:27:40 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[доклад]]></category><category><![CDATA[семантика]]></category><category><![CDATA[c++]]></category><category><![CDATA[cpprussia]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[компиляторы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Andrey2008 — Блог компании PVS-Studio (+4) — 29.05.2026 11:36]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1041016/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1041016/?utm_campaign=1041016&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Дайте посмотреть на нормальный С++ проект, созданный вайб-кодингом</strong></p><p>Чтобы корректировать развитие PVS-Studio я заинтересован смотреть C++ проекты, созданные с использованием генеративного AI или, по-простому, вайб-кодинга. Но вот незадача: все кругом пишут про этот самый вайб-кодинг, но я не знаю, как и где искать такие открытые проекты.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e78/793/703/e78793703404baf35231193eb12da41a.png" width="1600" height="902"></figure><p>Мне попадается какая-то белиберда типа <a href="https://github.com/gravecan/enhance-client/tree/main" rel="noopener noreferrer nofollow">enhance-client</a>, сгенерированная за $15. Но это даже смотреть несерьёзно. По присутствию в репозитории <code>.obj</code>, <code>.iobj</code>, <code>.ipdb</code> файлов и прочего мусора видно, что автор не понимает, что он делает. Проект не компилируется по разным причинам, например, из-за того, что заложен какой-то огрызок файла <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/injector/bytes.hpp#L25744" rel="noopener noreferrer nofollow">bytes.hpp</a> (у массива нет конца).</p><p>Если немного поправить и проверить, что удалось собрать, то там лезут перлы вида:</p><pre><code class="cpp">void enhance::modules::autototem::run()
{
  ....
  auto env = enhance::instance-&gt;get_env();
  if (!env)
  {
    env-&gt;DeleteLocalRef(player);
    return;
  }
  ....
}</code></pre><p>Предупреждение PVS-Studio: <a href="https://pvs-studio.ru/ru/docs/warnings/v522/" rel="noopener noreferrer nofollow">V522</a> [CWE-476, CERT-EXP34-C, SEC-NULL] Dereferencing of the null pointer ‘env’ might take place. <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/enhance/modules/autototem/autototem.cpp#L757" rel="noopener noreferrer nofollow">autototem.cpp 757</a></p><p>Явное разыменование нулевого указателя.</p><p>Или бессмысленные сравнения значения типа <code>int</code> с константой <code>0.1f</code>:</p><pre><code class="cpp">int sdk::minecraft_client::get_attack_cooldown() { .... }

void enhance::modules::shield_breaker::run()
{
  ....
  if (sdk::instance-&gt;get_attack_cooldown() &gt; 0.1f)
  ....
}</code></pre><p>Предупреждение PVS-Studio: <a href="https://pvs-studio.ru/ru/docs/warnings/v674/" rel="noopener noreferrer nofollow">V674</a> [CWE-682, CERT-FLP36-C] The ‘0.1f’ literal of the ‘float’ type is compared to a value of the ‘int’ type. <a href="https://github.com/gravecan/enhance-client/blob/642f90eafd954c076a34d60f811de77fdb9f705c/enhance/modules/shield_breaker/shield_breaker.cpp#L628" rel="noopener noreferrer nofollow">shield_breaker.cpp 628</a></p><p>Такие ляпы нет смысла серьёзно разбирать и описывать.</p><p>Можно спросить: “А что ты хочешь от поделок за 15$?” Да, в общем-то, ничего, но вместо нормальных проектов попадаются они. Мне интересно изучить большие открытые проекты нормального качества, при написании которых активно используется GenAI. А то пока ощущение, что термин “вайб-кодинг” есть, а C++ проектов нет. Или за них стыдно? :)</p><p>Если вы знаете подобные большие проекты, то присылайте ссылки на них в комментарии. Заранее спасибо.</p><p>Предыдущие публикации по мелким проектам:</p><ol><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1354/" rel="noopener noreferrer nofollow">Давайте заглянем в этот самый вайб-код</a>.</p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1366/" rel="noopener noreferrer nofollow">Ревью вайб-кода с гнильцой, который притворяется оптимизированным С++ кодом</a>.</p></li></ol> <a href="https://habr.com/ru/posts/1041016/?utm_campaign=1041016&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 29 May 2026 08:36:47 GMT</pubDate>
    <dc:creator><![CDATA[Andrey2008 (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[genai]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[генеративный ии]]></category><category><![CDATA[c++]]></category><category><![CDATA[си++]]></category><category><![CDATA[открытый исходный код]]></category><category><![CDATA[вайб-кодинг]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vibecodingai — C++ (+2) — 19.05.2026 14:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1036878/</guid>
    <link>https://habr.com/ru/posts/1036878/?utm_campaign=1036878&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🖥 <strong>Создатель C++ разнёс вайбкодинг: “сеньоры не хотят разгребать этот мусор”</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/957/933/46d/95793346d3354475a583aaaf44edba86.jpg" width="1241" height="1280"></figure><p>Бьёрн Страуструп, легендарный создатель C++, в новом двухчасовом интервью резко прошёлся по вайбкодингу.</p><p>Главная претензия простая: сгенерированный код пока слишком часто выглядит красиво только на демке. В реальном проекте он приносит баги, раздувает кодовую базу, плодит уязвимости и плохо поддаётся нормальной проверке.</p><p>Особенно больно это бьёт по опытным разработчикам. Им потом приходится не “магически ускоряться с ИИ”, а читать, чинить и переписывать слоп, который кто-то нагенерировал за пять минут.</p><p>Похожая история уже<a href="https://t.me/linuxacademiya/1109" rel="noopener noreferrer nofollow"> достала и Линуса Торвальдса.</a> Его буквально завалили кривыми AI-отчётами по ядру Linux: вроде бы люди “помогают”, а на практике создают шум, который мешает настоящей разработке.</p><p>Если человек не понимает архитектуру, безопасность, тесты и границы задачи, то вайбкодинг превращается не в ускорение, а в генератор технического долга.</p><p>Сеньоры не боятся ИИ.</p><p>Они просто не хотят провести остаток карьеры, разгребая чужой промптованный мусор.</p><p> Полное интервью нашел в тг тут: <a href="https://t.me/cpluspluc/1451" rel="noopener noreferrer nofollow">https://t.me/cpluspluc/1451</a></p> <a href="https://habr.com/ru/posts/1036878/?utm_campaign=1036878&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 19 May 2026 11:13:57 GMT</pubDate>
    <dc:creator><![CDATA[vibecodingai]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[страуструп]]></category><category><![CDATA[мнение]]></category><category><![CDATA[легенда]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @vibecodingai — C++ (+2) — 14.05.2026 13:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1035112/</guid>
    <link>https://habr.com/ru/posts/1035112/?utm_campaign=1035112&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>В C код может выполниться ещё до <code>main()</code></strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1e8/810/360/1e881036099cb6d3c0d4263bacd8c79f.jpg" width="905" height="825"></figure><p>В Linux и GCC есть constructor-функции - они запускаются автоматически до входа в main().</p><p>Выглядит почти как магия:</p><p>Такую функцию не нужно вызывать вручную. Компилятор сам пометит её как код, который должен выполниться при старте программы.</p><p>Где это используется:</p><p>- инициализация глобального состояния</p><p>- подготовка shared libraries</p><p>- регистрация плагинов</p><p>- настройка runtime-окружения</p><p>- выполнение служебного кода до основной логики</p><p>Именно поэтому в C-программе не всегда всё начинается с main().</p><p>Иногда до него уже кто-то успел поработать.</p><p>Подсмотрел в тг про С++ : <a href="https://t.me/cpluspluc/1449" rel="noopener noreferrer nofollow">https://t.me/cpluspluc/1449</a></p> <a href="https://habr.com/ru/posts/1035112/?utm_campaign=1035112&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 14 May 2026 10:07:36 GMT</pubDate>
    <dc:creator><![CDATA[vibecodingai]]></dc:creator>
      
      <category><![CDATA[c]]></category><category><![CDATA[cpp]]></category><category><![CDATA[linux]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @fascwind — C++ (+1) — 08.05.2026 11:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1032934/</guid>
    <link>https://habr.com/ru/posts/1032934/?utm_campaign=1032934&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/d6e/916/cd0/d6e916cd06cd57cf22e8d695f39a4b51.png" width="1280" height="720"></figure><p><br>Я С++ разработчик из Тюмени. Хочу представить вам свой проект : "Инструментарий Мастера Подземелья" <a href="https://mastertoolkit.ru/" rel="noopener noreferrer nofollow">https://mastertoolkit.ru/</a> (тут лежит рабочий прототип)</p><p>Исходный код выложен тут : <a href="https://gitlab.com/R1nk/dungeonmastertoolkit" rel="noopener noreferrer nofollow">https://gitlab.com/R1nk/dungeonmastertoolkit</a></p><p>В данный момент чувствую выгорание над проектом. Сайт выложен год назад, но не получал ни одного фидбэка. Прошлой осенью провел сессию по днд и выявил для себя пару ошибок и недоработок.</p><p>На текущий момент внесены изменения над кодом и функционалом и не завершен в рабочую сборку. </p><p>Инструментарий для мастеров подземелья. Есть 2 вида генерации событий:</p><ol><li><p>Абстрактная навигация (карты таро, описание мастей и значений. где масти можно описать как положительные так и негативные последствия, а значения можно более конкретизировать. Например отряд гоблинов как препятсвие или обвал).</p></li><li><p>Это события. можно описать дерево событий, из которых можно выбрать случайным способом. Например можно описать случайные квесты или встречи.</p></li><li><p>Журнал приключений (в режиме Сессия туда попадают все выпадающие события и абстрактная навигация)</p></li><li><p>Статистика так же работает в режиме сессии. Графики по выпавшим ситуациям.</p></li></ol> <a href="https://habr.com/ru/posts/1032934/?utm_campaign=1032934&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 08 May 2026 08:59:06 GMT</pubDate>
    <dc:creator><![CDATA[fascwind]]></dc:creator>
      
      <category><![CDATA[dungeons and dragons]]></category><category><![CDATA[tools]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DrMayDay — Rust (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1032036/</guid>
    <link>https://habr.com/ru/posts/1032036/?utm_campaign=1032036&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Rust + LLM: новая и сильная “ОПГ” против C++ и его друзей…</p><p>Есть такая штука с Borrow Checker - он ненавидит людей. Не потому, что он плохой, а потому, что требует держать в голове графы данных всего приложения всё время, пока пишешь. Люди устают, раздражаются, и в итоге - <code>unsafe</code>, чувство стыда перед собой и коллегами, и понеслась. А LLM на это просто… скажем, кхм, “не важно”. Ну, надо так надо. LLM итерирует. И самое забавное - ей можно запретить <code>unsafe</code> прямо в промпте, и она не будет искать обходные пути(ну, может, разок другой - Opus попробует, но это ловится простым поиском по файлам, даже PVS-Studio не нужен, хотя с ним было бы фееричнее). Скорее всего, LLM просто найдёт решение в рамках safe Rust. И это круто.</p><p>Про Python и JS - там ведь основная проблема не скорость даже(и синтаксически значимые пробелы у некоторых), а то, что деплоится не программа, а среда. Интерпретатор, зависимости, версии, “а на проде другой питон”… Сейчас с линковщиком от Zig можно прямо из Windows собрать бинарник под Linux - статически, без танцев(привет musl!), одним пинком. И это не какой-то хак, это просто работает. Получаешь один файл, который либо запустится, либо нет - без сюрпризов в середине.</p><p>C++ тут проигрывает не потому, что он сложный или плохой - он интересный, мощный, с огромной историей и экосистемой. Но именно эта мощность становится проблемой когда код - генерирует LLM(можно выстрелить себе в ногу из гранатомёта, и, самое страшное - не заметить этого). Модель получает слишком много способов сделать что-то, и часть из них - UB. Rust убивает целый класс таких подходов к реализации на уровне компилятора. Это не договорённость и не линтер - это просто не скомпилируется.</p><p>Мне кажется, уникальность этой связки тут в том, что задачи разделились очень чисто: LLM думает про логику, компилятор думает про корректность. И они не мешают друг другу. В C++ - см. выше. Именно то, что делает Rust тяжёлым для людей(кроме евангелистов и стримеров), делает его почти идеальным для этой связки.</p><p>Ну и если кто был травмирован неудачным опытом с “вайб-кодингом”, и сложилось впечатление, что вся эта пляска с LLM, это не серьёзно - попробуйте отложить китайщину(MiniMax, GLM, DeepSeek...), взять фронтир-модель типа “OpenAI Codex GPT-5.5 на XtraHigh” - и дать ей хотелку в виде описания какого-нибудь серверного приложения на Rust, и просто посмотреть что будет через 15-20 минут. Забейте на клоунов со “змейкой” и прочей мелочёвкой из бенчмарков на ютубе, попробуйте реальную задачку(многохопывый релей между серверами со своим протоколом КВН например и клиентами для Win/Linux). Оно сделает. Быстро. Качественно. Это довольно странное ощущение, честно говоря, видеть такое…</p><p>Просто мысли вслух, хотелось поделиться)</p><p>        -s. TekMetrics certified “Master C programmer”, July 1999</p> <a href="https://habr.com/ru/posts/1032036/?utm_campaign=1032036&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 06 May 2026 09:20:56 GMT</pubDate>
    <dc:creator><![CDATA[DrMayDay]]></dc:creator>
      
      <category><![CDATA[Rust]]></category><category><![CDATA[LLM]]></category><category><![CDATA[c++]]></category><category><![CDATA[borrow checker]]></category><category><![CDATA[rust is faster than go]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MeLiza_Beth — Блог компании PVS-Studio (+1) — 30.04.2026 14:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1030096/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1030096/?utm_campaign=1030096&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Тихий враг или молчаливый союзник? Коротко о выравнивании в C++. Часть 3 </strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/595/7c4/284/5957c4284de4c393cd96e36170d73858.png" width="1600" height="902"></figure><p>Мы уже разобрали базовое выравнивание полей и изучили, как наследование наслаивает данные друг на друга. Казалось бы, теперь-то всё — все ловушки изучены. Но не тут-то было! Есть у этой темы ещё одна, по-настоящему тёмная сторона, про которую не так часто говорят. </p><p>Одно короткое слово virtual полностью переписывает "геометрию" класса, внося в выравнивание свои коррективы, которые трудно игнорировать. Давайте разберёмся, что на самом деле происходит под капотом, когда выравнивание сталкивается <a href="https://pvs-studio.ru/ru/blog/posts/cpp/1369/" rel="noopener noreferrer nofollow">с виртуальностью</a>.</p> <a href="https://habr.com/ru/posts/1030096/?utm_campaign=1030096&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 30 Apr 2026 11:33:07 GMT</pubDate>
    <dc:creator><![CDATA[MeLiza_Beth (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[alignment]]></category><category><![CDATA[virtual]]></category><category><![CDATA[padding]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @YuriPanchul — C++ (+4) — 27.04.2026 18:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1028712/</guid>
    <link>https://habr.com/ru/posts/1028712/?utm_campaign=1028712&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Чернобыльское лето 1986 года, когда все киевские одноклассники разъехались по разным концам СССР подальше от радиации, было для меня супер-продуктивным в смысле изучения программирования. Я ходил в контору человека по фамилии Долина, бывшего полковника танковых войск из Донецка, который переквалифицировался в компьтеризатора украинского образования. Там я работал на компьютерах MSX Yamaha, выучил программирование на Си. Компилятор назывался ASCII C (сейчас в комментах появятся умники которые будут мне говорить, что ASCII это кодировка, а я им буду кидать ссылку что это еще и японская компания).</p><p>Долине мое увлечение Си не нравилось, он хотел чтобы я больше писал программ на Бейсике, которые он демонстрировал людям из украинских министерств и студии мультфильмов (некоторые программы были графические). Кроме графики я сделал еще например программу которая фиксировала в реальном времени действия футболистов во время матча, через нажатия клавиш наблюдателем. Контора Долины была у стадиона, оттуда доносились вопли болельщиков. Долина это показывал кому-то по спортивной линии.</p><p>В конце лета я полетел на Новосибирскую Летнюю Школу Юных Программистов, где выучил ассемблер Z80 и сделал поддержку параллельного выполнения нескольких Си функций с помощью переключения контекстов в обработчике прерывания по таймеру. С сохранением регистров в дексрипторе задачи в списке задач. За это я получил диплом первой степени. По-моему дипломы вручал академик Ершов, хотя может я путаю и мы встретились с ним в академгородке куда на тоже возили.</p><p>На школе было невероятное количество комаров, а также красивая девочка из Томска, которая мне нравилась, и ее подружка, которой нравился я. Из Украины еще был юный гений из Харькова, который постоянно спорил со мной, что персоналки фигня, а мейнфреймы - это круто. Так как я успел поработать и на мейнфреймах, споры были довольно развесистые.</p><p>Еще там я увидел первые советские программы западного качества - редактор tor(?), программу низкоуровневой работы с диском и оконный отладчик. Они были написаны на Си и ассемблере аккуратно, как примеры в западных книжках. Советский код который я видел до этого (и большинство после этого) был написан тяп-ляп. Писали эти программы местные аспиранты которые были также преподавателями школы.</p><p>Помимо этих программ я привез на флоппи-дисках со школы CP/M (хуже файловая система чем в MSX-DOS), среду Turbo Pascal, интерпретатор Lisp, компилятор Nevada Fortran, еще два компилятора Си (Aztec C и BDS C) и даже компилятор с подмножества языка Ada, который я знал теоретически, но никогда не использовал.</p><p>29 лет спустя, в 2017 году я приехал на ту же новосибирскую школу в качестве инструктора по Verilog и FPGA. Еще там был Борис Файфель который учил детей Лиспу или чему-то такому.</p> <a href="https://habr.com/ru/posts/1028712/?utm_campaign=1028712&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 27 Apr 2026 15:59:08 GMT</pubDate>
    <dc:creator><![CDATA[YuriPanchul]]></dc:creator>
      
      <category><![CDATA[Lisp]]></category><category><![CDATA[ADA]]></category><category><![CDATA[Z80]]></category><category><![CDATA[Летняя Школа Юных Программистов]]></category><category><![CDATA[ЛШЮП]]></category><category><![CDATA[Ершов]]></category><category><![CDATA[Новосибирск]]></category><category><![CDATA[Yamaha]]></category><category><![CDATA[Чернобыль]]></category><category><![CDATA[СССР]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @viordash — Искусственный интеллект (+3) — 25.04.2026 18:05]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027882/</guid>
    <link>https://habr.com/ru/posts/1027882/?utm_campaign=1027882&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Оптимизация контекста для Claude Code на большом проекте (иногда и 50% экономия токенов)</strong></p><p>Работаю над большим C++ проектом - реализация сетевого протокола. Использую Claude Code как основной инструмент. Со временем заметил: каждый новый чат начинается с того, что агент долго читает README.md, который разросся до 1000+ строк и 60 КБ.</p><p><strong>Проблема</strong></p><p>В CLAUDE.md была прописана команда читать README.md в начале каждого диалога, агенту нужно дать контекст проекта. Пока проект был небольшим это работало нормально. Но README рос вместе с проектом и в итоге стал содержать всё: архитектуру, логику DTLS, настройки веб-интерфейса, описание протокола, инструкции по сборке.</p><p>И как результат:</p><ul><li><p>Агент тратит тысячи токенов на анализ файла до начала работы</p></li><li><p>Если задача касается только фронтенда, модель всё равно загружает детали реализации ядра протокола. Лишний контекст снижает точность ответов.</p></li></ul><p><strong>Решение</strong></p><p>Вместо одного большого файла использовать иерархию маленьких, в отдельной папке <code>claude-context/</code>:</p><pre><code>claude-context/
├── context-claude.md       # общая архитектура и навигация (~90 строк)
├── context-AC-claude.md    # Access Controller
├── context-WTP-claude.md   # WTP Agent
├── context-WEB-claude.md   # Web Interface
└── context-TESTS-claude.md # тесты
</code></pre><p>Главный файл <code>context-claude.md</code> содержит краткое описание проекта и таблицу-навигатор: какой файл читать для какой области. В дочерних файлах описана детализация по модулям, каждый 100-130 строк.</p><p>Инструкция в CLAUDE.md теперь выглядит так:</p><blockquote><p>“Start each new conversation by reading claude-context/context-claude.md. For deeper context on specific areas, read the relevant file from that directory.”</p></blockquote><p>Агент читает главный файл (90 строк), понимает область задачи, подгружает только нужный дочерний контекст.</p><p><strong>Замер</strong></p><p>Чтобы проверить эффект, я поставил Claude одну и ту же задачу в двух разных конфигурациях:</p><blockquote><p>“Добавь тесты для WtpConfigController и WtpRadioController, проверь что если WTP address не строка, то возникает исключение std::runtime_error”</p></blockquote><pre><code>| Параметр             | README.md (60 КБ) | Иерархический контекст | Разница  |
| :------------------- | :---------------- | :--------------------- | :------- |
| Токены на сообщения  | 36.8k             | 17.6k                  | -53%     |
| Всего токенов        | 56.7k             | 37.6k                  | -34%     |
| Рост usage за задачу | +11%              | +6%                    | В 2 раза |
| Скорость анализа     | Заметная пауза    | Почти мгновенный старт |          |
</code></pre><p><strong>Важный момент</strong></p><p>README.md остался нетронутым - это документация для людей. Файлы в <code>claude-context/</code> - отдельный артефакт, написанный под AI: плотно, без лирики, с ASCII-схемами и таблицами. Я старался не смешивать два разных назначения в одном файле.</p><p>При небольшом проекте в этом подходе смысла нет, накладные расходы на поддержку двух наборов документации не оправдаются.</p> <a href="https://habr.com/ru/posts/1027882/?utm_campaign=1027882&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 15:05:10 GMT</pubDate>
    <dc:creator><![CDATA[viordash]]></dc:creator>
      
      <category><![CDATA[claude code]]></category><category><![CDATA[llm]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[контекстное окно]]></category><category><![CDATA[документация]]></category><category><![CDATA[ai-агенты]]></category>
  </item>
  

	
  

  

  

    

  

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

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+1) — 24.04.2026 11:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1027386/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1027386/?utm_campaign=1027386&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Тема неопределённого поведения (UB) в языке C++ освещается и обсуждается многие годы, но это не значит, что она исчерпала себя. Это плата, которую программисты отдают за эффективные оптимизации кода, такие как удаление ряда проверок.  </p><p>C++ - опасный инструмент, и не помешает лишний раз напомнить, как правильно держать его в руках. Причём с приходом инструментов вайб-кодинга ситуация, скорее всего, даже ухудшится, так как станет ещё сложнее удерживать неопределённое поведение под контролем. В докладе обсудили эту тему, заглянув в будущее. </p><iframe id="69eb28684b66d902aa913a13" src="https://embedd.srv.habr.com/iframe/69eb28684b66d902aa913a13" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Полезные ссылки из доклада:</p><ul><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/0374/" rel="noopener noreferrer nofollow">Undefined behavior ближе, чем вы думаете</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1024/" rel="noopener noreferrer nofollow">Ложные представления программистов о неопределённом поведении</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1298/" rel="noopener noreferrer nofollow">Подножка для AI в виде UTF-8</a></p></li><li><p><a href="https://pvs-studio.ru/ru/blog/posts/cpp/1215/" rel="noopener noreferrer nofollow">Путеводитель C++ программиста по неопределённому поведению</a></p></li></ul><p><em>Примечание. </em>Был задан вопрос про безопасные компиляторы (ГОСТ Р 71206—2024). Подробнее с этой темой можно познакомиться здесь:&nbsp;<a href="https://pvs-studio.ru/ru/webinar/rbpo/content/#Process12" rel="noopener noreferrer nofollow">Использование безопасной системы сборки программного обеспечения</a></p><p>Сделайте свой проект чистым с PVS-Studio. Месяц бесплатного использования по&nbsp;<a href="https://pvs-studio.ru/training_webinar" rel="noopener noreferrer nofollow">промокоду</a>.</p> <a href="https://habr.com/ru/posts/1027386/?utm_campaign=1027386&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Apr 2026 08:24:56 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[undefined behavior]]></category><category><![CDATA[доклад]]></category><category><![CDATA[неопределённое поведение]]></category><category><![CDATA[вайбкодинг]]></category><category><![CDATA[cpp]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JordanCpp — C (+4) — 20.04.2026 14:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1025592/</guid>
    <link>https://habr.com/ru/posts/1025592/?utm_campaign=1025592&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Переосмысление библиотеки <a href="https://github.com/JordanCpp/LDL" rel="noopener noreferrer nofollow">LDL</a>.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8eb/316/594/8eb3165940792d960cabf23cb81bb10c.jpg" width="802" height="632"></figure><p>Я полностью пересмотрел концепцию библиотеки LDL.</p><p><strong>Что такое LDL?</strong><br>Это графическая библиотека с единым API для всех систем как старых, так и новых.</p><p>Раньше я писал её на C++98, что давало хорошую портабельность. Но сейчас я пересмотрел многие тезисы, которые декларировал на GitHub, чтобы наконец добраться до первого релиза.</p><p>Новая стратегия</p><p>Я решил выпускать релизы&nbsp;<strong>без реализации полного функционала</strong>&nbsp;(графика, звук, шрифты и т.д.) постепенно, итеративно.</p><ul><li><p>Перешёл на&nbsp;<strong>C89</strong>&nbsp;для максимальной переносимости. Это не только DOS или Windows 3.x, но и старые системы вроде Solaris, PlayStation 1 и другие.</p></li><li><p>Для&nbsp;<strong>первого релиза</strong>&nbsp;реализую минимальный базовый функционал: графику (OpenGL, Vulkan), окна и события. По возможностям аналог GLFW.</p></li><li><p>С каждым следующим релизом буду добавлять: 2D-рендер, звук, шрифты и прочее.</p></li></ul><p>Лицензия и целевые платформы</p><ul><li><p>Лицензия меняется на&nbsp;<strong>LGPLv3</strong>.</p></li><li><p>На старте поддерживаются&nbsp;<strong>Windows и Linux</strong>.</p></li></ul><p>Качество и инструменты</p><p>При разработке использую:</p><ul><li><p>AddressSanitizer (ASan)</p></li><li><p>UndefinedBehaviorSanitizer (UBSan)</p></li><li><p>Различные анализаторы кода</p></li></ul><p>Я считаю, что такая стратегия полезнее, чем годами доводить библиотеку до версии 1.0 в офлайн-режиме.</p><p><strong>Примеры и бэкенды</strong></p><ul><li><p>Добавлю&nbsp;<strong>десятки примеров</strong>&nbsp;с OpenGL 1.x, OpenGL 3.x и Vulkan.</p></li><li><p>Буду добавлять&nbsp;<strong>бэкенды для LDL</strong>: не только под ОС, но и поверх других графических библиотек — SDL, SFML, GLFW и т.д.</p></li><li><p><strong>API остаётся единым</strong>&nbsp;для всех бэкендов.</p></li></ul><p>Это позволит сразу добавить поддержку звука и шрифтов (через бэкенды), а в нативных версиях реализовывать их позже.</p><p>&nbsp;<strong>2D-рендер без границ</strong></p><p>Одной из главных задач LDL я вижу создание&nbsp;<strong>единого 2D-интерфейса</strong>, который стирает различия между поколениями графики.</p><p>Вам не нужно думать о том, что находится в системе: современная видеокарта с&nbsp;<strong>Vulkan</strong>, старый ускоритель с&nbsp;<strong>OpenGL 1.2</strong>&nbsp;или вообще только центральный процессор (<strong>Software Rendering</strong>).</p><ul><li><p><strong>Единый интерфейс</strong>: Вы используете одни и те же команды для рисования пикселей, линий и спрайтов.</p></li><li><p><strong>Адаптивность</strong>: LDL сам выберет наиболее эффективный способ вывода изображения. На современной системе это будет аппаратное ускорение, а на «железе» без видеокарты оптимизированный программный растеризатор.</p></li><li><p><strong>Визуальная честность</strong>: Ваш визуальный стиль останется неизменным, на чем бы он ни запускался. Это дает возможность делать игры и приложения, которые выглядят и работают одинаково и на ретро-ноутбуке, и на современном мониторе.</p></li></ul><p><strong>Философия: Машина времени в вашем коде</strong></p><p>Зачем тратить силы на поддержку систем, которые многие считают «трупами»?</p><p><strong>1. Борьба с цифровым забвением</strong></p><p>Современный софт живет 3–5 лет. Мы выбрасываем железо не потому, что оно сломалось, а потому, что софт стал слишком тяжелым и ленивым. LDL — это протест против «запланированного устаревания». Я хочу, чтобы код, написанный сегодня, мог дышать в железе любой эпохи.</p><p><strong>2. Инженерный аскетизм</strong></p><p>Когда у тебя гигабайты памяти, ты перестаешь ценить каждый байт. Написание библиотеки под C89 для слабого железа — это духовная практика для программиста. Это возвращение к искусству находить изящные решения в условиях жестких ограничений. Каждый сэкономленный такт процессора — это дань уважения инженерам прошлого.</p><p><strong>3. Преемственность поколений</strong></p><p>Мы стоим на плечах гигантов, но часто забываем их имена. LDL сохраняет возможность для диалога между эпохами. Это инструмент, который позволяет современному разработчику почувствовать «металл» старых машин, не теряя связи с современными технологиями вроде Vulkan.</p><p><strong>Итог</strong></p><p>LDL — это&nbsp;<strong>Little Directmedia Layer</strong>. Он маленький не потому, что слабый, а потому, что в нем нет ничего лишнего. Это попытка создать код, который будет принадлежать не конкретной версии ОС, а истории программирования в целом.</p><p>Один API. Один код. Тридцать лет компьютерной истории.</p> <a href="https://habr.com/ru/posts/1025592/?utm_campaign=1025592&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 20 Apr 2026 11:17:08 GMT</pubDate>
    <dc:creator><![CDATA[JordanCpp]]></dc:creator>
      
      <category><![CDATA[c89]]></category><category><![CDATA[c++]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @A-G-B — Блог компании PVS-Studio (+4) — 30.03.2026 17:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1017014/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Всё, что нужно знать для начала работы в PVS-Studio</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a9a/ced/548/a9aced548cf807529f37c7f0f605f355.png" width="975" height="549"></figure><p>Статический анализатор PVS-Studio — это инструмент для поиска ошибок в коде на протяжении всего жизненного цикла проекта. <br>В новой статье разберём основные <a href="https://pvs-studio.ru/ru/blog/posts/1358/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">особенности анализатора PVS-Studio</a>, сценарии и варианты анализа, а также узнаем всё, что нужно знать для начала работы с инструментом.</p> <a href="https://habr.com/ru/posts/1017014/?utm_campaign=1017014&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 30 Mar 2026 14:19:03 GMT</pubDate>
    <dc:creator><![CDATA[A-G-B (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[pvs-studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[с++]]></category><category><![CDATA[c#]]></category><category><![CDATA[java]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[sast]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ilnurKh — C++ — 22.03.2026 23:27]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1013450/</guid>
    <link>https://habr.com/ru/posts/1013450/?utm_campaign=1013450&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Сравнивал разные методы сделать call-once (а точнее инициализацию синглтона) - далее небольшие заметки.</p><p>Итак, нам нужно создать какой-то объект, пусть даже что-то нетривиальное (для определённости можно представлять что мы хотим прочитать данные из файла/эмбеддет ресурсов и разложить эти данные в хеш-мапу для будущих чтений). Рассмотрим следующие варианты:</p><ol><li><p>статичный глобальный объект, вычисление вызывается в конструкторе</p></li><li><p>статичный глобальный объект + std::call_once</p></li><li><p>статичный локальный объект в функции, вычисление вызывается в конструкторе</p></li></ol><p>Чтобы в годболте видеть что и где вызывается - определяем тип имеющий только объявления методов (это заставит компилятор ставить явный <code>call</code>)</p><pre><code class="cpp">struct TSomeExternal {
    TSomeExternal(int);
    ~TSomeExternal();

    int DoCalc();
    char Data[60]; // просто чтобы было проще увидеть
};
</code></pre><p>Особенности <strong>первого варианта</strong>:</p><ul><li><p>вычисление "до main"</p></li><li><p>неконтролируемый порядок инициализации глобальных ответов =&gt; нельзя иметь зависимости между такими объектами</p></li><li><p>вычисление только в рамках 1 потока</p></li><li><p>уникальный плюс: нет проверок "на горячем цикле" - при обращении к объекту вызывающая функция может считать что данные уже готовы (но именно этот плюс стоит нам второго пункта)</p></li></ul><p>В <a href="https://godbolt.org/z/Pf4nvzbjh" rel="noopener noreferrer nofollow">годболте</a> можно посмотреть на func1 - видно что она скомпилилась просто в забор поинтера, и <code>call</code></p><pre><code class="cpp">TSomeExternal GlobalValue(7);
int func1() {
    int x = GlobalValue.DoCalc();
    return x + 14;
}
</code></pre><p>Также видно что были порождены - указание что нужно разместить объект</p><pre><code>GlobalValue:
        .zero   60
</code></pre><p>А также <code>_GLOBAL__sub_I_example.cpp</code> - там видно, что вызывается конструктор, и регистрируется указатель на деструктор в пост-колбеках (<code>__cxa_atexit</code>)</p><p><strong>Второй вариант</strong> (более правдоподобно было бы внести call_once внутрь глобального объекта, но для простоты сравнения сделал как ниже)</p><pre><code class="cpp">static std::once_flag flag;
static std::unique_ptr&lt;TSomeExternal&gt; ptr;
void init() {ptr = std::make_unique&lt;TSomeExternal&gt;(7);}

int func2() {
    std::call_once(flag, init);
    int x = ptr-&gt;DoCalc();
    return x + 14;
}
</code></pre><ul><li><p>настоящая инициализация случается только в момент первого использования (ленивая инициализация). Это может быть как плюс (позволяет не тратиться на инициализацию если данные не будут использоваться), так и минус (первые запросы/итерации будут медленными)</p></li><li><p>разные инициализаторы данных вполне могут работать одновременно из разных потоков</p></li><li><p>имхо - дорогой основной цикл (очень много инструкций до <code>TSomeExternal::DoCalc</code>) - это всё подготовка вызова <code>call pthread_once</code>, который будет выполнен каждый раз</p></li></ul><p><strong>Третий вариант</strong> <a href="https://godbolt.org/z/8Goav3o6v" rel="noopener noreferrer nofollow">годболт</a></p><pre><code class="cpp">int func3() {
    static TSomeExternal prepared = {7};
    int x = prepared.DoCalc();
    return x + 14;
}
</code></pre><ul><li><p>в рантайме есть проверка - но это проверка и так нужного нам указателя на null</p></li></ul><pre><code>push    rbx
movzx   eax, byte ptr [rip + guard variable for func3()::prepared]
test    al, al
je      .LBB0_1
</code></pre><ul><li><p>если указатель не нулевой, то переход не будет выполнен и мы сразу переходим к</p></li></ul><pre><code>        lea     rdi, [rip + func3()::prepared]
        call    TSomeExternal::DoCalc()@PLT
</code></pre><ul><li><p>в случае если указатель не готов, то подготовка случается под блокировкой (<code>__cxa_guard_acquire</code>)</p></li><li><p>конкретно в годболте не видно, но создаются слоты для <code>guard variable for func3()::prepared</code> и <code>func3()::prepared</code> (в этом смысле разницы со вторым вариантом мало)</p></li></ul><p>Итого: ленивое вычисление, также возможна многопоточная инициализация, а также дешёвый success-path</p><p>Я бы назвал относительным неудобством третьего варианта, что указатель оказывается скрыт внутри функции, и надо сделать ещё доп действие чтобы использовать объект из нескольких функций. Пример такой обёртки <a href="https://github.com/ytsaurus/ytsaurus/blob/70adf41209de55a50cd90685471c838782197360/util/generic/singleton.h#L115" rel="noopener noreferrer nofollow">Singleton</a>.</p> <a href="https://habr.com/ru/posts/1013450/?utm_campaign=1013450&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 22 Mar 2026 20:27:45 GMT</pubDate>
    <dc:creator><![CDATA[ilnurKh]]></dc:creator>
      
      <category><![CDATA[call_once]]></category><category><![CDATA[singleton]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @FaryaRos — Linux (+3) — 16.03.2026 19:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010982/</guid>
    <link>https://habr.com/ru/posts/1010982/?utm_campaign=1010982&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>NixOS: идея, до&nbsp;которой индустрия доросла только сейчас.</strong></p><p>Кажется, NixOS наконец выходит из&nbsp;категории системы «для своих» и становится все заметнее в&nbsp;инженерной среде. Это закономерно: он очень точно попал в&nbsp;проблемы, с&nbsp;которыми команды массово столкнулись только в&nbsp;последние годы.</p><p>История началась в 2003&nbsp;году, когда исследователь Элко Долстра и его коллеги в&nbsp;Утрехтском университете запустили проект Nix. Это исследовательский проект, который включал пакетный менеджер и собственный декларативный язык. Идея&nbsp;была сделать так, чтобы пакеты и зависимости собирались предсказуемо, не&nbsp;конфликтовали между собой и не&nbsp;превращали систему в&nbsp;хаос после очередного обновления. Чуть позже из&nbsp;этой логики вырос NixOS, где тот&nbsp;же подход применили уже ко всей операционной системе.</p><p>В&nbsp;этом и&nbsp;был главный поворот. Nix с&nbsp;самого начала смотрел на&nbsp;систему не&nbsp;как&nbsp;на&nbsp;набор вручную настроенных файлов и команд, а&nbsp;как&nbsp;на&nbsp;то, что&nbsp;можно описать целиком. Пакеты хранятся изолированно, разные версии могут спокойно жить рядом, а&nbsp;состояние машины задается через конфиг. За&nbsp;счет этого обновления становятся атомарными.</p><p>Это особенно интересно на&nbsp;фоне обычных Linux‑дистрибутивов. Там текущее состояние системы часто является результатом длинной цепочки действий: что‑то поставили, что‑то удалили, где‑то поправили конфиг, где‑то забыли. В&nbsp;NixOS логика другая: ты описываешь&nbsp;желаемое состояние, а&nbsp;система приводит машину именно к&nbsp;нему. Если новая конфигурация не&nbsp;взлетела, предыдущее состояние никуда не&nbsp;исчезает.</p><p>😏 Почему NixOS набирает популярность именно сейчас? Потому что&nbsp;индустрия наконец доросла до&nbsp;его сильных сторон. Чем больше у&nbsp;команды окружений, CI/CD, инфраструктуры как&nbsp;кода и цены ошибки, тем важнее воспроизводимость и предсказуемость. То, что&nbsp;раньше выглядело как&nbsp;нишевая экзотика, сегодня все чаще выглядит как&nbsp;очень здравый инженерный выбор.</p><p><strong>Многие современные immutable‑системы по&nbsp;сути идут в&nbsp;ту&nbsp;же сторону, куда NixOS пошел еще много лет назад.</strong></p><p>А&nbsp;если хочется не&nbsp;просто прочитать про&nbsp;Nix, а&nbsp;разобраться, как&nbsp;он работает на&nbsp;практике, приходите на&nbsp;наш открытый воркшоп.</p><p>📹 Открытый воркшоп в&nbsp;рамках ИнженеркаТех Плюс, <strong>18&nbsp;марта в 19:00&nbsp;по&nbsp;МСК. </strong>Александр Сергеев из&nbsp;сообщества RULKC, Russian Linux Kernel Community, расскажет про&nbsp;Nix и функциональный подход к&nbsp;пакетам и сборке.</p><p>Если вы хотите получить полный контроль над окружением и наконец закрыть вопрос воспроизводимых сборок, этот воркшоп для&nbsp;вас. Разберем ключевые концепции Nix и наглядно покажем, чем он отличается от&nbsp;привычных систем управления пакетами.</p><p>Зарегистрироваться <a href="https://t.me/inz_infra_bot" rel="noopener noreferrer nofollow">тут</a></p> <a href="https://habr.com/ru/posts/1010982/?utm_campaign=1010982&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 16:22:43 GMT</pubDate>
    <dc:creator><![CDATA[FaryaRos]]></dc:creator>
      
      <category><![CDATA[nix]]></category><category><![CDATA[nixos]]></category><category><![CDATA[linux]]></category><category><![CDATA[linux kernel]]></category><category><![CDATA[linux kernel development]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
