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

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @NikitaPanevin — Блог компании PVS-Studio (+3) — 24.04.2026 14:52]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1027530/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1027530/?utm_campaign=1027530&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>ИИ что? Проверяем Semantic Kernel</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/ff3/597/b8e/ff3597b8e3a002df50bedb168a1711a4.png" width="975" height="550"></figure><p>Проекты, связанные с интеграцией искусственного интеллекта, всё чаще становятся частью повседневной разработки. Один из таких проектов — <a href="https://github.com/microsoft/semantic-kernel" rel="noopener noreferrer nofollow">Semantic Kernel</a>. Он представляет собой SDK для построения AI-агентов и оркестрации LLM-сценариев и активно развивается компанией Microsoft.</p><p>Однако под капотом даже самых современных решений скрывается вполне обычный C# код со всеми присущими ему проблемами. Поэтому мы проверили проект и написали статью о самых интересных <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1367/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore&amp;utm_content=article" rel="noopener noreferrer nofollow">ошибках в коде Semantic Kernel</a>.</p> <a href="https://habr.com/ru/posts/1027530/?utm_campaign=1027530&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Apr 2026 11:52:54 GMT</pubDate>
    <dc:creator><![CDATA[NikitaPanevin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[.net]]></category><category><![CDATA[open source]]></category><category><![CDATA[программирование]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[semantic kernel]]></category><category><![CDATA[pvs-studio]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 03.04.2026 08:34]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018770/</guid>
    <link>https://habr.com/ru/posts/1018770/?utm_campaign=1018770&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/memstechtips/Winhance/" rel="noopener noreferrer nofollow">Winhance</a>. Это приложение на C#, предназначенное для удаления лишних программ, оптимизации и настройки работы с Windows 10/11 - от управления программным обеспечением до оптимизации и настройки системы, </p><p>Winhance включает в себя большинство тех же улучшений, что и <a href="https://github.com/memstechtips/UnattendedWinstall" rel="noopener noreferrer nofollow">UnattendedWinstall</a>, но без необходимости чистой установки Windows.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/94e/047/3b9/94e0473b9d07170c322de844c3fccf9d.png" width="1920" height="1080"></figure> <a href="https://habr.com/ru/posts/1018770/?utm_campaign=1018770&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 03 Apr 2026 05:34:08 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Winhance]]></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[Пост @PvsTeam — Блог компании PVS-Studio (+3) — 05.03.2026 09:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/1006710/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🚀 <strong>Бесплатный курс для разработчиков: создаём свой язык программирования!</strong>    </p><p>Приглашаем вас пройти наш курс и разобраться, как устроены языки программирования изнутри.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6d1/859/4ed/6d18594edc8ab53337ad2da2c996d864.png" width="1920" height="1080"></figure><p>Изначально курс делали для прохождения внутри компании, но решили, что полезного материала так много, что хочется рассказать всему миру!</p><p>Этот курс подойдёт разработчикам, которые хотят выйти за рамки повседневной разработки и глубже понять фундаментальные принципы работы кода. Да, примеры будут на C++, но сам материал гораздо шире и будет полезен программистам с любым стеком. Независимо от того, пишете вы на C++, C#, Java или любом другом языке, понимание внутренней архитектуры языков сделает вас сильнее как инженера.</p><p>В рамках курса мы шаг за шагом разберём, как создаётся язык программирования:<br> — что такое лексер и парсер и какую роль они играют;<br> — как работает семантический анализ;<br> — как происходит вычисление и обработка кода;<br> — как все эти части объединяются в единую систему.</p><p>Вы увидите, как текст программы превращается в структуру, понятную машине, и поймёте, какие решения стоят за этим процессом.</p><p>Даже если вы не планируете создавать собственный язык программирования, курс поможет чуть глубже понять, как всё это устроено "под капотом", расширить технический кругозор и по-новому взглянуть на привычные инструменты. Это хороший способ систематизировать знания, освежить базовые концепции и просто обсудить интересные темы с коллегами.</p><p>Мы постарались сделать материал одновременно понятным и практико-ориентированным: минимум абстракции ради абстракции — максимум смысла.</p><p>Если вы хотите лучше понимать, что происходит "под капотом" программирования и прокачать инженерное мышление — этот курс для вас.</p><p>👉 Подробности и доступ <a href="https://pvs-studio.ru/ru/blog/training/courses/davajte-sozdadim-yazyk-programmirovaniya/?utm_source=habr&amp;utm_medium=pvsteam" rel="noopener noreferrer nofollow">к курсу по ссылке. </a></p><p>Присоединяйтесь и изучайте программирование глубже — бесплатно!</p> <a href="https://habr.com/ru/posts/1006710/?utm_campaign=1006710&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 05 Mar 2026 06:18:00 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[курс]]></category><category><![CDATA[cpp]]></category><category><![CDATA[создание языка программирования]]></category><category><![CDATA[лексер]]></category><category><![CDATA[java]]></category><category><![CDATA[c#]]></category><category><![CDATA[парсер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @konturtech — Блог компании Контур (+2) — 24.02.2026 14:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/skbkontur/posts/1003052/</guid>
    <link>https://habr.com/ru/companies/skbkontur/posts/1003052/?utm_campaign=1003052&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Статический анализ генерируемой OpenApi-разметки и .NET 10</strong></p><p>Привет, Хабр! 👋 На связи Саша Кузнецов, ведущий инженер-программист в Контуре.</p><p>Начиная с версии .NET 10 Microsoft решила поломать обратную совместимость в отношении статических анализаторов генерируемой OpenApi-разметки.</p><pre><code class="cs">[HttpGet("{id}")]
[ProducesResponseType&lt;User&gt;(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task&lt;IActionResult&gt; GetUser(int id)
{
    var user = users.FirstOrDefault(p =&gt; p.Id == id);
    if (user == null)
        return NotFound();

    return Ok(user);
}</code></pre><p>Раньше можно было возвращать IActionResult, или ActionResult, размечая типы ответов специальными атрибутами типа ProducesResponseType (см. код 1). Это позволяло включить потом статический анализатор добавлением в настройки проекта специального атрибута IncludeOpenAPIAnalyzers (см. код 2) и получать предупреждения на этапе компиляции, или статического анализа кода (см. код 3).  </p><pre><code class="xml">&lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net10.0&lt;/TargetFramework&gt;
    &lt;IncludeOpenAPIAnalyzers&gt;true&lt;/IncludeOpenAPIAnalyzers&gt;
  &lt;/PropertyGroup&gt;</code></pre><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/668/27d/24a/66827d24a01ff82cbdb886ea3f24c5a3.png" width="1407" height="718"></figure><p>Увы, но с выходом .NET 10 этот подход был объявлен устаревшим (см.:&nbsp;<a href="https://learn.microsoft.com/ru-ru/aspnet/core/breaking-changes/10/openapi-analyzers-deprecated" rel="noopener noreferrer nofollow">https://learn.microsoft.com/ru-ru/aspnet/core/breaking-changes/10/openapi-analyzers-deprecated</a>&nbsp;и&nbsp;<a href="https://github.com/aspnet/Announcements/issues/521" rel="noopener noreferrer nofollow">https://github.com/aspnet/Announcements/issues/521</a>). Microsoft решила сосредоточиться на работе через Results (см. код 4), которые появились в .NET 7. В них статический анализ поддерживается "из коробки" из-за строгой типизации.</p><pre><code class="cs">[HttpGet("{id}")]
public async Task&lt;Results&lt;Ok&lt;User&gt;, NotFound&gt;&gt; GetUser(int id)
{
    var user = users.FirstOrDefault(p =&gt; p.Id == id);
    if (user == null)
        return TypedResults.NotFound();

    return TypedResults.Ok(user);
}</code></pre><p>Сама тенденция не сильно радует. В старых проектах IActionResult и ActionResult (их пока не объявили устаревшими, но без статического анализа ошибок разметки они начнут терять привлекательность) используются много где.  </p> <a href="https://habr.com/ru/posts/1003052/?utm_campaign=1003052&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Feb 2026 11:48:19 GMT</pubDate>
    <dc:creator><![CDATA[konturtech (Контур)]]></dc:creator>
      
      <category><![CDATA[openapi]]></category><category><![CDATA[.net10]]></category><category><![CDATA[c#]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JordanCpp — Старое железо (+4) — 21.02.2026 15:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1002196/</guid>
    <link>https://habr.com/ru/posts/1002196/?utm_campaign=1002196&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/882/908/6b0/8829086b0e7651718f99b67de3bb3433.png" width="594" height="789"></figure><p>Приветствую, Хабравчане!</p><p><strong>Задумывались ли вы, насколько высок современный налог на железо в разработке ПО?</strong></p><p>У меня в руках настоящий «старичок» из 2002-го: сокет 478, матплата GA-8IR2003, Celeron 1700 МГц (по силам как Pentium III на 1 ГГц, но с поддержкой SSE2), 2 Гб ОЗУ, GeForce 4 MX и верный HDD на 40 Гб.</p><p>Я хочу написать о нем статью, но не в стиле ностальгический обзор ретро-игр такого в сети полно. Моя цель вдохнуть в него жизнь и проверить, пригоден ли этот 23-летний дедушка для&nbsp;<strong>современной разработки</strong>.</p><p>На борт успешно встают Windows 7 и Debian 11, что открывает доступ к актуальному софту, IDE и библиотекам. Хочется понять: реально ли на таком непотребстве поднять бэкенд на C# или собрать что-то серьезное на C++?</p><p>Запасной вариант, если основному ПК не хватит инструкций.</p><p>В запасе ПК: Athlon x4 640, 8гб ОЗУ, ssd 256.</p><p>На нем, отключая ядра и понижая частоту можно добиться симуляции ПК начиная с 2000-ого по 2010 год. Думаю этот вариант будет предпочтительнее. Но начну конечно с celeron'а.</p><p><strong>Что планирую потестить:</strong></p><ol><li><p><strong>C# под Linux:</strong>&nbsp;Запустить бэкенд и посмотреть, не «умрет» ли система.</p></li><li><p><strong>Базы данных:</strong>&nbsp;Погонять PostgreSQL 9.4 (она еще дружит с 32-битными процессорами).</p></li><li><p><strong>C++:</strong>&nbsp;Сравнить скорость сборки проекта с модулями и без них.</p></li><li><p><strong>Безумный челлендж:</strong>&nbsp;Попробовать собрать&nbsp;<strong><em>userver</em></strong>. В чате разработчиков сказали "вряд ли взлетит", а мне тем более интересно проверить.</p></li><li><p><strong>IDE:</strong>&nbsp;Какая версия Visual Studio оживет и можно ли в ней работать без боли.</p></li></ol><p><strong>Прошу совета у сообщества:</strong>&nbsp;накидайте идей! Какие бенчмарки прогнать? Какой софт или специфические проекты попробовать собрать, чтобы нащупать предел возможностей?</p><p>Будет интересно сделать вывод: пригоден ли древний ПК хоть для какой-то разработки сегодня, или «налог на железо» стал неподъемным. Жду ваши предложения!</p><p>Update: Поправил текст, ошибки и очепятки.</p> <a href="https://habr.com/ru/posts/1002196/?utm_campaign=1002196&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 21 Feb 2026 12:53:26 GMT</pubDate>
    <dc:creator><![CDATA[JordanCpp]]></dc:creator>
      
      <category><![CDATA[бенчмарки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @0xInnominatus — Solidity (+3) — 17.02.2026 17:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1000588/</guid>
    <link>https://habr.com/ru/posts/1000588/?utm_campaign=1000588&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Добавил поддержку типов System.UInt128 и System.Int128 в основную web3-библиотеку для шарпистов/дотнетчиков,— <a href="https://github.com/Nethereum/Nethereum/pull/1100" rel="noopener noreferrer nofollow">Nethereum</a>. Уже ушло в master, так что если активно используете Nethereum для работы с протоколами, где широко представлены 128-битные типы в событиях/параметрах/результатах вызова функции и страдаете от избыточного потребления памяти BigInteger, то можно уже переключаться на версию из master (для сборки необходим nuget.exe). Особенно это актуально для AAVE, Balancer и Velodrome/Aerodrome (в последних не забывайте использовать packed-кодирование при работе с роутером).</p><p>Сейчас обсуждаем с мейнтейнером Хуаном Бланко повышение производительности и снижение потребления памяти при кодировании/декодировании целых чисел в Nethereum, после чего я подготовлю ещё один Pull Request с реализацией и ориентировочно всё эти изменения войдут в следующий релиз.</p><p>Если есть идеи, что ещё можно было бы сделать/улучшить, присоединяйтесь к обсуждению в <a href="https://discord.com/invite/u3Ej2BReNn" rel="noopener noreferrer nofollow">Discord</a> проекта (на английском/испанском) или в issues в репозитории на <a href="https://github.com/Nethereum/Nethereum/issues" rel="noopener noreferrer nofollow">github</a>.</p> <a href="https://habr.com/ru/posts/1000588/?utm_campaign=1000588&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Feb 2026 14:49:20 GMT</pubDate>
    <dc:creator><![CDATA[0xInnominatus]]></dc:creator>
      
      <category><![CDATA[Nethereum]]></category><category><![CDATA[UInt128]]></category><category><![CDATA[Int128]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ia_alpatov — C++ (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/992072/</guid>
    <link>https://habr.com/ru/posts/992072/?utm_campaign=992072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>MiniFilter и Protector/Rejector (ObCallback) в одном драйвере с управлением через C#</strong></p><p> В продолжение этого <a href="https://habr.com/ru/posts/990380/" rel="noopener noreferrer nofollow">поста</a>.</p><p>Предлагаю вашему внимаю мою поделку основанную на <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/about-file-system-filter-drivers" rel="noopener noreferrer nofollow">MiniFilter</a>, <a href="https://learn.microsoft.com/en-us/samples/microsoft/windows-driver-samples/obcallback-callback-registration-driver/" rel="noopener noreferrer nofollow">ObCallback</a> и <a href="https://avaloniaui.net/" rel="noopener noreferrer nofollow">Avalonia</a></p><p>Можно <s>грабить корованы</s> защищать от закрытия, регулировать доступ к файлам и запрещать запускать процессы. </p><p>C# код для управления драйвером:</p><pre><code class="cs">using System;
using System.Diagnostics;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Threading;
using SharpMiniFilter.Driver.MiniFilter;
using SharpMiniFilter.Driver.Protector;

namespace SharpMiniFilter.Protected;

public partial class MainWindow : Window
{
    private bool allowClose = false;
    
    public MainWindow()
    {
        InitializeComponent();
        this.Closing += (sender, args) =&gt;
        {
            args.Cancel = !allowClose;

            if (!args.Cancel)
            {
                ProtectorClient.ReplaceProtectList(Array.Empty&lt;string&gt;());
                ProtectorClient.ReplaceRejectList(Array.Empty&lt;string&gt;());
                MiniFilterClient.CloseConnection();
                MiniFilterClient.DriverFilter -= DriverClientOnDriverFilter;
            }
        };
        
        MiniFilterClient.DriverFilter += DriverClientOnDriverFilter;
        
        if (MiniFilterClient.Connect())
        {
            ProtectorClient.ReplaceProtectList(new[] { $"PID:{Process.GetCurrentProcess().Id}" });
            ProtectorClient.ReplaceRejectList(new[] {  "*cmd.exe" });
            
            Log_TextBox.Text += "Added current process to protection list." + Environment.NewLine;
            Log_TextBox.Text += "Added cmd.exe to reject list." + Environment.NewLine;
        }
        else
        {
            Log_TextBox.Text += "Connection to driver failed." + Environment.NewLine;
            MiniFilterClient.DriverFilter -= DriverClientOnDriverFilter;
        }
    }

    private void DriverClientOnDriverFilter(MinifilterEventArgs e)
    {
        Dispatcher.UIThread.Invoke(() =&gt;
        {
            if (e.Path.Contains("test.txt"))
            {
                if (!Process.GetProcessById((int)e.ProcessId).ProcessName.ToLower().Contains("notepad"))
                {
                    e.SetHandled(true);
                    Log_TextBox.Text += "Minifilter: test.txt blocked" + Environment.NewLine;
                }
                else
                {
                    e.SetHandled(false);
                    Log_TextBox.Text += "Minifilter: test.txt not blocked for notepad.exe" + Environment.NewLine;
                }
            }
        });
    }

    private void Button_OnClick(object? sender, RoutedEventArgs e)
    {
        allowClose = true;
        this.Close();
    }
}</code></pre><p>Бонусом - создание .cab файла для отправки в Microsoft <a href="https://stackoverflow.com/a/52474756" rel="noopener noreferrer nofollow">на сертификацию</a> при Release сборке.</p><p><a href="https://github.com/ia-alpatov/SharpMiniFilter" rel="noopener noreferrer nofollow">Ссылка</a> на репозиторий.</p><p>P.S. Если вам будет интересно, а у меня силы и карма - то расскажу, что там и как в отдельной статье. А теперь и <a href="https://music.yandex.ru/album/3385449/track/47700736" rel="noopener noreferrer nofollow">ответ </a>на всех мучающий вопрос: <span class="habrahidden">"Почему пингвин пошёл в горы?"</span></p> <a href="https://habr.com/ru/posts/992072/?utm_campaign=992072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 03 Feb 2026 04:43:48 GMT</pubDate>
    <dc:creator><![CDATA[ia_alpatov]]></dc:creator>
      
      <category><![CDATA[minfilter]]></category><category><![CDATA[c#]]></category><category><![CDATA[driver]]></category><category><![CDATA[protector]]></category><category><![CDATA[obcallback]]></category><category><![CDATA[avalonia]]></category><category><![CDATA[avaloniaui]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DazzleBizzareAdventure — .NET (+1) — 02.02.2026 12:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991752/</guid>
    <link>https://habr.com/ru/posts/991752/?utm_campaign=991752&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как же меня задолбали собеседования.</p><p>Пытался устроиться backend-разработчиком на .NET в строительную компанию. Они делают софт для своих жильцов: приложения для взаимодействия с домофоном, сервисы дома и всё такое. Окей, звучит вполне нормально.</p><p>Как обычно, поговорили про теорию, опыт, архитектуру — всё шло стандартно.</p><p>А потом мы перешли к моей «любимой» части —&nbsp;<strong>лайв-кодингу</strong>.</p><p>И вместо задачи, хоть как-то приближённой к реальной работе, мне выдают:</p><p>&gt;А давай ты решишь задачу на полный квадрат,&nbsp;<strong>но без использования Math.Sqrt</strong>, который вообще-то есть в&nbsp;<strong>стандартной библиотеке языка</strong>.</p><p>В этот момент хотелось спросить:</p><p><strong>&gt;вы вообще в своём уме?</strong></p><p>Какого чёрта я должен это знать и уметь?</p><p>Вы имели бы полное право спрашивать такое,&nbsp;<strong>если бы в вакансии шла речь о разработке CAD-софта или инженерных расчётов</strong>. Но нет — это обычный backend для сервисного приложения.</p><p>Это всё равно что прийти устраиваться&nbsp;<strong>водителем</strong>, а тебе завязывают руки за спиной и говорят:</p><p>&gt;Ну давай, покажи, как ты водишь.</p><p>Посидел пару минут, посмотрел на это всё и сказал:&nbsp;<strong>«не, ребят»</strong>.</p><p>После этого они попытались впарить ещё одну задачу, но тут я уже просто послал их нафиг и ушёл.</p> <a href="https://habr.com/ru/posts/991752/?utm_campaign=991752&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Feb 2026 09:45:04 GMT</pubDate>
    <dc:creator><![CDATA[DazzleBizzareAdventure]]></dc:creator>
      
      <category><![CDATA[поиск работы]]></category><category><![CDATA[поиск работы в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ia_alpatov — .NET (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990380/</guid>
    <link>https://habr.com/ru/posts/990380/?utm_campaign=990380&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/bdf/68b/fe3/bdf68bfe34f2f19e7ced95665a8d107f.png" alt="Результат" title="Результат" width="639" height="194"><div><figcaption>Результат</figcaption></div></figure><p>В продолжение этого <a href="https://habr.com/ru/posts/966844/" rel="noopener noreferrer nofollow">поста</a></p><p>Когда у вас AOT приложение, которое запускается от администратора - 99% библиотек для работы с COM <a href="https://github.com/dahall/Vanara/issues/487" rel="noopener noreferrer nofollow">не работают</a>, плюс для Windows App SDK отдельно указано "<a href="https://learn.microsoft.com/en-us/windows/apps/develop/notifications/app-notifications/app-notifications-quickstart?tabs=cs" rel="noopener noreferrer nofollow">Notifications for an elevated (admin) app is currently not supported</a>.", а<a href="https://github.com/microsoft/WindowsAppSDK/issues/3595" rel="noopener noreferrer nofollow"> issue на github</a> висит с 2023 года и поэтому для отправки системных уведомлений надо выкручиваться через другое приложение/<a href="https://github.com/GitHub30/toast-notification-examples" rel="noopener noreferrer nofollow">PowerShell</a>.</p><p>Пример как отправлять уведомления:</p><pre><code class="cs">using System.Diagnostics;
using Windows.UI.Notifications;
using Microsoft.Toolkit.Uwp.Notifications;
using Vanara.PInvoke;
using Vanara.Windows.Shell;

namespace ConsoleNotifications;

class Program
{
    static async Task Main(string[] args)
    {
        string messageTitle = "Habr";
        string messageText = "Hello Habrahabr!";
        string targetExePath = Environment.SystemDirectory + "\\notepad.exe";
        string appUserModelId = GetAppAumid().First(var=&gt;var.Name.Contains("Chrome")).Aumid;
        await SendNotification(appUserModelId, messageTitle, messageText, targetExePath);
    }

    private static Task SendNotification(string appUserModelId, string title, string content, string targetPath)
    {
        var tcs = new TaskCompletionSource();
        var notification = new ToastNotification(new ToastContentBuilder().AddText(title)
            .AddText(content).Content.GetXml());
        notification.Priority = ToastNotificationPriority.High;
        notification.Activated += (s, e) =&gt;
        {
            Process.Start(new ProcessStartInfo(targetPath));
            tcs.SetResult();
        };
        notification.Failed += (s, e) =&gt; tcs.SetResult();
        notification.Dismissed += (s, e) =&gt; tcs.SetResult();
        ToastNotificationManager.CreateToastNotifier(appUserModelId).Show(notification);
        return tcs.Task;
    }
    
    public sealed record AppAumidInfo(string Name, string Aumid);
    
    public static List&lt;AppAumidInfo&gt; GetAppAumids()
    {
        var results = new List&lt;AppAumidInfo&gt;();
        var f = new ShellFolder(Shell32.KNOWNFOLDERID.FOLDERID_AppsFolder);
        foreach (ShellItem i in f.EnumerateChildren(FolderItemFilter.NonFolders | FolderItemFilter.Folders))
            results.Add(new AppAumidInfo(i.Name, i.ParsingName));
        return results;
    }
}</code></pre><p>В вызываемом приложении надо выставить AppUserModelID и предварительно создать ссылку на него</p><pre><code class="cs">[LibraryImport("shell32.dll", SetLastError=true)]
internal static partial void SetCurrentProcessExplicitAppUserModelID([MarshalAs(UnmanagedType.LPWStr)] string AppID);</code></pre><p>Создание .lnk ссылки с параметрами:</p><pre><code class="cs">var link = new ShellLink()
{
        ToastActivatorId = guid, 
        AppUserModelID = appUserModelId,
        TargetPath = exePath
};
link.Save(shortcutPath);</code></pre><p>P.S. Буду рад услышать про другие существующие решения этой проблемы</p> <a href="https://habr.com/ru/posts/990380/?utm_campaign=990380&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 28 Jan 2026 18:50:42 GMT</pubDate>
    <dc:creator><![CDATA[ia_alpatov]]></dc:creator>
      
      <category><![CDATA[winapi]]></category><category><![CDATA[c#]]></category><category><![CDATA[windows]]></category><category><![CDATA[.net]]></category><category><![CDATA[com]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DazzleBizzareAdventure — Удалённая работа (+2) — 28.01.2026 14:29]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990030/</guid>
    <link>https://habr.com/ru/posts/990030/?utm_campaign=990030&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Куда можно сбежать из разработки, чтобы не умереть с голоду?</strong></p><p>Ищу работу уже несколько месяцев, и ощущение такое, что рынок полуживой. По вакансиям — требования «знай всё на свете», а если верить hh, то на некоторые позиции по 400–500 откликов.</p><p>Невольно возникает вопрос:<br>а есть ли вообще адекватный выход из разработки?</p><p>Я .NET-разработчик с 6+ годами опыта и хотелось бы понять, куда можно перейти, чтобы мой бэкграунд был полезен, а не обнулялся в ноль — и при этом не остаться без средств к существованию.</p><p>Возможно, у кого-то уже был похожий путь. Буду рад, если поделитесь, из чего выбирали и на чём в итоге остановились.</p> <a href="https://habr.com/ru/posts/990030/?utm_campaign=990030&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 28 Jan 2026 11:29:00 GMT</pubDate>
    <dc:creator><![CDATA[DazzleBizzareAdventure]]></dc:creator>
      
      <category><![CDATA[поиск работы]]></category><category><![CDATA[поиск работы в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DazzleBizzareAdventure — Программирование (+4) — 26.01.2026 13:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/989046/</guid>
    <link>https://habr.com/ru/posts/989046/?utm_campaign=989046&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Ответьте мне на один простой вопрос: <strong>зачем в наше время вообще нужны HR?</strong></p><p>Ни для кого не секрет, что найм сегодня сломан. Бесконечные этапы собеседований, которые якобы должны отсекать «вкатунов в IT», по факту отсеивают и нормальных разработчиков.</p><p>Причём даже в эффективности этого «фильтра» есть серьёзные сомнения: по сети уже гуляют AI-оверлеи, которые в реальном времени анализируют вопросы интервьюеров и подсказывают ответы. Так о каком объективном отборе вообще идёт речь?</p><p>При этом у HR — бесконечный поток, условно говоря, «подопытных кроликов», на которых можно тестировать гипотезы, улучшать процессы и действительно чинить найм.<br> Но вместо этого они просто копируют чужие, далеко не самые успешные практики.</p><p>Почему HR не выполняют своё прямое предназначение, а действуют по шаблону?</p><p>И главный вопрос: <strong>каким образом лайв-кодинг должен подтверждать или опровергать мои навыки</strong>, если:</p><p>могут дать абсолютно любую задачу и в штатном порядке, я залезу гуглить документацию, а на собесе я это сделать не могу?</p><p> Короче говоря — <strong>как же у меня с этого горит</strong>.  </p> <a href="https://habr.com/ru/posts/989046/?utm_campaign=989046&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 10:54:03 GMT</pubDate>
    <dc:creator><![CDATA[DazzleBizzareAdventure]]></dc:creator>
      
      <category><![CDATA[поиск работы в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+4) — 26.01.2026 12:02]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/988992/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Что нового появилось в PVS-Studio в 2025 году</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5b4/935/4ab/5b49354ab15ac5b7b4109709f6125dc7.png" width="1600" height="902"></figure><p>Новый 2026 год уже вовсю идёт, и мы решили оглянуться назад и вспомнить, что интересного появилось в PVS-Studio за богатый на изменения 2025 год:</p><ul><li><p>десятки новых диагностических правил, включая проверки, ориентированные на безопасность;</p></li><li><p>обновления интеграций в популярные IDE, CI/CD-системы, ASOC и сборочные системы;</p></li><li><p>улучшения анализа;</p></li><li><p>расширенная поддержка стандартов.</p></li></ul><p>Всё это и многое другое описано <a href="https://pvs-studio.ru/ru/blog/posts/1336/?utm_source=website&amp;utm_medium=habr&amp;utm_campaign=readmore" rel="noopener noreferrer nofollow">в новой статье</a> в нашем блоге.</p> <a href="https://habr.com/ru/posts/988992/?utm_campaign=988992&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 09:02:08 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[PVS-Studio]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[C++]]></category><category><![CDATA[C#]]></category><category><![CDATA[Java]]></category><category><![CDATA[Security]]></category><category><![CDATA[SAST]]></category><category><![CDATA[Безопасность]]></category><category><![CDATA[РБПО]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tsb99x — Программирование (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/986450/</guid>
    <link>https://habr.com/ru/posts/986450/?utm_campaign=986450&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><em>Статьи по DDD.</em></strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/958/75a/5ec/95875a5ec9ec327a1e4d60099e8f04e3.png" width="2024" height="1378"></figure><p>Уди Дахан — один из первопроходцев DDD в C#.</p><p>Он смог показать, как именно можно применить очевидные инфраструктурные практики типа сервисной шины в контексте доменных событий.</p><p>Да, на сегодняшний день имплементация инфраструктуры для доменных событий может выглядеть совсем иначе. Но ознакомление с 3-я заметками Дахана крайне важно для понимания исторического контекста.</p><p>Статьи на сайте Дахана:</p><ul><li><p><a href="https://udidahan.com/2008/02/29/how-to-create-fully-encapsulated-domain-models/" rel="noopener noreferrer nofollow">How to create fully encapsulated Domain Models</a></p></li><li><p><a href="https://udidahan.com/2008/08/25/domain-events-take-2/" rel="noopener noreferrer nofollow">Domain Events – Take 2</a></p></li><li><p><a href="https://udidahan.com/2009/06/14/domain-events-salvation/" rel="noopener noreferrer nofollow">Domain Events – Salvation</a></p></li></ul> <a href="https://habr.com/ru/posts/986450/?utm_campaign=986450&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 19 Jan 2026 06:16:58 GMT</pubDate>
    <dc:creator><![CDATA[tsb99x]]></dc:creator>
      
      <category><![CDATA[уди дахан]]></category><category><![CDATA[ddd]]></category><category><![CDATA[архитектура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ProgerMan — C# (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/976416/</guid>
    <link>https://habr.com/ru/posts/976416/?utm_campaign=976416&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><em>Required или нет?</em></strong></p><p>Работая над одним из проектов, который недавно переехал из <code>Framework 4.8</code> на <code>Core 9</code>, обнаружил множество самых разных вариантов использования модификатора <code>required</code> и атрибута <code>Required</code>, примерно каждый второй из которых был использован неправильно. Я написал это коллегам и хочу поделиться этим здесь. Это не обязательные правила, но сильно упрощают работу с кодом.</p><p><strong>Небольшое пояснение</strong></p><p><a href="https://learn.microsoft.com/ru-ru/dotnet/api/system.componentmodel.dataannotations.requiredattribute?view=net-8.0" rel="noopener noreferrer nofollow">Атрибут</a> <code>Required</code> нужен для проверки входящих преимущественно строковых данных в эндпоинтах. Возвращает ошибку, если значение <code>null</code> или пустая строка для строк (если не отключено параметром <code>AllowEmptyStrings</code>). Работает в <code>Runtime</code>. Также применяется в <code>Entity Framework</code> в подходе <code>code-first</code> но с включением опции <code>&lt;Nullable&gt;</code> в <code>csproj</code> про эти случаи можно забыть, сделав код чище.</p><p><a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/required" rel="noopener noreferrer nofollow">Модификатор</a> <code>required</code> нужен для обязательного указания значений полей при создании класса. Работает в <code>Compile-time</code>.</p><p><strong>Примеры использования</strong></p><pre><code class="cs">// имеем класс с required полем
public class Example
{
    public required string Name { get; set; }
}

// пытаемся создать экземпляр в коде
var example1 = new Example();  // будет ошибка при попытке сборки проекта
var example2 = new Example { Name = string.Empty };  // тут ошибки не будет

// Вывод: модификатор required нужен для разработчика</code></pre><pre><code class="cs">// имеем класс с полем, у которого атрибут Required
public class Example
{
    [Required]
    public string Name { get; set; }
}

// пытаемся создать экземпляр в коде
var example = new Example();  // проект спокойно собирается

// имеем эндпоинт в контроллере
public IActionResult PostMethod([FromBody] Example model) =&gt; Ok();

/* передаём в теле запроса:
{}
или
{"Name": null}
или
{"Name": ""}
или
{"Name": "   "}
Получаем BadRequest с текстом ошибки. */

// передаём в теле запроса: {"Name": "name"}. Получаем OK.

// Вывод: атрибут Required нужен для пользователя</code></pre><p><strong>Как стоит и не стоит использовать.</strong></p><pre><code class="cs">public class BadExample
{
    public required string Field1 { get; set; } // 1
    
    public required string? Field2 { get; set; } // 2
    
    [Required]
    public required string Field3 { get; set; } // 3

    [Required]
    public string? Field4 { get; set; } // 4

    [Required]
    public int Field5 { get; set; } // 5

    public required int Field6 { get; set; } = 10; // 6
      
    public required List&lt;int&gt; Field7 { get; set; } // 7
}</code></pre><ol><li><p>Ошибка, если класс используется как входящий параметр в эндпоинте. Соответственно, не стоит использовать, если десериализуем в него.</p></li><li><p>Либо <code>required</code>, либо <code>nullable</code>.</p></li><li><p>Надо выбрать одно из двух в зависимости от места использования.</p></li><li><p>Либо <code>Required</code>, либо <code>nullable</code>. Тут даже <code>AllowEmptyStrings = true</code> не поможет.</p></li><li><p><code>Required</code> используется для строк. Но есть нюанс (*).</p></li><li><p>Не нужно использовать <code>required</code> со значением по умолчанию.</p></li><li><p>Не стоит усложнять жизнь, если поле можно проинициализировать при создании класса.</p></li></ol><pre><code class="cs">public class GoodExample
{
    public required string Field1 { get; set; } // 1
    
    [Required]
    public string Field2 { get; set; } = null!; // 2
    
    public string? Field3 { get; set; } // 3

    public int Field4 { get; set; } // 4

    public List&lt;string&gt; Field5 { get; set; } = []; // 5
}</code></pre><ol><li><p>Хорошо где угодно за пределами эндпоинтов и десериализации, а значение не может принимать <code>null</code>.</p></li><li><p>То что нужно для эндпоинта.</p></li><li><p>Поле <code>nullable</code>. Поэтому никаких <code>required</code>.</p></li><li><p>Не используем атрибут <code>Required</code> с не строками. Но есть нюанс (*).</p></li><li><p>Избегаем использование <code>required</code>, проинициализировав коллекцию.</p></li></ol><p>* - если передаётся <code>json</code>, в котором явно указано значение <code>null</code> (<code>{"Field4": null}</code>), то использование атрибута <code>Required</code> вернёт <code>BadRequest</code>.<br>Если же в <code>json</code> поле было опущено, то будет присвоено значение по умолчанию.</p><p>Надеюсь, это поможет сделать код чище и избежать неоднозначностей.</p> <a href="https://habr.com/ru/posts/976416/?utm_campaign=976416&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 14 Dec 2025 03:01:02 GMT</pubDate>
    <dc:creator><![CDATA[ProgerMan]]></dc:creator>
      
      <category><![CDATA[required]]></category><category><![CDATA[C#]]></category><category><![CDATA[.net core]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DazzleBizzareAdventure — .NET (+1) — 11.12.2025 09:59]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/975570/</guid>
    <link>https://habr.com/ru/posts/975570/?utm_campaign=975570&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Хочу немного поплакаться о поиске работы в IT…</p><p>Не так давно я решил покинуть родные края и выйти на рынок труда, чтобы найти новую работу и уйти от текущего работодателя. Уже около двух месяцев я активно ищу место, и этот процесс оказался куда тяжелее, чем я ожидал.</p><p>Я — .NET backend-разработчик с опытом 6+ лет. Казалось бы, с таким бэкграундом я должен быть для HR вполне «лакомым кусочком». Но реальность оказалась совсем другой.</p><p>Постоянные отказы без объяснений. При том что резюме — нормальное, вычитанное, со смыслом. Все, кому я его показывал, говорили то же самое. И это, разумеется, бьёт по самооценке: появляется ощущение, что никому не нужен.</p><p>Складывается впечатление, что компании ищут кандидатов, которые совпадают с их стеком на 100%, и им плевать, что ту или иную технологию можно подтянуть за пару вечеров. Иначе я не могу объяснить, почему в вакансиях требуют конкретные библиотеки вроде Dapper или Autofac, которые изучаются буквально за вечер.</p><p>Есть ChatGPT и Gemini — хочешь, они разжуют любую тему. Но если в резюме не указал какую-то библиотеку — красный флаг. Отказ.<br>«Мы лучше ещё пару месяцев поищем кандидата, который совпадает на 100%, чем возьмём тебя». Примерно так это и выглядит.</p><p>А собеседования — отдельная песня.<br>По три этапа, каждый по часу. И ладно бы их можно было пройти за неделю, так нет — между этапами неделя перерыва. За это время уже как-то всё равно становится, возьмут тебя или нет. А когда после третьего этапа тебе в итоге не дают оффер — ощущение, что просто выкинул время в мусорку.</p><p>Про технические интервью я вообще молчу. Иногда спрашивают такую дичь, которая в реальной работе не нужна от слова «совсем». Например, у меня спросили разницу между структурой и классом. Я ответил по классике: копирование, расположение в памяти, наследование. Но от меня ожидали услышать ещё про блок синхронизации в объекте и почему структуры нельзя использовать в <code>lock</code>.<br> Может, я и читал это когда-то у Шилдта или Троелсена, но в реальной работе это знание ни разу не пригодилось.</p><p> А лайв-кодинг — это вообще отдельный вид боли. Ты сидишь и пишешь код с ощущением, что кто-то стоит у тебя за спиной и дышит в затылок. Ни тебе привычного темпа, ни спокойной среды, ни возможности просто подумать головой. Вместо того чтобы показать реальные навыки, ты занимаешься акробатикой под взглядами людей, которые ждут от тебя идеальных движений в условиях, максимально далёких от рабочих.  </p><p>И вот главный вопрос: зачем столько этапов?<br>Человек с каждым собеседованием становится опытнее, у него подвешивается язык, он понимает, что сейчас в моде спрашивать. Если где-то не ответил — проработает и на следующем собесе уже ответит. Так зачем превращать процесс в марафон длиной в месяц? </p><p>Да и честно говоря, всё равно все на собеседованиях врут. Потому что попробуй скажи правду — например:<br>«Мне надоело бесконечно ковыряться в легаси, поэтому я решил уйти».<br> Мгновенно получишь красный флаг.</p><p>Вместо честного диалога приходится придумывать какие-то «правильные» формулировки про профессиональный рост, новые вызовы и желание расширить экспертизу. И это тоже превращает собеседования в театр, где все играют роли: кандидат делает вид, что не устал от банального бардака в кодовой базе, а компания — что у них идеальная инженерная культура.</p><p>А ещё последнее время любят оправдывать весь этот цирк «защитой от вкатунов с курсов».<br>Только проблема в том, что эта защита вообще не работает.</p><p>Собеседования проходят удалённо — и любой новичок может просто расшарить экран своему более опытному товарищу, который будет подсказывать ответы или прямо диктовать решения. </p><p>В итоге фильтруют не тех, кого нужно, а просто создают лишние барьеры.</p><p>Хотите проверить, что кандидат — не выпускник трёхнедельного курса? Попросите показать трудовую книжку. Я покажу без проблем — подтвердить реальные годы опыта для меня не проблема.</p><p>Но складывается впечатление, что некоторые компании ищут не разработчика, а «идеального сотрудника на всю жизнь», который уже сегодня знает абсолютно всё, что им может понадобиться завтра.</p> <a href="https://habr.com/ru/posts/975570/?utm_campaign=975570&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Dec 2025 06:59:00 GMT</pubDate>
    <dc:creator><![CDATA[DazzleBizzareAdventure]]></dc:creator>
      
      <category><![CDATA[поиск работы]]></category><category><![CDATA[поиск работы в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @A-G-B — Блог компании PVS-Studio (+2) — 04.12.2025 17:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/973360/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/973360/?utm_campaign=973360&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Проверяем osu! и рассказываем про фишки статических анализаторов</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/b84/4e2/e03/b844e2e03c19316f6b8415b9b59a9f2e.png" width="1600" height="902"></figure><p>Про существование инструментов статического анализа известно многим, но почему их часто используют и в чём конкретно заключается практическая польза? В этот раз мы предлагаем рассмотреть несколько основных особенностей этого инструмента на примере анализа исходного кода игры osu!</p><p><strong>Первая особенность: экономит время</strong></p><p>Одной из особенностей статических анализаторов является возможность сэкономить время на код-ревью за счёт схожего подхода (просмотра исходников), только за вас всё делает инструмент :)</p><p>Предлагаю начать с небольшой разминки: сможете ли вы самостоятельно найти ошибку?</p><pre><code class="cpp">public partial class TopScoreStatisticsSection
  : CompositeDrawable
{ 
  public ScoreInfo Score
  {
    ....

    if (score == null &amp;&amp; value == null) 
      return;

    if (score?.Equals(value) == true)
      return;

    score = value;

    accuracyColumn.Text = value.DisplayAccuracy;

    maxComboColumn.Text = value.MaxCombo
                               .ToLocalisableString(@"0\x");

    ppColumn.Alpha = value.BeatmapInfo!
                          .Status
                          .GrantsPerformancePoints() ? 1 : 0;

   
  }
}</code></pre><p>Если нужна подсказка или хотите убедиться в своём варианте, можно посмотреть на <a href="https://pvs-studio.ru/ru/docs/warnings/v3125/" rel="noopener noreferrer nofollow">предупреждение PVS-Studio</a>:</p><p><span class="habrahidden">V3125 [SEC-NULL] The 'value' object was used after it was verified against null. Check lines: 128, 120. TopScoreStatisticsSection.cs 128</span></p><p>Нашли? Ну я в вас и не сомневался :)</p><p>Для протокола давайте всё же разберём, что произошло. Выглядит как логическая ошибка, а их не так просто заметить, потому что не все захотят высматривать все возможные сценарии. В нашем же случае один из них сразу может вызвать проблемы.</p><p>В начале есть две проверки.</p><p>Первая проверка:</p><pre><code class="cpp">if (score == null &amp;&amp; value == null)
  return;</code></pre><p>Вторая проверка:</p><pre><code class="cpp">if (score?.Equals(value) == true)
  return;</code></pre><p>Скорее всего, они предназначались для обработки двух переменных по разным сценариям (если <code>score = null</code>, если <code>value</code> = <code>null</code>, если они равны и т. д.). Но вот если комбинация будет <code>score</code> = <code>"NotNull"</code> и <code>value = null</code>, то первая и вторая проверки отработают без выхода из метода, и мы пойдём дальше по коду, где непременно наткнёмся на разыменовывание свежеполученного <code>null</code></p><pre><code class="cpp">accuracyColumn.Text = value.DisplayAccuracy;
maxComboColumn.Text = value.MaxCombo.ToLocalisableString(@"0\x");</code></pre><p>А это, в свою очередь, может привести к исключению <a href="https://pvs-studio.ru/ru/blog/terms/6694/" rel="noopener noreferrer nofollow">NullReferenceException</a>.</p><p><strong>Хотите узнать еще?</strong><br>Если вас заинтересовало какие еще есть <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1319/" rel="noopener noreferrer nofollow">особенности статических анализаторов</a> и  что еще мы смогли найти в osu! То предлагаю прочитать полную версию статьи.  </p> <a href="https://habr.com/ru/posts/973360/?utm_campaign=973360&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 04 Dec 2025 14:54:00 GMT</pubDate>
    <dc:creator><![CDATA[A-G-B (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[gamedev]]></category><category><![CDATA[c#]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[статический анализ]]></category><category><![CDATA[sast]]></category><category><![CDATA[static analysis]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AndreyMoskalew — Блог компании PVS-Studio (+4) — 19.11.2025 15:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/968048/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/968048/?utm_campaign=968048&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Статья "Код блокчейн-проектов Neo и NBitcoin VS анализатор кода. Кто-кого?"</strong><br><br> PVS-Studio ворвался в мир блокчейн-разработки, и первыми "под удар" попали open source проекты на C# — Neo и NBitcoin!<br><br> В статье мы рассмотрели самые интересные ошибки: как явные, так и потенциальные, которые нашли в этом проекте. Если вам интересно, какие ошибки могут находить такие инструменты, как PVS-Studio, или вы желаете прокачать свой собственный "ментальный анализатор", приглашаю к <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1312/" rel="noopener noreferrer nofollow">прочтению</a> :)</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0d8/c44/6d4/0d8c446d439370d67a58c4dc2e895fcd.png" width="975" height="549"></figure> <a href="https://habr.com/ru/posts/968048/?utm_campaign=968048&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 19 Nov 2025 12:51:56 GMT</pubDate>
    <dc:creator><![CDATA[AndreyMoskalew (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[блокчейн]]></category><category><![CDATA[open source]]></category><category><![CDATA[ошибки в коде]]></category><category><![CDATA[neo]]></category><category><![CDATA[анализатор кода]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ia_alpatov — .NET (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/966844/</guid>
    <link>https://habr.com/ru/posts/966844/?utm_campaign=966844&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Определение типа fullscreen</strong></p><p>Понадобилось мне как‑то определять тип fullscreen для&nbsp;вывода подходящего типа уведомления (звуковое/системное/окном) во время запущенных игр и родился такой код:</p><pre><code class="cs">    public enum WindowFullscreenState
    {
        None,
        Emulated,
        Shared,
        Exclusive,
        ExclusiveGdi,
        NotOwned
    }

    public static WindowFullscreenState GetForegroundWindowFullscreenType()
    {
        var result = WindowFullscreenState.None;   
        uint dwProcessId;
        D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP query = new D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
        {
            hWindow = GetForegroundWindow()
        };

        GetWindowThreadProcessId(query.hWindow, out dwProcessId);

        query.hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId);
        if (query.hProcess != IntPtr.Zero)
        {
            D3DKMTQueryVidPnExclusiveOwnership(ref query);
            CloseHandle(query.hProcess);

            result = query.OwnerType switch
            {
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_UNOWNED =&gt; WindowFullscreenState.NotOwned,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_SHARED =&gt; WindowFullscreenState.Shared,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE =&gt; WindowFullscreenState.Exclusive,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI =&gt; WindowFullscreenState.ExclusiveGdi,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EMULATED =&gt; WindowFullscreenState.Emulated,
                _ =&gt;WindowFullscreenState.None
            };
        }

        return result;
    }

    public enum D3DKMT_VIDPNSOURCEOWNER_TYPE
    {
        D3DKMT_VIDPNSOURCEOWNER_UNOWNED = 0,
        D3DKMT_VIDPNSOURCEOWNER_SHARED = 1,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE = 2,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI = 3,
        D3DKMT_VIDPNSOURCEOWNER_EMULATED = 4
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct LUID
    {
        public uint LowPart;
        public int HighPart;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
    {
        public IntPtr hProcess;
        public IntPtr hWindow;
        public uint VidPnSourceId;
        public LUID AdapterLuid;
        public D3DKMT_VIDPNSOURCEOWNER_TYPE OwnerType;
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType);

    private const uint PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;

    [DllImport("gdi32.dll", EntryPoint = "D3DKMTQueryVidPnExclusiveOwnership")]
    private static extern int D3DKMTQueryVidPnExclusiveOwnership(ref D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP data);
    
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();</code></pre><p>Схема использования с типами уведомлений:</p><pre><code class="css">WindowFullscreenState.Exclusive -&gt; SendVoiceNotification
WindowFullscreenState.ExclusiveGdi -&gt; SendVoiceNotification
WindowFullscreenState.Emulated -&gt; ShowSystemNotification
WindowFullscreenState.Shared -&gt; ShowSystemNotification
WindowFullscreenState.NotOwned || WindowFullscreenState.None -&gt; IsForegroundWindowSmallerThanScreen ? ShowCustomWindow : ShowSystemNotification</code></pre><p>Подробнее можно прочитать про виды захвата экрана <a href="https://wiki.special-k.info/Presentation_Model" rel="noopener noreferrer nofollow">тут</a> и <a href="https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/d3dkmthk/nf-d3dkmthk-d3dkmtqueryvidpnexclusiveownership" rel="noopener noreferrer nofollow">тут</a>. </p><p>P.S. Некоторые игры (ExclusiveGdi) можно заставить (Emulated) получать системные уведомления через режим <a href="https://timeweb.com/ru/community/articles/kak-zapuskat-starye-igry-na-novyh-versiyah-windows" rel="noopener noreferrer nofollow">совместимости</a>.</p> <a href="https://habr.com/ru/posts/966844/?utm_campaign=966844&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 16 Nov 2025 07:40:47 GMT</pubDate>
    <dc:creator><![CDATA[ia_alpatov]]></dc:creator>
      
      <category><![CDATA[winapi]]></category><category><![CDATA[c#]]></category><category><![CDATA[windows]]></category><category><![CDATA[.net]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rip_m — Блог компании PVS-Studio (+3) — 10.11.2025 15:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/964924/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/964924/?utm_campaign=964924&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>.NET Digest #9</strong></p><p>Рады вам представить девятый выпуск нашего дайджеста, посвящённого новостям и событиям в мире .NET! </p><p>В этот раз мы расскажем про новые preview и RC версии .NET 10 и новую Visual Studio 2026. А ещё мы собрали для вас несколько интересных статей: </p><ul><li><p>про производительность в .NET от Стивена Тауба;</p></li><li><p>спонсорство на <a href="http://NuGet.org" rel="noopener noreferrer nofollow">NuGet.org</a>;</p></li><li><p>и статистику популярности языков от GitHub.</p></li></ul><p>Команда PVS-Studio рада представить вам подборку самых интересных и полезных материалов! Подробнее читайте в нашей <a href="https://pvs-studio.ru/ru/blog/posts/csharp/1306/" rel="noopener noreferrer nofollow">статье</a>. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/6f0/8dc/992/6f08dc992b1f3c6c6e5979290b1450fb.png" width="974" height="549"></figure> <a href="https://habr.com/ru/posts/964924/?utm_campaign=964924&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 10 Nov 2025 12:45:47 GMT</pubDate>
    <dc:creator><![CDATA[rip_m (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[.net]]></category><category><![CDATA[visual studio]]></category><category><![CDATA[visual studio 2026]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MorozovDamian — .NET (+3) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/957312/</guid>
    <link>https://habr.com/ru/posts/957312/?utm_campaign=957312&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Парсинг Сохранённых сообщений Телеграм в локальный каталог</strong></p><p>Всем привет. Позвольте рассказать вам, как&nbsp;скачать содержимое Сохранённых сообщений Телеграм к&nbsp;себе на&nbsp;ПК.</p><p>Для начала, ознакомьтесь с предыдущей статьёй - <a href="https://habr.com/ru/posts/946954/" rel="noopener noreferrer nofollow">Парсинг чатов Телеграм</a>. В ней описан процесс установки и первичной настройки десктоп клиента. Кратко, что у вас должно быть настроено:<br>1. Путь к хранилищу (локальная БД SQLite).<br>2. Путь к файлу сессии (в нём сохраняется служебная текущая сессия подключения).<br>3. Регистрация приложения на сайте Телеграм.<br>4. Настройки подключения клиента (хранится в таблице приложений).</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a3a/ec1/05d/a3aec105dd558524487cfed74a914403.png" alt="Страница настроек" title="Страница настроек" width="1713" height="1016"><div><figcaption>Страница настроек</figcaption></div></figure><p>После успешного подключения к Телеграм, откроется доступ к меню <em>Сохранённые сообщения</em>. Заходим на третью вкладку <em>Скачать</em>, кликаем по кнопке <em>Сбросить по-умолчанию, </em>указываем локальный каталог на диске для скачивания файлов (например C:\OpenTgResearcher\SavedMessages)<em>.</em> По необходимости, отредактируем первый ИД и количество потоков. Всё готово, кликаем по кнопке Запустить парсинг Телеграм. После чего можно идти пить кофе, пока ожидаем результат работы парсинга. Файлы будут скачаны в локальный каталог, а сообщения в соответствующую таблицу, их можно будет посмотреть на вкладке <em>Содержимое</em>.<br></p><p>Если вам нужна заказная разработка приложений либо вы в поисках разработчика моего уровня, сообщите пожалуйста мне в личку.<br><br>🧠 Стек технологий:<br>- Разработка ПО: Console, <a href="http://ASP.NET" rel="noopener noreferrer nofollow">ASP.NET</a> Core Web API, Blazor, WinForms, WPF, UWP, WinUI<br>- Хранение и передача информации: JSON, XML, SQLite<br>- БД и ORM: MS SQL Server / PostgreSQL / SQLite, EF Core<br>- Веб технологии: REST API / RESTful API, HTTP, TCP/IP, HttpClient, WebSocket<br>- Брокеры сообщений: RabbitMQ (готов быстро освоить Kafka)<br>- Контейнеризация: Docker / Compose (готов быстро освоить Kubernetes)<br>- Архитектура ПО: ООП, шаблоны проектирования (Design Patterns)<br>- Архитектурные подходы: TDD, DRY, KISS, SOLID, YAGNI, Clean Architecture, N-Tier Architecture<br>- Фронт: небольшой опыт разработки Angular<br></p> <a href="https://habr.com/ru/posts/957312/?utm_campaign=957312&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 21 Oct 2025 11:06:55 GMT</pubDate>
    <dc:creator><![CDATA[MorozovDamian]]></dc:creator>
      
      <category><![CDATA[OpenTgResearcher]]></category><category><![CDATA[Телеграм]]></category><category><![CDATA[скачать]]></category><category><![CDATA[ресёчер]]></category><category><![CDATA[тгресечер]]></category><category><![CDATA[тгресёчер]]></category><category><![CDATA[тг-ресечер]]></category><category><![CDATA[тг-ресёчер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @IBS_habrablog — Блог компании IBS (+3) — 14.10.2025 13:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ibs/posts/956402/</guid>
    <link>https://habr.com/ru/companies/ibs/posts/956402/?utm_campaign=956402&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/b9e/4b0/846/b9e4b0846eab62a6e0cc9e4a29cf6386.jpg" width="1011" height="647"></figure><p>Знакомая ситуация: нужно добавить новую функциональность, а одно небольшое изменение тянет за собой правки в десятках мест? Код превращается в хрупкую конструкцию.</p><p>Проблема часто кроется в отсутствии гибкой архитектуры. Ключ к её созданию — грамотное использование интерфейсов в C#.</p><p><strong>17 октября в 16:00 (Мск) на бесплатном вебинаре «<a href="https://ibs-training.ru/training/seminar/154009/" rel="noopener noreferrer nofollow">Основы интерфейсов C#: первые шаги к гибкой архитектуре</a>» на простых и понятных примерах разберём:</strong></p><p>✔️ Что такое интерфейс на самом деле и почему это не просто «контракт».</p><p>✔️ Чем интерфейс отличается от класса — убережем от главной ошибки новичков.</p><p>✔️ Как правильно объявлять и реализовывать интерфейсы в C#.</p><p>✔️ Как интерфейсы делают ваш код гибким, тестируемым и готовым к изменениям.</p><p>Этот вебинар — важный шаг от написания кода, который «просто работает», к созданию архитектуры, которая «легко масштабируется».</p><p>📅<strong> Дата:</strong> 17 октября 2025 г.</p><p>🕓 <strong>Время:</strong> 16:00 - 17:00 (Мск)</p><p>➡️<strong> <a href="https://ibs-training.ru/training/seminar/154009/" rel="noopener noreferrer nofollow">Зарегистрироваться</a></strong></p> <a href="https://habr.com/ru/posts/956402/?utm_campaign=956402&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 14 Oct 2025 10:33:22 GMT</pubDate>
    <dc:creator><![CDATA[IBS_habrablog (IBS)]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[интерфейсы]]></category><category><![CDATA[архитектура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @MorozovDamian — .NET (+3) — 15.09.2025 11:56]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/946954/</guid>
    <link>https://habr.com/ru/posts/946954/?utm_campaign=946954&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Парсинг чатов Телеграм</strong></p><p>Всем привет. Позвольте показать вам как&nbsp;скачать содержимое чата Телеграм к&nbsp;себе на&nbsp;ПК, включая сообщения.<br><br>Нам понадобится скачать программу <a href="https://opentgresearcher.online/" rel="noopener noreferrer nofollow">OpenTgResearcher</a>. Исходные коды лежат на <a href="https://github.com/DamianMorozov/OpenTgResearcher" rel="noopener noreferrer nofollow">ГитХаб</a>. Комьюнити <a href="https://opentgresearcher.online/licenses" rel="noopener noreferrer nofollow">лицензию</a> можно получить бесплатно в&nbsp;автоматическом режиме через меню программы. Скачать можно стабильный релиз,&nbsp;либо самую новую превью версию в&nbsp;разделе <a href="https://github.com/DamianMorozov/OpenTgResearcher/releases" rel="noopener noreferrer nofollow">релизов</a>. Есть несколько вариантов установки: консольная версия (кроссплатформенная), докер версия (для продвинутых), десктоп версия (под&nbsp;Windows).</p><p>Установим десктоп версию. Для&nbsp;этого нам понадобится дистрибутив. В&nbsp;списке файлов релиза найдите OpenTgResearcherDesktop‑win‑x64-Setup.exe (64-разрядная архитектура ПО). Браузер может запросить разрешение на&nbsp;скачивание и сохранение файла, а&nbsp;также предупредить, что&nbsp;файлы редко скачиваются. После чего, Windows предупредит вас, что&nbsp;файл скачан из&nbsp;интернета и спросит разрешение на&nbsp;установку. Для&nbsp;проверки дистрибутива на&nbsp;вирусы можете воспользоваться онлайн сервисом проверки <a href="https://www.virustotal.com/gui/home/upload" rel="noopener noreferrer nofollow">VirusTotal</a>. По&nbsp;завершении установки ПО&nbsp;вы должны увидеть загрузочную страницу. Из&nbsp;которой вы можете попасть на&nbsp;главную страницу. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c41/830/672/c41830672d25d1d42bea68c6e5236704.png" alt="Главная страница" title="Главная страница" width="1700" height="1016"><div><figcaption>Главная страница</figcaption></div></figure><p>Поздравляю, вы справились! Теперь необходимо настроить локальные каталоги. В&nbsp;главном меню слева выбираем Settings. В&nbsp;них вы можете задать путь к&nbsp;хранилищу (Storage: c:\OpenTgResearcher\TgStorage\TgStorage.db) и путь к&nbsp;файлу сессии(Session: C:\Users\&lt;userName&gt;\AppData\Local\OpenTgResearcherDesktop\current\OpenTgResearcher.session). После чего, сохраняем настройки и закрываем ПО, запускаем заново.</p><p>Итак, у&nbsp;нас есть локальное хранилище и путь к&nbsp;файлу сессии. Теперь нам необходимо получить авторизацию от&nbsp;самого Телеграм и сохранить сессию. Для&nbsp;этого, в&nbsp;главном меню слева открываем Client connection. Кликаем по&nbsp;ссылке <a href="https://my.telegram.org/auth?to=apps" rel="noopener noreferrer nofollow">my.telegram.org</a>, в&nbsp;открывшейся странице браузера, вводим свой номер телефона, код авторизации получаем в&nbsp;боте Telegram Service Notifications. Далее, мы заполняем поля App title, Short name. Выписываем поля App api_id, App api_hash. Переходим обратно в&nbsp;OpenTgResearcher и заполняем поля API hash, API ID, Phone number. Эти данные сохранятся в&nbsp;локальном хранилище в&nbsp;таблице APPS. Если вы используете пароль, то заполните поле Password (это поле не&nbsp;сохраняется в&nbsp;таблице, если сессия протухнет, придётся вводить заново). После чего нажмите кнопку Connect to TG server. Возможно, к&nbsp;вам снова придёт код авторизации, в&nbsp;таком случае, его необходимо скопировать и вставить в&nbsp;поле Login code. После чего снова нажать Connect to TG server. В&nbsp;случае успеха&nbsp;— поле Connection state изменит своё положение на&nbsp;крайнее правое и описание рядом Client is connected, а&nbsp;также заполнятся остальные поля блока Settings without saving. В&nbsp;случае ошибок, смотрим содержимое поля Data request и запрашиваем помощь в <a href="https://t.me/OpenTgResearcher" rel="noopener noreferrer nofollow">Телеграм группе</a>.</p><p>Что&nbsp;дальше? Просканируем доступные каналы и группы. Для&nbsp;этого в&nbsp;главном меню слева кликнем по&nbsp;меню Chats. Изначально список будет пуст. Заполним его, кликнув по&nbsp;кнопке Online update. Вы увидите прогресс парсинга ваших чатов. Сверху отображается текущий статус чтения, сколько чатов всего. Снизу отображается защитный механизм Телеграм&nbsp;— Flood Control. После определённой порции данных, Телеграм просит подождать несколько секунд, эта информация обновляется автоматически. По&nbsp;завершении парсинга, можно открыть любой чат, дважды кликнув по&nbsp;строке с&nbsp;именем. В&nbsp;открывшейся странице деталей чата настроим каталог для&nbsp;сохранения медиа&nbsp;(Directory). Если чат содержит темы, то можете включить переключатель Creating subdirectories. Если нам нужны комментарии - включите переключатель Parsing comments. Далее сохраним настройки&nbsp;— Save chat settings. Поздравляю, всё готово для&nbsp;скачивания&nbsp;— жмём кнопку Online update. Запустится процесс скачивания медиа и парсинга сообщений. В&nbsp;случае отмены&nbsp;— нажмите кнопку Stop download. Прогресс отображается в строках Message и Media.</p><p>Это мой первый пост на хабре. Оставляйте свои комментарии и пожелания.</p> <a href="https://habr.com/ru/posts/946954/?utm_campaign=946954&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 15 Sep 2025 08:56:17 GMT</pubDate>
    <dc:creator><![CDATA[MorozovDamian]]></dc:creator>
      
      <category><![CDATA[OpenTgResearcher]]></category><category><![CDATA[Телеграм]]></category><category><![CDATA[скачать]]></category><category><![CDATA[ресёчер]]></category><category><![CDATA[ресечер]]></category><category><![CDATA[тгресечер]]></category><category><![CDATA[тгресёчер]]></category><category><![CDATA[тг-ресечер]]></category><category><![CDATA[тг-ресёчер]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @KrawMire — .NET (+4) — 07.08.2025 12:42]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/934940/</guid>
    <link>https://habr.com/ru/posts/934940/?utm_campaign=934940&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мне надоели платные приложения для учета расходов, поэтому я сделал <a href="https://github.com/KrawMire/profitocracy" rel="noopener noreferrer nofollow">свое</a>: бесплатное и с открытым исходным кодом.</p><p>Согласитесь, идея довольно проста: мобильное приложение, в котором можно было бы записывать свои расходы и строить какие-нибудь планы по тратам. Количество таких инструментов в магазинах приложений, по моим ощущениям, сравнимо с количеством самописных будильников и калькуляторов - их довольно много.</p><p>Я перепробовал десятки решений, но в каждом находил какие-то ограничения. Где-то были платные подписки или ограниченный функционал, где-то требовалась регистрация и данные о моих расходах улетали на сервера (зачем?), а где-то приложение просто не подходило мне по функционалу. В итоге я решил уйти от готовых приложений к учету в таблицах Excel. Но такой подход тоже был неудобным, и я понял, что пора создать свое собственное приложение: приватное, бесплатное и, самое главное, открытое.</p><p>В общем, так появилось&nbsp;<strong><a href="https://github.com/KrawMire/profitocracy" rel="noopener noreferrer nofollow">Profitocracy</a></strong>&nbsp;- бесплатное Open Source мобильное приложение, написанное на .NET MAUI. Его главная цель — помочь пользователям организовать учет личных расходов по популярному правилу&nbsp;<strong>50-30-20</strong>, а также обеспечить конфиденциальность данных.&nbsp;Profitocracy&nbsp;хранит всю информацию локально на вашем устройстве. Приложение не передает никакие данные третьим лицам и полностью свободно от рекламы и монетизации.</p><p>Среди основных особенностей приложения я хотел бы выделить:</p><ul><li><p><strong>Автоматическое планирование бюджета. </strong>Вы указываете дату окончания периода (получение зарплаты, например), и приложение расчитает для вас ежедневные расходы, расходы по типам (по правилу 50-30-20), а также по категориям (которые вы можете создать сами).</p></li><li><p><strong>Индивидуальная настройка.</strong> Вы можете создавать собственные профили расходов: для личных нужд, на время отпуска или поездку в командировку. Причем столько сколько вам потребуется.</p></li><li><p><strong>Приватность. </strong>Все данные - на вашем устройстве и только. Также, имеется возможность создания бэкапов (выгрузка данных в файл) для переноса данных на другое устройство.</p></li><li><p><strong>Открытый исходный код.</strong>&nbsp;Исходный код проекта выложен на GitHub (<a href="https://github.com/KrawMire/profitocracy" rel="noopener noreferrer nofollow">ссылка на репозиторий</a>). Каждый может внести свой вклад, предложить новый функционал или изучить как работает приложение.</p></li><li><p><strong>Кроссплатформенность. </strong>Приложение доступно как для Android, так и для iOS.</p></li><li><p><strong>Перевод на несколько языков.</strong>&nbsp;Profitocracy поддерживает русский, английский и другие языки.</p></li></ul><p>На момент написания поста проект завоевал небольшой, но значимый отклик в сообществе разработчиков:</p><ul><li><p><strong>100+ звезд</strong>&nbsp;на GitHub;</p></li><li><p><strong>20+ форков;</strong></p></li><li><p><strong>3 активных контрибьютора. </strong>Причем, это не мои друзья :)</p></li></ul><p><strong>Ссылки на скачивание:</strong></p><ul><li><p><a href="https://play.google.com/store/apps/details?id=com.krawmire.profitocracy" rel="noopener noreferrer nofollow">Google Play Market</a></p></li><li><p><a href="https://apps.apple.com/app/profitocracy/id6503658740" rel="noopener noreferrer nofollow">App Store</a></p></li></ul><p>Буду рад вашим отзывам, предложениям и комментариям как на GitHub, так и здесь. Надеюсь, Profitocracy поможет вам так же, как оно помогло мне!</p> <a href="https://habr.com/ru/posts/934940/?utm_campaign=934940&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 07 Aug 2025 09:42:49 GMT</pubDate>
    <dc:creator><![CDATA[KrawMire]]></dc:creator>
      
      <category><![CDATA[open source]]></category><category><![CDATA[личные финансы]]></category><category><![CDATA[.net]]></category><category><![CDATA[maui]]></category><category><![CDATA[github]]></category><category><![CDATA[мобильное приложение]]></category><category><![CDATA[учет финансов]]></category><category><![CDATA[приватность данных]]></category><category><![CDATA[конфиденциальность]]></category><category><![CDATA[бесплатно]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alados — .NET (+1) — 03.08.2025 17:29]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/933598/</guid>
    <link>https://habr.com/ru/posts/933598/?utm_campaign=933598&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>🎲 Обновление бота для планирования настолок и DnD</p><p>Привет! Я сделал телеграм-бота, который помогает быстро и удобно планировать игровые сессии с друзьями — будь то настолки, DnD или что-то ещё.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e72/12a/b4b/e7212ab4ba635984cdcffaabdc4badf9.png" alt="🎲 Обновление бота для планирования настолок и DnD" width="592" height="394"><div><figcaption>🎲 Обновление бота для планирования настолок и DnD</figcaption></div></figure><p>Идея проста:</p><ul><li><p>создаёте группу в боте,</p></li><li><p>участники отмечают, когда они свободны,</p></li><li><p>бот показывает, в какое время совпадают все. Больше никаких бесконечных переписок в чатах, когда «мне удобно только в среду», а у кого-то уже пятница.</p></li></ul><p>💡 Что нового в последнем обновлении Я выпустил большой апдейт, который особенно пригодится игрокам в настолки и DnD:</p><ul><li><p>⏳ Дата окончания сессии — теперь можно указать полный промежуток времени, когда вы свободны. Например, с 14:00 до 18:00.</p></li><li><p>🔁 Повторяющиеся сессии — один раз указали «понедельник с 14 до 16», и эта запись будет актуальна каждую неделю.</p></li><li><p>🔔 Настраиваемые уведомления — можно включать только те напоминания, что нужны, и отключать ненужные.</p></li><li><p>🗓 Новое напоминание — за день до игры бот предупредит, чтобы вы точно не забыли.</p></li></ul><p>📱 Если хотите попробовать — бот бесплатный, работает прямо в Telegram.<br>Ссылка на бота -&nbsp;<a class="mention" href="/users/game_session_scheduler_bot">@game_session_scheduler_bot</a><br>Ссылка на канал с обновлениями -&nbsp;<a href="https://t.me/gamescheduler" rel="noopener noreferrer nofollow">https://t.me/gamescheduler</a></p> <a href="https://habr.com/ru/posts/933598/?utm_campaign=933598&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 03 Aug 2025 14:29:32 GMT</pubDate>
    <dc:creator><![CDATA[alados]]></dc:creator>
      
      <category><![CDATA[telegrambot]]></category><category><![CDATA[telegram]]></category><category><![CDATA[dnd]]></category><category><![CDATA[rpg]]></category><category><![CDATA[games]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @KOMMEHTATOP — .NET (+2) — 23.07.2025 13:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/930306/</guid>
    <link>https://habr.com/ru/posts/930306/?utm_campaign=930306&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>ChatCaster - приложение для голосового ввода с помощью геймада. </p><p>Друзья, всех приветсвтую! </p><p>Я тут набросал небольшое приложение для игроков на ПК и людей с ограничеными возможностями, которые играют в игры в помощью геймпада. Суть в том чтобы не вводить текст руками в чаты, а нажать любую комбинацию клавиш на геймпаде (или клавиатуре), сказать голосом то что хотите написать и все. Текст будет в нужном месте.</p><p>Бонусом приложение поддерживает перевод на 5 языков (самые популярые в steam). Вы просто выбираете нужный вам язык, говорите на своем родном, весь текст будет переведен и введен там где вам нужно.  </p><p>Если тут есть .net разработчики которые захотят присоединиться и доработать пару фишек или внести что-то свое, буду только благодарен.</p><p>Приложение делал один в рамках пет проекта, съело много времени, пока не могу себе позволить его развивать. Нужно дальше обучаться кодить и искать работу. </p><p>Короткое видео что оно умеет делать вот тут <a href="https://youtu.be/p_exJzcF1so" rel="noopener noreferrer nofollow">https://youtu.be/p_exJzcF1so</a></p><p>Ссылка на репозиторий если кто-то захочет поучаствовать <a href="https://github.com/KOMMEHTATOP/ChatCaster" rel="noopener noreferrer nofollow">https://github.com/KOMMEHTATOP/ChatCaster</a></p><p>С технической стороны это вообще мое первое приложение, те кто ищут косяки обязательно найдут, но приложение рабочее. Потребление приемлимое. И самое главное весь основной функционал работает. </p><p>Пост делаю впервые, АИ для текста не использую намеренно, готов к конструктивной критике или предложениям. </p><p>Буду рад если приложение окажется кому-то полезным. </p> <a href="https://habr.com/ru/posts/930306/?utm_campaign=930306&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 23 Jul 2025 10:38:50 GMT</pubDate>
    <dc:creator><![CDATA[KOMMEHTATOP]]></dc:creator>
      
      <category><![CDATA[распознавание речи]]></category><category><![CDATA[геймпад]]></category><category><![CDATA[клавиатура]]></category><category><![CDATA[переводчик]]></category><category><![CDATA[игры]]></category><category><![CDATA[петпроект]]></category><category><![CDATA[pet-project]]></category><category><![CDATA[wpf]]></category><category><![CDATA[wpf.mvvm]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Siemargl — Delphi (+4) — 22.07.2025 01:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/929766/</guid>
    <link>https://habr.com/ru/posts/929766/?utm_campaign=929766&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Есть для альтернатива Delphi в 2025 году для простых кроссплатформенных приложений?</strong></p><p>Навеяно обсуждением <a href="https://habr.com/ru/articles/928810/" rel="noopener noreferrer nofollow">статьи про Дельфи в 2025</a>.</p><p>Q1: Если сейчас есть задача по-быстрому сбацать что то с формами под винду - какая есть альтернатива дельфи?  </p><p>Q2: А если так же быстро накидать, только кроссплатформенное приложение и без зависимостей?  </p><p>И мой ответ </p><p>A: Не находишь, что 3000$ за кроссплатформенный дизайнер форм слишком дорого? Даже за хороший.</p><p>Собственно, порылся в памяти и в википедии, проверил что там еще живое и набросал списочек визуальных дизайнеров для Linux - приложеньиц. По названию язык программирования и фреймворк легко идентифицируется.</p><p>Все может использоваться бесплатно и без особых претензий на функциональность. Единственное, иногда бывает нужно еще нарисовать какой то чарт/график и загрузить/записать данные в БД/XML/JSON - с этим могут быть нюансы с конкретным вариантом.</p><p>С чем то я работал, с чем то нет, актуальные версии вживую не проверял. </p><ol><li><p>GNOME Builder (ex.Anjuta). GTK multilang IDE</p></li><li><p>Cambalache (ex.Glade) - GTK form builder</p></li><li><p>Qt Creator</p></li><li><p>FLUID for FLTK</p></li><li><p>wxFormBuilder for wxWidgets&nbsp;</p></li><li><p>Projucer for JUCE</p></li><li><p>Ultimate++&nbsp;</p></li><li><p>NetBeans GUI design tool for Java Swing&nbsp;</p></li><li><p>TKproE (TCL/TK Programming Environment)</p></li><li><p>Lazarus</p></li><li><p>MSEide+MSEgui Pascal</p></li><li><p>GTK# Visual Designer MonoDevelop (retired)</p></li><li><p>Xamarin.Forms GTK Backend (discontinued for NET MAUI)</p></li><li><p>JavaFX Scene Builder</p></li><li><p>Pygubu Tkinter a GUI for Python</p><p>Может еще что и забыл, либо не попалось на глаза.</p></li></ol> <a href="https://habr.com/ru/posts/929766/?utm_campaign=929766&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 21 Jul 2025 22:13:12 GMT</pubDate>
    <dc:creator><![CDATA[Siemargl]]></dc:creator>
      
      <category><![CDATA[Desktop]]></category><category><![CDATA[GUI]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alados — .NET (+1) — 20.07.2025 17:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/929334/</guid>
    <link>https://habr.com/ru/posts/929334/?utm_campaign=929334&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Обновление бота: поддержка часовых поясов и улучшения стабильности!</strong></p><p>Привет! Вышло крупное обновление бота, и вот что нового:</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/24e/f1e/884/24ef1e884450131f57b66e3dee1fe9ef.png" width="1024" height="1024"><div><figcaption><a class="mention" href="/users/game_session_scheduler_bot">@game_session_scheduler_bot</a></figcaption></div></figure><p>Ссылка на бота - <a class="mention" href="/users/game_session_scheduler_bot">@game_session_scheduler_bot</a><br>Ссылка на канал с обновлениями бота - <a href="https://t.me/gamescheduler" rel="noopener noreferrer nofollow">https://t.me/gamescheduler</a><br><br>🕒 <strong>Поддержка часовых поясов</strong><br> Теперь у каждой <strong>группы</strong> есть свой часовой пояс - по нему отправляются все уведомления.<br> У каждого <strong>пользователя</strong> - свой часовой пояс, и он видит <strong>все даты и время в привычном формате</strong>.<br> Это большое изменение, так что если что-то работает не так - <strong>обязательно напишите в канал или оставьте фидбек через бота</strong>.</p><p>⭐ <strong>Напоминание об оценке игроков</strong><br> Через 2 часа после начала игры приходит уведомление: самое время оценить своих напарников!<br> Раньше об этом часто забывали, а теперь - точно не забудете.</p><p>🔧 <strong>Повышена стабильность запросов</strong><br> Теперь бот лучше справляется с ограничениями Telegram и работает надёжнее, даже если вы активно им пользуетесь.</p><p>🧹 <strong>Удалена настройка стандартного времени</strong><br> Она только путала всех - больше этой настройки нет, и нотификаций по ней тоже.</p><p>Спасибо, что пользуетесь ботом!<br><br>Если возникнут вопросы - пишите в канал или через /feedback. Ваши отзывы помогают делать бота лучше ❤️</p> <a href="https://habr.com/ru/posts/929334/?utm_campaign=929334&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 20 Jul 2025 14:16:50 GMT</pubDate>
    <dc:creator><![CDATA[alados]]></dc:creator>
      
      <category><![CDATA[telegrambot]]></category><category><![CDATA[telegram]]></category><category><![CDATA[c#]]></category><category><![CDATA[c#.net]]></category><category><![CDATA[bot]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @alados — .NET (+1) — 17.07.2025 17:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/928684/</guid>
    <link>https://habr.com/ru/posts/928684/?utm_campaign=928684&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/fa4/d5c/a54/fa4d5ca5458ac27513f9f24de4a4e5ae.png" width="1024" height="1024"></figure><p>Благодаря вашим отзывам бот становится лучше с каждым днём.<br>Нас уже больше <strong>250 </strong>- это очень вдохновляет! Вчера вышло обновление для бота и он стал чуточку удобнее.<br><br>Вот ссылка на бота - <a class="mention" href="/users/game_session_scheduler_bot">@game_session_scheduler_bot</a><br>А вот здесь канал с новостями и обновлениями - <a href="https://t.me/gamescheduler" rel="noopener noreferrer nofollow">https://t.me/gamescheduler</a><br><br><strong>Что нового в этом обновлении: </strong></p><ul><li><p>Можно настраивать стандартное время группы, это то за час до которого всегда идёт нотификации о сессии</p></li><li><p>Теперь можно добавлять игру прям во время записи на сессию</p></li><li><p>Больше никакого стандартного списка игр, всё нужно добавлять руками (только для новых групп)</p></li><li><p>Удалять время тоже теперь можно пачкой</p></li></ul><p><strong>Исправления:</strong></p><ul><li><p>Игра теперь должна быть уникальной только в рамках одной группы, а не всего бота</p></li><li><p>Исправлены несколько опечаток в русской версии</p></li><li><p>Добавлены кнопки возвращения в меню, внутри некоторых команд</p></li><li><p>Спам сообщением "Enter Command" в общие чаты должен прекратиться</p></li></ul><p>Если захотите предложить новые фичи - пишите прямо в боте через фидбэк или в комментариях тут.</p><p>Спасибо, что вы с нами!</p> <a href="https://habr.com/ru/posts/928684/?utm_campaign=928684&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 17 Jul 2025 14:01:56 GMT</pubDate>
    <dc:creator><![CDATA[alados]]></dc:creator>
      
      <category><![CDATA[telegrambot]]></category><category><![CDATA[c#]]></category><category><![CDATA[c#.net]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ddomrachevaa — Блог компании Контур (+2) — 03.07.2025 10:46]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/skbkontur/posts/924520/</guid>
    <link>https://habr.com/ru/companies/skbkontur/posts/924520/?utm_campaign=924520&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Контур проводит исследование о том, как живёт .NET-сообщество в России. <a href="https://forms.kontur.ru/form/dotNet_research" rel="noopener noreferrer nofollow">Анкета</a> активна до 15 июля. </p><p>Вопросов чуть больше 20, но большинство из них закрытые, так что много времени не займет. Мы не спрашиваем ваши персональные данные и зарплатные вилки. Мы хотим узнать, как C# разработчики обмениваются знаниями и какие выбирают инструменты для развития.   </p><p>Об итогах напишем на Хабре. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8a3/486/dbc/8a3486dbcbd4cd537d5a4590119cdf8d.png" width="1920" height="1080"></figure> <a href="https://habr.com/ru/posts/924520/?utm_campaign=924520&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 03 Jul 2025 07:46:50 GMT</pubDate>
    <dc:creator><![CDATA[ddomrachevaa (Контур)]]></dc:creator>
      
      <category><![CDATA[дотнет]]></category><category><![CDATA[шарп]]></category><category><![CDATA[c#.net]]></category><category><![CDATA[c#]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @JBFW — C# (+1) — 13.06.2025 15:47]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/918164/</guid>
    <link>https://habr.com/ru/posts/918164/?utm_campaign=918164&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мы все ругаем ИИ, и за дело, но вот в ходе дискуссии возник спор: можно ли с помощью ИИ написать код, который будет работать, если человек вообще не владеет нужным языком программирования, но хотя бы чуть-чуть помнит предметную область.</p><p>И вот что получилось:</p><pre><code class="cs">using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

class LZ77Compressor
{
    const int WINDOW_SIZE = 4096;
    const int LOOKAHEAD_BUFFER_SIZE = 18;

    public static void Compress(string inputPath, string outputPath)
    {
        byte[] input = File.ReadAllBytes(inputPath);
        using var output = new BinaryWriter(File.Create(outputPath));

        int pos = 0;
        while (pos &lt; input.Length)
        {
            int bestMatchDistance = 0, bestMatchLength = 0;

            int startIndex = Math.Max(0, pos - WINDOW_SIZE);

            for (int i = startIndex; i &lt; pos; i++)
            {
                int matchLength = 0;
                while (matchLength &lt; LOOKAHEAD_BUFFER_SIZE &amp;&amp;
                       pos + matchLength &lt; input.Length &amp;&amp;
                       input[i + matchLength] == input[pos + matchLength])
                {
                    matchLength++;
                }

                if (matchLength &gt; bestMatchLength)
                {
                    bestMatchDistance = pos - i;
                    bestMatchLength = matchLength;
                }
            }

            if (bestMatchLength &gt;= 3)
            {
                output.Write((byte)1); // флаг: это ссылка
                output.Write((ushort)bestMatchDistance); // расстояние
                output.Write((byte)bestMatchLength); // длина
                pos += bestMatchLength;
            }
            else
            {
                output.Write((byte)0); // флаг: это литерал
                output.Write(input[pos]); // байт как есть
                pos++;
            }
        }
    }

    public static void Decompress(string inputPath, string outputPath)
    {
        using var input = new BinaryReader(File.OpenRead(inputPath));
        using var output = new BinaryWriter(File.Create(outputPath));

        List&lt;byte&gt; buffer = new();

        while (input.BaseStream.Position &lt; input.BaseStream.Length)
        {
            byte flag = input.ReadByte();
            if (flag == 1)
            {
                int distance = input.ReadUInt16();
                int length = input.ReadByte();

                int start = buffer.Count - distance;
                for (int i = 0; i &lt; length; i++)
                {
                    byte b = buffer[start + i];
                    buffer.Add(b);
                    output.Write(b);
                }
            }
            else
            {
                byte b = input.ReadByte();
                buffer.Add(b);
                output.Write(b);
            }
        }
    }
}
</code></pre><pre><code class="cs">class Program
{
    static void Main()
    {
        string input = "input.txt";
        string compressed = "compressed.lz";
        string decompressed = "output.txt";

        LZ77Compressor.Compress(input, compressed);
        LZ77Compressor.Decompress(compressed, decompressed);

        Console.WriteLine("Сжатие и распаковка завершены.");
    }
}
</code></pre><p>Я не знаю С#, и даже не помню LZ - кто-нибудь может попытаться это скомпилировать - оно работает или нет?<br>Или опять ИИ всё навыдумывал?</p> <a href="https://habr.com/ru/posts/918164/?utm_campaign=918164&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 13 Jun 2025 12:47:37 GMT</pubDate>
    <dc:creator><![CDATA[JBFW]]></dc:creator>
      
      <category><![CDATA[иишница]]></category><category><![CDATA[lz77]]></category><category><![CDATA[c#]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @lartyom — Чулан (+1) — 26.03.2025 13:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/894550/</guid>
    <link>https://habr.com/ru/posts/894550/?utm_campaign=894550&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/27a/1bc/54d/27a1bc54d8f5af44d087f281c0a01f8e.png" alt="startdelu.ru" title="startdelu.ru" width="2560" height="1080"><div><figcaption>startdelu.ru</figcaption></div></figure><p>Здравствуйте, дорогие хабрачане! Недавно закрылся Хабр Фриланс, возможно единственной фриланс-площадкой с адекватным комьюнити. Итак я предлагаю вместо неё другое решение больше подходящие тематике сайта (т.к. в основном здесь сидят программисты-энтузиасты описывающие свои ощущения) и возможно, представляющая другой подход к экономике как например <a href="https://habr.com/ru/articles/72753/" rel="noopener noreferrer nofollow">эта</a></p><p>В современном мире, где информационный шум и высокая конкуренция становятся неотъемлемой частью нашей жизни, найти единомышленников и ресурсы для реализации своих идей становится настоящим вызовом. Каждый день мы сталкиваемся с потоком информации, который затрудняет поиск тех, кто разделяет наши ценности и стремления. Гении, творцы и новаторы часто остаются непризнанными, их идеи теряются в океане шума, а талант — не находит должного признания.</p><p>Представляю вам уникальную площадку <a href="http://startdelu.ru" rel="noopener noreferrer nofollow">startdelu.ru</a>, созданную моим знакомым специально для энтузиастов у кого есть много свободного времени, но не знает как эффективно его потратить не только для себя, но и для пользы всего сообщества, кто ищет поддержку и вдохновение. Здесь вы сможете не только найти единомышленников, но и привлечь необходимые ресурсы для реализации своих проектов, указав что у вас уже имеется, а что ещё нужно привлечь.</p><p>Делается это просто. Регистрируемся на сайте. Выбираем тип идеи (коммерческая или некоммерческая/волонтёрская). Описываем свою идею и указываем свои свои "способности и потребности". Дизайн сайта настолько прост, что с ним справится может даже ребёнок! Ещё одной отличительной особенностью сайта есть наличие личных сообщений с автором поста, что делает его своего рода социальной сетью. </p><p>Пока у сайта небольшое комьюнити состоящая только из знакомых его автора, да и он ещё сырой и нуждается в доработке, например, отображение статуса текущего проекта и т.п. Но я думаю что он не умрёт и ещё заслужит нашего внимания, пока существуем мы!  </p><p></p> <a href="https://habr.com/ru/posts/894550/?utm_campaign=894550&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 26 Mar 2025 10:54:10 GMT</pubDate>
    <dc:creator><![CDATA[lartyom]]></dc:creator>
      
      <category><![CDATA[поддержка проектов]]></category><category><![CDATA[поддержка стартапов]]></category><category><![CDATA[энтузиасты]]></category><category><![CDATA[конкуренция]]></category><category><![CDATA[информационный шум]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Max_2D — C# (+1) — 20.03.2025 09:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/892560/</guid>
    <link>https://habr.com/ru/posts/892560/?utm_campaign=892560&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем привет ,собрал на днях оверлей плеер для управления любым музыкальным плеером . Так же продолжаю работы по другому проекту из другого поста . </p><p>Тут оверлей плеер <a href="https://github.com/maxim2d/Overlay_Player/releases" rel="noopener noreferrer nofollow">https://github.com/maxim2d/Overlay_Player/releases</a></p><p>Тут второй проект <a href="https://habr.com/ru/posts/875106/" rel="noopener noreferrer nofollow">https://habr.com/ru/posts/875106/</a></p><p>Дополнил скриншотами </p><figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/611/ae8/511/611ae85113757bebdecb7430d107eb07.png" width="500" height="100"></figure><p></p> <a href="https://habr.com/ru/posts/892560/?utm_campaign=892560&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 20 Mar 2025 06:37:49 GMT</pubDate>
    <dc:creator><![CDATA[Max_2D]]></dc:creator>
      
      <category><![CDATA[Музыкальный плеер]]></category><category><![CDATA[оверлей]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @m3ta10ph0b — .NET (+4) — 21.02.2025 23:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/884804/</guid>
    <link>https://habr.com/ru/posts/884804/?utm_campaign=884804&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>В начале года я опубликовал статью про гибридное кэширование.</p><a href="https://habr.com/ru/articles/871716/" target="_blank" rel="noopener noreferrer nofollow" class="embed_link embed_layout-right"><div class="embed__thumb" style="background-image: url(&quot;https://habrastorage.org/getpro/habr/upload_files/b25/1aa/e22/b251aae227b91858f353a09074314e61.jpeg&quot;);"></div><div class="embed__caption"><div class="embed__caption-title"><span>Гибридное кэширование в ASP.NET Core</span></div><div class="embed__caption-description">В .NET 9 появилась новая библиотека для кэширования — HybridCache . В статье расскажу, что это такое...</div><span class="embed__caption-host">habr.com</span></div></a><p>Прошло уже больше месяца, а стабильная версия nuget-пакета <a href="https://www.nuget.org/packages/Microsoft.Extensions.Caching.Hybrid/" rel="noopener noreferrer nofollow">Microsoft.Extensions.Caching.Hybrid</a> так и не вышла.</p><p>Я не делаю прогнозы по датам выхода, но хочу порассуждать на тему того, чего ожидаю от стабильной версии. И чего — точно нет.</p><p><strong>Начну с последнего — каких изменений я не ожидаю</strong></p><p>Изменение состава и сигнатур текущих методов. Если следить за выходом новых версий пакета <a href="https://www.nuget.org/packages/Microsoft.Extensions.Caching.Hybrid/" rel="noopener noreferrer nofollow">Microsoft.Extensions.Caching.Hybrid</a>, можно заметить, что методы объекта <a href="https://learn.microsoft.com/en-us/aspnet/core/performance/caching/hybrid?view=aspnetcore-9.0" rel="noopener noreferrer nofollow">HybridCache</a> не меняются уже давно. Из этого можно сделать вывод, что в стабильной версии мы увидим тоже самое, что наблюдаем сейчас.</p><p><strong>Какие изменения я ожидаю увидеть</strong></p><p>Удаление объекта из кэша по тегам. На момент написания статьи метод&nbsp;<a href="https://source.dot.net/Microsoft.Extensions.Caching.Abstractions/R/c37a54f5e962ab23.html" rel="noopener noreferrer nofollow">RemoveByTagAsync</a> вообще не имел реализации. Сейчас в версии <a href="https://nuget.info/packages/Microsoft.Extensions.Caching.Hybrid/9.2.0-preview.1.25105.6" rel="noopener noreferrer nofollow">9.2.0-preview.1.25105.6</a> он реализован и вполне себе работает, так что в релизную версию явно войдёт.</p><p>Не удивлюсь, если изменится логика присваивания тегов. Сейчас для многих она может быть неочевидной. Разберём пример:</p><pre><code class="cs">  await cache.GetOrCreateAsync(
    "someKey",
    async ct =&gt; await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag2", "tag3"],
    cancellationToken);

  await cache.GetOrCreateAsync(
    "someKey",
    async ct =&gt; await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag4"],
    cancellationToken);</code></pre><p>Представим, что метод <code>GetOrCreateAsync</code> вызывается несколько раз с одним и тем же ключом, но разным набором тегов. Теги будут присвоены только при первом попадании объекта в кэш, то есть в момент его извлечения из хранилища. Когда проектируем приложение, не всегда заранее известно, в какой из вызовов <code>GetOrCreateAsync</code> объект будет извлекаться из кэша, а в какой — из хранилища. Оно и логично — метод специально создали так, чтобы мы не задумывались об этом. Соответственно, сейчас при вызове этого метода мы не можем определить, какой из наборов тегов ляжет в кэш.</p><p>И тут у меня два варианта развития событий: или логика поменяется и теги будут перезаписываться всегда — независимо от того, берётся объект из кэша или хранилища. Или при написании программы нужно будет следить, не передаём ли мы разные наборы тегов.</p><p></p> <a href="https://habr.com/ru/posts/884804/?utm_campaign=884804&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 21 Feb 2025 20:51:14 GMT</pubDate>
    <dc:creator><![CDATA[m3ta10ph0b]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[.net]]></category><category><![CDATA[.net 9 preview]]></category><category><![CDATA[.net 9]]></category><category><![CDATA[asp.net]]></category><category><![CDATA[asp.net core]]></category><category><![CDATA[программирование]]></category><category><![CDATA[кэширование]]></category><category><![CDATA[кэширование данных]]></category><category><![CDATA[гибридное кэширование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @feeelin — Блог компании PVS-Studio (+3) — 17.02.2025 12:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/883162/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/883162/?utm_campaign=883162&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Проблемы в работе плагина PVS-Studio для Visual Studio</strong></p><p>Несколько пользователей сообщили нам, что в работе плагина PVS-Studio для Visual Studio версии 17.12 и выше происходят проблемы, не позволяющие запустить плагин. В этой заметке мы опишем проблему и предложим способы её решения.</p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/e22/c8e/952/e22c8e95215bc7e925fab59efd2bf429.png"></figure><p>У некоторых пользователей статического анализатора PVS-Studio при использовании плагина для интегрированной среды разработки Microsoft Visual Studio 2022 происходило завершение работы плагина, связанное с внутренней ошибкой. А на экране появлялся страшный список вызовов:</p><pre><code>Exception message:

One or more errors occurred.

Exception type:

System.AggregateException

Stack:    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)

   at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)

   at System.Threading.Tasks.Task.Wait()

   at ProgramVerificationSystems.PVSStudio.PVSStudio.InitializeErrorListWindow(Boolean isFromPackageLoadedEvent) in D:\\JenkinsProjects\\workspace\\proj_PVS_Setup_Docker\\WorkDir\\PVS-Studio\\PVS-Studio\\VsPkg.cs:line 2414

Inner Exception:

Exception message:

Exception from HRESULT: 0x80042007

Exception type:

System.Runtime.InteropServices.COMException



Stack: at Microsoft.VisualStudio.Shell.Interop.IVsShell5.LoadPackageWithContext(Guid&amp; packageGuid, Int32 reason, Guid&amp; context)
....
</code></pre><p>Возникновение этой ошибки обусловлено тем, что в версии Visual Studio 2022 17.12 был изменён API этой среды разработки для взаимодействия с плагинами. Поэтому в версии PVS-Studio 7.33 мы внесли необходимые изменения в плагин для Visual Studio, и на этой версии с указанной средой разработки анализатор работает корректно.</p><p>Следовательно, для решения этой проблемы есть следующие варианты:</p><ul><li><p>обновить анализатор PVS-Studio до версии 7.33 или выше;</p></li><li><p>откатить версию среды разработки Visual Studio 2022 на предыдущую.</p></li></ul><p>Если после выполнения указанных выше рекомендаций ситуация не решилась, или же вы столкнулись с другой проблемой при использовании нашего анализатора, не стесняйтесь сообщить нам о ней с помощью специальной <a href="https://pvs-studio.ru/ru/about-feedback/" rel="noopener noreferrer nofollow">формы на сайте</a>. Мы приложим все возможные усилия, чтобы решить вашу проблему!</p><p>Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Valerii Filatov. <a href="https://pvs-studio.com/en/blog/posts/cpp/1223/" rel="noopener noreferrer nofollow">Issues: PVS-Studio plugin for Visual Studio</a>.</p> <a href="https://habr.com/ru/posts/883162/?utm_campaign=883162&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 17 Feb 2025 09:25:55 GMT</pubDate>
    <dc:creator><![CDATA[feeelin (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[visual studio]]></category><category><![CDATA[pvs-studio]]></category><category><![CDATA[plugin]]></category><category><![CDATA[плагин]]></category><category><![CDATA[c#]]></category><category><![CDATA[c++]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[статический анализ]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @EF9GH2Ygfd3 — C# (+4) — 07.01.2025 17:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/872060/</guid>
    <link>https://habr.com/ru/posts/872060/?utm_campaign=872060&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p> В Фреймворк DBGridChart добавлено OLAP-приложение "Экспресс_обработка_таблицы.exe ", позволяющее при разработке программ на C++, Java, Visual Basic, F# и на других языках программирования (имеющих средства выполнения из программы готовых приложений из командной строки с параметрами) автоматическое формирование табличных и ленточных форм, форм с диаграммами и графиками с готовым унифицированным многофункциональным интерфейсом пользователя для корректировки баз данных, OLAP-анализу и прогнозированию данных в табличной и в графической формах. </p><p>Таким образом, программист при разработке приложения, даже на языке, отличным от C#, может использовать все средства и возможности Фреймворка DFGridChart путем обращения к приложению "Экспресс_обработка_таблицы.exe " с указанием через параметры значения свойствам, например: текст строки подключения к базе данных, текст команды Select, текст строки подстановки. Порядок формирование таких таблиц определяется интерфейсом (меню, кнопки), разрабатываемого программистом для приложения. </p><p><strong>Гиперссылка для скачивания</strong>&nbsp;Фреймворка "DBGridChart", OLAP-приложения "Экспресс_обработка.exe" и "Экспресс_обработка_таблицы.exe " с исходными текстами, DLL-библиотеками, документацией и с демонстрационными примерами:&nbsp;<strong><a href="https://disk.yandex.ru/d/sI1VhBiSPzDp-A" rel="noopener noreferrer nofollow">https://disk.yandex.ru/d/sI1VhBiSPzDp-A</a></strong></p><p><strong>Пример обращения к приложению "Экспресс_обработка_таблицы.exe " при разработке программы на C++</strong></p><p>#include &lt;string&gt;</p><p>...</p><p>// Символ # должен быть указан перед наименованием свойства!// Внутри строковых констант перед символами \ и " нужно указывать символ \<br>std::string<br>       program = "C:\\Экспресс_обработка_таблицы\\bin\\Debug\\Экспресс_обработка_таблицы .exe",&nbsp;// Местоположение приложения<br>      p1 = "#ConnString=Provider = Microsoft.Jet.OLEDB.4.0;Data Source="C:\\Демонстрационный пример Экспресс обработка таблицы для C++\\Выпуск изделий.mdb",&nbsp;// Строка подключения к базе данных<br>      p2 = "#DBMS = Access",&nbsp;// Тип СУБД, если не указан (p2 не указано), то определяется по строке подключения<br>      p3 = "#Select = SELECT Подразделения.[Код подразделения]@#,Подразделения.[Наименование подразделения]*, Подразделения.[Численность на 2022], Подразделения.[Численность на 2023], Подразделения.[Численность], Подразделения.[Дата формирования], Подразделения.[Код типа подразделения]*, [Типы подразделений].[Наименование типа подразделения], Подразделения.[Действующее] FROM [Типы подразделений] RIGHT JOIN Подразделения~ ON [Типы подразделений].[Код типа подразделения] = Подразделения.[Код типа подразделения] ORDER BY Подразделения.[Наименование подразделения]",&nbsp;// Запрос с возможностью корректировки таблицы Подразделения. Специальные символы при режиме корректировки после имен полей или псевдонимов: ключевое (@), обязательное (*), не корректируемое (#) поле и после имени корректируемой таблицы указывается символ ~, если таблиц несколько во фразе From.<br>      p4 =&nbsp;"#Podstavit_v_kolonki = ктп #-; SELECT [Наименование типа подразделения], [Код типа подразделения] FROM [Типы подразделений] ORDER BY [Наименование типа подразделения]",&nbsp;//Подстановка кода типа подразделения в колонку с именем ктп по наименованию путем выбора мышкой из списка (сформированного указанной командой Select) наименований типов подразделений. Режимы подстановки: только из списка (-), список открывается в текущей ячейке (#).<br>      p5 = "#Flag_Create_SQL_Select = True",&nbsp;// Разрешить (True)/не разрешить (False) использовать конструктор команд SQL (по умолчанию - True и p5 можно не указывать)<br>      p6 = "#Table_№ = 2367",&nbsp;// Уникальный номер (обычно, случайное число) таблицы или запроса для сохранения макета настройки индивидуально для таблицы<br>      parameters = p1 + p2 + p3 + p4 + p5 + p6,&nbsp;// параметры приложения<br>      command = program + " " + parameters;&nbsp;// командная строка<br>      system(command.c_str());&nbsp;// выполнение приложения, которое формирует табличную форму с многофункциональным унифицированным интерфейсом Фреймворка DBGridChart  </p> <a href="https://habr.com/ru/posts/872060/?utm_campaign=872060&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 07 Jan 2025 14:57:02 GMT</pubDate>
    <dc:creator><![CDATA[EF9GH2Ygfd3]]></dc:creator>
      
      <category><![CDATA[olap]]></category><category><![CDATA[framework]]></category><category><![CDATA[datagridview]]></category><category><![CDATA[разработка приложений]]></category><category><![CDATA[chart]]></category><category><![CDATA[sql]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PvsTeam — Блог компании PVS-Studio (+2) — 12.11.2024 10:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/pvs-studio/posts/857828/</guid>
    <link>https://habr.com/ru/companies/pvs-studio/posts/857828/?utm_campaign=857828&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/802/a2a/7ef/802a2a7ef0545027d4f7adb6505108ad.png" width="1600" height="902"></figure><p>Многие C# разработчики знают, что статический анализатор кода — это полезная штука (или крутой инструмент?). Но какие проблемы он может выявить в реальности?</p><ul><li><p>Заметит незакрытую скобку?</p></li><li><p>Укажет на плохое название или проблемы с код-стайлом?</p></li><li><p>Выявит NRE или выход за границы массива?</p></li><li><p>Или же он способен на что-то большее?</p></li></ul><p>Узнаем в новом вебинаре, посвященном использованию статических анализаторов для проверки и улучшения C# проектов. Узнаем возможности инструмента на реальных примерах, его сильные и слабые стороны. А ещё разберём тему безопасной разработки, узнаем, способны ли выявлять анализаторы уязвимости и причём тут новый ГОСТ 71207.</p><p><strong>18 ноября 14:00</strong></p><p><a href="https://pvs-studio.ru/ru/webinar/?utm_source=habr&amp;utm_medium=pvs&amp;utm_campaign=webinar&amp;utm_content=csharp1" rel="noopener noreferrer nofollow">Ссылка на регистрацию здесь.</a> </p><p>Присоединяйтесь! Будем рады пообщаться!</p> <a href="https://habr.com/ru/posts/857828/?utm_campaign=857828&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 12 Nov 2024 07:03:00 GMT</pubDate>
    <dc:creator><![CDATA[PvsTeam (PVS-Studio)]]></dc:creator>
      
      <category><![CDATA[.net]]></category><category><![CDATA[гост]]></category><category><![CDATA[csharp]]></category><category><![CDATA[static analyzer]]></category><category><![CDATA[static analysis]]></category><category><![CDATA[developer tools]]></category><category><![CDATA[devsecops]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AuToMaton — Rust (+3) — 03.11.2024 08:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/855732/</guid>
    <link>https://habr.com/ru/posts/855732/?utm_campaign=855732&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e2e/bd4/97e/e2ebd497e58a47d6e4e3f303a7d4eb73.jpeg" width="1498" height="813"></figure><p>Не знаю на сколько это свежая новость ибо прочитал в новостях, но факт занимательный. JetBrains (опять) изменила лицензирование сделав IDE для Rust, JavaScript, C# и тестирования бесплатными для некоммерческого использования.</p><p>На сколько это следствие продвижения ИИ в средствах разработки - поди знай, но уж больно совпало по времени.</p> <a href="https://habr.com/ru/posts/855732/?utm_campaign=855732&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 03 Nov 2024 05:48:42 GMT</pubDate>
    <dc:creator><![CDATA[AuToMaton]]></dc:creator>
      
      <category><![CDATA[ide]]></category><category><![CDATA[rust]]></category><category><![CDATA[c#]]></category><category><![CDATA[javascript]]></category><category><![CDATA[testing]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Gromilo — C# — 18.10.2024 20:45]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/851812/</guid>
    <link>https://habr.com/ru/posts/851812/?utm_campaign=851812&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>История тупняка.<br>В тестах я использую билдеры на минималках: создаю DTO и мутирую его с помощью универсального метода <code>With</code> или специальных методов расширений. Это позволяет устанавливать только важные для теста поля. Выглядит так-то так:</p><pre><code class="cs">var person = DefaultPerson().With(x =&gt; Name = "Вася");
//или
var person = DefaultPerson().WithName("Вася");</code></pre><p>И вот мне понадобилось в таком стиле работать с рекорадми, а они не мутируются. Ну я такой не растерялся, вспомнил, что есть нормальная реализация паттерна builder, когда мы сначала настраиваем builder, а потом потом уже создаём интересующий нас объект. Выглядит так раньше, только есть вызов <code>Build()</code>.</p><pre><code class="cs">var person = DefaultPerson().WithName("Вася").Build();</code></pre><p>Минус в том, что билдер нужно писать, поэтому вспомнил про source-generators, нашёл библиотеку в которой просто объявляешь класс билдера, вешаешь атрибут, а остальное она сделает сама. Выглядит вот так:</p><pre><code class="cs">[AutoGenerateBuilder(typeof(PersonDto))]
public partial class PersonDtoBuilder
{
}</code></pre><p>А потом решил загуглить как народ выкручивается, искал по запросу <code>C# record builder</code>. И нашёл, что можно просто использовать ключевое слово <code>with</code>. Очень просто:</p><pre><code class="cs">DefaultPerson() with {Name = "Вася" }; </code></pre><p>И знаете что? Я знал про <code>with</code>, просто никогда не пользовался и забыл. Такой вот тупняк на ровном месте.</p><p></p> <a href="https://habr.com/ru/posts/851812/?utm_campaign=851812&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 18 Oct 2024 17:45:48 GMT</pubDate>
    <dc:creator><![CDATA[Gromilo]]></dc:creator>
      
      <category><![CDATA[c#]]></category><category><![CDATA[синтаксический сахар]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
