<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>.NET</title>
    <description/>
    <link>https://tproger.ru/tag/dot-net</link>
    <atom:link href="https://tproger.ru/tag/dot-net/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 04 Oct 2026 05:21:29 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>.NET</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Бесплатный WAF инструмент кибербезопасности, который я использую</title>
      <link>https://tproger.ru/articles/besplatnyj-waf-instrument-kiberbezopasnosti-kotoryj-ya-ispolzuyu</link>
      <comments>https://tproger.ru/articles/besplatnyj-waf-instrument-kiberbezopasnosti-kotoryj-ya-ispolzuyu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Неопознанный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/besplatnyj-waf-instrument-kiberbezopasnosti-kotoryj-ya-ispolzuyu</guid>
      <description><![CDATA[<p>Разбор бесплатного open-source WAF SafeLine для защиты от OWASP Top 10, DDoS и ботов. Сравнение с ModSecurity и Cloudflare по точности обнаружения атак, минимальные ложные срабатывания, простая установка одной командой Docker.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/besplatnyj-waf-instrument-kiberbezopasnosti-kotoryj-ya-ispolzuyu">Бесплатный WAF инструмент кибербезопасности, который я использую</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Unity]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[CSR]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2026 05:55:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Решения с открытым исходным кодом достигли такого уровня зрелости, что сегодня они действительно могут конкурировать с коммерческими продуктами — не только по функциональности, но и по удобству использования и поддержке сообщества. Если вы управляете собственной инфраструктурой, больше нет оправдания тому, чтобы оставлять дверь открытой для угроз.</p><p>SafeLine WAF — это бесплатный инструмент, который я лично тестировал.</p><p>Это полностью open-source решения, продукт с действительно бесплатной Community Edition, где ключевые функции не урезаны.</p><p><b>SafeLine WAF — веб-приложенийный межсетевой экран, который действительно поставляется с разумными настройками по умолчанию</b></p><p><b>Что он делает:</b></p><p>Защищает веб-приложения от SQL-инъекций, XSS-атак, командных инъекций, CSRF, SSRF, атак включения файлов и других угроз из списка OWASP Top 10. Также поддерживает защиту от CC/DDoS-атак, управление ботами и может работать как шлюз аутентификации.</p><p><b>Почему он:</b></p><p>Большинство WAF с открытым исходным кодом достаточно сложно настроить. Можно потратить часы на настройку правил, пытаясь остановить ложные срабатывания, из-за которых легитимные пользователи блокируются.</p><p>SafeLine использует другой подход — вместо того чтобы полностью полагаться на сигнатурное обнаружение, он применяет движок семантического анализа, который фактически анализирует и понимает входящие HTTP-запросы. Это позволяет добиться более высокого уровня обнаружения при значительно меньшем количестве ложных срабатываний по умолчанию.</p><p>Некоторые показатели, которые стоит учитыват</p><ol><li>Уровень обнаружения - SafeLine (Balanced) (71.65%), ModSecurity (Level 1) (69.74%), Cloudflare (Free) (10.7%)</li><li>Уровень ложных срабатываний - SafeLine (Balanced) (0.07%), ModSecurity (Level 1) (17.58%), Cloudflare (Free) (0.07%)</li><li>Точность - SafeLine (Balanced) (99.45%), ModSecurity (Level 1) (82.20%), Cloudflare (Free) (98.40%)</li></ol><p>Сбалансированный профиль SafeLine обнаруживает более 70% атак, при этом блокируя легитимный трафик ошибочно всего в 0.07% случаев. Это именно тот уровень настроек по умолчанию, который можно использовать в промышленной среде без постоянного ручного контроля.</p><p>Установка выполняется одной командой</p><p>После запуска он разворачивается как набор Docker-контейнеров: Tengine (форк Nginx) используется в качестве reverse proxy, отдельный сервис отвечает за семантический анализ, PostgreSQL хранит конфигурации и логи, а удобная веб-панель администратора работает на порту 9443.Community Edition поддерживает до 10 сайтов, чего достаточно для большинства личных проектов и небольших бизнес-сценариев.</p><p>Сайт: <a href="https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fcodeby.net%2Fgoto%2Flink-confirmation%3Furl%3DaHR0cHM6Ly9jeWJlcnNlcnZhbC50ZWNoL2xhbmRpbmcvc2FmZWxpbmXvv7xHaXRIdWI%253D%26s%3D7008b60d8a0849ba0be350fe25edfa72&amp;postId=3005263" rel="nofollow noopener">https://cyberserval.tech/landing/safeline</a></p><p>GitHub:<a href="https://api.vc.ru/v2.8/redirect?to=http%3A%2F%2Fgithub.com%2Fchaitin%2FSafeLine&amp;postId=3005263" rel="nofollow noopener"> github.com/chaitin/SafeLine</a> (более 21 тыс. звёзд)</p><p>Лицензия: GPL-3.0 / MIT (Community Edition)</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft представила Visual Studio 2026: 5000 исправлений и 300 новых функций. Разбираемся, что нового</title>
      <link>https://tproger.ru/news/microsoft-predstavila-visual-studio-2026--5000-ispravlenij-i-300-novyh-funkcij--razbiraemsya--chto-novogo</link>
      <comments>https://tproger.ru/news/microsoft-predstavila-visual-studio-2026--5000-ispravlenij-i-300-novyh-funkcij--razbiraemsya--chto-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-predstavila-visual-studio-2026--5000-ispravlenij-i-300-novyh-funkcij--razbiraemsya--chto-novogo</guid>
      <description><![CDATA[<p>Microsoft выпустила Visual Studio 2026 и .NET 10: 5000 исправлений, 300 функций, новый Fluent UI, интеграция Copilot и рост скорости</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-predstavila-visual-studio-2026--5000-ispravlenij-i-300-novyh-funkcij--razbiraemsya--chto-novogo">Microsoft представила Visual Studio 2026: 5000 исправлений и 300 новых функций. Разбираемся, что нового</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Nov 2025 04:07:59 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Microsoft</b> официально <a href="https://visualstudio.microsoft.com/downloads/">выпустила</a> <b>Visual Studio 2026</b> — крупнейшее обновление IDE за последние годы.</p><p>Релиз вышел одновременно с <b>.NET 10</b>, который стал версией с долгосрочной поддержкой (LTS).</p><h2>Что нового в Visual Studio 2026</h2><p>По данным Microsoft, в новую версию вошло <b>более 300 новых функций и 5000 исправлений ошибок</b>, собранных по запросам сообщества. IDE получила <b>обновленный дизайн на базе Fluent UI </b>с 11 новыми темами и улучшенной производительностью.</p><p>Компания заявляет, что <b>время загрузки проектов и зависания интерфейса сократились более чем на 50%</b>, а общая отзывчивость среды разработки заметно выросла.</p><p>Главные изменения:</p><ul><li>интеграция <b>GitHub Copilot</b> во все части среды разработки;</li><li>ускоренное открытие <b>крупных проектов</b>;</li><li><b>переработанная система обновлений</b> — теперь IDE обновляется отдельно от инструментов сборки;</li><li>полная совместимость с <b>более чем 4000 расширениями</b> от Visual Studio 2022;</li><li>поддержка новых инструментов <b>для анализа кода</b> и <b>тестирования</b>.</li></ul><h2>Отдельное обновление инструментов</h2><p>Одно из самых ожидаемых нововведений — <b>развязка Visual Studio и build tools</b>.</p><p>Раньше обновление IDE приводило к изменению инструментов сборки и могло ломать рабочие процессы. Теперь разработчики могут получать ежемесячные апдейты Visual Studio с новыми функциями, не затрагивая цепочку сборки.</p><h2>Релиз .NET 10</h2><p>Одновременно с IDE <a href="https://get.dot.net/10">вышел</a> <b>.NET 10</b> — LTS-релиз, который будет поддерживаться <b>до 10 ноября 2028 года</b>.</p><p>Microsoft называет его самым производительным за всю историю платформы: оптимизации коснулись рантайма, компиляции, языков и облачных нагрузок.</p><p>Компания рекомендует разработчикам как можно скорее перейти на новую версию, особенно для рабочих приложений. В процессе миграции можно использовать <b>GitHub Copilot</b>, который помогает адаптировать существующие проекты под .NET 10.</p><h2>Почему это важно</h2><p><b>Visual Studio 2026</b> делает ставку на <b>скорость, стабильность и интеграцию с ИИ</b>.</p><p>Microsoft позиционирует релиз как «инструмент, который не просто помогает писать код, а сам становится частью команды разработчиков».</p>]]></content:encoded>
    </item>
    <item>
      <title>Натальная карта онлайн бесплатно с расшифровкой по дате рождения: ТОП-7 лучших сервисов и нейросетей 2025</title>
      <link>https://tproger.ru/articles/natalnaya-karta-onlajn-besplatno-s-raswifrovkoj-po-date-rozhdeniya--top-7-luchwih-servisov-i-nejrosetej-2025</link>
      <comments>https://tproger.ru/articles/natalnaya-karta-onlajn-besplatno-s-raswifrovkoj-po-date-rozhdeniya--top-7-luchwih-servisov-i-nejrosetej-2025?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[СтудГид]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/natalnaya-karta-onlajn-besplatno-s-raswifrovkoj-po-date-rozhdeniya--top-7-luchwih-servisov-i-nejrosetej-2025</guid>
      <description><![CDATA[<p>Лучшие сервисы для построения натальной карты онлайн бесплатно: подробный обзор и инструкция по использованию, узнайте всё о расчете натальной карты бесплатно!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/natalnaya-karta-onlajn-besplatno-s-raswifrovkoj-po-date-rozhdeniya--top-7-luchwih-servisov-i-nejrosetej-2025">Натальная карта онлайн бесплатно с расшифровкой по дате рождения: ТОП-7 лучших сервисов и нейросетей 2025</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Хобби]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Nov 2025 13:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Натальная карта — это персональный астрологический портрет, который открывает глубинные аспекты вашей личности. В 2025 году <a href="https://eduforms.org/?rid=5140076457e41208&amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnatal_chart">рассчитать натальную карту онлайн</a> стало проще: современные сервисы предлагают бесплатный расчёт по дате рождения с подробной расшифровкой за несколько минут. <i>Более того, появились нейросети и искусственный интеллект, которые объясняют сложные астрологические термины понятным языком.</i></p><p>В этой статье мы собрали лучшие сервисы для <a href="https://eduforms.org/?rid=5140076457e41208&amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnatal_chart">построения натальной карты</a> онлайн, рассказали, как правильно рассчитать гороскоп рождения и получить максимальную пользу от расшифровки. Вы узнаете, что показывают планеты в вашей натальной карте, как использовать знания на практике и почему ИИ-астрология становится главным трендом.</p><h2>ТОП-7 сервисов для расчёта натальной карты онлайн</h2><h2>🏆 StudyAI — натальная карта с нейросетью на базе Geocult</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/6b4d311b-02e1-4036-8718-7e276cf710bd.jpg" alt="Генератор натальной карты" /><figcaption>В свободной форме можно ввести свой данные и задать интересующий вопрос</figcaption></figure><p><b>StudyAI</b> — инновационный сервис для расчёта натальной карты, который работает на базе легендарного <b>Geocult</b> и интегрирует мощную нейросеть для расшифровки. Это уникальное сочетание: точность проверенных астрологических алгоритмов Geocult плюс доступность искусственного интеллекта, который переводит сложную астрологию на человеческий язык.</p><p>&gt;&gt; <a href="https://eduforms.org/?rid=5140076457e41208&amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat%2Fnatal_chart">Построить натальную карту</a> в StudyAi &lt;&lt;</p><p>Главное преимущество <b>StudyAI</b> — нейросеть анализирует вашу натальную карту по дате рождения и даёт персональную расшифровку, учитывая психологический профиль. Вместо шаблонных текстов вы получаете глубокий разбор характера, талантов и жизненных сценариев. Сервис заменяет консультацию астролога, которая стоит 3000-5000 рублей, всего за 199 рублей.</p><p><b>Преимущества</b>:</p><ul><li>Расчёт натальной карты на базе надёжного Geocult.ru с проверенными формулами</li><li>ИИ объясняет астрологические термины простым языком без сложной терминологии</li><li>Глубокий психологический анализ личности на основе положения планет в гороскопе</li><li>Можно задавать вопросы нейросети и получать уточнения по расшифровке</li><li>Персональный разбор натальной карты мужчины, женщины или ребёнка</li><li>Стоимость 199₽ вместо 3000-5000₽ за консультацию астролога</li></ul><p><b>Недостатки</b>:</p><ul><li>Платный сервис, хотя цена символическая для качества расшифровки</li><li>Требуется стабильное интернет-соединение для работы искусственного интеллекта онлайн</li></ul><p><b>Для кого</b>: новички в астрологии, кто ищет понятную расшифровку натальной карты без терминов, люди, которые хотят сэкономить на консультации астролога.</p><h2>Geocult.ru — классика русской астрологи</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/c2515153-1665-4251-8b08-ed91dddd4343.jpg" alt="Натальная карта гороскоп" /><figcaption>Классический натал новичку может быть непонятен</figcaption></figure><p><b>Geocult.ru</b> — один из старейших и наиболее авторитетных русскоязычных сервисов для расчёта натальной карты онлайн бесплатно. Здесь можно построить натальную карту по дате и времени рождения, получить расшифровку положения планет в домах гороскопа и изучить аспекты. Geocult выбирают те, кто хочет погрузиться в классическую астрологию и самостоятельно анализировать карту.</p><p>&gt;&gt; <a href="https://geocult.ru/">Рассчитать натальную карту</a> в Geocult &lt;&lt;</p><p><b>Преимущества</b>:</p><ul><li>Бесплатное построение натальной карты онлайн с детальной расшифровкой всех элементов</li><li>Удобный интерфейс, расчёт без регистрации и скрытых платежей</li><li>Подробная интерпретация аспектов планет и домов гороскопа рождения</li><li>Поддержка ведической и западной систем астрологии для разных школ</li><li>Большая база учебных статей для изучения астрологии самостоятельно</li></ul><p><b>Недостатки</b>:</p><ul><li>Нет встроенной нейросети или ИИ для упрощённого анализа</li><li>Дизайн выглядит устаревшим, хотя функционал остаётся надёжным</li></ul><p><b>Для кого</b>: опытные пользователи, студенты астрологии, кто хочет самостоятельно изучать натальную карту.</p><h2>Astro-Online.ru — быстрый онлайн-расчёт</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/35063878-b7b8-4741-a923-6087e3b50b98.jpg" alt="астро онлайн натальная карта" /></figure><p><b>Astro-Online.ru</b> — удобный сервис для тех, кто хочет рассчитать натальную карту онлайн бесплатно и получить базовую расшифровку за пару минут. Платформа предлагает простой интерфейс, моментальный расчёт гороскопа рождения по дате и подробное описание планет в знаках Зодиака.</p><p><b>Преимущества</b>:</p><ul><li>Бесплатный расчёт натальной карты онлайн с автоматической расшифровкой</li><li>Предоставляет полную таблицу домов, планет и аспектов</li><li>Быстрая загрузка результатов без задержек</li><li>Есть варианты западной и ведической натальной карты</li><li>Адаптирован для мобильных устройств</li></ul><p>&gt;&gt; Натальная карта в <a href="https://astro-online.ru/">Astro-Online.ru</a> &lt;&lt;</p><p><b>Недостатки</b>:</p><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/0a8750d7-f2a7-43e1-a68c-2b0ea02f6c80.jpg" alt="" /></figure><ul><li>Некоторые дополнительные функции доступны только в платной версии</li><li>Интерфейс не всегда корректно отображается на старых телефонах</li></ul><p><b>Для кого</b>: пользователи, которым нужен быстрый расчёт натальной карты без углублённого изучения.</p><h2>Sotis-Online — профессиональный инструмент</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/f2d12b04-66ee-42f2-8e52-e36d4e6a7e08.jpg" alt="" /><figcaption><br /></figcaption></figure><p><b>Sotis-Online</b> — один из самых уважаемых астрологических сервисов, где можно рассчитать натальную карту онлайн бесплатно с высокой точностью расчёта. Профессиональные астрологи ценят Sotis за надёжность формул, точное определение Асцендента и возможность построить транзиты планет.</p><p><a href="https://sotis-online.ru/">Рассчитать натальную карту онлайн</a> в Sotis-Online</p><p><b>Преимущества</b>:</p><ul><li>Точный расчёт натальной карты рождения с профессиональными алгоритмами</li><li>Глубокий анализ положения планет, аспектов и домов гороскопа</li><li>Возможность построить прогнозы и транзитные карты онлайн</li><li>Русский интерфейс и функция экспорта в PDF-формат</li><li>Поддержка классической и ведической астрологии</li></ul><p><b>Недостатки</b>:</p><ul><li>Интерфейс немного устаревший по дизайну</li><li>Расшифровка менее эмоциональна и понятна, чем у ИИ-сервисов</li></ul><p><b>Для кого</b>: профессиональные астрологи, продвинутые пользователи, кто ценит точность расчёта натальной карты.</p><h2>Astrozet.net — простота и наглядность</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/44d199d5-7421-4b19-bf96-d6c25ce85f28.png" alt="" /></figure><p><b>Astrozet.net</b> — надёжный сервис для тех, кто хочет построить натальную карту онлайн бесплатно с понятной расшифровкой по дате рождения. Платформа выделяется простым интерфейсом, понятными описаниями и интерактивной схемой гороскопа для визуального анализа.</p><p><a href="https://astrozet.net/">Натальная карта онлайн</a> в Astrozet.net</p><p><b>Преимущества</b>:</p><ul><li>Натальная карта бесплатно онлайн по дате и времени рождения за минуты</li><li>Простая и понятная расшифровка всех элементов без перегрузки терминами</li><li>Отличная работа на мобильных устройствах без потери функционала</li><li>Можно рассчитать совместимость партнёров и транзиты планет</li><li>Интерактивная схема гороскопа для лучшего понимания</li></ul><p><b>Недостатки</b>:</p><ul><li>Нет встроенного ИИ-анализатора для персональной расшифровки</li><li>Результаты иногда сохраняются только вручную, нет автосохранения</li></ul><p><b>Для кого</b>: новички, кто ценит визуальную наглядность и простоту при построении натальной карты.</p><h2>Astrolog4you.com — международная платформа</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/fff7f432-c7da-4b91-b56f-577a1203ea0f.jpg" alt="" /></figure><p><b>Astrolog4you.com</b> — международный сервис для <a href="https://astrolog4you.com/">расчёта натальной карты по дате рождения </a>онлайн с бесплатной расшифровкой на разных языках. Платформа подходит как новичкам, так и практикующим астрологам, предлагая точные координаты планет, дома и графическое построение гороскопа.</p><p><b>Преимущества</b>:</p><ul><li>Точный расчёт натальной карты онлайн бесплатно с высокой точностью</li><li>Выбор разных астрологических школ: западная, индийская, китайская астрология</li><li>Подробные трактовки каждой планеты и аспекта в гороскопе</li><li>Функция сохранения и экспорта натальной карты в разных форматах</li><li>Удобен для анализа гороскопа мужчины, женщины или ребёнка</li></ul><p><b>Недостатки</b>:</p><ul><li>Расшифровка текста не всегда адаптирована для начинающих</li><li>Интерфейс немного перегружен астрологическими терминами</li></ul><p><b>Для кого</b>: пользователи с базовыми знаниями астрологии, кто хочет сравнить разные системы расчёта.</p><h2>Бесплатные нейросети (ChatGPT, Claude)</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/3cbc5a65-3750-4116-a63c-58eeb373c130.png" alt="" /></figure><p>Современные нейросети вроде ChatGPT и Claude могут помочь рассчитать натальную карту онлайн и дать базовую расшифровку. Достаточно загрузить данные рождения, и искусственный интеллект предложит интерпретацию планет и домов гороскопа. Однако точность расчёта зависит от используемых ИИ алгоритмов.</p><p><a href="https://eduforms.org/?rid=5140076457e41208&amp;ulp=https%3A%2F%2Fstudy24.ai%2Fchat">Бесплатные нейросети</a> без VPN</p><p><b>Преимущества</b>:</p><ul><li>Полностью бесплатный доступ к нейросети для расшифровки</li><li>ИИ объясняет астрологию простым языком без терминов</li><li>Можно задавать уточняющие вопросы и получать персональные советы</li><li>Доступно онлайн 24/7 без ограничений по времени</li></ul><p><b>Недостатки</b>:</p><ul><li>Нейросети не всегда правильно рассчитывают натальную карту без специализированной базы</li><li>Расшифровка может быть поверхностной по сравнению с профессиональными сервисами</li><li>Нет визуализации схемы гороскопа</li></ul><p><b>Для кого</b>: пользователи, которые хотят получить общее представление о натальной карте бесплатно.</p><h2>Что такое натальная карта</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/9d2d851a-6c2c-43c1-860e-245863a1f56f.png" alt="" /></figure><p>Натальная карта — это персональный астрологический портрет, построенный по точной дате, времени и месту вашего рождения. Она показывает положение планет в знаках Зодиака и домах гороскопа в момент вашего появления на свет. По натальной карте астрологи определяют сильные и слабые стороны характера, профессиональные склонности и предназначение, особенности личных отношений и жизненные циклы успеха.</p><p>Для построения натальной карты нужны три параметра: <b>дата рождения</b> (день, месяц, год), <b>точное время рождения</b> (желательно с точностью до минуты) и <b>место рождения</b> (город). После ввода данных программа вычисляет астрологические координаты и выдаёт схему гороскопа с расшифровкой планет, домов и аспектов между ними.</p><p>Почему важно точное время рождения? От времени зависит расчёт Асцендента (восходящего знака) и распределение домов гороскопа. Разница даже в несколько минут может изменить Асцендент и повлиять на трактовку натальной карты. Если вы не знаете точное время, его можно узнать в роддоме, ЗАГСе или из свидетельства о рождении.</p><p>Современные сервисы позволяют рассчитать натальную карту онлайн бесплатно за считанные секунды. Вы вводите данные рождения, система проводит расчёт положения планет и строит схему гороскопа с автоматической расшифровкой. Некоторые платформы дополнительно используют нейросети и искусственный интеллект, чтобы сделать интерпретацию натальной карты максимально понятной для обычного человека без знаний астрологии.</p><h2>Как рассчитать натальную карту онлайн бесплатно</h2><p>Построить натальную карту по дате рождения онлайн с расшифровкой можно за четыре простых шага. Процесс занимает не больше двух минут и не требует специальных знаний астрологии.</p><h2>Шаг 1: Подготовьте данные для расчёта</h2><p>Перед тем как рассчитать натальную карту онлайн, соберите необходимую информацию:</p><ul><li>Дата рождения — день, месяц и год</li><li>Точное время рождения — желательно с точностью до минуты (можно узнать в роддоме, свидетельстве о рождении или спросить у родителей)</li><li>Место рождения — город, где вы родились</li></ul><p>Если вы не знаете точное время рождения, некоторые сервисы позволяют построить натальную карту без времени, но в таком гороскопе не будет Асцендента и точного распределения домов.</p><h2>Шаг 2: Выберите сервис для построения карты</h2><p>Определитесь, какой сервис использовать для расчёта натальной карты онлайн:</p><ul><li>Бесплатные сервисы (Geocult, Astro-Online, Sotis) подходят для ознакомления и базовой расшифровки гороскопа по дате рождения</li><li>Платные с нейросетью (StudyAI) дают глубокий анализ с участием искусственного интеллекта, который объясняет астрологию понятным языком</li></ul><p>Критерии выбора сервиса: качество расшифровки, удобство интерфейса, наличие дополнительных функций (транзиты планет, совместимость, экспорт в PDF).</p><h2>Шаг 3: Введите данные и рассчитайте</h2><p>Зайдите на выбранный сайт и найдите форму для расчёта натальной карты. Введите данные рождения в соответствующие поля:</p><ul><li>Дата рождения</li><li>Время рождения</li><li>Город рождения (сервис автоматически определит часовой пояс)</li></ul><p>Обязательно проверьте правильность часового пояса для города рождения — это влияет на точность расчёта гороскопа. Нажмите кнопку «Рассчитать» или «Построить карту», и система моментально построит вашу натальную карту онлайн.</p><h2>Шаг 4: Получите расшифровку натальной карты</h2><p>После расчёта вы увидите:</p><ul><li>Схему натальной карты — круглый гороскоп с планетами в знаках Зодиака и домах</li><li>Описание планет в знаках — что означает положение каждой планеты в вашем гороскопе</li><li>Дома гороскопа — 12 сфер жизни и их характеристики</li><li>Аспекты между планетами — связи, которые формируют особенности характера</li></ul><p>Некоторые сервисы дают текстовую расшифровку всех элементов натальной карты автоматически. Если вы используете нейросеть вроде StudyAI, искусственный интеллект создаст персональную интерпретацию с учётом вашего психологического профиля и жизненной ситуации.</p><h2>Основные элементы натальной карты</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/dc37740d-ac44-4683-898d-0729f6fb7d62.png" alt="" /></figure><p>Чтобы понять расшифровку натальной карты по дате рождения, нужно знать основные элементы гороскопа: планеты, дома и аспекты. Каждый элемент отвечает за определённую сферу жизни и влияет на характер человека.</p><h2>10 планет и их значение в натальной карте</h2><p>Каждая планета в натальной карте символизирует определённую энергию и сферу жизни. Положение планет в знаках Зодиака показывает, как эта энергия проявляется в вашем характере.</p><p><b>Солнце</b> — ваша личность и цель жизни, ядро характера, осознанное эго и самовыражение.</p><p>Луна — эмоции и внутренний мир, подсознание, реакции на стресс, потребность в комфорте и безопасности.</p><p><b>Меркурий</b> — мышление и общение, интеллект, способ обработки информации, стиль коммуникации с окружающими.</p><p><b>Венера</b> — любовь и гармония, эстетические предпочтения, способ выражения чувств в отношениях, ценности.</p><p><b>Марс</b> — энергия и воля, способ действий, агрессия, сексуальность, как вы достигаете целей.</p><p><b>Юпитер</b> — удача и рост, экспансия, мировоззрение, философские взгляды, где вас ждёт успех.</p><p><b>Сатурн</b> — дисциплина и ограничения, жизненные уроки, ответственность, где вы встречаете препятствия и чему учитесь.</p><p><b>Уран</b> — новаторство и свобода, революционные перемены, оригинальность мышления, неожиданные события в жизни.</p><p><b>Нептун</b> — мечты и вдохновение, иллюзии, творчество, духовность, интуиция и связь с подсознанием.</p><p><b>Плутон</b> — трансформация и сила, глубинные изменения, власть, возрождение через кризисы и разрушение старого.</p><p>Каждая планета в вашей натальной карте находится в определённом знаке Зодиака, что окрашивает её энергию. Например, Марс в Овне даёт импульсивность и прямоту в действиях, а Марс в Весах — дипломатичность и избегание конфликтов.</p><h2>12 домов гороскопа</h2><p>Дома в натальной карте — это 12 секторов, каждый из которых отвечает за определённую сферу жизни. Планеты, попадающие в дома, показывают, где и как проявляется их энергия.</p><p>1 дом (Асцендент) — ваша личность, внешность, первое впечатление, которое вы производите на окружающих, начало любых дел.</p><p>2 дом — деньги, материальные ценности, самооценка, таланты, которые можно монетизировать.</p><p>3 дом — общение, обучение, братья и сёстры, короткие поездки, информация.</p><p>4 дом — семья, корни, дом, родители (особенно мать), эмоциональная база.</p><p>5 дом — творчество, романтика, дети, хобби, самовыражение, удовольствия.</p><p>6 дом — работа, здоровье, рутина, служение, домашние животные, практические навыки.</p><p>7 дом — отношения и партнёрство, брак, деловые союзы, открытые враги, как вы строите отношения с другими.</p><p>8 дом — трансформация, секс, общие ресурсы, наследство, психология, кризисы.</p><p>9 дом — философия, высшее образование, дальние путешествия, религия, мировоззрение.</p><p>10 дом — карьера и призвание, социальный статус, амбиции, публичная репутация.</p><p>11 дом — дружба, группы, надежды и мечты, социальные связи, коллективная деятельность.</p><p>12 дом — подсознание, изоляция, духовность, секреты, завершение циклов, скрытые враги.</p><p>При расчёте натальной карты онлайн система автоматически распределяет планеты по домам гороскопа. Это даёт понимание, в каких сферах жизни будет проявляться энергия каждой планеты.</p><h2>Аспекты между планетами</h2><p>Аспекты — это угловые расстояния между планетами в натальной карте, которые формируют связи и взаимодействия между ними. Аспекты показывают, как разные части личности сотрудничают или конфликтуют друг с другом.</p><p>Гармоничные аспекты (трин 120°, секстиль 60°) создают лёгкое течение энергии, таланты, способности, удачу в определённых сферах.</p><p>Напряжённые аспекты (квадрат 90°, оппозиция 180°) создают внутренние конфликты, вызовы, но через преодоление этих напряжений происходит личностный рост.</p><p>Большинство сервисов для расчёта натальной карты онлайн бесплатно показывают таблицу аспектов с расшифровкой их влияния на характер и судьбу.</p><h2>Расшифровка натальной карты: от сложного к простому</h2><p>Многие пользователи, которые рассчитали натальную карту онлайн бесплатно, сталкиваются с проблемой: как понять расшифровку? Астрологические тексты часто перегружены терминами вроде «Сатурн в экзальтации в 10 доме формирует квадрат к Марсу в 7 доме». Для человека без знаний астрологии такие фразы — темный лес.</p><h2>Проблема сложного языка</h2><p>Классические сервисы для построения натальной карты дают технически правильную расшифровку, но она требует базового понимания астрологии. Новичок не знает, что означает «Асцендент в Скорпионе» или «Луна в падении». Это создаёт барьер: люди получают натальную карту по дате рождения, но не могут извлечь из неё практическую пользу.</p><p>Риск неправильной трактовки тоже велик. Читая отрывочные описания планет из бесплатных источников, легко составить искажённое представление о себе или зациклиться на негативных аспектах гороскопа.</p><h2>Решение: нейросети и искусственный интеллект</h2><p>Современные нейросети решают эту проблему. Искусственный интеллект анализирует натальную карту и переводит астрологический язык в психологический — понятный каждому. Вместо «Венера в Козероге в 5 доме» нейросеть объяснит: «Вы серьёзно относитесь к романтическим отношениям, цените верность и стабильность, проявляете любовь через практическую заботу».</p><p>StudyAI — лучший пример такого подхода. Сервис использует базу расчёта от Geocult (проверенная точность) и добавляет слой ИИ-интерпретации. Нейросеть создаёт персональную расшифровку натальной карты, учитывая контекст всех планет, домов и аспектов одновременно. Вы можете задавать уточняющие вопросы искусственному интеллекту, и он объяснит любой момент гороскопа простыми словами.</p><p>Преимущества ИИ-расшифровки:</p><ul><li>Понятный язык без терминов</li><li>Персонализация под ваш запрос (карьера, любовь, таланты)</li><li>Целостный анализ вместо разрозненных описаний планет</li><li>Диалог: можно переспросить и уточнить</li></ul><h2>Что искать в расшифровке натальной карты</h2><p>Когда вы получили расшифровку после расчёта натальной карты онлайн, обратите внимание на ключевые элементы:</p><p>Солнце в знаке показывает вашу суть, основной характер, как вы видите себя и к чему стремитесь. Это ядро личности.</p><p>Луна в знаке раскрывает эмоциональные потребности, как вы реагируете на стресс, что даёт ощущение безопасности и комфорта.</p><p>Асцендент (восходящий знак, 1 дом) — это ваша маска для окружающих, то, как вас воспринимают при первой встрече, ваш стиль поведения.</p><p>Венера в натальной карте говорит о том, как вы любите и строите отношения, что цените в партнёре, как проявляете чувства.</p><p>Марс показывает, как вы действуете, достигаете целей, проявляете волю, где находится источник вашей энергии.</p><p>Сатурн указывает на жизненные уроки, ограничения, страхи, но также на области, где через упорный труд вы достигнете мастерства.</p><h2>Пример разбора натальной карты</h2><p>Представьте: у человека Солнце в Овне, Луна в Раке, Асцендент в Весах. Что это значит на практике?</p><ul><li>Солнце в Овне даёт энергичность, инициативность, прямоту. Человек быстро принимает решения, любит быть первым.</li><li>Луна в Раке говорит о глубокой эмоциональности, чувствительности, потребности в семье и заботе. Внутренний мир богат и раним.</li><li>Асцендент в Весах создаёт внешнюю дипломатичность, обаяние, стремление к гармонии в общении.</li></ul><p>Итого: внешне этот человек выглядит мягким и вежливым (Весы), но внутри — огонь и импульсивность (Овен), а эмоционально он очень привязан к близким и раним (Рак). Понимание этих слоёв помогает осознать внутренние противоречия и использовать сильные стороны каждого элемента натальной карты.</p><p>Нейросеть в StudyAI делает именно такой синтетический анализ автоматически, экономя часы изучения астрологии.</p><h2>Западная vs Ведическая натальная карта</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/869c6436-a3b5-4fbc-8a17-5a4eceafed9b.png" alt="" /></figure><p>Когда вы решаете рассчитать натальную карту онлайн, часто возникает вопрос: какую систему астрологии выбрать — западную или ведическую? Обе дают расчёт гороскопа по дате рождения, но используют разные подходы и акценты.</p><h2>Западная (тропическая) натальная карта</h2><p>Западная астрология — самая распространённая система в Европе и Америке. Она использует тропический Зодиак, привязанный к сезонам года. Точка отсчёта — момент весеннего равноденствия (0° Овна).</p><p>Фокус западной астрологии — психология личности, характер, таланты, отношения. Натальная карта рассматривается как карта внутреннего мира человека. Западная система хорошо подходит для самопознания, работы с психологическими паттернами, понимания мотиваций.</p><p>Большинство бесплатных сервисов для расчёта натальной карты онлайн (Geocult, Astro-Online, Sotis) по умолчанию используют западную систему. Если вы новичок в астрологии, начинайте именно с неё.</p><h2>Ведическая натальная карта (Джйотиш)</h2><p>Ведическая астрология (Джйотиш) — древняя индийская система, которая использует сидерический Зодиак, привязанный к реальным положениям звёзд на небе. Из-за прецессии Земли между тропическим и сидерическим Зодиаком сейчас разница примерно 24°. Это значит, что при расчёте ведической натальной карты планеты окажутся в других знаках, чем в западной.</p><p>Фокус ведической астрологии — карма, судьба, духовное предназначение. Джйотиш более фаталистична: она показывает, что предначертано судьбой, какие уроки нужно пройти. Ведическая натальная карта по дате рождения часто используется для предсказания событий, выбора благоприятных дат (мухурта), анализа кармических задач.</p><p>Некоторые сервисы (Geocult, Astrolog4you) позволяют построить натальную карту онлайн бесплатно и в западной, и в ведической системе для сравнения.</p><h2>Какую систему выбрать</h2><p>Для новичков, которые хотят рассчитать натальную карту онлайн бесплатно для самопознания, рекомендуется западная астрология. Она проще для понимания, больше ресурсов для обучения на русском языке, и расшифровка фокусируется на психологии.</p><p>Если вас привлекает духовная сторона, кармические темы, или вы хотите глубже изучить предназначение — попробуйте ведическую натальную карту. Но учтите: Джйотиш требует более серьёзного погружения в астрологию.</p><p>Хорошая новость: вы можете рассчитать обе натальные карты онлайн и посмотреть, какая резонирует больше. Многие пользователи находят ценность в обеих системах, используя западную для психологии, а ведическую — для понимания жизненных циклов и кармических задач.</p><h2>Практическое применение натальной карты</h2><p>Рассчитать натальную карту онлайн бесплатно по дате рождения — это только начало. Главная ценность гороскопа — в практическом применении знаний для улучшения жизни. Вот как можно использовать натальную карту в разных сферах.</p><h2>Для самопознания и личностного роста</h2><p>Натальная карта — мощный инструмент для понимания себя. Она помогает:</p><ul><li>Понять сильные и слабые стороны характера через положение планет в знаках и домах гороскопа</li><li>Раскрыть скрытые таланты, которые можно развить для карьеры или хобби</li><li>Осознать жизненные паттерны и повторяющиеся сценарии через анализ аспектов между планетами</li><li>Принять себя таким, какой вы есть, увидев, что многие черты характера заложены в натальной карте</li></ul><p>Расшифровка натальной карты даёт язык для описания внутренних процессов. Вместо расплывчатого «я такой сложный» вы получаете конкретику: «У меня Луна в Скорпионе — поэтому эмоции глубокие и интенсивные».</p><h2>Для карьеры и призвания</h2><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/25ab5597-4191-414d-a4a2-7d1fe4c8a4ae.jpg" alt="" /></figure><p>Натальная карта по дате рождения показывает профессиональные склонности и предназначение. Ключевые точки для анализа карьеры:</p><ul><li>10 дом и планеты в нём — ваша карьера, амбиции, социальный статус</li><li>6 дом — повседневная работа, навыки, служение</li><li>2 дом — способы заработка, таланты, которые можно монетизировать</li><li>Положение Сатурна — область, где через упорный труд достигнете мастерства</li></ul><p>Если вы построили натальную карту онлайн и хотите понять призвание, обратите внимание на Середину Неба (МС — куспид 10 дома). Знак на МС указывает на стиль профессиональной реализации, а планеты в 10 доме — на конкретные сферы деятельности.</p><p>Также полезно отслеживать транзиты планет — движение планет по небу после вашего рождения. Благоприятные транзиты (например, Юпитер в 10 доме) показывают периоды карьерного роста, когда стоит начинать новые проекты.</p><h2>Для отношений и совместимости</h2><p>Один из популярных запросов при расчёте натальной карты онлайн — анализ совместимости с партнёром. Астрология помогает:</p><ul><li>Понять потребности в любви через Венеру и 7 дом в натальной карте</li><li>Увидеть стиль общения через Меркурий</li><li>Узнать, как вы выражаете страсть через Марс</li><li>Построить синастрию — сравнение натальных карт партнёров для оценки совместимости</li></ul><p>Совместимость по натальным картам не означает «судьба или нет». Это инструмент для понимания динамики отношений: где вы дополняете друг друга, а где возникают трения. Зная слабые места (например, квадрат между вашими Лунами), можно осознанно работать над отношениями.</p><p>Многие сервисы для расчёта натальной карты онлайн бесплатно предлагают функцию синастрии. Вы вводите данные рождения партнёра, и система строит совместимость по гороскопам.</p><h2>Для родителей: натальная карта ребёнка</h2><p>Родители часто хотят рассчитать натальную карту ребёнка по дате рождения, чтобы лучше понять его характер, таланты и потребности. Гороскоп рождения ребёнка помогает:</p><ul><li>Выбрать подход к воспитанию, учитывая темперамент (огонь, земля, вода, воздух)</li><li>Развить врождённые таланты через анализ сильных планет и домов</li><li>Понять эмоциональные потребности через Луну в натальной карте</li><li>Избежать конфликтов, зная особенности характера ребёнка</li></ul><p>Например, если у ребёнка Марс в Овне и Солнце в 1 доме, он очень активный, импульсивный, нуждается в физической активности. Попытки сделать из него тихого домоседа приведут к конфликтам. А ребёнок с Луной в Раке и Нептуном в 4 доме очень чувствительный, нуждается в эмоциональной безопасности и творческом самовыражении.</p><p>Нейросеть в StudyAI может создать персональную расшифровку натальной карты ребёнка с рекомендациями для родителей — это экономит время и даёт практические советы.</p><h2>Планирование по транзитам</h2><p>Транзиты планет — это текущее положение планет на небе и их взаимодействие с вашей натальной картой. Отслеживание транзитов помогает:</p><ul><li>Выбрать благоприятные даты для важных начинаний (свадьба, открытие бизнеса, переезд)</li><li>Понять периоды активности и отдыха в соответствии с планетарными циклами</li><li>Подготовиться к сложным периодам (например, транзит Сатурна часто приносит испытания)</li><li>Использовать удачные транзиты (Юпитер даёт рост и возможности)</li></ul><p>Некоторые сервисы для расчёта натальной карты онлайн бесплатно (Geocult, Sotis, Astrozet) позволяют построить текущие транзиты планет к вашему гороскопу. Вы видите, какие планеты сейчас активируют какие дома вашей натальной карты, и можете планировать жизнь более осознанно.</p><h2>Нейросети и искусственный интеллект в астрологии</h2><p>2025 год — эра нейросетей в астрологии. Искусственный интеллект революционизирует способ, которым люди рассчитывают и понимают натальную карту онлайн. Если раньше требовались годы изучения астрологии, чтобы интерпретировать гороскоп, сейчас ИИ делает это за минуты, причём на языке, понятном каждому.</p><figure><img src="https://media.tproger.ru/user-uploads/114541/2025-10-31/5d093cf5-bfc6-48fe-8965-7a2bbe2a883f.png" alt="" /></figure><h2>Как ИИ меняет астрологию</h2><p>Автоматическая расшифровка натальной карты с участием нейросети — это не просто генерация текста по шаблону. Современный искусственный интеллект обучен на тысячах реальных гороскопов и астрологических текстов. Он понимает контекст: например, Марс в Овне даёт одно, но если он в 12 доме и в квадрате к Сатурну — совсем другое. ИИ учитывает все эти нюансы одновременно.</p><p>Персонализация расшифровки — главное преимущество нейросетей. Вы можете задать фокус анализа: «расскажи про карьеру», «объясни мои отношения», «какие таланты у моего ребёнка». Искусственный интеллект создаст расшифровку именно под ваш запрос, а не выдаст общее описание всех планет.</p><p>Объяснение сложного простым языком — то, что делают лучшие ИИ-сервисы вроде StudyAI. Нейросеть переводит фразы типа «Венера в экзальтации в Рыбах в 5 доме образует трин к Нептуну в 9 доме» в «Вы очень романтичная натура, влюбляетесь в идеал, цените красоту и духовную связь в отношениях».</p><p>Диалог с ИИ-астрологом — новый формат. Вы рассчитали натальную карту онлайн, получили расшифровку, но остались вопросы? Задайте их нейросети: «Почему у меня проблемы в отношениях?», «Какая профессия мне подойдёт?». ИИ проанализирует ваш гороскоп и ответит персонально.</p><h2>Преимущества ИИ-расшифровки натальной карты</h2><ul><li>Быстрее консультации астролога: нейросеть даёт расшифровку за 2 минуты, а не ждать неделю на запись к специалисту</li><li>Дешевле: рассчитать натальную карту с ИИ-расшифровкой в StudyAI стоит 199₽, консультация астролога — 3000-5000₽</li><li>Доступно 24/7: можете построить натальную карту онлайн в любое время, даже ночью</li><li>Можно переспросить: если что-то непонятно, задаёте уточняющий вопрос нейросети</li><li>Анализ психологического профиля: искусственный интеллект соединяет астрологию с психологией для глубокого разбора</li></ul><h2>Ограничения нейросетей в астрологии</h2><p>Искусственный интеллект — мощный инструмент, но у него есть границы:</p><ul><li>Не заменяет живого астролога на 100%: опытный специалист учитывает тонкости, которые ИИ может упустить</li><li>Требует критического мышления: расшифровку нейросети стоит воспринимать как гипотезу, а не абсолютную истину</li><li>Нужен интернет: чтобы рассчитать натальную карту онлайн с ИИ, требуется стабильное соединение</li><li>Бесплатные нейросети (ChatGPT, Claude) дают поверхностный анализ без специализированной астрологической базы, в отличие от StudyAI</li></ul><p>Главный вывод: нейросети делают астрологию доступной. Теперь не нужно быть экспертом, чтобы понять свою натальную карту по дате рождения. Искусственный интеллект — ваш персональный астролог онлайн, который объясняет гороскоп понятным языком и отвечает на вопросы.</p><h2>Часто задаваемые вопросы</h2><h2>Заключение</h2><p>Натальная карта — это мощный инструмент для самопознания, понимания своих талантов, отношений и жизненного пути. В 2025 году рассчитать натальную карту онлайн бесплатно с расшифровкой по дате рождения можно за несколько минут в надёжных сервисах вроде Geocult, Astro-Online, Sotis.</p><p>Если вам нужна не просто схема гороскопа, а глубокий персональный анализ на понятном языке, обратите внимание на StudyAI. Этот сервис сочетает проверенную точность расчёта от Geocult с мощью нейросети, которая объясняет астрологию через призму психологии. За 199 рублей вы получаете то, что заменяет консультацию астролога, — понятную расшифровку натальной карты с возможностью задавать вопросы искусственному интеллекту.</p><p>Построить натальную карту по дате рождения онлайн — это первый шаг к пониманию себя. Используйте полученные знания как личный навигатор жизни: для выбора карьеры, улучшения отношений, раскрытия талантов и осознанного планирования будущего. Гороскоп рождения не диктует судьбу, но показывает ваш потенциал и помогает реализовать его максимально эффективно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</title>
      <link>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</link>
      <comments>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</guid>
      <description><![CDATA[<p>Выбираете первый язык программирования? Узнайте о низкоуровневых (C, C++), среднеуровневых (Java, C#) и высокоуровневых (Python, JavaScript) языках: плюсы, минусы и примеры применения. Чек-лист от экспертов поможет новичкам выбрать язык для веб, мобильной разработки или игр.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka">Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Xamarin]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для погружения в программирование нужно всего 3 вещи:</p><ul><li>Решить, с какого языка/технологии вы хотите начать.</li><li>Решить, на каком ресурсе вы хотите обучаться.</li><li>Выделить время на само программирование.</li></ul><p>Звучит просто, однако у вас уйдёт много времени на исследования, чтобы решить, что вам подходит и на каком ресурсе обучаться.</p><p>Некоторые люди начинают с относительно низкоуровневого программирования на C и C++. Другие выбирают более традиционный путь, изучая Java или C#. Есть и те, кто начинает с высокоуровневых или скриптовых языков вроде Python, Ruby или JavaScript.</p><p>Мы классифицируем языки по уровню абстракции. Для новичков: низкоуровневые — как ручная сборка машины (контроль, но сложный); среднеуровневые — как готовый конструктор с инструкцией (сохраняем баланс); высокоуровневые — как приложение на смартфоне (быстро, но меньше контроля). Ниже разберём плюсы и минусы и поможем сделать правильный выбор.</p><h2>Низкоуровневые языки: близко к «железу»</h2><p>Это языки, где вы напрямую работаете с памятью компьютера. Нет автоматической уборки ненужных данных, <b>всё под вашим контролем</b>. Подходят для системного ПО, игр или устройств (например, микроконтроллеров).</p><p>Примеры: C (для ОС вроде Linux), C++ (для игр на движке вроде Unreal Engine), Assembler (для оптимизации критических частей кода).</p><p><b>Плюсы:</b></p><ul><li>Полный контроль: вы решаете, как использовать ресурсы. Так, в C++ можно вручную выделять память для массивов, избегая ненужных копий данных.</li><li>Высокая скорость: прямой доступ к памяти позволяет писать код, который работает быстрее (это важно для работы с играми или серверами).</li><li>Основы основ: такие языки учат, как компьютер работает изнутри, чтобы в будущем ценить удобства других языков. Например, вы узнаёте, почему «утечка памяти» — это проблема.</li><li>Эффективность: низкоуровневые языки мотивируют думать об оптимизации заранее, снижая расход батареи или CPU.</li><li>Компактность: минимальная библиотека, приложения получаются лёгкими (идеально для embedded-систем, как в IoT-устройствах).</li></ul><p>Минусы:</p><ul><li>Всё-таки это сложно: рутинные задачи (например, чтение файла) требуют больше кода и внимания к деталям, рискуя ошибками вроде переполненного буфера.</li><li>Ручное управление памятью: можно легко «забыть» освободить память, вызвав утечки или краши. Например, в C нужно использовать malloc/free, иначе программа съест всю RAM.</li><li>Много копипасты: придётся писать шаблонный код, и делать это часто.</li><li>Платформо-зависимость: код для Windows может не работать на Linux без правок.</li></ul><h2>Среднеуровневые языки: баланс контроля и удобства</h2><p>Эти языки предлагают готовые инструменты, упрощающие работу, но требуют строгой проверки типов данных. Для их запуска нужна специальная программа (среда выполнения). Они идеальны для приложений, серверов и игр.</p><p>Примеры: Java (для Android-приложений), C# (для Unity-игр или .NET-серверов).</p><p>Плюсы:</p><ul><li>Автоматическая память: память очищается автоматически благодаря сборщику мусора, что избавляет от ручной работы и снижает вероятность ошибок, вроде утечек памяти в больших проектах. При этом можно получить доступ к низкоуровневым функциям для особых задач, например, через специальные инструменты в Java.</li><li>Богатые библиотеки: готовые инструменты для сетей, GUI или баз данных. Пример: Java’s Spring для веб-серверов.</li><li>Кроссплатформенность: компиляция в байт-код (JVM для Java) позволяет запускать код везде. Например, пишешь на Windows, запускаешь на Linux.</li><li>Безопасность: язык проверяет типы данных перед запуском программы, помогая заранее найти ошибки. Среда выполнения защищает от опасных сбоев, например, от переполненной памяти.</li><li>Масштабируемость: встроенные инструменты для параллельных вычислений позволяют легко создавать программы, которые одновременно выполняют много задач (серверы для тысяч пользователей и т.п.).</li></ul><p>Минусы:</p><ul><li>Дополнительная нагрузка от рантайма: Среда выполнения и автоматическая очистка памяти создают дополнительную нагрузку. Сборщик мусора может ненадолго останавливать программу, что заметно в играх или при обработке видео.</li><li>Меньше контроля: абстракции скрывают детали памяти, усложняя оптимизацию (например, в Java сложно избежать боксинга примитивов).</li><li>Повторяющийся код, которого много: приходится писать повторяющийся код и тренировать свою усидчивость, например, для доступа к данным объекта. Кстати, инструменты вроде Lombok могут упростить эту задачу.</li><li>Зависимость от среды: для запуска программ нужна специальная среда (например, JVM для Java), что влияет на размер программ и замедляет их старт.</li><li>Сложность интеграции: подключение кода на других языках, например, на C, требует писать специальные обёртки, что усложняет работу и снижает скорость.</li></ul><h2>Высокоуровневые языки: удобство и скорость разработки</h2><p>Эти языки скрывают технические детали, позволяя сосредоточиться на создании <b>логики программы</b>. Подходят для веба, data science или скриптов.</p><p>Примеры: Python (для ML), Ruby (для веб-разработки), JavaScript (для фронтенда).</p><p>Плюсы:</p><ul><li>Простота: сложные задачи решаются в пару строк. Так, в JS async/await упрощает API-запросы.</li><li>Быстрая разработка: динамическая типизация позволяет быстро писать и тестировать код без необходимости его компиляции.</li><li>Богатые экосистемы: есть библиотеки для всего (к примеру, NumPy для данных в Python).</li><li>Гибкость: легко менять код, идеально для прототипов или стартапов.</li></ul><p>Минусы:</p><ul><li>Низкая производительность: абстракции добавляют нагрузки. Например, циклы в Python медленнее, чем в C.</li><li>Ошибки на рантайме: из-за слабой типизации ошибки выявляются только при запуске программы, что усложняет отладку.</li><li>Риск «спагетти-кода»: лёгкость изменений может привести к хаосу без дисциплины.</li><li>Скрытые проблемы: абстракции маскируют баги.</li><li>Зависимость от интерпретатора: программы требуют установленного интерпретатора, что замедляет их запуск и добавляет зависимость от дополнительного ПО.</li></ul><h2>Чек-лист: как выбрать язык программирования для новичка</h2><p>Этот чек-лист основан на советах экспертов, чтобы помочь новичкам выбрать первый язык программирования. Каждый пункт включает конкретные рекомендации.</p><ol><li><b>Определите, что вас вдохновляет, и выберите сферу.</b> Подумайте, что вы хотите создавать: сайты, игры, мобильные приложения или серверы. Разные сферы требуют разных языков. Например, для веб-разработки подойдут JavaScript или Python, для мобильных приложений — Java, Kotlin, Swift или Dart, а для игр — C# или C++. Составьте список идей (например, сайт-визитка, игра, аналитика данных) и найдите, какие языки для них используют. <br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Ищите язык с широким применением.</b> Выбирайте языки, которые используются в разных областях, чтобы легче переключаться между задачами. Например, Kotlin подходит для мобильной разработки, веба и серверов, а C# — для десктоп-приложений, игр (Unity) и бэкенда. Это даёт гибкость и упрощает изучение новых языков в будущем.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Проверьте спрос на рынке труда. </b>Если цель — смена профессии, изучите вакансии на HH.ru или LinkedIn. Введите «junior Python», «junior Java» и сравните, где больше предложений и какие требования. Избегайте языков с низким спросом, если хотите быстро найти работу. Например, Java, Kotlin, Python и JavaScript популярны для найма.<br />— Владислав Масунов, Head of Development</li><li><b>Опробуйте языки на практике.</b> Напишите простые программы (например, "Hello World" или калькулятор) на нескольких языках, чтобы понять, какой синтаксис вам ближе. Используйте онлайн-редакторы вроде Replit или CodePen. Например, попробуйте TypeScript для веба (он поддерживает типизацию и разные подходы к программированию) или C++ для понимания работы с памятью. Это поможет почувствовать, к чему лежит душа.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS; Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Выберите язык с хорошей документацией и сообществом.</b> Убедитесь, что у языка много обучающих материалов и активное сообщество. Например, TypeScript имеет богатую документацию и поддержку, что упрощает старт. Проверьте ресурсы вроде LearnPython.org, freeCodeCamp для JavaScript или Telegram-чаты для C++. Это поможет быстрее решать вопросы.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Учитывайте сложность и карьерные цели.</b> Для небольших проектов или быстрого старта берите Python или PHP — они проще и подходят для веб-разработки или скриптов. Для сложных задач с высокой нагрузкой (например, серверы или оптимизация) попробуйте C++ или Go. Если цель — работа в крупных компаниях, Java и Kotlin востребованы и часто используются с ИИ-инструментами. Выбирайте, исходя из сложности и ваших амбиций.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Смотрите на универсальность и переход к другим языкам. </b>Выбирайте язык, который учит основам программирования и упрощает переход к другим. Например, изучение C# может помочь освоить Java, а затем — Android-разработку. TypeScript учит объектно-ориентированному и функциональному программированию, что полезно для разных задач. Это создаёт базу для дальнейшего роста.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH; Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Не гонитесь за гилти плежа.</b> Избегайте языков, которые изучают «для удовольствия» без практического применения. Выбирайте те, которые можно применить в реальных проектах или которые востребованы в индустрии. Например, вместо нишевых языков берите Python, Java или Kotlin: они имеют чёткие сценарии использования.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Практикуйтесь с ИИ-инструментами.</b> Если хотите работать в крупных компаниях, освойте язык, который хорошо сочетается с ИИ-инструментами (например, Go или Java). Практикуйтесь с ИИ-агентами по типу GitHub Copilot для автоматизации задач — это ценится работодателями.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Составьте план развития.</b> Создайте roadmap: определите, какие проекты хотите делать через 3-6 месяцев (например, мобильное приложение или веб-сервис), и подберите язык под эти цели. Если выбрали C#, начните с десктоп-приложений, затем попробуйте Xamarin для кроссплатформенной разработки. Постепенно добавляйте новые языки, опираясь на первый.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li></ol><p>Если не определились, предлагаем пройти квиз и расставить всё по полочкам:</p>]]></content:encoded>
    </item>
    <item>
      <title>Какие приложения установить на Windows и macOS</title>
      <link>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</link>
      <comments>https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos</guid>
      <description><![CDATA[<p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kakie-prilozheniya-ustanovit-na-windows-i-macos">Какие приложения установить на Windows и macOS</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Xbox]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Для продвинутых]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[Avast]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Epic Games]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Safari]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[PlayStation]]></category>
      <category><![CDATA[Microsoft Edge]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[RPA]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Figma]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Markdown]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Дизайн интерфейсов и UX]]></category>
      <category><![CDATA[Steam]]></category>
      <category><![CDATA[GPU]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[iPhone]]></category>
      <category><![CDATA[MacBook]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Итак, вы только что настроили новый компьютер. Операционная система установлена, драйверы обновлены, и теперь пора заняться самым интересным — установкой программ. Но с чего начать? Какие приложения действительно необходимы, а какие просто занимают место?</p><p>Редакция Tproger сделала и адаптировала <a href="https://www.techspot.com/article/2974-desktop-software-essentials/">перевод подборки  программ для Windows и macOS</a>. Здесь вы найдёте проверенные временем решения для работы, развлечений и повседневных задач. Мы сосредоточились на бесплатных и условно-бесплатных приложениях с отличной репутацией, которые решают реальные задачи без навязывания ненужных функций.</p><p>Список разбит по категориям: от браузеров и гейминга до утилит безопасности и инструментов для продуктивности.</p><p>Неважно, опытный вы пользователь или новичок — здесь найдётся что-то полезное для каждого.</p><h2>Браузеры</h2><p>Браузер — это, пожалуй, самое важное приложение на вашем компьютере. Именно через него проходит большая часть вашей цифровой жизни: работа, развлечения, коммуникации. Выбор браузера влияет не только на скорость загрузки страниц, но и на конфиденциальность, безопасность и удобство работы.</p><ul><li><b>Большинство пользователей:</b> Chrome, Edge или Safari</li><li><b>Защита приватности: </b>Firefox, Brave, Ungoogled Chromium</li><li><b>Опытные пользователи:</b> Vivaldi</li><li><b>Максимальная анонимность: </b>Tor Browser</li></ul><h3>Google Chrome</h3><p>Chrome остаётся самым популярным браузером в мире — и не просто так. Он быстрый, стабильный и отлично интегрируется с экосистемой Google. Огромная библиотека расширений из Chrome Web Store позволяет настроить браузер под любые задачи. Синхронизация между устройствами работает безупречно: вкладки, пароли, закладки и история всегда под рукой.</p><p>Минус один, но существенный: Chrome прожорлив. Если у вас открыто больше десятка вкладок, он может съесть несколько гигабайт оперативной памяти. На компьютерах с 8 ГБ RAM и меньше это становится проблемой.</p><h3>Mozilla Firefox</h3><p>Firefox — это выбор тех, кто ценит приватность и открытость. Mozilla не зарабатывает на продаже ваших данных, а сам браузер активно развивается сообществом. Встроенные инструменты защиты от трекинга работают из коробки, блокируя рекламные сети и скрипты слежения.</p><p>По скорости Firefox не уступает Chrome, а по потреблению памяти даже выигрывает. Библиотека расширений чуть меньше, чем у Chrome, но все основные инструменты доступны.</p><h3>Microsoft Edge</h3><p>Edge построен на том же движке Chromium, что и Chrome, но при этом лучше оптимизирован для Windows. Microsoft вложилась в производительность: браузер работает быстро, потребляет меньше ресурсов и отлично интегрируется с системой.</p><p>Особенно приятны функции вроде Collections (коллекции вкладок для организации исследований), режим чтения и встроенный скриншотер. Edge поддерживает все расширения Chrome, так что переход безболезненный.</p><h3>Brave</h3><p>Brave — это Chrome на стероидах приватности. Браузер блокирует рекламу и трекеры по умолчанию, что делает сёрфинг быстрее и безопаснее. При этом он полностью совместим с расширениями Chrome.</p><p>Есть интересная фишка: Brave Rewards позволяет зарабатывать криптовалюту за просмотр приватной рекламы (если захотите её включить). Спорная механика, но как опция — почему нет. Для тех, кто хочет Chrome без Google и с упором на приватность, Brave — отличный выбор.</p><h3>Safari (только macOS)</h3><p>Если у вас Mac, Safari заслуживает внимания. Это самый энергоэффективный браузер для macOS: на MacBook он даёт ощутимо больше автономности по сравнению с Chrome или Firefox. Интеграция с экосистемой Apple безупречна: Handoff, синхронизация через iCloud, Reading List, автозаполнение паролей.</p><p>Safari быстрый, безопасный и не перегружен функциями. Единственный минус — библиотека расширений заметно скромнее, чем у конкурентов. Но для большинства задач базового функционала хватает.</p><h3>Ungoogled Chromium</h3><p>Для ультраосторожных Ungoogled Chromium удаляет всё отслеживание и сервисы Google — но вам придётся настраивать всё самостоятельно, так как в нём нет автообновлений или встроенной синхронизации.</p><p>Для максимально осторожных пользователей — это Chrome, из которого убрали всю телеметрию Google, отслеживание и облачные сервисы. Браузер работает, но требует ручной настройки: отсутствуют автоматические обновления и встроенная синхронизация между устройствами.</p><h3>Tor Browser</h3><p>Выводя приватность на следующий уровень, Tor Browser маршрутизирует ваш трафик через сеть Tor, анонимизируя ваш IP и многократно шифруя соединение. Он медленнее по задумке, но идеален, если ваш приоритет — максимальная анонимность, а не скорость или удобство.</p><h3>Vivaldi</h3><p>Vivaldi — браузер мечты для тех, кто хочет полного контроля. Стекирование вкладок, тайлинг, кастомные горячие клавиши, встроенная почта и календарь, веб-панели — это полноценный десктопный опыт внутри браузера. Хотите боковую панель браузера, открывающую ваши заметки, RSS-ленты или любой нужный сайт? Vivaldi это умеет.</p><h3>Arc</h3><p>Наконец, Arc — когда-то новичок на рынке браузеров, нацеленный на переосмысление UX: замена традиционной панели вкладок на боковую панель, акцент на веб-приложениях, интегрированные разделённые виды и easels для заметок и доски. К сожалению, компания за Arc прекратила разработку, чтобы полностью переключиться на ИИ с новым браузером, который сейчас в закрытой бета-версии.</p><h2>Управление паролями</h2><ul><li><b>Лучший бесплатный выбор:</b> Bitwarden</li><li><b>Также отлично:</b> 1Password, Dashlane, KeePass</li></ul><p>Миллионы людей продолжают использовать одни и те же слабые пароли на всех сайтах — или, что ещё хуже, держатся за классику вроде «123456». Даже сильные пароли мало помогают, если их повторяют или забывают. Конечно, большинство браузеров предлагают встроенные менеджеры паролей, но они ограничены, привязаны к одному браузеру и менее безопасны, чем специализированные решения.</p><p>Также не будем забывать о passkeys (ключах доступа). Если говорить практически, можно сказать, что passkeys объединяют концепцию пароля и двухфакторной аутентификации (2FA) в одно плавное действие, но гораздо безопаснее и гораздо менее раздражающе.</p><h3>Bitwarden</h3><p>Полностью опенсорсный, зашифрованный и щедрый даже в бесплатной версии. Вы получаете неограниченное количество паролей, синхронизацию между устройствами и приложения для всех платформ. Премиум ($10/год) добавляет безопасный обмен файлами и инструменты 2FA. Также есть доступные семейные и командные планы.</p><h3>1Password</h3><p>Премиум-решение с отполированным интерфейсом, сильной кроссплатформенной поддержкой и отличными функциями вроде Travel Mode (режим путешествий) и полной интеграцией passkeys.</p><h3>Dashlane</h3><p>Предлагает мониторинг даркнета, интеграцию VPN и плавный пользовательский опыт. Есть бесплатный тариф с ограниченными функциями, но премиум-версия конкурентоспособна.</p><h3>KeePassXC</h3><p>Отличная оффлайн-альтернатива, если хотите полного контроля и не против ручной синхронизации (или использования чего-то вроде Syncthing или Dropbox для синхронизации базы данных).</p><p>Пропустите LastPass — когда-то фаворит, он упал в немилость после повторных утечек безопасности. Для душевного спокойствия лучше поискать в другом месте.</p><h2>Продвинутые утилиты и дополнения к ОС</h2><ul><li><b>Поиск + лаунчеры:</b> Everything или Wox (Windows), Alfred или Raycast (macOS)</li><li><b>Пакетные менеджеры: </b>WinGet, Homebrew (macOS)</li><li><b>Для пользователей Windows:</b> PowerToys</li><li><b>Для пользователей Mac: </b>Rectangle</li><li><b>История буфера обмена: </b>ClipClip, Flycut (macOS)</li><li><b>Скриншоты + аннотации: </b>Monosnap</li></ul><h3>Winget</h3><p><b></b>Официальный менеджер пакетов Microsoft, встроенный в Windows 10 и 11. Работает похоже на Chocolatey, но разработан и поддерживается Microsoft. Homebrew — самый популярный менеджер пакетов для macOS. Позволяет быстро устанавливать, обновлять и управлять приложениями и CLI-инструментами с помощью команд в терминале.</p><h3>Everything</h3><p>Что касается поиска, Everything остаётся золотым стандартом сверхбыстрого поиска по именам файлов в Windows. Он индексирует диски за секунды и выдаёт почти мгновенные результаты с минимальной нагрузкой на систему. Если нужен функционал шире базового поиска, Wox использует движок Everything и добавляет мощные возможности лаунчера: поиск файлов, запуск приложений, калькулятор, перевод текста и расширения через плагины. Получается более гибкий опыт в духе Spotlight для Windows.</p><h3>Command Palette/Alfred/Raycast</h3><p>В который раз Microsoft не смогла существенно улучшить встроенный поиск Windows, хотя <b>Command Palette</b> в PowerToys даёт неплохой компромисс для тех, кто не хочет ставить сторонние утилиты.</p><p>На macOS <b>Alfred</b> по-прежнему главный лаунчер и утилита поиска. Он быстрый, интуитивный и в бесплатной версии включает историю буфера и настраиваемые поиски; расширенная автоматизация и «воркфлоу» доступны в Powerpack.</p><p>Тем, кто хочет современную облачно-интегрированную альтернативу с готовыми расширениями и встроенной поддержкой Notion, GitHub и Slack, стоит присмотреться к <b>Raycast</b> — это стильный, дружественный к разработчикам вариант, который стремительно набирает популярность.</p><h3>Менеджеры буфера обмена</h3><p>Они позволяют возвращаться к ранее скопированному — тексту, изображениям, ссылкам — и сильно ускоряют рутинные операции.</p><p>В Windows встроенная история буфера (Win + V) кое-как выручает, но продвинутым пользователям обычно хочется большего. В числе бесплатных рекомендаций — <b>ClipClip</b> для Windows и <b>Flycut</b> для macOS.</p><p>Когда речь о скриншотах и аннотациях, штатные инструменты macOS и Windows заметно выросли. Но многим всё равно удобнее сторонние решения. Нам по-прежнему нравится <b>Monosnap</b> за простоту и возможность мгновенно заливать снимки в облако для шаринга (и это бесплатно).</p><p><b>PowerToys</b> — набор полезных утилит от Microsoft для продвинутых пользователей Windows, повышающих продуктивность и упрощающих рабочие процессы. Среди инструментов: FancyZones для продвинутого раскладывания окон, PowerRename для пакетного переименования, Keyboard Manager для ремапинга клавиш, универсальный color picker и другие.</p><p><b>Rectangle</b> и <b>Magnet </b>— два самых популярных приложения на macOS для закрепления окон: быстрые выравнивание и ресайз по хоткеям или перетаскиванием, примерно как по умолчанию в Windows. Пользователям, пришедшим с Windows и скучающим по системному снапингу, одно из них жизненно необходимо.</p><p>Широко используемая альтернатива в Windows — <b>FancyZones</b> (часть PowerToys), предлагающая продвинутое управление окнами: настраиваемые сетки, зоны привязки и поддержку нескольких мониторов — поэтому это фаворит пауэр-пользователей на Windows.</p><h2>Для рутины и создания проектов</h2><ul><li><b>Бесплатные инструменты: </b>FreeOffice, LibreOffice и WPS Office</li><li>Microsoft Office за единовременную плату $49, Office 2024 — $129</li><li><b>Заметки: </b>Notion, OneNote, Obsidian</li><li><b>Бесплатный PDF-редактор: </b>PDFsam</li><li><b>Почтовые клиенты:</b> Thunderbird, eM Client</li></ul><p>Независимо от того, пишете ли вы тексты, планируете проект, кодите или наводите порядок в цифровой жизни, правильные инструменты решают многое. Сегодня выбор топовых приложений для продуктивности и разработки — часто бесплатных — лучше, чем когда-либо.</p><p><b>Microsoft Office</b> остаётся отраслевым стандартом для профессиональной продуктивности. Подписка Microsoft 365 открывает доступ к Word, Excel, PowerPoint, Outlook и включает 1 ТБ облачного хранилища.</p><p>Среди бесплатных альтернатив LibreOffice — мощный open-source комплект с сильным сообществом (хотя интерфейс некоторым кажется старомодным). Если нужна внешне более майкрософтовская альтернатива, попробуйте<b> FreeOffice </b>или <b>WPS Office Free</b> — у них хорошая совместимость.</p><p>На macOS <b>Pages</b>, <b>Numbers</b> и <b>Keynote</b> предустановлены и более чем достаточны для большинства задач, особенно если вы в экосистеме Apple.</p><h3>Знания и ведение заметок</h3><p><b>Notion</b> стал универсальной платформой организации: заметки, базы данных, to-do, управление проектами, создания совместных рабочих пространств. Если нужны более локальные заметки с синхронизацией между устройствами и поддержкой Markdown, <b>Obsidian</b> — любимец студентов и исследователей.</p><p>Для быстрых кроссплатформенных заметок <b>OneNote</b> — крепкий бесплатный вариант от Microsoft. В качестве альтернатив — <b>Simplenote</b> или open-source <b>Joplin</b>.</p><p>Если вы занимаетесь академической работой и научными статьями, <b>Zotero</b> — отличный open-source менеджер источников с интеграцией в браузер и совместными коллекциями. <b>Milanote</b> предлагает визуальный подход к заметкам и планированию — идеально для креативных пользователей.</p><h3>Работа с PDF</h3><p>Хотя Adobe Acrobat остаётся премиальным редактором PDF, бесплатные альтернативы вроде <b>PDFsam</b> позволяют без усилий объединять, разбивать, редактировать и поворачивать страницы.</p><h2>Инструменты для дизайна и создания контента</h2><p>Для дизайна два выделяющихся приложения хорошо дополняют набор продуктивности. <b>Figma Desktop</b> — совместная платформа интерфейс-дизайна, широко используемая UI/UX-дизайнерами и фронтенд-разработчиками. Десктоп-версия работает быстрее, чем браузер, и лучше интегрируется с ОС — это удобно для сложных дизайн-систем и коллаборации в реальном времени.</p><p><b>Canva</b> с интуитивным drag-and-drop превосходно чувствует себя и как десктоп-приложение. Отлично подходит для быстрых графических материалов для соцсетей, маркетинга, постеров и презентаций. Благодаря тысячам шаблонов и совместной работе это фаворит как у профи, так и у новичков.</p><h2>Почтовые клиенты</h2><p>Если вы предпочитаете отдельный почтовый клиент, у <b>eM Client</b> много функций, бесплатный — до двух аккаунтов. <b>Mozilla</b> <b>Thunderbird</b> — мощная open-source альтернатива с удобной настраиваемостью, а <b>Mailbird</b> — вариант с упором на продуктивность для тех, кого не пугает подписка.</p><h2>Инструменты разработчика</h2><ul><li><b>Редакторы кода и текста:</b> VS Code, Cursor, Sublime Text</li><li><b>Система контроля версий:</b> SourceTree, GitHub Desktop</li><li><b>Контейнеры: </b>Docker</li><li><b>Локальные LLM: </b>Ollama</li><li><b>SFTP, загрузка файлов:</b> WinSCP, Forklift</li></ul><p>Для разработчиков <b>Visual Studio Code</b> — безусловный вариант. Бесплатный, лёгкий, но мощный, кроссплатформенный — тысячи расширений покрывают практически любой язык, фреймворк или инструмент. Набирающая популярность альтернатива — <b>Cursor</b>, редактор на базе VS Code с усиленной AI-помощью. Он подходит для связки с LLM: даёт inline-подсказки, генерирует код, рефакторит и позволяет редактировать кодовую базу.</p><p>При этом<b> Sublime Text </b>остаётся для скорости и простоты, а <b>Notepad++</b> — отличный лёгкий редактор для быстрых правок в Windows.</p><p>Для Git графические клиенты <b>SourceTree</b> и <b>SmartGit</b> дают понятный интерфейс для управления репозиториями на GitHub, GitLab и не только. <b>GitHub Desktop</b> раньше был простоват и не слишком хорош, но сейчас существенно прибавил — всё ещё простой для работы, но в хорошем смысле.</p><p>Для локальных окружений, API-тестирования или терминального воркфлоу инструментов — пруд пруди. Например, <b>Docker Desktop</b> стал стандартом для тех, кто собирает и запускает контейнеризированные приложения на разных платформах. Он упрощает настройку окружений и держит систему чистой.</p><p><b>Ollama</b> позволяет запускать большие языковые модели (LLM) локально с минимальной настройкой. Поддерживает модели вроде LLaMA, Mistral и другие open-weight альтернативы GPT, так что можно работать с ИИ прямо на своём компьютере без отправки данных в облако.</p><p>Если вы работаете с облачными хранилищами или SFTP, WinSCP (Windows) и ForkLift (macOS) — отличные клиенты с двухпанельным управлением файлами, синхронизацией и автоматизацией. На Mac также популярны <b>Commander One</b> и <b>Transmit</b> — у них есть встроенные подключения к удалённым и облачным путям.</p><h3>Безопасность</h3><p>И Windows, и macOS сегодня предлагают более чем достойную встроенную защиту. С защитой в реальном времени, интеграцией с файерволом и биометрией вроде <b>Windows Hello</b> и <b>Touch ID</b>. Для обычных пользователей, которые соблюдают гигиену безопасности: не скачивают сомнительное ПО, используют менеджеры паролей и включают 2FA — встроенной защиты часто хватает.</p><p>Для продвинутых пользователей есть дополнительные варианты.</p><p>Отличное первое дополнение — <b>Malwarebytes</b>. Это давний фаворит в обнаружении и удалении malware, adware и руткитов; бесплатная версия по-прежнему хороша для ручных сканов. В платной — защита в реальном времени без ощутимой просадки производительности.</p><p>Если не хочется ставить традиционный антивирус, есть достойные альтернативы. <b>Emsisoft Emergency Kit</b> — мощный портативный сканер, который можно запускать с флешки: идеально для редких глубоких сканов или лечения заражённых систем без установки чего-либо. Просто подключаете, когда нужно.</p><p>Ещё один отличный инструмент — <b>VirusTotal</b>: бесплатный веб-сервис, который проверяет файлы и URL через десятки антивирусных движков. Прежде чем открывать подозрительную загрузку, можно залить файл на VirusTotal.com или использовать их расширение для браузера, чтобы проверять ссылки в реальном времени. Быстро, просто и удобно для осторожных пользователей.</p><p>Мы не поклонники установки антивирусов на каждый компьютер и не полностью в курсе, какие сейчас показывают лучшие результаты. Тем не менее, <b>AV-Tes</b>t давно и регулярно оценивает популярные решения, поэтому советуем смотреть их свежие отчёты. В текущем списке высокооценённых — <b>Avast, BitDefender, ESET </b>и другие; многие из них предлагают бесплатные версии для пробы.</p><h3>Удалённый доступ и вспомогательные утилиты</h3><p><b>RustDesk</b> стал современным, ориентированным на приватность аналогом <b>TeamViewer</b>. Он с открытым исходным кодом, быстрый и работает кроссплатформенно.</p><p>Тем, кому нужны более устоявшиеся коммерческие решения, подойдёт <b>AnyDesk</b>, который остаётся лёгким и надёжным вариантом для личного и командного использования.</p><p>Превращение смартфона в пульт дистанционного управления компьютером бывает невероятно удобно — будь то презентации, потоковое видео или просто навигация с дивана.</p><p><b>Remote Mouse</b> — простой и эффективный способ эмулировать мышь и клавиатуру с телефона. Для более продвинутых сценариев можно использовать приложения вроде <b>Unified Remote.</b></p><h2>Редактирование изображений и видео</h2><ul><li><b>Профессиональный видеомонтаж:</b> DaVinci Resolve</li><li><b>Простой видеомонтаж: </b>CapCut</li><li><b>Редакторы изображений:</b> GIMP, PhotoDemon, Pixelmator Pro</li><li><b>Бесплатное улучшение изображений:</b> Upscayl</li><li><b>RAW-редактирование:</b> RawTherapee</li><li><b>Видеоконвертация:</b> HandBrake</li></ul><p>Если вам нужен бесплатный инструмент для редактирования изображений, <b>GIMP</b> — один из самых мощных вариантов. Он предоставляет профессиональные возможности, такие как слои, маски и настраиваемые плагины, что делает его идеальным для продвинутых пользователей. Если вы ищете более лёгкий редактор с чистым интерфейсом, стоит обратить внимание на <b>PhotoDemon</b>. Он работает как портативное приложение на Windows, поддерживает слои и редактирование — отличный выбор для быстрых правок или ретуши.</p><p>Если вы хотите увеличивать разрешение изображений без потери качества, <b>Upscayl</b> — мощный и бесплатный инструмент для апскейла. Он кроссплатформенный, и по нашим тестам показывает результаты на уровне платных решений вроде Topaz.</p><p>Для векторной графики — логотипы, иллюстрации — <b>Inkscape</b> является достойным open-source вариантом с полной поддержкой редактирования SVG. <b>Krita</b> — ещё один отличный бесплатный инструмент, особенно подходящий для цифровой живописи и художественного творчества.</p><p>Для редактирования RAW-фотографий, <b>Darktable</b> и <b>RawTherapee</b> — два высококлассных open-source аналога Adobe Lightroom. Их широко используют фотографы, которым нужна работа с изображениями без подписки.</p><p>Для простых GIF-анимаций <b>ScreenToGif</b> — удобная утилита, мгновенно записывающая область экрана и экспортирующая в GIF или другие форматы с оверлеями.</p><p>Среди платных фоторедакторов <b>Adobe Photoshop</b> остаётся лидером, но для macOS есть <b>Pixelmator Pro</b> — мощное приложение с разовой оплатой, а <b>Affinity Photo</b> предлагает профессиональные возможности по более доступной цене.</p><h3>Видеомонтаж и конвертация</h3><p><b>DaVinci Resolve</b> считается лучшим бесплатным профессиональным ПО. Его используют и энтузиасты, и профессионалы — от простого тримминга до цветокоррекции и сложного постпродакшена.</p><p><b>Shotcut</b> и <b>Kdenlive</b> — тоже сильные бесплатные варианты, предлагают более простой фукнционал с хорошим набором функций для новичков и продвинутых пользователей. <b>CapCut</b>, изначально мобильное приложение, теперь доступен на десктопе — идеально подходит для быстрых монтажей и роликов для соцсетей.</p><p>Для пользователей macOS <b>iMovie </b>предустановлен и остаётся надёжным вариантом для базовых видео. Если вам нужно просто конвертировать или сжимать видео в современные форматы, <b>HandBrake</b> — проверенное бесплатное решение с поддержкой и вариацией входных и выходных форматов.</p><p>Тем, кто ищет топовый профессиональный монтаж, подойдут <b>Adobe Premiere Pro</b> и<b> Final Cut Pro</b>, но там есть дорогая подписка и более высокий порог входа.</p><h2>Коммуникации и совместная работа</h2><ul><li><b>Для повседневной связи: </b>WhatsApp, Messenger и Zoom, если у вас нет FaceTime</li><li><b>Для приватности: </b>Signal</li><li><b>Для работы:</b> Slack, Teams</li><li><b>Для игр и общения: </b>Discord</li></ul><p>Выбор коммуникационных и мессенджерных приложений в первую очередь зависит от того, с кем вы общаетесь — с семьёй, друзьями, коллегами или игровым сообществом. Вот актуальная картина:</p><p>Для личной переписки <b>WhatsApp</b> и <b>Facebook Messenger</b> остаются самыми массовыми платформами по всему миру. У них есть десктопные клиенты и встроенное сквозное шифрование по умолчанию. <b>Telegram</b> также крайне популярен благодаря синхронизации между устройствами и поддержке крупных чатов. Пользователи Apple продолжают активно использовать <b>iMessage</b> для приватного, шифрованного общения в экосистеме Apple.</p><p>Из видеоконференций <b>Zoom</b> остаётся одним из лидеров для групповых звонков и онлайн-ивентов, предлагая локальные записи, демонстрацию экрана и комнаты (breakout rooms). Однако бесплатный тариф ограничивает 1:1 звонки 40 минутами, если не перейти на платный план. Zoom поддерживает сквозное шифрование, но при включении E2EE отключаются некоторые функции вроде облачной записи и комнат.</p><p><b>Google Meet</b> — отличный браузерный аналог без необходимости установки, который заметно улучшился по качеству и удобству использования. Многие компании применяют Meet в ежедневной работе и гибридных форматах. Если ваша организация использует Microsoft 365, скорее всего, вы работаете в <b>Microsoft Teams</b>, который уже заменил Skype на корпоративном уровне. Teams поддерживает большие созвоны, обмен файлами и глубоко интегрирован с Office. Сквозное шифрование доступно, но только для 1:1 звонков.</p><p><b>FaceTime</b> по-прежнему отличный для пользователей Apple, и благодаря новым обновлениям к звонку теперь могут присоединяться и пользователи Android/Windows по ссылке через браузер.</p><p>Когда приватность критична, <b>Signal</b> — один из лучших вариантов. Разработан некоммерческой организацией, бесплатен, open-source, без рекламы, использует надёжное сквозное шифрование для сообщений и звонков.</p><p>Для рабочих коммуникаций<b> Slack</b> и <b>Teams</b> продолжают использоваться в бизнес-среде. Бесплатный тариф Slack ограничивает историю 90 днями и звонки, но остаётся любимцем стартапов и малых команд благодаря интеграциям и ботам. <b>Cisco Webex</b> — также крепкий вариант, особенно популярен в корпоративной среде.</p><p>Если вы работаете с креативными командами, сообществами или геймерами, <b>Discord</b> стал явным лидером. Изначально созданный для игр, он превратился в полноценную коллаборативную платформу с текстом, голосом и видео, стримингом экрана и ботами для автоматизации. Многие комьюнити — и даже IT-компании — используют Discord как основной рабочий инструмент.</p><p>Для внутриигрового голосового чата <b>TeamSpeak </b>остаётся олдскульным достойным вариантом: можно использовать анонимно и получать полный контроль над сервером. Встроенный чат Steam лучше, чем раньше, и помогает в игровой координации, но большинство всё же выбирает Discord.</p><h2>Гейминг, моддинг и стриминг</h2><ul><li><b>Игровые платформы: </b>Steam, Epic Games, EA App, Ubisoft, GOG</li><li><b>Последние драйверы для GPU:</b> Nvidia GeForce, AMD Radeon, Intel Arc</li><li><b>Стриминг:</b> OBS Studio</li></ul><p><b>Steam</b> остаётся центром PC-игр. Это не только магазин, но и социальная платформа, лаунчер и площадка с модами, облачными сохранениями и встроенным стримингом. Регулярные распродажи, поддержка контроллеров и сообщества делают его обязательным для любого PC-геймера.</p><p>Не менее важно установить Epic <b>Games Store</b>. Хотя библиотека меньше, он регулярно раздаёт бесплатные игры, доступные любому с аккаунтом Epic. Это также must-have, если вы играете в Fortnite.</p><p>Помните: не все издатели размещают игры на Steam или Epic. Для тайтлов EA понадобится <b>EA App (ранее Origin)</b>, для Ubisoft — <b>Ubisoft Connect</b>, для Blizzard/Activision — <b>Battle.net</b>, а GOG Galaxy не только предлагает DRM-free классику, но и может агрегировать игры из других лаунчеров.</p><p>Некоторые сверхпопулярные игры распространяются отдельно: Minecraft (через Minecraft.net или Microsoft Store), Roblox, League of Legends и Valorant (через лаунчер Riot Games). Если вы новичок и ищете что-то лёгкое, можно начать с free-to-play тайтлов или классики вроде <b>Brutal Chess</b> или <b>GZDoom</b>.</p><p>Если вы играете с геймпадом, Windows поддерживает Xbox-контроллеры из коробки. PlayStation-контроллеры теперь тоже отлично работают: Steam через <b>Steam Input </b>поддерживает DualShock 4 и DualSense практически во всех играх. При необходимости глубокой кастомизации можно использовать DS4Windows, но большинству хватает возможностей Steam.</p><p>Если вас интересует моддинг, хороший менеджер модов время в этой жизни:</p><ul><li><b>Mod Organizer 2</b> — лучший для RPG Bethesda (Skyrim, Fallout).</li><li><b>Vortex (от Nexus Mods)</b> — дружелюбный к новичкам и поддерживает широкий перечень игр.</li></ul><p>Для записи геймплея или стриминга <b>Nvidia ShadowPlay</b> и <b>AMD Radeon ReLive</b> подходят для простых задач. Но для стриминга с вебкой, сценами, оверлеями или многосценовым продакшеном <b>OBS Studio</b> — безальтернативный лидер. Он бесплатный, open-source и подходит как новичкам, так и про-стримерам (Twitch, YouTube, Kick и т.д.). <b>SignalRGB</b> помогает синхронизировать весь RGB-зоопарк и задавать динамические эффекты.</p><h2>Мониторинг железа и разгон</h2><ul><li><b>Мониторинг: </b>CPU-Z, HWMonitor, HWiNFO64</li><li><b>Настройка и разгон:</b> Afterburner, FanControl, ThrottleStop, SignalRGB</li></ul><p>Одно из первых дел, которое стоит сделать после сборки ПК — убедиться, что компоненты соответствуют ожиданиям и работают корректно. К счастью, существует много инструментов, позволяющих мониторить, тестировать и настраивать железо.</p><p>Начать стоит с <b>CPU-Z</b> — классического бесплатного инструмента, показывающего информацию о CPU, материнской плате, оперативной памяти и других компонентах. Он также умеет запускать простой стресс-тест и бенчмарк для проверки стабильности.</p><p>Для более широкого мониторинга <b>HWMonitor</b> показывает температуры, напряжения и скорости вентиляторов в реальном времени. Если нужно ещё глубже и с более гибким интерфейсом — <b>HWiNFO64</b> считается одним из лучших: поддерживает логирование датчиков и интеграцию с оверлеями (например, RTSS или Rainmeter).</p><p>Чтобы проверить хранилище, <b>CrystalDiskMark</b> измеряет скорость чтения/записи SSD и HDD — это помогает понять, соответствует ли диск заявленным характеристикам. Глубже оценить здоровье накопителя можно в <b>Hard Disk Sentinel</b>, который анализирует SMART-данные, оценивает срок службы и предлагает ограниченный ремонт.</p><p>С точки зрения охлаждения, всё больше геймеров используют утилиты для настройки вентиляторов. <b>FanControl</b> — актуальный бесплатный фаворит: поддерживает сложные кривые оборотов, привязку к датчикам, и совместим с большинством современных материнских плат. На Mac одной из лучших утилит остаётся<b> Macs Fan Control.</b></p><p>Для настройки видеокарт долгое время стандартом был <b>MSI Afterburner</b> — для разгона, настройки вентиляторов и мониторинга с RTSS-оверлеем. Однако из-за замедления обновлений многие сегодня используют встроенные утилиты от <b>Nvidia (GeForce Experience/Control Panel)</b> и <b>AMD (Adrenalin Software)</b>.</p><p>Если вы меняете видеокарту или подозреваете проблемы с драйверами, обязательно используйте <b>Display Driver Uninstaller</b> (DDU) — он полностью очищает систему от старых драйверов перед переустановкой.</p><p>Если вы играете на ноутбуке или хотите снизить нагрев и повысить автономность, <b>ThrottleStop</b> остаётся одним из лучших инструментов для андервольта CPU и настройки энергопрофилей.</p><p>Тем, кто серьёзно подошёл к разгону CPU и GPU, пригодятся фирменные инструменты вроде <b>Intel XTU (для Intel) и AMD Ryzen Master</b> — они дают контроль над частотами, напряжениями и лимитами мощности.</p><h2>Управление файлами</h2><ul><li><b>Поиск больших файлов:</b> SpaceSniffer, WizTree, Disk Drill (macOS)</li><li><b>Поиск дубликатов: </b>dupeGuru</li><li><b>Архивы и ZIP: </b>PeaZip, The Unarchiver</li><li><b>Очистка: </b>BCUninstaller, CCleaner Portable, AppCleaner (macOS)</li></ul><p>Чтобы грамотно управлять файлами и освобождать место, нужно понимать, что именно занимает пространство. На Windows популярны <b>WinDirStat и WizTree </b>— быстрые бесплатные инструменты для визуализации диска. <b>SpaceSniffer</b> предоставляет динамическую схему.</p><p>На macOS — <b>GrandPerspective и Disk Drill </b>предлагают аналогичный функционал, а <b>DaisyDisk</b> — один из самых красивых платных вариантов с молниеносным сканированием.</p><p>Если дубликаты засоряют диск, <b>dupeGuru</b> (open-source) отлично справляется с поиском повторяющихся изображений и музыки, даже слегка изменённых.</p><p>Для пакетного переименования файлов (например, фоточек с камеры) существует гибкий <b>Bulk Rename Utility</b>. Если нужно что-то попроще: <b>PowerRename</b> из PowerToys (Windows) или встроенный инструмент в <b>Finder</b> (macOS) подходят большинству.</p><p>Встроенный <b>File Explorer</b> в Windows недавно получил вкладки и стал удобнее, но <b>Files</b> (open-source) — современная альтернатива с улучшенным UX. Кто-то ещё пользуется <b>Total Commander</b> или <b>Directory Opus</b>, благодаря расширяемости и скриптам, хотя новичкам они кажутся устаревшими. Для просмотра изображений по-прежнему незаменим <b>IrfanView</b>.</p><p>Для работы с архивами, если не устраивает встроенный ZIP-менеджер Windows, скачайте <b>7-Zip</b> или <b>PeaZip</b>. На Mac лучшим бесплатным инструментом остаётся <b>The Unarchiver</b>.</p><p>Для очистки системы важно выбирать надёжные утилиты. На Windows, <b>BCUninstaller (Bulk Crap Uninstaller)</b> — один из самых проверенных для удаления программ и их хвостов. <b>BleachBit</b> и <b>Wise Disk Cleaner</b> — безопасные альтернативы <b>CCleaner</b> (лучше использовать Portable-версию, так как стационарная испортила репутацию). На Mac <b>AppCleaner</b> всё ещё любим за полное удаление приложений без мусора.</p><p>Если вы организуете большую библиотеку медиа, стоит взглянуть на open-source <b>TagSpaces</b>, позволяющий тегировать файлы локально, без облака.</p><h2>Облачное хранилище и резервное копирование</h2><ul><li><b>Простая синхронизация: </b>Dropbox, Google Drive</li><li><b>Фото между устройствами:</b> Apple iCloud, Google Photos</li><li><b>Приватность: </b>pCloud, Proton Drive, Internxt</li><li><b>Полные бэкапы:</b> Backblaze, IDrive</li></ul><h3>Базовое облачное хранилище</h3><p><b>Dropbox</b> — один из самых простых в использовании, хотя бесплатных 2 ГБ мало.</p><p><b>
Google Drive</b> — 15 ГБ бесплатно, используется Gmail, Docs и Photos. Идеален для Android.</p><p><b>
OneDrive</b> — идёт в комплекте с Windows и Microsoft 365. 1 ТБ включён в большинство Office-планов. Хотя по скорости и интерфейсу уступает Dropbox/Google.</p><p><b>
iCloud Drive</b> — лучший выбор для пользователей Apple, глубокая интеграция с macOS/iOS. Бесплатно 5 ГБ, далее по планам до 2 ТБ.</p><p><b>
Proton Drive</b> — шифрованная альтернатива от создателей ProtonMail.</p><h3>Фото и видео</h3><p>На macOS приложение <b>Photos</b> автоматически создаёт альбомы по людям и локациям, синхронизирует всё через iCloud.</p><p>На Windows мы часто рекомендуем <b>Google Photos</b>, который предлагает аналогичный набор функций и автоматизацию. Для пользователей Android — это стандарт по умолчанию. Да, раньше было безлимитно, теперь фото занимают общее место Google Drive (15 ГБ), которое быстро заканчивается.</p><h3>Полные бэкапы</h3><p>Если требуется сохранять всю систему, терабайты медиа, состояние дисков используйте отдельные сервисы резервного копирования.</p><p><b>Backblaze</b> — топ в этой категории: фиксированная цена (~$8/месяц за устройство), безлимитное хранилище, минимум настроек: установил и забыл.</p><p><b>IDrive</b> — более контролируемый вариант, поддерживает несколько устройств, внешние диски и версионность файлов.</p><p>Простой для не-технарей — <b>Carbonite</b>, с возможностью быстрого восстановления и круглосуточной поддержкой.</p><p>Профессионалам — <b>Acronis Cyber Protect</b>: клон дисков, анти-вымогатель, гибридное облако.</p><h3>Для особо чувствительных данных</h3><p>Если вы храните личные финансовые документы или медицинские сведения, стоит выбрать end-to-end решений.</p><p><b>pCloud</b> предлагает клиентское шифрование (через платный «Crypto»). Даже при взломе аккаунта файлы не расшифруются без ключа.</p><p><b>Proton Drive </b>— аналогичный подход, с прозрачностью open-source.</p><h2>Прочие полезные инструменты, не вошедшие в другие разделы</h2><p><b>Google Earth</b> — для любителей карт и планировки.</p><p><b>qBittorrent</b> — лучший torrent-клиент: чистый, без рекламы, с поиском. Альтернатива — легковесный Transmission или кастомизируемый Deluge.</p><p><b> iMazing</b> — must-have для владельцев iPhone: резервные копии, экспорт медиа, проверка батареи, конвертация HEIC.</p><p><b>AirDroid</b> — аналог для Android: управление файлам, уведомления, SMS с ПК.</p><p><b>Rufus</b> — лидер по созданию загрузочных USB-дисков для Windows/Linux.</p><p><b>Open Shell </b>— возвращает классическое меню «Пуск» в стиле Windows 7.</p><p><b>Stretchly</b> — напоминает делать перерывы — полезно удалёнщикам и фрилансерам.</p><p><b>AutoHotkey</b> — скриптовый движок для Windows: переназначение клавиш, макросы, автоматизация.</p><p><b>VPN: </b>бесплатные — ProtonVPN, Windscribe, TunnelBear (с лимитом). Платные — ProtonVPN, NordVPN.</p><p><b>Calibre</b> — лучшее бесплатное решение для чтения, организации и конвертации e-book (EPUB, MOBI, PDF и др.).</p><h2>Заключение</h2><p>Итак, мы прошлись по основным категориям приложений, которые стоит установить на новый компьютер. Конечно, этот список не исчерпывающий — у каждого свои задачи и предпочтения. Но если вы установите хотя бы половину из перечисленного, ваш компьютер станет гораздо удобнее и функциональнее.</p><p>Несколько советов напоследок:</p><ol><li><b>Не захламляйте систему.</b> Устанавливайте только то, что действительно используете. Чем меньше фоновых процессов — тем быстрее работает компьютер.</li><li><b>Следите за обновлениями.</b> Большинство программ обновляются автоматически, но некоторые требуют ручного апдейта. Свежие версии — это не только новые функции, но и закрытые уязвимости.</li><li><b>Делайте резервные копии.</b> Никакие утилиты не спасут от отказа жёсткого диска. Регулярный бэкап на внешний носитель или в облако — обязательная практика.</li><li><b>Экспериментируйте. </b>Попробуйте несколько браузеров, редакторов, плееров. То, что подходит большинству, может не подойти именно вам.</li><li><b>Читайте отзывы.</b> Перед установкой незнакомого приложения загляните на форумы или Reddit. Сообщество быстро выявляет проблемы и подводные камни.</li></ol><p>Теперь ваш компьютер готов к работе, учёбе, развлечениям — и чему угодно ещё. Главное — не забывайте, что инструменты важны, но ещё важнее то, как вы их используете. Удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft сломала localhost в Windows 11 — миллионы разработчиков не могут локально тестить проекты</title>
      <link>https://tproger.ru/news/microsoft-slomala-localhost-v-windows-11---milliony-razrabotchikov-ne-mogut-lokalno-testit-proekty</link>
      <comments>https://tproger.ru/news/microsoft-slomala-localhost-v-windows-11---milliony-razrabotchikov-ne-mogut-lokalno-testit-proekty?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-slomala-localhost-v-windows-11---milliony-razrabotchikov-ne-mogut-lokalno-testit-proekty</guid>
      <description><![CDATA[<p>Обновление Windows 11 KB5066835 сломало localhost: HTTP.sys перестал работать, и миллионы разработчиков не могут тестировать проекты</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-slomala-localhost-v-windows-11---milliony-razrabotchikov-ne-mogut-lokalno-testit-proekty">Microsoft сломала localhost в Windows 11 — миллионы разработчиков не могут локально тестить проекты</a>»</p>]]></description>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Windows 10]]></category>
      <category><![CDATA[Asp.NET]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Windows 11]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Oct 2025 10:31:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Не прошло и двух дней после официального завершения поддержки Windows 10, как пользователи <b>Windows 11</b> <a href="https://www.techpowerup.com/341976/microsoft-breaks-localhost-with-windows-11-october-update-users-forced-to-revert">столкнулись</a> с серьезной ошибкой.</p><p>Последнее октябрьское обновление системы — <b>KB5066835</b> — нарушило работу localhost, что фактически лишило разработчиков возможности тестировать веб-приложения локально.</p><p>Проблему активно обсуждают на <b>Microsoft Support Forums</b>, <b>Stack Overflow</b> и <b>Server Fault</b>: серверы перестали отвечать на запросы, отвалилась отладка в Visual Studio, а ASP.NET-приложения не компилируются.</p><p>По оценкам экспертов, сбой затронул <b>миллионы веб-разработчиков и инженеров</b>, использующих Windows 11 в качестве локальных серверов и рабочих станций.</p><h2>Что пошло не так</h2><p>Пакет <b>KB5066835</b> был задуман как <b>обновление безопасности</b>, улучшавшее сентябрьский релиз <b>KB5065789</b>, но именно он привел к поломке <b>HTTP.sys</b> — системного компонента ядра Windows, отвечающего за маршрутизацию локального HTTP-трафика.</p><p>После установки апдейта, <b>localhost перестал отвечать на запросы</b>, а соединения по HTTP/2 начали обрываться.</p><h2>Как временно исправить</h2><p>Microsoft пока официально не подтвердила проблему, но сообщество уже нашло обходное решение:</p><ol><li>Удалить октябрьское обновление <b>KB5066835</b>.</li><li>Если не помогло — удалить и предыдущее <b>KB5065789</b>.</li><li>После этого localhost начинает работать штатно. Однако это <b>временная мера</b> и пользователи рискуют остаться без последних исправлений безопасности.</li></ol><h2>Неудачи Microsoft продолжаются</h2><p>Это уже <b>второй крупный сбой за неделю</b>. В понедельник компания случайно «сломала» <b>Media Creation Tool</b> — утилиту для установки Windows — всего за день до окончания поддержки Windows 10.</p><p>А на прошлой неделе Microsoft окончательно обязала пользователей <b>входить в Windows 11 только через онлайн-аккаунт</b>, что вызвало волну критики.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы автоматизировали мутационное тестирование unit тестов на проекте в крупном банке с использованием Stryker.NET</title>
      <link>https://tproger.ru/articles/kak-my-avtomatizirovali-mutacionnoe-testirovanie-unit-testov-na-proekte-gazprombanka-s-ispolzovaniem-stryker-net</link>
      <comments>https://tproger.ru/articles/kak-my-avtomatizirovali-mutacionnoe-testirovanie-unit-testov-na-proekte-gazprombanka-s-ispolzovaniem-stryker-net?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[asyncguru]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-my-avtomatizirovali-mutacionnoe-testirovanie-unit-testov-na-proekte-gazprombanka-s-ispolzovaniem-stryker-net</guid>
      <description><![CDATA[<p>Опыт автоматизации мутационного тестирования Unit-тестов в крупном банке с помощью Stryker.NET. Практический кейс по внедрению в CI/CD, настройке и интеграции в legacy-проект. Как мы нашли слабые места в тестах и повысили их надёжность, не замедляя процесс разработки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-my-avtomatizirovali-mutacionnoe-testirovanie-unit-testov-na-proekte-gazprombanka-s-ispolzovaniem-stryker-net">Как мы автоматизировали мутационное тестирование unit тестов на проекте в крупном банке с использованием Stryker.NET</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 11 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Качественные модульные тесты помогают оптимизировать ресурсы команды разработки и увеличивают надежность создаваемого продукта. Оценить эффективность этих тестов можно с помощью автоматизированного инструмента для мутационного тестирования Stryker.NET.</p><p><i>Меня зовут Юрий Каган, я Software/System Architect в IT_ONE. Расскажу об опыте применения </i><i>Stryker.NET </i><i>на проекте в крупном банке. </i><i></i></p><h2>Качественные юнит-тесты —  основа надежного ПО</h2><p>Несмотря на то, что юнит-тесты —  только один из компонентов пирамиды тестирования ПО, они —  база для создания качественного кода:</p><p>– Благодаря проверке отдельных фрагментов кода можно <b>выявить дефекты на ранних стадиях</b>, не пропуская их на следующие этапы разработки. Известно, что чем раньше обнаружена ошибка, тем ниже стоимость её исправления.</p><p>– Модульные тесты обеспечивают <b>стабильность разработки</b>, служа некой страховкой: они предотвращают регрессии при изменениях и рефакторинге.</p><p>– Проведённые тесты служат документацией и <b>ускоряют внедрение нового функционала</b>. По ним можно понять изначальный замысел автора кода и упростить разработку.</p><p>Для оценки качества юнит-тестов разработчики обычно пользуются метрикой Code Coverage, отражающей процент покрытия тестами исходного кода. Такая информация может собираться различными способами в зависимости от типа используемого инструмента, но результат получается схожий: данные о том, какие конкретно фрагменты кода выполнялись во время тестов. О каких бы то ни было проверках речи не идет. То есть, по нашему опыту, технически очень легко можно написать тесты, которые будут давать 100% Code Coverage и при этом ничего не проверять. Это означает, что даже высокий процент покрытия кода тестами не гарантирует, что они разработаны качественно и поведение вашего кода надёжно зафиксировано. После них нельзя исключать скрытые ошибки.</p><p>Как следствие, постоянно осознавая риски некачественных тестов, разработчики могут начать бояться рефакторинга —  ведь любые изменения потенциально грозят дефектами в коде. Причем допущенный дефект может быть обнаружен намного позже, уже в продакшене. Всё это приводит к дополнительным рискам, замедляет и удорожает цикл разработки.</p><p>Но существует и другая, не столь широко известная метрика, которая более объективно описывает надёжность проведённых тестов: она определяется в процессе <b>мутационного тестирования</b>. Первые упоминания об этом подходе мы встречаем еще в 1970-х годах. Тогда он уже признавался перспективным, но в то же время —  практически неприменимым из-за запредельного объема работы. Сегодня мы имеем возможность автоматизировать большую часть этой работы с помощью инструментов, например, Stryker.NET.</p><h2>Принципы мутационного тестирования</h2><p>Алгоритм мутационного тестирования достаточно прост: в исходный код (базу) вносятся различные изменения (мутации). Существует несколько разновидностей мутаций. Основные из них:</p><p>– <b>изменение операторов</b>: замена арифметических и логических операторов (например, + на -, &gt;= на &gt;),</p><p>– <b>изменение значений</b>: замена булевых значений, удаление вызовов методов или изменение литералов,</p><p>– <b>изменение условий</b>: в if, циклах и логических выражениях.</p><p>Затем на этом модифицированном коде выполняются модульные тесты для проверки их чувствительности к изменениям. Мутанты, которые вызывают провал тестов, считаются «убитыми» (Killed Mutants), остальные —  «выжившими». По итогу проверки формируется отчет, где ключевая метрика качества тестов —  Mutation Score —  доля убитых мутантов от их общего количества. Если тесты не «убивают» подавляющее число мутантов, значит их нельзя считать достаточно эффективными.</p><p>Среди инструментов для автоматизации проведения мутационного тестирования мы остановили выбор на Stryker.NET и вот, почему:</p><p>– на данный момент Stryker.NET обладает <b>наибольшим объемом автоматизированных операций</b>: он самостоятельно вносит мутации в исходный код, запускает юнит-тесты и генерирует подробные отчеты;</p><p>– Stryker.NET <b>полностью интегрирован с .NET-экосистемой</b>: поддерживает .NET и .NET Framework, основные тестовые фреймворки (xUnit, NUnit, MSTest);</p><p>– Stryker.NET – это бесплатный <b>инструмент с открытым исходным кодом</b>, постоянно обновляемый и поддерживаемый сообществом, что гарантирует его актуальность и развитие.</p><p>По нашей практике, Stryker.NET будет полезен для трех категорий пользователей:</p><p>– <b>Разработчик</b> может убедиться, что новый код покрыт качественными тестами и изменения не привели к деградации существующих тестов, а также находить и удалять тесты, которые ничего не тестируют и только отнимают ресурсы.</p><p>– <b>Ревьюер</b> может быстро и надежно проверить качество тестов в pull request.</p><p>– <b>ИТ-архитектор и руководитель разработки</b> могут регулярно строить и анализировать отчеты, чтобы мониторить «здоровье» юнит-тестов во всей кодовой базе.</p><h2>Установка и использование Stryker.NET</h2><p>Технически Stryker.NET представляет из себя dotnet tool. Соответственно, чтобы его установить, необходимо выполнить команду в cmd или в PowerShell консоли:</p><p><i>dotnet tool install -g dotnet stryker</i></p><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/29e01f48-c311-41e1-a22b-b0be87e83f32.png" alt="" /><figcaption>установка Stryker.NET</figcaption></figure><p>Получение и анализ отчетов: результаты выводятся в консоль и сохраняются в подробном HTML-отчете.</p><p>Stryker.NET поддерживает несколько сценариев, простейший из них — анализ проекта с кодом. В этом случае необходимо запустить мутационное тестирование из папки, где расположен файл проекта, указать имя этого файла без пути и через ключ <b><i>tp</i></b> указать полные пути ко всем файлам проектов, содержащим тесты для проекта с кодом. Например:</p><p><i>dotnet stryker -p “project.csproj” -tp “c:\git\project.tests\project.tests.csproj”</i></p><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/19df0a95-2009-4c70-b05b-c9fc49c9da8c.png" alt="" /><figcaption>запуск Stryker.NET для анализа проекта с кодом</figcaption></figure><p>В результате тестирования программа сгенерирует отчет, где в первой колонке будет выведена метрика Mutation Score в целом по проекту и по отдельным файлам, причем разделённая на две группы: <i>Of total</i> —  общее количество мутантов, <i>Of covered</i> —  количество мутантов, находящихся в тех фрагментах кода, для которых вообще существуют тесты.</p><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/2d7165e7-c7b8-4f67-ac0a-bcbab2514419.png" alt="" /><figcaption>детальный отчет Stryker.NET файлов проекта, метрики</figcaption></figure><p>В колонке <i>Killed</i> отображается количество убитых мутантов, в колонке <i>Survived</i> —  количество выживших. В колонке <i>Timeout</i> —  количество мутантов, которые привели к зацикливанию выполнения тестов и их прерыванию утилитой. Значения остальных колонок, а также другую важную информацию можно посмотреть в документации на официальном сайте <a href="https://stryker-mutator.io/docs/stryker-net/introduction/">https://stryker-mutator.io/docs/stryker-net/introduction/</a>.</p><p>Также важно отметить, что отчёт доступен для более глубокого и детализированного анализа: можно раскрыть параметры каждого файла и увидеть подробную информацию о том, какие именно изменения были произведены, какие из мутантов выжили и почему.</p><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/c2f8db51-6aaa-4dc9-8fa2-10bee3457fef.png" alt="" /><figcaption>красная точка показывает часть кода с выжившим мутаном</figcaption></figure><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/e1b90d3b-d5fa-44e9-b39e-7c7e847a9287.png" alt="" /><figcaption>кликнув на красную точку, можно увидеть, какая именно мутация выжила</figcaption></figure><p>Stryker.NET умеет генерировать отчеты не только в HTML, но и в других форматах: например, в JSON, который очень удобен для автоматического анализа, если разработчики планируют встроить этот инструмент в свой CI/CD-пайплайн. Кроме того, есть встроенный дашборд, который, к сожалению, невозможно развернуть локально —  он доступен только как online сервис (https://dashboard.stryker-mutator.io).</p><h2>Применение Stryker.NET при разработке банковских продуктов</h2><p>Мы внедрили использование Stryker.NET в проекте для крупного банка, чтобы с помощью этого инструмента решить <b>ряд взаимосвязанных задач</b>. Самая главная проблема заключалась в том, что мы хотели улучшить качество тестов посредством мутационного тестирования, но его проведение вручную —  предельно утомительная и требующая много времени процедура. Ни Product Owners, ни разработчики не были готовы постоянно выделять на это ресурсы.</p><p>Без регулярного мутационного тестирования, нам было практически невозможно оценить текущее состояние всей кодовой базы с точки зрения качества unit тестов. У нас было много unit тестов, мы имели высокий процент Code Coverage, но не знали, насколько эти тесты нас защищают. В свою очередь, без понимания текущего состояния у нас не было возможности устанавливать команде цели по улучшению ситуации.</p><p>На данный момент команда активно <b>использует Stryker.NET на всех этапах разработки</b>.</p><p>Мы столкнулись и с ограничением использования Stryker.NET: попытка его интеграции в CI/CD-пайплайн оказалась неудачной. Это связано с тем, что кодовая база проекта насчитывает несколько миллионов строк, и выполнение всех проверок занимает примерно 12 часов. Однако мы думаем, что на проектах меньшего размера такая интеграция должна сработать.</p><p>Мы выбрали альтернативный вариант: был внедрен регулярный автоматический пост-релизный прогон Stryker.NET по ветке master, в результате которого генерируется сводный отчет. Проводится анализ изменений сводного отчета по всем проектам от релиза к релизу. По данным каждого сводного отчета мы можем оценивать работу конкретных проектных команд, и если их метрика Mutation Score недостаточно высока, – ставить цели по улучшению.</p><figure><img src="https://media.tproger.ru/user-uploads/117400/2025-10-07/cb80b102-c01a-4ed2-8892-af8630d0281f.png" alt="" /><figcaption>сводный отчет по всем проектам solution'на</figcaption></figure><p><b>Резюме</b><b></b></p><p>Итак, мутационное тестирование – мощный инструмент для повышения качества юнит-тестов и, соответственно, качества кода. Оно позволяет не только узнать, какой процент кода покрыт тестами, но и убедиться в том, что эти тесты действительно защищают код от ошибок.</p><p>Внедрение Stryker.NET —  шаг к более надёжной и предсказуемой разработке. Его регулярное использование помогает уверенно вносить изменения, рефакторить код и добавлять новый функционал.</p><p>Мы рекомендуем начать использование Stryker.NET в ваших проектах с ключевых модулей. При этом стоит постоянно делиться опытом с командой, чтобы наиболее эффективно улучшать программный продукт.</p>]]></content:encoded>
    </item>
    <item>
      <title>На GitHub появился коммит 1978 года за авторством Microsoft</title>
      <link>https://tproger.ru/news/--na-github-poyavilsya-kommit-1978-goda-za-avtorstvom-microsoft</link>
      <comments>https://tproger.ru/news/--na-github-poyavilsya-kommit-1978-goda-za-avtorstvom-microsoft?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--na-github-poyavilsya-kommit-1978-goda-za-avtorstvom-microsoft</guid>
      <description><![CDATA[<p>Microsoft выложила на GitHub исходники BASIC 1.1 для MOS 6502, оформив коммит датой 1978 года. Это исторический код, стоявший у истоков компании</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--na-github-poyavilsya-kommit-1978-goda-za-avtorstvom-microsoft">На GitHub появился коммит 1978 года за авторством Microsoft</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Sep 2025 02:52:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>На GitHub появился необычный коммит — Microsoft выложила исходники оригинального интерпретатора BASIC для процессора MOS 6502.</p><p>Что интересно, компания <b>задала датой коммита 27 июля 1978 года, 22:00 по московскому времени</b>. Таким образом, формально коммиту — <b>47 лет</b>.</p><h2>Исторический артефакт в прямом эфире</h2><p>Проект под названием<a href="https://github.com/microsoft/BASIC-M6502"> BASIC-M6502</a> содержит полный исходный код Microsoft BASIC версии 1.1. Это один из самых ранних программных продуктов компании, написанный между 1976 и 1978 годами.</p><p>BASIC 1.1 стал основой для множества персональных компьютеров, включая:</p><ul><li><b>Apple II</b> — революционный домашний ПК от Джобса и Возняка.</li><li><b>Commodore PET</b> — один из первых массовых компьютеров.</li><li><b>KIM-1</b>, <b>OSI</b>, <b>PDP-10</b> — популярные среди хобби-разработчиков системы.</li></ul><h2>Коммит из прошлого</h2><p>В коммит-логе можно увидеть:</p><ul><li><b>Дата:</b> July 27, 1978, 22:00 (GMT+3).</li><li><b>Автор:</b> Scott Hanselman (Microsoft).</li><li><b>Файл:</b> m6502.asm — 6955 строк ассемблера.</li><li><b>Текст коммита:</b> «Microsoft BASIC for 6502».</li></ul><p>Microsoft явно вручную подставила дату коммита, чтобы подчеркнуть историческую важность релиза.</p><h2>Зачем Microsoft это выложила?</h2><p>По словам авторов, это попытка сохранить цифровое наследие эпохи ранних ПК. В README подробно описано, почему именно этот код важен:</p><ul><li>Он сделал программирование доступным миллионам пользователей;</li><li>Лицензирование интерпретатора стало основой бизнес-модели Microsoft;</li><li>Код использовался до появления MS-DOS и Windows;</li><li>Интерпретатор легко переносился на разные платформы, заложив принципы кроссплатформенной разработки.</li></ul><p>Проект представлен как <b>учебный и исследовательский ресурс</b>, с MIT-лицензией.</p><h2>Внутри — чистый 6502-ассемблер</h2><p>Код представляет собой полноценный интерпретатор BASIC, написанный на <b>ассемблере для процессора MOS 6502</b>. Он включает:</p><ul><li>Поддержку арифметики с плавающей точкой.</li><li>Обработку строк и массивов.</li><li>Динамическое распределение памяти.</li><li>Сборку мусора.</li><li>Абстракцию ввода-вывода под разные платформы.</li></ul><p>Также внутри есть журнал изменений с точными датами коммитов конца 70-х годов — например, фиксы в парсинге FOR-циклов, улучшения сборщика мусора и добавление пользовательских функций.</p><blockquote>Это не просто учебный проект или архив. Это исходный код, с которого началась история Microsoft как софтверной компании. Без него не было бы MS-DOS, Windows и .NET</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Безопасное исполнение ненадёжного кода</title>
      <link>https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda</link>
      <comments>https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Межов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda</guid>
      <description><![CDATA[<p>Методы безопасного исполнения ненадёжного кода. Рассматриваются уровни изоляции кода, методы ограничения ресурсов процесса, проблемы жёсткого лимитирования и подходы к их решению. Обсуждаются вопросы управления песочницами, а также использование инструментов контейнеризации.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bezopasnoe-ispolnenie-nenadyozhnogo-koda">Безопасное исполнение ненадёжного кода</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Песочница]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 06 Jul 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы привыкли к тому, что ведем разработку, используя лучшие инженерные практики, включая настройку CI/CD-конвейера. Сначала код проходит многоэтапные стадии проверки и тестирования, а только потом попадает в production-среду.</p><p>Давайте представим ситуацию, что нужно запустить код, минуя все эти стадии. Прям в production-среде. На первый взгляд — бред! Но если подумать, то на самом деле, не такая уж редкость. Например, некоторые системы предоставляют своим пользователям возможность расширять функциональность за счет прикладных скриптов. Наш любимый CI/CD-конвейер зачастую построен на пользовательских скриптах.</p><p>С одной стороны, для большинства подобная постановка вопроса — крайность. С другой, появляется возможность рассмотреть проблему с разных ракурсов. Уверен, что какие-то части общего решения, о котором пойдёт речь далее, могут быть использованы повторно и в других проектах.</p><p>Предлагаю по частям разобрать проблему безопасного исполнения ненадёжного кода. Последовательно рассмотрим вопросы, ответы на которые поворотные в выборе целевой архитектуры. Большая часть статьи касается разработки, но в конце сделаны важные акценты относительно администрирования и развертывания.</p><h2>Ненадёжный код</h2><p>Для начала определимся, что же считать ненадёжным кодом? На самом деле ответ зависит от решаемой задачи, правил и процессов, принятых в компании:</p><ul><li>Код, который не прошел CI, review и т.п.</li><li>Код из ненадёжного или неизвестного источника.</li><li>Закрытый (проприетарный) код.</li><li>Код, содержащий уязвимости.</li><li>Код, использующий запрещенные функции.</li><li>Любой код, который написал коллега:)</li></ul><p>Чтобы отделять код разрабатываемого приложения от ненадёжного, первый буду называть кодом приложения, а второй — <i>ненадёжным</i> или <i>внешним кодом</i>. Необходимость запуска ненадёжного кода в некоторых случаях буду называть <i>задачей</i>.</p><h2>Уровни изоляции кода</h2><p>Можно выделить три варианта запуска внешнего кода — три уровня изоляции. Каждый следующий увеличивает дистанцию между кодом приложения и запускаемым кодом. Чем выше уровень изоляции, тем меньше вероятность, что запускаемый код нанесет вред приложению и системе.</p><h3>Уровень 1: тот же процесс</h3><p>Запуск внешнего кода в адресном пространстве процесса приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/191fd454-6837-4e91-abbf-c6d4a1fb6121.png" alt="Запуск внешнего кода в адресном пространстве процесса приложения." /><figcaption>Запуск внешнего кода в адресном пространстве процесса приложения.</figcaption></figure><p>Такой способ определяет самый слабый уровень изоляции, поскольку запущенный код теоретически имеет доступ ко всему тому, к чему имеет доступ код самого приложения.</p><p>Примером может служить использование интерпретаторов скриптов (<a href="https://github.com/mozilla/rhino">Rhino</a>, <a href="https://github.com/IronLanguages/ironpython3">IronPython</a>, <a href="https://github.com/jython/jython">Jython</a> и т.п.), визуальных языков программирования (workflow-движков) или подключение модулей расширения (плагинов).</p><p>Способов защиты на этом уровне не так много. Пожалуй, самым эффективным выступает (self-sandboxing), при котором приложение делает самозапрет на доступ к некоторым ресурсам системы. Например, сразу после инициализации — самозапрет на доступ к файловой системе.</p><p>Дополнительно запускаемый код можно подвергать строгому (синтаксическому) анализу, запрещая использование определенных функций, модулей, пакетов и т.п. Некоторые интерпретаторы имеют точки расширения, которые позволяют контролировать процесс исполнения. Если такой возможности нет, можно воспользоваться одной из техник самоизоляции — <a href="https://www.kernel.org/doc/html/latest/userspace-api/seccomp_filter.html">фильтрацией системных вызовов</a>.</p><p>Что же касается плагинов, то они призваны расширять возможности приложения, поэтому их использование изначально не предполагает сильной изоляции. Здесь можно предложить усилить контроль взаимодействия на уровне контракта (API). В идеале — если плагины будут публиковаться в некоторый центральный репозиторий, которому вы доверяете и который может производить дополнительные проверки и тестирование до этапа запуска кода плагина.</p><h3>Уровень 2: отдельный процесс</h3><p>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e0bf62de-65a9-4370-9986-ed21c6e63b8e.png" alt="Запуск внешнего кода на той же машине, но в отдельном процессе ОС." /><figcaption>Запуск внешнего кода на той же машине, но в отдельном процессе ОС.</figcaption></figure><p>Поскольку и приложение, и внешний код взаимодействуют в рамках одного узла, используя локальные ресурсы ОС (оперативная память, файловая система и т.п.), скорость межпроцессного взаимодействия очень высокая.</p><p>Этот уровень изоляции предполагает использование широкого арсенала возможностей. Как минимум, внешний код может быть запущен от имени менее привилегированного пользователя, с ограниченным доступом к ресурсам ОС. Сильные способы изоляции ограничивают ресурсы с помощью средств ОС или инструментов контейнеризации. Однако, чем сильнее контроль, тем больше накладных расходов на запуск и исполнение процесса, что при решении некоторых задач неприемлемо дорого или неоправданно сложно.</p><h3>Уровень 3: отдельная машина</h3><p>Запуск внешнего кода на отдельной машине — песочнице.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/5e48bc50-75c9-4789-9dc7-3bbf2c1659a7.png" alt="Запуск внешнего кода на отдельной машине — песочнице." /><figcaption>Запуск внешнего кода на отдельной машине — песочнице.</figcaption></figure><p>Это максимальный уровень изоляции из всех возможных. Здесь появляется возможность ограничить ресурсы самой песочницы (CPU, память, дисковое пространство, доступ к сети и т.п.). Если в результате исполнения внешнего кода песочница выйдет из строя, приложение продолжит свою работу.</p><p>Самый главный недостаток этого подхода — необходимость сетевого взаимодействия между узлом, на котором работает приложение, и песочницей. Передача входных данных в песочницу, запуск процесса внутри, ожидание окончания его исполнения, получение выходных данных — всё это сетевые обращения. Так существенно замедляется процесс исполнения, а само взаимодействие подвержено сетевым сбоям, что ведёт к нестабильности системы и получаемых результатов.</p><h2>Использование песочницы</h2><p>Предположим, требуется максимальный уровень изоляции ненадёжного кода, следовательно, нужно остановиться на варианте запуска на отдельной машине. Если так, то для принятия последующих архитектурных решений нужно ответить на следующую пару вопросов.</p><h3>Пересоздание или переиспользование песочницы</h3><p>Песочницу требуется пересоздавать перед исполнением каждой задачи, если требуется особенное окружение (например, определенная версия ОС, пакетов или ресурсов) или идентичность этого окружения (для стабильности получаемых результатов). Схожие вопросы возникают, например, при интеграционном тестировании: каждому тесту нужны свои предустановки.</p><p>Переиспользование песочницы становится возможным, если задачи могут исполняться в одном окружении и не оказывают влияния друг на друга (предыдущая задача не портит результаты последующей). Продолжая аналогию с интеграционным тестированием: всем тестам нужны одинаковые предустановки, и тесты могут запускаться повторно на одном стенде, демонстрируя один и тот же результат.</p><p>Основным преимуществом пересоздания песочницы выступает стабильность получаемых результатов. К недостаткам относится медленный запуск и перерасход ресурсов. На пересоздание песочницы уходят десятки секунд или даже минут, следовательно, большая часть ресурсов будет тратиться именно на это. Существует множество техник ускорения пересоздания, благодаря которым можно сократить время запуска. Прежде всего, сюда можно отнести backup/restore (snapshot песочницы, базы данных и т.п.). Также если поток задач небольшой и ресурсы позволяют, можно попробовать организовать пул песочниц и создавать их заранее.</p><p>Ставка на переиспользование делается в случае, когда поток задач большой и нужно сократить время ожидания их запуска. При этом возрастает вероятность получения нестабильных результатов и, возможно, требуется производить какую-то очистку окружения до или после исполнения очередной задачи.</p><h3>Последовательное или параллельное исполнение</h3><p>Теперь осталось ответить на вопрос, как именно можно или нужно исполнять задачи: последовательно или параллельно. Последовательное исполнение требуется в следующих случаях:</p><ul><li>важен порядок следования и исполнения задач;</li><li>задачам нужен эксклюзивный доступ к определенному ресурсу;</li><li>задачи ёмкие и их совместное исполнение вызовет нехватку ресурсов;</li><li>задачи могут мешать исполнению друг друга из-за борьбы за ресурсы.</li></ul><p>Например, шаги установки и настройки ПО; шаги CI/CD-конвейера; рендеринг изображения на GPU; интенсивные вычисления. Все эти задачи, скорее всего, придётся исполнять <b>последовательно</b>.</p><p>В остальных случаях допустимо <b>параллельное исполнение</b>. Яркой аналогией может служить одна из лучших практик в тестировании: тесты не должны оказывать влияние друг на друга, а порядок их запуска не должен иметь значения.</p><p>Последовательное исполнение обеспечивает стабильность получаемых результатов, однако приводит к низкой пропускной способности и дороговизне масштабирования (песочница обходится дороже процесса ОС). Параллельное исполнение, напротив, увеличивает пропускную способность системы и улучшает утилизацию ресурсов песочницы, но одновременно повышает вероятность нестабильных результатов. Более того, при параллельном исполнении появляется шанс перегрузить песочницу или вывести её из строя таким образом, что приведет к увеличению времени исполнения всех запущенных задач или потере результатов их работы.</p><p>На практике было замечено, что при параллельном исполнении, несмотря на увеличенную общую пропускную способность, время исполнения каждой отдельной задачи увеличивается. Если уровень параллелизма становится больше числа CPU-ядер, время исполнения начинает деградировать намного сильней.</p><h2>Управление песочницами</h2><p>Допустим, переиспользование песочниц возможно. В таком случае необходимо определить способ управления ими. Можно выделить два подхода, основанные на принципах микросервисной архитектуры, но адаптированные к специфике рассматриваемой проблемы.</p><h3>Оркестрация</h3><p>Оркестрация предполагает, что приложение совмещает две роли: оркестратор исполнения и оператор песочниц. Оркестратор координирует процесс исполнения кода: выбор подходящей песочницы, загрузка в неё входных данных, запуск удалённого процесса, получение результатов его работы и т.п. Оператор, в свою очередь, отслеживает доступные песочницы и их состояние.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/93758cab-2542-4a80-b47a-d65b04ef4f14.png" alt="Оркестрация песочниц." /><figcaption>Оркестрация песочниц.</figcaption></figure><p>Основное преимущество оркестрации в контексте решаемой проблемы — её простота и ясность. Код легко читается и сосредоточен в одном месте. Однако у этого решения есть и недостатки. Рассмотрим их в порядке от простого к сложному.</p><ul><li><i>Синхронное взаимодействие.</i> Так или иначе, для результата приложение вынуждено ожидать окончания исполнения задачи. Для продуктивного использования ресурсов приходится прибегать к техникам асинхронного программирования: пока задача исполняется, приложение будет занято полезной работой. Это малозаметный недостаток в языках со встроенной поддержкой концепции асинхронного программирования. Для упрощения работы с асинхронным кодом в Java я создал небольшую вспомогательную библиотеку <a href="https://github.com/AlexMAS/asynchronizer">asynchronizer</a>, снабдив её подробной <a href="https://github.com/AlexMAS/asynchronizer/blob/main/docs/README.ru.md">документацией</a>.</li></ul><ul><li><i>Отслеживание доступности песочниц.</i> Поскольку хотелось бы, чтобы количество песочниц менялось в зависимости от нагрузки на систему, придётся отслеживать их доступность. Это прямая обязанность оператора песочниц, которую можно выделить в отдельный discovery-сервис (например, на базе <a href="https://github.com/spring-cloud/spring-cloud-netflix">Netflix Eureka</a>), либо реализовать как часть приложения с использованием инфраструктурных механизмов (например, <a href="https://github.com/fabric8io/kubernetes-client">Kubernetes API</a>). Важно отметить, что оператор песочниц не имеет отношения к бизнес-логике приложения.</li></ul><ul><li><i>Отслеживание загруженности песочниц.</i> Оркестратор исполнения должен выбрать подходящую <a href="https://samwho.dev/load-balancing/">стратегию балансировки</a>, основанную на состоянии песочниц, предоставляемых оператором. На практике наилучшую эффективность демонстрирует алгоритм Least connections, с помощью которого можно выбирать наименее загруженные песочницы. Для этого достаточно вести учёт количества задач, исполняемых каждой песочницей. Конечно, это не серебряная пуля, а лишь частное наблюдение, поэтому в идеале нужно предусмотреть несколько стратегий балансировки и выбрать наилучшую по результатам нагрузочного тестирования.</li></ul><ul><li><i>Неопределённость результата, если нет ответа от песочницы.</i> Песочница может быть недоступна по различным причинам, включая не только проблемы с сетью, но и падения песочницы из-за ненадёжного кода. К сожалению, в общем случае эта проблема не имеет решения, так как делать повторные запуски (retries) может быть опасно. Всё, что остаётся, это использовать таймауты и откладывать неуспешную задачу на потом.</li></ul><p>Ещё один существенный минус, который стоит упомянуть, это возможный побочный эффект, возникающий при масштабировании системы и проявляющийся в виде перегрузки песочниц. Для наглядности рассмотрим конкретный пример.</p><p>Для отслеживания нагрузки на песочницы экземпляр приложения ориентируется на количество задач в каждой из доступных песочниц. Предположим, что было принято решение увеличить количество экземпляров приложения. Этот экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой). Известно, что каждая песочница может вынести максимум 4 параллельных задачи.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/623f7e7c-71d0-41da-8681-731ef43d3716.png" alt="Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой)." /><figcaption>Экземпляр исполняет 5 задач в двух песочницах (3 процесса в одной и 2 в другой).</figcaption></figure><p>Добавив новый экземпляр приложения, неизвестно, сколько задач исполняет каждая песочница. Такая ситуация может произойти по разным причинам.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/7131d310-7c0d-44b8-b031-055436bd64d8.png" alt="Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница." /><figcaption>Новый экземпляр приложения не знает, сколько задач исполняет каждая песочница.</figcaption></figure><p>Вполне очевидно, что новый экземпляр приложения направит очередную задачу в первую попавшуюся песочницу, чем может спровоцировать её перегрузку. В итоге результат исполнения будет испорчен или потерян из-за падения песочницы.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/c65090e5-020f-4eff-826b-566d3dc6da5c.png" alt="Очередная задача направляется в первую песочницу и провоцирует её перегрузку." /><figcaption>Очередная задача направляется в первую песочницу и провоцирует её перегрузку.</figcaption></figure><p>В качестве решения можно предложить два способа, каждый из которых уменьшает вероятность возникновения перегрузок, но не избавляет от них.</p><ul><li><i>Для контроля количества исполняемых задач в песочнице использовать распределённый счётчик</i> (например, на базе Redis). Проблема в том, что распределённый счётчик имеет латентность и на момент запуска задач может выдать устаревшее значение. Кроме того, в системе появляется еще один инфраструктурный компонент, который не несёт бизнес-пользы.</li></ul><ul><li><i>Выделить каждому экземпляру приложения эксклюзивное подмножество песочниц.</i> Подобное решение существенно усложнит deployment-скрипты и процесс масштабирования, а также снизит степень утилизации выделенных ресурсов, ведь нет никаких гарантий того, что экземпляр приложения сможет хорошо нагрузить все выделенные ему песочницы.</li></ul><p>Кстати, после доклада на TechLeadConf 2025 мне задали интересный вопрос: <i>Можно ли при балансировке нагрузки на песочницы учитывать не только количество исполняемых задач, но и процент загрузки CPU, памяти и прочих ресурсов? </i>Если у кого-то возник такой же вопрос, то отвечу, что это не имеет смысла, поскольку ситуация в песочнице может поменяться мгновенно. Полученный практический опыт и нагрузочное тестирование показали, что простой подсчёт задач работает эффективно.</p><h3>Самоорганизация</h3><p>В микросервисной архитектуре подобный подход принято называть хореографией, однако чтобы не возникало неправильных ассоциаций, предлагаю использовать термин <i>самоорганизация</i>.</p><p>Ключевой момент в архитектуре — это появление двух очередей: очередь задач на исполнение (Task Queue) и очередь результата их исполнения (Result Queue). Все поступающие задачи приложение направляет в первую очередь, а результаты — во вторую. Дополнительно появляется роль агента — микросервиса, который исполняется в рамках узла песочницы и координирует исполнение поступающих задач.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/0d449846-e767-49bd-bd50-d1c77c49cf10.png" alt="Самоорганизация песочниц." /><figcaption>Самоорганизация песочниц.</figcaption></figure><p>Основной недостаток самоорганизации — распределённый процесс обработки задач. Учитывая простоту алгоритма обработки, это не так существенно. Стоит отметить преимущества этой архитектуры.</p><ul><li><i>Максимальная изоляция ненадёжного кода.</i> Ненадёжный код, как и в случае с оркестрацией, по-прежнему работает в песочнице в рамках отдельного процесса ОС.</li></ul><ul><li><i>Скорость и стабильность взаимодействия.</i> Никаких проблем с сетью  из-за локальности взаимодействия между агентом и песочницей.</li></ul><ul><li><i>Контролируемая нагрузка на песочницы.</i> Агент, выступая в роли консюмера очереди задач, может точно контролировать степень параллелизма и выбирать новые задачи только тогда, когда он закончил обрабатывать предыдущие.</li></ul><ul><li><i>Минимум инфраструктурного кода.</i> Очереди избавляют от необходимости иметь оператор песочниц, отслеживать их состояние и осуществлять балансировку нагрузки.</li></ul><ul><li><i>Простота масштабирования.</i> Приложение и песочницы масштабируются независимо друг от друга без негативных побочных эффектов.</li></ul><h2>Запуск процесса ОС</h2><p>К запуску процесса ОС, в рамках которого будет исполняться ненадёжный код, нужно подойти с особой осторожностью. Здесь важно ответить как минимум на три вопроса.</p><ul><li><i>Как ограничить права доступа к ресурсам.</i> Самое простое решение — запуск процесса от имени пользователя с ограниченными правами (на доступ к ресурсам ОС).</li></ul><ul><li><i>Как ограничить объем используемых ресурсов.</i> Для запускаемого процесса нужно определить доступные ресурсы и возможные действия.</li></ul><ul><li><i>Как осуществлять анализ поведения и результатов исполнения.</i> Наличие и решение этой проблемы целиком и полностью зависит от специфики проекта. Здесь невозможно предложить универсального решения.</li></ul><p>Рассмотрим варианты ограничения ресурсов процесса ОС.</p><h3>Ограничение ресурсов процесса</h3><p>Ресурсы процесса могут быть ограничены на трех уровнях:</p><ul><li><i>Лимиты узла.</i> Физические ограничения машины, на которой исполняется процесс. В частном случае можно говорить об инфраструктурных лимитах, определённых для Docker/Kubernetes контейнера.</li></ul><ul><li><i>Лимиты контейнера.</i> Программные лимиты, задаваемые выбранным инструментом контейнеризации (cgroup, Docker, <a href="https://dzen.ru/a/Z8sdaQvf5w96SRes">Bubblewrap</a>, <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a> и т.п.).</li></ul><ul><li><i>Лимиты процесса.</i> Программные лимиты, задаваемые средствами ОС. На этом уровне можно осуществлять гибкую настройку вариантов запуска и исполнения.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/d11a1ee8-1780-4ca6-b826-a09d4d95ed0d.png" alt="Уровни лимитирования ресурсов процесса." /><figcaption>Уровни лимитирования ресурсов процесса.</figcaption></figure><p>Можно использовать все три уровня лимитирования, либо какой-то определенный.</p><p>Между тем, важно отметить некоторые трудности, которые могут возникнуть при использовании инструментов контейнеризации.</p><p>Например, для использования cgroup или Docker внутри Kubernetes-контейнера нужно эскалировать привилегии контейнера, что в общем случае небезопасно в контексте исполнения ненадёжного кода. Более того, практика показала, что легковесных rootless-средств, предоставляемых ОС, вполне достаточно, чтобы снять большую часть рисков. В частности, Linux API позволяет не только лимитировать CPU и память, но и блокировать доступ к некоторым возможностям самой ОС. Например, можно наложить фильтр, который запретит вызов определённых системных функций.</p><h3>Проблемы жёсткого лимитирования</h3><p>Рассмотренные выше способы лимитирования задают жёсткие границы (hard limit), нарушение которых замедляет исполнение процесса, либо приводит к его принудительному завершению. При этом поведение наблюдаемого процесса и системы сильно варьируется в зависимости от того, какой лимит был превышен. Например, превышение по использованию CPU может привести к троттлингу (throttling), приостановке работы или принудительному завершению; превышение по использованию памяти заканчивается принудительным завершением со стороны ОС (OOM Killer) либо самостоятельным падением процесса (с ошибкой Out Of Memory).</p><p>Подобная вариативность осложняет <i>анализ поведения и результатов исполнения.</i> В этом случае можно использовать подход с программной мягкой границей (watchdog limit). Суть заключается в запуске дополнительного следящего потока (или процесса) ОС, который контролирует поведение и расход ресурсов у наблюдаемого. Как только детектируется превышение одного из лимитов, производится принудительное завершение наблюдаемого процесса, но уже не со стороны ОС, а со стороны приложения.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/e38eb138-04f3-439f-89b5-9b810f112a69.png" alt="Программная мягкая граница (watchdog limit)." /><figcaption>Программная мягкая граница (watchdog limit).</figcaption></figure><p>Такой подход имеет несколько преимуществ.</p><ul><li><i>Точное определение причин принудительного завершения.</i> Жёсткие лимиты чуть выше мягких, благодаря чему для исполняемого кода создаётся иллюзия отсутствия каких-либо лимитов. Между тем, если лимиты всё-таки нарушаются, процесс всё равно будет завершен (либо со стороны приложения, либо гарантированно со стороны ОС). Но подобный дополнительный контроль со стороны приложения оставляет для него гораздо больше шансов понять причину принудительного завершения наблюдаемого процесса.</li></ul><ul><li><i>Возможность гибкого лимитирования ресурсов.</i> Приложение (или агент), ответственное за запуск наблюдаемого процесса, может обратиться к средствам ОС (в частности, к Linux API) и гибко настроить параметры запуска и исполнения. Как минимум, жёстко определить лимиты по CPU и памяти; наложить ограничения на объем I/O; создать запрет на вызов некоторых системных функций (например, запрет использования сетевых операций или файловой системы) и т.п.</li></ul><p>Такой подход я назвал watchdog и в целях иллюстрации реализовал его в виде .NET-библиотеки <a href="https://github.com/AlexMAS/ProcessSandbox">ProcessSandbox</a>. Помимо прочего, на странице проекта подробно рассмотрена проблематика контроля и анализа поведения процесса ОС со стороны прикладного кода.</p><p>Итоговая схема лимитирования может выглядеть так, как показано на рисунке ниже. Вместо тяжеловесных инструментов контейнеризации используется легковесный rootless-инструмент (watchdog) на базе средств ОС и только.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/2c5e74e4-125b-467d-8b27-30b005364523.png" alt="Лимитирование ресурсов процесса с помощью watchdog." /><figcaption>Лимитирование ресурсов процесса с помощью watchdog.</figcaption></figure><p>Для задач, где не нужен анализ поведения процесса и тонкая настройка лимитов, можно воспользоваться готовым инструментом — утилитой.</p><h2>Многоконтейнерные поды</h2><p>Зная, что контейнеры одного Kubernetes-пода работают на одном и том же узле, можно попытаться решить проблему нестабильности сетевого взаимодействия приложения и песочницы, разместив их контейнеры в одном поде.</p><figure><img src="https://media.tproger.ru/user-uploads/115455/2025-06-18/62400b6a-9c5b-4285-bff8-b0adb5ac8868.png" alt="Размещение контейнера приложения и песочницы в одном Kubernetes-поде." /><figcaption>Размещение контейнера приложения и песочницы в одном Kubernetes-поде.</figcaption></figure><p>Несмотря на всю заманчивость данной идеи, она несёт ряд недостатков.</p><ul><li><i>Плохая масштабируемость.</i> Соотношение приложение-песочница всегда один к одному. Однако не исключено, что в некоторых случаях это вполне приемлемо.</li></ul><ul><li><i>Плохая утилизация ресурсов.</i> Сможет ли приложение достаточно нагрузить песочницу, если количество песочниц будет в избытке; и наоборот, нужно ли столько же экземпляров приложения, сколько и песочниц.</li></ul><ul><li><i>Возможность перегрузки песочницы.</i> В распоряжении экземпляра приложения только одна песочница, которая может не справиться с потоком задач, обрабатываемых приложением.</li></ul><ul><li><i>Риск нарушить работоспособность приложения.</i> Выход песочницы из строя скорее всего приведет к перезапуску всего пода. Более того, если приложение и песочница обмениваются файлами через общий раздел (<a href="https://kubernetes.io/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/">shared volume</a>), это может стать уязвимым местом.</li></ul><h2>Образ для песочницы</h2><p>Основные моменты, которые следует учесть при создании (Docker) образов песочниц:</p><ul><li><i>Заменить init-процесс</i> на <a href="https://github.com/krallin/tini">tini</a>, чтобы не превысить лимит по PIDs.</li></ul><ul><li><i>Создать непривилегированного пользователя,</i> ограничив ему права на доступ к ресурсам.</li></ul><ul><li><i>Регулярно сканировать версии образов</i> и пакетов на наличие уязвимостей.</li></ul><h2>Инфраструктура исполнения</h2><p>Основные моменты, которые следует учесть при настройке инфраструктуры исполнения:</p><ul><li><i>Обеспечить быстрый (пере)запуск песочниц.</i> Нужно быть готовым к тому, что песочницы будут падать. Если речь идет о Kubernetes, то улучшить время запуска может подходящая настройка <a href="https://kubernetes.io/docs/concepts/containers/images/">Image Pull Policy</a>. При этом лучше не использовать тег `latest`, а указывать конкретную версию или хэш-код образа, чтобы не тратить время на попытки определения последней версии при каждом запуске.</li></ul><ul><li><i>Установить приемлемый <a href="https://kubernetes.io/docs/concepts/policy/pid-limiting/">лимит на PIDs</a>.</i> Необходимо контролировать число активных процессов в системе. Особо вредоносный код может попытаться создать очень много дочерних процессов, поэтому при отсутствии лимита на PIDs узел быстро будет выведен из строя. Важно отметить, что лимит задаётся для пользователя, а не для запускаемого процесса. По этой причине он должен быть разумно большим.</li></ul><ul><li><i>Установить <a href="https://kubernetes.io/docs/concepts/policy/resource-quotas/">лимиты на ресурсы узла</a>.</i> В Kubernetes для каждого контейнера нужно указать, как минимум, лимиты по CPU и памяти. Значения лимитов лучше всего определить в ходе нагрузочного тестирования или путём сбора метрик приложения.</li></ul><h2>Заключение</h2><p>Как можно заметить, задача исполнения ненадёжного кода всегда решается в комплексе, начиная с анализа, продолжая разработкой и заканчивая вопросами уровня DevOps. Думаю, что многие техники и инструменты применимы и к коду самого приложения.</p><p>Я постарался показать последовательность шагов по направлению к целевой архитектуре, которая будет отвечать требованиям бизнеса и справляться с ненадёжным кодом. <i>Если вам интересна данная тематика, подписывайтесь на мой Telegram-канал Архитектоника в ИТ (@arch_and_dev). Буду рад поделиться опытом. </i></p>]]></content:encoded>
    </item>
    <item>
      <title>Топ-7 самых тупых хакерских атак в истории</title>
      <link>https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii</link>
      <comments>https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii</guid>
      <description><![CDATA[<p>Самые нелепые хакерские атаки в истории. Взлом через аквариум, звуковая атака ядерного объекта, загрузка отпечатков в систему и другие атаки. Ошибки и просчеты хакеров. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/top-7-samyh-tupyh-hakerskih-atak-v-istorii">Топ-7 самых тупых хакерских атак в истории</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[.NET]]></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>
      <category><![CDATA[Юмор]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Jun 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте типичного хакера. Наверняка перед глазами возникает образ компьютерного вундеркинда в капюшоне, чьи пальцы порхают по клавиатуре, взламывая серверы Пентагона между глотками энергетика. Но реальность куда прозаичнее: большинство киберпреступников — не мифические кудесники, а обычные люди, которые иногда умудряются облажаться так эпично, что их провалы достойны отдельного топа.</p><p>В мире, где большинство успешных атак происходит из-за банальных ошибок вроде слабых паролей или непропатченного софта, находятся «особые» экземпляры. Те, кто взламывает дорожные знаки, чтобы предупредить о зомби-апокалипсисе, крадет данные клиентов, работая в отделе кибербезопасности, оставляет цифровые отпечатки там, где даже новичок догадался бы их удалить.</p><p>Эти семь историй — не просто сборник курьезов. Они наглядно показывают: главная уязвимость любой системы (не обязательно цифровой) — человеческая глупость. И хорошо, что хотя бы некоторые злоумышленники тоже подчиняются этому правилу.</p><h2>Семерка самых нелепых хакерских атак</h2><p>Хакерские атаки обычно ассоциируются с высокотехнологичными схемами и тонкими методами взлома, но иногда злоумышленники совершают настолько абсурдные вещи,  что остается только разводить руками. Одни попадаются из-за детских ошибок, другие — из-за нелепой самоуверенности, третьи умудряются навредить сами себе.</p><p>Перед вами семь самых нелепых и странных кибератак в истории — от «Годзиллы» на дорожных знаках до злоумышленников, загрузивших собственную биометрию в систему безопасности.</p><h3>Взлом казино через аквариум</h3><p>В 2017 году один из западных игорных домов (название до сих пор не раскрыто) стал жертвой атаки, которая больше похожа на сценарий абсурдного кибертриллера. Злоумышленники пробрались в сеть казино… через аквариум. Обычный, с рыбками.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/b206d2c6-e7e9-4f55-87d7-1e20e5e272c1.jpg" alt="" /></figure><h3>IoT-термометр как дыра в безопасности</h3><p>В холле заведения стоял «умный» аквариум с подключенными датчиками — они следили за температурой воды, уровнем чистоты и даже автоматически сбрасывали корм. Казалось бы, безобидная техника для ухода за рыбками. Но проблема в том, что эти сенсоры были частью внутренней сети казино.</p><p>Хакеры нашли уязвимость в IoT-устройстве (скорее всего, использовали стандартный пароль или эксплойт для устаревшей прошивки) и через него проникли в систему. Как позже рассказали эксперты, взломщики не просто получили доступ к аквариуму — они провели разведку, нашли другие слабые места и добрались до базы данных высокодоходных клиентов — так называемых «китов» (тоже улов своего рода).</p><h4>10 ГБ данных и финский сервер</h4><p>Зараженный термометр стал точкой входа, но дальше атака развивалась уже по классическому сценарию:</p><ul><li>сканирование сети — хакеры искали узлы с уязвимостями;</li><li>перемещение по системе — получив привилегии, они добрались до ценных данных;</li><li>эксфильтрация — украденная информация (около 10 ГБ) ушла на сервер в Финляндии.</li></ul><p>Самое забавное — после этого следы обрываются. Данные не всплыли в даркнете, их не пытались продать. Возможно, это была разведка перед более масштабной атакой, но сами злоумышленники так и не объявились. Спрашивается: зачем?</p><p>Почему это вообще сработало:</p><ul><li>Безопасность IoT в 2017 году была мифом. Умные устройства были в новинку, их редко обновляли, защищали слабыми паролями или просто забывали изолировать от корпоративной сети.</li><li>Человеческий фактор. Кто-то в казино решил, что датчик для рыб не нуждается в серьезной защите. Ошибка.</li><li>Отсутствие сегментации сети. Аквариум оказался в той же сети, что и база с данными клиентов.</li></ul><h4>Что изменилось с тех пор</h4><p>Случай с казино стал хрестоматийным примером рисков IoT. Сейчас компании чаще изолируют умные устройства в отдельных сегментах сети, запрещают дефолтные пароли и мониторят аномальную активность.</p><p>Но проблема не исчезла. В 2021 году, например, хакеры взломали систему очистки бассейна в отеле через уязвимый контроллер — и снова получили доступ к внутренним серверам.</p><p>Эта история — идеальный пример того, как человеческая беспечность и плохая настройка техники приводит к курьезным, но опасным взломам. Если ваша компания до сих пор считает, что умный чайник или датчик температуры не угрожают безопасности, вспомните казино с аквариумом. Возможно, прямо сейчас ценные данные уплывают вместе с рыбками.</p><h3>Соискатель с креативным подходом</h3><p>В 2010 году венгерский программист Аттила Немет совершил, пожалуй, самый нелепый карьерный маневр в истории киберпреступлений. Вместо того чтобы отправить резюме в отдел кадров, он взломал систему безопасности сети отелей Marriott — чтобы потом предложить свои услуги по ее защите. Получилось не совсем так, как он планировал.</p><h4>Вирус вместо сопроводительного письма</h4><p>25-летний Немет, судя по всему, искренне считал себя «белым хакером». Его план выглядел так:</p><ol><li>Взломать Marriott, показав уязвимости.</li><li>Предложить компании свои услуги по устранению этих дыр.</li><li>Получить работу в отделе кибербезопасности.</li></ol><p>Для первого пункта он выбрал классическую схему: фишинговые письма с вредоносными вложениями. Кто-то из сотрудников отеля открыл файл — и Немет получил доступ к внутренним системам. Он скопировал конфиденциальные данные, включая информацию о клиентах, но не стал их продавать или публиковать. Вместо этого хакер связался с Marriott и… предложил себя в качестве спасителя.</p><h4>«Ваша защита слабая — возьмите меня на работу»</h4><p>По версии следствия, Немет напрямую заявил представителям компании: он готов раскрыть все уязвимости, если его возьмут в штат. В Marriott идею не оценили. Вместо HR-менеджера с ним начал переписку сотрудник Секретной службы США, представившись «заинтересованным руководителем».</p><p>Хакер, не заметив подвоха, подробно описал методы взлома и даже согласился прилететь в США для личной встречи. В аэропорту его ждали не потенциальные коллеги, а полиция.</p><p>Почему это провалилось:</p><ul><li>Криминал ≠ пентест. Настоящие «этичные хакеры» не крадут данные перед тем, как предложить услуги.</li><li>Наивность. Немет всерьез верил, что компания простит взлом ради его навыков.</li><li>Юридическая безграмотность. Венгр не учел, что в США за такое сажают, даже если «хотел как лучше».</li></ul><p>Немета приговорили к 2,5 годам тюрьмы — относительно мягко, учитывая потенциальный срок за кражу данных. Marriott потратил около $1 млн на расследование и усиление защиты. Сам хакер, выйдя на свободу, исчез из публичного поля. По некоторым данным, он все же устроился в IT — но уже без креативных «испытательных заданий».</p><h4>Что было не так с его планом?</h4><p>Эксперты отмечают несколько фатальных просчетов:</p><ul><li>Нелегальный вход. Даже если цель благая, несанкционированный доступ остается преступлением.</li><li>Доказательства кражи. Скопировав данные, Немет автоматически стал нарушителем закона — никакие благие намерения это не отменяли.</li><li>Доверие к анонимам. Переписка с Marriott велась через анонимные сервисы, но хакер почему-то поверил, что это официальные представители.</li></ul><p>Как надо было поступить? Если бы Немет действительно хотел помочь и устроиться на работу, ему стоило:</p><ol><li>Найти уязвимости, не получая доступа к данным.</li><li>Связаться через официальный канал с ответственными за безопасность.</li><li>Предложить исправления, приложив резюме.</li></ol><p>Так делают настоящие исследователи — и их не арестовывают в аэропортах.</p><h4>Мораль для соискателей</h4><p>Эта история — отличный пример того, как не стоит искать работу в кибербезопасности. Хотите показать навыки? Участвуйте в баг-баунти программах, где взлом разрешен правилами. Мечтаете о карьере «белого хакера»? Получайте сертификаты, а не судимости.</p><p>Немету повезло: отделался небольшим сроком. Со следующим «креативщиком» могут поступить гораздо жестче.</p><h3>Тупейший взлом в истории: просчитались, но где?</h3><p>В 2018 году группа «киберпреступников» (если их можно так назвать) совершила то, что эксперты единогласно признали самым идиотским взломом десятилетия. Их план выглядел как сценарий для пародийного фильма: чтобы украсть товары со склада, они… загрузили свои отпечатки пальцев в охраняемую базу данных.</p><h4>Хакеры против сканеров: кто кого?</h4><p>Все началось с того, что преступники нацелились на склады компании, производящей предметы роскоши. Система безопасности использовала биометрические сканеры — без правильного отпечатка пальца внутрь не попасть.</p><p>Первая идея была в духе голливудских блокбастеров: отключить сканеры удаленно. Но тут злоумышленников ждало разочарование. Оказалось, что сканеры контролируются ИИ, который заметит любые манипуляции, а физическое отключение сразу вызовет тревогу. Тогда группа перешла к «плану Б» — и вот здесь началось самое интересное.</p><h4>«Давайте добавим свои отпечатки в базу!»</h4><p>Вместо того чтобы искать обходные пути, хакеры решили действовать напролом:</p><ol><li>Взломали базу данных с отпечатками сотрудников.</li><li>Удалили несколько «лишних» слепков.</li><li>Загрузили туда свои собственные пальцы.</li></ol><p>Логика была проста: сканер запрашивает базу, видит «своих» и открывает дверь. Что могло пойти не так?</p><p>Почему это был худший план в истории:</p><ol><li>Отпечатки — это улика. В отличие от анонимных логинов, пальцы нельзя сменить или стереть.</li><li>База синхронизировалась с архивами. Удаленные отпечатки не исчезли навсегда — их восстановили за минуты.</li><li>Сотрудники заметили пропажу. Когда люди перестали проходить сканеры, охрана забеспокоилась раньше, чем воры добрались до склада.</li></ol><p>Система безопасности компании не просто хранила отпечатки — она вела журнал всех изменений. Как только хакеры загрузили свои данные, ИИ отметил неавторизованный доступ к базе, подозрительные правки и самое главное — новые отпечатки, которых нет в кадровых документах. Полиция сравнила свежие «слепки» с криминальной базой и нашла полное совпадение. Всех участников группы задержали в течение суток.</p><h4>Что не так с их логикой?</h4><p>Эксперты до сих пор удивляются, как вообще можно было придумать такой план:</p><ul><li>Биометрия = паспорт. Даже начинающие хакеры знают: подделывать отпечатки — все равно что оставлять автограф на месте преступления.</li><li>Резервные копии. Любая серьезная система делает бэкапы. Удалить данные навсегда практически невозможно.</li><li>Слишком много шагов. Проще было взломать дверь кувалдой, чем лезть в базу.</li></ul><p>Что стало с «гениями»:</p><ul><li>Главарь группы получил 4 года за взлом и кражу данных.</li><li>Компания усилила защиту, добавив двухфакторную аутентификацию для доступа к биометрии.</li><li>Этот случай теперь разбирают на курсах кибербезопасности как пример «как не надо делать».</li></ul><p>Мораль для будущих хакеров: Если ваш план включает пункт «загружаем свои отпечатки», он точно провалится. Иногда старомодный взлом замка — куда более разумный выбор.</p><h3>Рок против ядерки: как хакеры заставили ядерный объект играть AC/DC</h3><p>Если бы кто-то в 2012 году предложил иранским инженерам послушать хард-рок вместо ночной смены, они бы наверняка отказались. Но хакеры не спрашивали разрешения.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/3d9dee02-e29f-44e7-8411-e6b27d159961.jpg" alt="" /></figure><p>Летом того года на двух ядерных объектах Ирана внезапно заиграла «Thunderstruck» — культовая песня легендарной группы AC/DC. Громкость была выставлена на максимум, динамики орали «THUN-DAH!» в ночной тишине, а персонал никак не мог это остановить. Так, вирус Stuxnet, уже хорошо известный в мире кибербезопасности, добавил к своей репутации еще и музыкальный троллинг.</p><h4>Взлом с саундтреком</h4><p>Stuxnet — один из самых сложных червей в истории. Его создавали для физического разрушения оборудования: он менял скорость вращения центрифуг, на которых иранцы обогащают уран, выводя их из строя, и маскировал атаку, подделывая данные мониторинга. Но в какой-то момент кто-то решил, что просто ломать машины — скучно.</p><p>Анонимный сотрудник иранской АЭС написал исследователю Микко Хиппонену: система управления периодически отключалась, а из динамиков гремел AC/DC. Тегеран официально отрицал инцидент, но детали всплыли в переписке техников. Вирус явно модифицировали — помимо основной нагрузки, он включал медиаплеер и запускал трек в случайное время.</p><p>Почему именно «Thunderstruck»? Возможно, из-за названия: «Пораженный громом» звучало как намек на ядерный удар. Или потому, что гитарный рифф идеально подходил для психологического давления.</p><h4>Кто стоял за атакой?</h4><p>Stuxnet приписывают совместной разработке США и Израиля (<a href="https://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%C2%AB%D0%9E%D0%BB%D0%B8%D0%BC%D0%BF%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8%D0%B3%D1%80%D1%8B%C2%BB">операция «Олимпийские игры»</a>). Но музыкальный «апгрейд» — дело рук других исполнителей.</p><p>Эксперты предполагают, что это могли сделать:</p><ul><li>гражданские хакеры — в знак протеста против ядерной программы;</li><li>внутренние саботажники — чтобы деморализовать персонал;</li><li>сами разработчики Stuxnet — в качестве «пасхального яйца».</li></ul><p>Интересно, что атака совпала с ужесточением санкций против Ирана. Громкий рок стал своеобразным медийным сигналом: «Мы контролируем ваши системы».</p><p>Обычно хакеры стараются оставаться незамеченными. Здесь же они:</p><ul><li>использовали уязвимость Windows (CVE-2010-2568) для распространения;</li><li>внедрили двойную нагрузку: саботаж плюс звуковое воздействие;</li><li>не стали скрывать факт взлома — будто хотели, чтобы об этом говорили.</li></ul><p>Для воспроизведения музыки вирус либо содержал MP-файл внутри кода, либо скачивал его с зараженного сервера. Версия с AC/DC так и не была найдена в открытых образцах Stuxnet — возможно, ее «дорабатывали» уже на месте.</p><h4>Последствия: смех или паранойя?</h4><p>Иранские власти заявили, что атака не нанесла ущерба. Но психологический эффект переоценить сложно:</p><ul><li>персонал не мог отключить музыку — только глушил динамики физически;</li><li>трек включался ночью, нарушая режим работы;</li><li>слухи о взломе подрывали доверие к системе безопасности.</li></ul><p>Этот случай вошел в историю не только из-за технической стороны, но и из-за абсурдности. Хакеры доказали: даже в кибервойне есть место черному юмору.</p><p>Stuxnet стал первым вирусом, который физически разрушал инфраструктуру. А его музыкальная версия показала, что хакеры умеют добывать не только данные, но и портить нервы. Говорят, после этого случая иранские ядерные объекты перешли на компьютеры без звуковых карт. Но это уже другая история.</p><h3>«Годзилла нападает!»: цифровой хаос на дорогах США</h3><p>В 2014 году водители в Сан-Франциско получили необычное предупреждение: электронное табло на трассе внезапно замигало сообщением «GODZILLA ATTACK – TURN BACK!». Никакой паники не случилось — большинство решило, что это чья-то шутка. Но за этим стояла реальная хакерская атака, которая вскрыла уязвимости критической инфраструктуры.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-05-21/e608e9ce-d461-4f0b-9c06-ac91363930d9.jpg" alt="" /></figure><h4>Как взламывали дорожные знаки</h4><p>Электронные дорожные табло в США управлялись (а возможно, управляются до сих пор) через примитивные системы, часто с заводскими паролями вроде «admin» или «1234». Хакеры, обнаружившие эту лазейку, подключались к знакам через открытые порты или уязвимости в протоколах. Иногда даже не требовалось сложных инструментов — достаточно было мобильного модема и стандартного ПО для управления сетевыми устройствами.</p><p>После взлома злоумышленники меняли сообщения на абсурдные: предупреждали о зомби-апокалипсисе, просили «спасти заложников на фабрике знаков» или просто выводили бессмысленный набор символов. В Техасе, например, однажды появилось сообщение: «СЛЕДИТЕ ЗА ДОРОГОЙ, А НЕ ЗА ТЕЛЕФОНОМ» — ироничный намек на проблему невнимательности, которая как раз и позволила хакерам провести атаку.</p><h4>Почему это стало возможным?</h4><p>Основная причина — беспечность муниципальных служб. Многие дорожные системы десятилетиями работали на устаревшем ПО, а пароли к ним никогда не менялись. Как позже выяснилось, часть оборудования даже не была защищена брандмауэрами.</p><p>Федеральное управление автомобильных дорог США (FHWA) после инцидента выпустило рекомендации по усилению безопасности, но исправлять ситуацию пришлось годами. В 2016 году исследователи из Университета Мичигана провели аудит дорожной инфраструктуры и обнаружили, что 40% систем по-прежнему уязвимы к простейшим атакам.</p><h4>Последствия и уроки</h4><p>К счастью, никто не пострадал — большинство водителей просто игнорировали странные сообщения. Однако атака показала, как легко можно посеять хаос, если критическая инфраструктура не защищена.</p><p>Сейчас подобные взломы стали редкостью, но не исчезли полностью. В 2020 году в Огайо хакеры вывели на табло фразу «COVID-19 — это обман», а в 2022-м в Калифорнии знаки призывали «готовиться к вторжению пришельцев».</p><p>Главный вывод прост: даже самые невинные устройства, подключенные к сети, могут стать оружием в руках злоумышленников. И если дорожные знаки взламывают ради шутки, то что мешает кому-то устроить настоящий хаос?</p><h3>«Этичный хакер» с двойной жизнью: как специалист по безопасности стал киберпреступником</h3><p>Пепейн Ван дер Стап выглядел идеальным кандидатом для работы в сфере кибербезопасности — молодой, талантливый, увлеченный технологиями. Днем он помогал компаниям защищать данные, а ночью взламывал их, сливая конфиденциальную информацию на даркнет-форумы. Его арест в 2023 году стал одним из самых громких случаев двойной игры в IT-индустрии.</p><h4>Как его поймали</h4><p>Все началось с жалобы амстердамской компании, которая обнаружила утечку данных. Расследование привело к Ван дер Стапу — сотруднику Hadrian Security, фирмы, специализирующейся на пентестах (тестировании систем безопасности) и защите от кибератак. Злая ирония в том, что он сам годами использовал те же инструменты, которые по задумке должны были защищать системы от взлома.</p><p>Следствие выяснило, что с 2020 по 2023 год оборотень с ноутбуком и его сообщники взломали десятки компаний, вымогали деньги под угрозой утечки данных и заработали на этом более 2,6 млн евро. При обыске у Ван дер Стапа нашли базы с персональными данными миллионов людей, готовые для продажи на RaidForums и BreachForums — двух крупнейших хакерских площадках, ныне закрытых.</p><h4>Почему он это делал?</h4><p>В интервью DataBreaches.net Ван дер Стап утверждал, что начал заниматься взломами до работы в кибербезопасности, а потом «хотел завязать». Но цифры говорят обратное: его активность совпадала с периодом трудоустройства в Hadrian Security. Возможно, доступ к внутренним данным клиентов сделал атаки проще.</p><p>Его мотивы банальны — деньги и азарт. Он продавал украденные данные, торговал доступом к корпоративным сетям и даже консультировал других хакеров. При этом успел поработать волонтером в Голландском институте раскрытия уязвимостей (DIVD), что добавляет ситуации еще немного абсурда.</p><h4>Что не сработало в его схеме</h4><p>Главная ошибка Ван дер Стапа — уверенность в анонимности. Он использовал ники вроде «Espeon» и «Rekt», но криптовалютные транзакции и логи подключений его выдали. В 2023 году правоохранители синхронизировали данные с закрытых форумов и вышли на него.</p><p>Еще один провал — масштаб. Он не ограничился мелкими взломами, а атаковал крупные компании, привлекая внимание регуляторов. Когда ущерб исчисляется миллионами, следствие действует жестче.</p><h4>Последствия и уроки</h4><p>Суд дал ему 4 года тюрьмы. Но важнее другое: случай показал, как легко «белые» хакеры могут скатиться в преступность. Компании до сих пор плохо проверяют сотрудников, работающих с критической инфраструктурой.</p><p>После этого скандала в Нидерландах ужесточили контроль за специалистами по кибербезопасности. Например, Hadrian Security ввела аудит действий сотрудников, а DIVD теперь требует раскрытия прошлой активности волонтеров.</p><h3>Как хакеры качали топливо с АЗС обычным пультом</h3><p>В 2019 году во Франции раскрыли аферу, больше похожую на сценарий криминальной комедии, чем на реальное преступление. Группа из пяти человек за год украла более 120 тысяч литров бензина, используя… обычный пульт управления заправочной колонкой.</p><h4>Пароль «0000» — мечта хакера</h4><p>Все началось с того, что злоумышленники обнаружили: на некоторых АЗС Total топливные колонки защищены стандартным PIN-кодом «0000». Персонал заправок не удосужился его изменить, а производитель оборудования не требовал обязательной смены пароля при вводе в эксплуатацию.</p><p>Купив на теневых форумах сервисный пульт (предназначенный для технического обслуживания), преступники научились разблокировать колонки без оплаты, обнулять стоимость топлива, отключать лимиты на подачу горючего.</p><p>Группа работала слаженно. Первый автомобиль подъезжал к АЗС – водитель с помощью пульта «взламывал» колонку. Затем подъезжал фургон с цистерной и закачивал до 3000 литров за раз.</p><p>Украденное топливо сбывали через соцсети по заниженным ценам. За год схема принесла им около $170 000, пока полиция не вышла на след. В этом случае тупыми оказались не столько хакеры, которые не особенно даже скрывались, а сотрудники безопасности, допустившие подобный беспредел. Тупым был способ, но не результат.</p><p>Почему это сработало:</p><ul><li>Халатность — Total подтвердила, что на оборудовании использовались заводские настройки.</li><li>Отсутствие контроля — на небольших АЗС пропажу замечали только через недели.</li><li>Уязвимость ПО — колонки считали «просто железом», но их софт оказался уязвим.</li></ul><p>Всех пятерых задержали за кражу и взлом. Total экстренно обновила прошивки и обязала менять пароли.</p><p>Как оказалось, это был не единичный подобный случай.  В 2021 году в США хакеры через уязвимость в ПО вызвали дефицит бензина на Восточном побережье. А в 2023-м исследования показали, что 20% европейских АЗС до сих пор используют устаревшее ПО.</p><h4>Технические детали</h4><p>Преступники использовали пульт Gilbarco Passport — стандартное устройство для обслуживания колонок. Его можно было купить на eBay за $300-500. Подключившись через ИК-порт, система запрашивала PIN-код, который часто оставался заводским.</p><p>Новые модели уже имели принудительную смену пароля при первом запуске, ограничение попыток ввода кода, систему оповещений о подозрительной активности.</p><h4>Как защититься?</h4><p>Владельцам АЗС эксперты рекомендуют обязательно менять стандартные пароли, регулярно обновлять ПО, устанавливать камеры с аналитикой и сегментировать сеть, изолируя колонки.</p><p>Этот случай — идеальный пример, как халатность открывает двери для примитивных, но прибыльных атак. Если ваш бизнес использует IoT-устройства, проверьте — возможно, они до сих пор на пароле «0000»?</p><h2>Итоги</h2><p>Эти истории доказывают: даже в мире высоких технологий человеческий фактор остается главной уязвимостью. Хакеры, о которых мы рассказали, обладали навыками, но им не хватило элементарной логики. Одни забывали скрыть следы, другие выбирали абсурдные цели, третьи — сами себя подставляли.</p><p>Главный урок? Безопасность — это не только сложные алгоритмы, но и здравый смысл. И если даже злоумышленники порой действуют настолько нелепо, то компаниям точно не стоит расслабляться. В конце концов, следующий «гений» может оказаться чуть удачливее — или чуть менее смешным.</p><p>Когда код уже не компилится, остаётся только смеяться. Самые айтишные мемы <a href="https://t.me/+9NN_uyMiOas5NWU6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Баг в конфиге может положить целую Windows — инженер Microsoft разобрал реальный случай</title>
      <link>https://tproger.ru/news/bag-v-konfige-mozhet-polozhit-celuyu-windows---inzhener-microsoft-razobral-realnyj-sluchaj</link>
      <comments>https://tproger.ru/news/bag-v-konfige-mozhet-polozhit-celuyu-windows---inzhener-microsoft-razobral-realnyj-sluchaj?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/bag-v-konfige-mozhet-polozhit-celuyu-windows---inzhener-microsoft-razobral-realnyj-sluchaj</guid>
      <description><![CDATA[<p>Инженер Microsoft показал, как один флаг в конфиге .NET-приложения может вызвать утечку памяти и «положить» Windows. Реальный кейс и разбор</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/bag-v-konfige-mozhet-polozhit-celuyu-windows---inzhener-microsoft-razobral-realnyj-sluchaj">Баг в конфиге может положить целую Windows — инженер Microsoft разобрал реальный случай</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 22 May 2025 10:57:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Инженер Microsoft Мэтт Хэмрик <a href="https://www.neowin.net/news/microsoft-engineer-shows-how-bad-code-can-lead-to-your-windows-pc-slowing-down/">опубликовал</a> разбор ошибки, которая может вызвать утечку памяти, замедление системы и даже крах всей Windows — и все это из-за одной строчки в конфигурационном файле .NET-приложения.</p><p>Речь идет о параметре reloadOnChange, который отвечает за автообновление настроек из файла конфигурации.</p><p>Проблема возникает, если установить reloadOnChange: true в неподходящем месте — например, в контроллере или middleware-компоненте. В этом случае каждый вызов создает нового «наблюдателя» за файлом, и память начинает стремительно заполняться.</p><h2>Что делает reloadOnChange</h2><p>Этот параметр нужен для динамической подгрузки настроек без перезапуска приложения. Но его стоит использовать только при старте и только для нестандартных файлов, которые .NET не мониторит по умолчанию.</p><p>Если включить его не там и не вовремя — приложение начнет плодить объекты, следящие за одним и тем же файлом, и сборщик мусора просто не справится.</p><p>По словам Хэмрика, ошибка накапливается медленно, но неотвратимо: система становится все менее отзывчивой, программы начинают сбоить, а в тяжелых случаях падает и сама Windows.</p><h2>Как Microsoft нашла баг</h2><p>Хэмрик обнаружил проблему, анализируя дампы памяти .NET, снятые через WinDbg и другие инструменты. Он увидел, как объект конфигурации разрастается в памяти — и каждый экземпляр привязан к новой копии FileSystemWatcher, который отслеживает изменения одного и того же файла.</p><p>И хотя пример относится к .NET 7, ошибка не зависит от версии: аналогичная утечка может случиться и в более новых релизах .NET, если допустить такую же архитектурную оплошность.</p><h2>Почему это важно</h2><p>Такие баги коварны: они не приводят к ошибке сразу. Но если приложение активно, баг способен положить всю систему — и администратор потратит часы на поиски причины, не подозревая, что виноват всего один флаг в конфиге.</p><p>Инженеры Microsoft советуют использовать reloadOnChange осознанно и только там, где это действительно необходимо. Особенно в продакшене.</p><h2>Разработчики против пользователей</h2><p>Этот кейс — пример того, как даже маленькая ошибка в коде может превратиться в системную проблему. И это особенно актуально на фоне разговоров о производительности Windows, медленной работе старых устройств и резком росте требований к «железу».</p><p>Как отмечает сам Хэмрик, часто дело не в слабом компьютере, а в неоптимизированном коде. И если раньше таким ошибкам просто не придавали значения, то сейчас они напрямую сказываются на стабильности всей системы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Copilot вернул разработчику из Microsoft его же код</title>
      <link>https://tproger.ru/news/--copilot-vernul-razrabotchiku-iz-microsoft-ego-zhe-kod</link>
      <comments>https://tproger.ru/news/--copilot-vernul-razrabotchiku-iz-microsoft-ego-zhe-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--copilot-vernul-razrabotchiku-iz-microsoft-ego-zhe-kod</guid>
      <description><![CDATA[<p>Разработчик Microsoft Мао Пачеко обнаружил, что GitHub Copilot вернул ему его же код, включая ошибки и странные названия переменных. Это вызвало у него экзистенциальный кризис: можно ли доверять ИИ-ассистентам, если они просто копируют уже существующие решения</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--copilot-vernul-razrabotchiku-iz-microsoft-ego-zhe-kod">Copilot вернул разработчику из Microsoft его же код</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Mar 2025 15:25:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик Microsoft <b>Мао Пачеко</b> <a href="https://maho.dev/2025/03/when-ai-spits-your-own-shitty-code-back-at-you/">столкнулся</a> с неожиданным эффектом использования ИИ-ассистентов при программировании.</p><p>Работая над новым проектом по интеграции <b>ActivityPub</b> в .NET, он решил использовать Copilot и другие ИИ-инструменты для оптимизации своего кода.</p><p>Однако ответ ИИ заставил его пересмотреть своё отношение к этим технологиям.</p><h2>Как всё началось</h2><p>Пачеко, известный своими многочисленными сайд-проектами, запустил новый репозиторий в 1:00 ночи — по его словам, он просто не мог игнорировать внезапное вдохновение.</p><p>Чтобы ускорить процесс, разработчик решил подключить <b>Copilot, Claude, ChatGPT и GitHub Copilot</b>. Он использует их не только для кодинга, но и для форматирования документов, исправления грамматики и даже планирования путешествий.</p><p>Однако на этот раз Copilot его удивил — он вернул <b>точную копию</b> кода, который Пачеко написал сам.</p><h2>ИИ-кодинг: гордость или кризис доверия?</h2><blockquote>Я не просто получил похожий код — он выдал <b>мою же версию</b> со всеми теми же странными именами пространств, пропущенными реализациями и магическими строками.</blockquote><p>Такое совпадение вызвало у него две противоречивые эмоции:</p><ul><li><b>Гордость</b> — его код стал частью обучающих данных для ИИ, пусть даже в каком-то незначительном масштабе.</li><li><b>Экзистенциальный кризис</b> — если ИИ просто воспроизводит его же ошибки, можно ли доверять ему улучшение кода?</li></ul><p>По его словам, Copilot напоминает <b>джуниора, уверенного в своём ответе, но на деле плохо понимающего контекст задачи</b>.</p><p>Иногда он выдаёт отличные исправления, которые действительно лучше исходного кода, но иногда просто генерирует <b>уверенно звучащую чушь</b>.</p><h2>Выводы: ИИ — не волшебная палочка</h2><p>По мнению Пачеко, разработчики должны помнить, что <b>ИИ — это всего лишь инструмент</b>, а не абсолютный источник истины. Да, он может ускорять работу, но его ответы всегда нужно проверять.</p>]]></content:encoded>
    </item>
    <item>
      <title>Состоялся релиз первого превью .NET 10: C# 14, улучшенный JIT и новые API</title>
      <link>https://tproger.ru/news/--sostoyalsya-reliz-pervogo-prevyu--net-10--c--14--uluchwennyj-jit-i-novye-api</link>
      <comments>https://tproger.ru/news/--sostoyalsya-reliz-pervogo-prevyu--net-10--c--14--uluchwennyj-jit-i-novye-api?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--sostoyalsya-reliz-pervogo-prevyu--net-10--c--14--uluchwennyj-jit-i-novye-api</guid>
      <description><![CDATA[<p>Вышло превью .NET 10 с C# 14, улучшенным JIT и новыми API. Улучшена работа с памятью, производительность и поддержка Blazor, MAUI и ASP.NET Core</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--sostoyalsya-reliz-pervogo-prevyu--net-10--c--14--uluchwennyj-jit-i-novye-api">Состоялся релиз первого превью .NET 10: C# 14, улучшенный JIT и новые API</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Asp.NET]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Mar 2025 04:43:13 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Microsoft представила первую превью-версию .NET 10</b>, которая принесла <b>обновленный язык C# 14</b>, значительные улучшения в JIT-компиляции и новые API.</p><p>Финальный релиз <b>ожидается в ноябре</b>, а пока разработчики могут опробовать нововведения в тестовой версии.</p><h2>C# 14: удобнее, быстрее, гибче</h2><p>В новой версии языка появились важные улучшения:</p><ul><li><b>Поддержка</b> System.Span&lt;T&gt; и System.ReadOnlySpan&lt;T&gt; на уровне языка, что делает работу с этими типами более естественной и повышает производительность без потери безопасности.</li><li><b>Упрощенная работа с дженериками</b> — теперь аргумент nameof может быть <b>непривязанным</b> (unbound) дженериком.</li><li><b>Лямбда-выражения стали гибче</b>: можно добавлять модификаторы параметров (scoped, ref, in, out, ref readonly) <b>без указания их типов</b>.</li></ul><p>Эти нововведения позволяют писать более <b>эффективный и компактный код</b> без потери производительности.</p><h2>Улучшенный JIT и производительность .NET 10</h2><p>Разработчики продолжают снижать <b>абстрактные накладные расходы</b> популярных языковых конструкций:</p><ul><li>JIT-компилятор теперь умеет <b>де-виртуализировать</b> вызовы методов для интерфейсов массивов, что ускоряет работу с массивами.</li><li><b>Автоматическое выделение небольших массивов в стеке</b>, если они не содержат указателей на управляемую память (GC), снижает нагрузку на сборщик мусора.</li></ul><p>Благодаря этим улучшениям <b>.NET 10 стал еще быстрее</b>, а нагрузка на память уменьшилась.</p><h2>Новые API и улучшения в библиотеках</h2><p><b>В стандартные библиотеки добавлены новые API</b>, которые оптимизируют работу с текстовыми данными и 3D-графикой:</p><ul><li><b>Обработка символов</b> теперь работает с Span&lt;char&gt;, что позволяет <b>избежать лишних выделений памяти</b>.</li><li><b>Поддержка матриц левой трансформации</b>, полезная при работе с <b>3D-графикой</b>.</li><li><b>Улучшена производительность</b> ZipArchive для работы с архивами.</li></ul><p>Эти обновления направлены на <b>ускорение работы кода и снижение потребления памяти</b>.</p><h2>Обновления ASP.NET Core, Blazor и MAUI</h2><ul><li><b>ASP.NET Core</b> теперь поддерживает <b>OpenAPI 3.1</b> и <b>генерацию API-документации в формате YAML</b>.</li><li><b>Blazor</b> получил <b>подсветку синтаксиса маршрутов</b>, что упрощает разработку.</li><li><b>.NET MAUI</b> теперь поставляется <b>в виде .NET workload</b> и через <b>NuGet-пакеты</b>, что облегчает фиксацию версий и тестирование экспериментальных сборок.</li></ul><p>Также в <b>Entity Framework</b> появился <b>метод</b> LeftJoin <b>для LINQ</b>, что упрощает написание SQL-запросов.</p><p>Скачать и опробовать .NET 10 можно перейдя по <a href="https://dotnet.microsoft.com/en-us/download/dotnet/10.0">ссылке</a> на официальный сайт Microsoft.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Godot 4.4: что нового в набирающем популярность игровом движке?</title>
      <link>https://tproger.ru/news/vywel-godot-4-4--chto-novogo-v-nabirayushhem-populyarnost-igrovom-dvizhke-</link>
      <comments>https://tproger.ru/news/vywel-godot-4-4--chto-novogo-v-nabirayushhem-populyarnost-igrovom-dvizhke-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-godot-4-4--chto-novogo-v-nabirayushhem-populyarnost-igrovom-dvizhke-</guid>
      <description><![CDATA[<p>Godot 4.4 вышел с улучшенной физикой, оптимизированной графикой и поддержкой XR. Теперь Jolt Physics встроен в движок, а C# получил поддержку .NET 8</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-godot-4-4--chto-novogo-v-nabirayushhem-populyarnost-igrovom-dvizhke-">Вышел Godot 4.4: что нового в набирающем популярность игровом движке?</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 04 Mar 2025 11:52:31 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики выпустили <b>Godot 4.4</b> — новую стабильную версию кроссплатформенного игрового движка.</p><p>Главное в этом обновлении — улучшенная физика, оптимизация рендеринга и новые возможности для работы с 3D-графикой и VR.</p><h2>Физика, графика и оптимизация работы движка</h2><p><b>Jolt Physics</b> интегрировали прямо в <b>Godot</b> — теперь этот физический движок доступен без установки дополнительных расширений. Добавлена <b>интерполяция 3D-физики</b>, что делает движение объектов более плавным.</p><p>Также появилась <b>поддержка Ubershaders</b>, снижающая подтормаживания при первом запуске шейдеров. Это особенно важно для игр с насыщенной графикой, где важно минимизировать зависания.</p><p>Тональная коррекция <b>AgX</b> стала доступна по умолчанию, обеспечивая <b>более реалистичное освещение и цветопередачу</b>.</p><p>Производительность в целом была улучшена за счет <b>нового компрессора текстур Betsy</b>, который <b>ускоряет импорт ассетов и снижает потребление ресурсов</b>.</p><h2>Редактор, XR и улучшения для разработчиков</h2><p>Редактор <b>Godot 4.4</b> получил <b>интерактивное редактирование</b> — теперь можно вносить изменения в код и сцену прямо во время «воспроизведения» игры, что делает процесс тестирования удобнее.</p><p>Появилась <b>поддержка XR-устройств</b> в редакторе: теперь можно изменять сцены прямо в виртуальной реальности. На данный момент официально поддерживаются гарнитуры <b>Quest 3, Quest 3S</b> и <b>Quest Pro</b>.</p><p>Важное изменение для разработчиков на <b>C# — полная поддержка .NET 8.0</b>, что повышает совместимость с актуальными технологиями Microsoft.</p><p>Также <b>обновлена система работы со скриптами</b> — внедрены <b>типизированные словари</b>, что делает код более предсказуемым и строгим.</p><h2>Что дальше?</h2><p>Разработчики <b>обещают дальнейшую оптимизацию производительности</b>, <b>улучшение</b> <b>редактора</b> и <b>расширение возможностей для 3D-графики</b>.</p><p>Подробнее можно узнать на <a href="https://godotengine.org/releases/4.4/">официальном сайте</a> Godot.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как не сломать прод: настройка CORS и заголовков безопасности в ASP.NET</title>
      <link>https://tproger.ru/articles/kak-ne-slomat-prod--nastrojka-cors-i-zagolovkov-bezopasnosti-v-asp-net</link>
      <comments>https://tproger.ru/articles/kak-ne-slomat-prod--nastrojka-cors-i-zagolovkov-bezopasnosti-v-asp-net?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Береговой]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ne-slomat-prod--nastrojka-cors-i-zagolovkov-bezopasnosti-v-asp-net</guid>
      <description><![CDATA[<p>Настраиваем CORS и заголовки безопасности в ASP.NET: защищаем API от несанкционированных запросов, XSS-атак и утечек данных. Разбираем ключевые настройки без лишней головной боли.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ne-slomat-prod--nastrojka-cors-i-zagolovkov-bezopasnosti-v-asp-net">Как не сломать прод: настройка CORS и заголовков безопасности в ASP.NET</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Asp.NET]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 28 Feb 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Когда речь идет о безопасности веб-приложений, настройка CORS (Cross-Origin Resource Sharing) и заголовков безопасности — один из первых шагов к защите данных и предотвращению атак. Однако ошибки в конфигурации могут привести к неприятным последствиям: от блокировки легитимных запросов до уязвимостей. Рассказываем, как грамотно настроить CORS и заголовки безопасности в ASP.NET, чтобы избежать проблем и сохранить баланс между защитой и функциональностью.</p><h2>Что такое CORS?</h2><p>Браузеры строго следят за безопасностью и запрещают кросс-доменные запросы, если они не разрешены сервером. Это называется политикой одного источника (Same-Origin Policy). Она защищает пользователей от кражи данных, но иногда мешает законным сценариям.</p><p>Например, ваше веб-приложение загружено с siteA.com, но данные хранятся на api.siteB.com. По умолчанию браузер блокирует такие запросы. Как же обойти это ограничение? Использовать <b>CORS (Cross-Origin Resource Sharing).</b></p><p>CORS — механизм, который позволяет серверу явно указывать, какие домены, схемы и порты могут запрашивать у него данные. Работает через специальные HTTP-заголовки.</p><p>Если браузер видит нестандартный запрос (например, PUT или DELETE), он сначала отправляет предварительный (preflight) запрос. Это проверка: серверу сообщают о запрашиваемом методе и заголовках, а тот решает — разрешить или запретить. Если сервер даёт добро, основной запрос выполняется.</p><p>CORS — не обходной путь, а стандарт, утверждённый W3C. Без него современные веб-приложения не могли бы безопасно взаимодействовать друг с другом.</p><h2>Какие есть источники: same-origin – different-origin</h2><p>Два адреса (URL) имеют одинаковый источник (same-origin), если они оба принадлежат одному домену.</p><p>Здесь у адресов один источник:</p><ul><li>https://test.com/index.html</li><li>https://test.com/about.html</li></ul><p>А здесь — разные:</p><ul><li>https://hello.net</li><li>https://www.hello.com/foo.html</li></ul><p>Так, если приложение обратится с адреса https://hello.net к странице https://www.hello.com/foo.html без настройки политики, то CORS запрос завершится ошибкой. Чтобы запрос обработался, мы должны сказать браузеру, что обращение к источнику https://www.hello.com  разрешено.</p><p>Пример кросс-доменного запроса: JavaScript фронтенд-код, загруженный с URL https://domain-a.com, использует метод fetch() для запроса JSON-файла с URL https://domain-b.com/data.json.</p><p>CORS поддерживает безопасные кросс-доменные запросы — это снижает риски при использовании fetch() и XMLHttpRequest. Однако CORS лишь управляет разрешёнными междоменными запросами, но не гарантирует безопасность.</p><h2>Включение CORS в ASP.Net Core приложении</h2><p>Чтобы добавить механизм CORS в ASP.NET приложение, нужно:</p><ol><li>Добавить сервисы CORS в контейнер сервисов приложения;</li><li>Включить промежуточное ПО CORS в конвейер обработки HTTP-запросов.</li></ol><p>В первом шаге необходимо вызвать метод расширения AddCors для интерфейса IServiceCollection. Он добавляет в контейнер две сущности: ICorsService и ICorsPolicyProvider.</p><p>Существует также перегруженная версия этого метода расширения, позволяющая сконфигурировать политику CORS:</p><p>Во втором шаге вызывается метод расширения UseCors определенного для интерфейса IApplicationBuilder.</p><p>Этот метод добавляет промежуточное ПО CorsMiddleware в конвейер обработки HTTP-запросов. Для UseCors есть также перегруженная версия:</p><p>Есть три способа подключения CORS:</p><ul><li>В ПО промежуточного слоя с помощью именованной политики или политики по умолчанию.</li><li>Использование маршрутизации конечных точек.</li><li>С атрибутом [EnableCors].</li></ul><p>[EnableCors] с именованной политикой обеспечивает лучший контроль в ограничении конечных точек, поддерживающих CORS.</p><h2>CORS с именованной политикой и ПО промежуточного слоя</h2><p>ПО промежуточного слоя CORS обрабатывает запросы между источниками. Следующий код применяет политику CORS ко всем эндпоинтам с указанными источниками:</p><p>Пример кода выше — часть Program.cs, показывающая инициализацию WebApplication. В ней объявляется константа политики CORS — MyAllowedOrigins. Далее вызывается AddCors, в который через параметры передается имя политики и набор адресов разрешенных источников. Ниже есть вызов метода расширения UseCors, в который передано то же самое имя политики CORS.</p><p>Важно:</p><ul><li>URL в настройках CORS не должны заканчиваться на '/', иначе заголовки не вернутся.</li><li>При использовании ПО промежуточного слоя кэширования ответов (ResponseCaching) UseCors должен вызываться перед UseResponseCaching.</li><li>При использовании Endpoints настройте CORS для выполнения между вызовами UseRouting и UseEndpoints.</li><li>Обычно UseStaticFiles вызывается раньше UseCors, но если JavaScript загружает файлы, UseCors следует вызвать раньше.</li></ul><h2>CORS с политикой по умолчанию и ПО промежуточного слоя</h2><p>Следующий выделенный код включает политику CORS по умолчанию:</p><p>Разница по сравнению с предыдущим фрагментом кода в том, что здесь явно не указывается имя политики CORS. Предполагается, что она будет единственной, в то время как в предыдущем примере можно объявить несколько политик CORS, каждую со своими настройками.</p><h3>Включение CORS с маршрутизацией конечных точек</h3><p>Когда используется вызов UseEndpoints, можно подключить политику CORS к каждой отдельно взятой конечной точке, при этом можно указать имя применяемой политики в методе RequireCors:</p><p>В предыдущем коде:</p><ul><li>app.UseCors включает ПО промежуточного слоя CORS. Политики CORS привязываются к конечным точкам внутри метода UseEndpoints.</li><li>Конечные /echo точки и точки контроллера разрешают запросы между источниками с помощью указанной политики – MyAllowSpecificOrigins, переданной в RequireCors.</li><li>Конечные /echo2 точки и Razor страницы не разрешают запросы между источниками, так как политика по умолчанию не указана.</li></ul><h3>Включение CORS с помощью атрибутов</h3><p>Атрибуты [EnableCors] позволяют подключить CORS только к конечным точкам, вместо глобальной настройки через промежуточное ПО. Плюс  [EnableCors] без параметров включает политику CORS по умолчанию, а [EnableCors("{cors_policy_name}")] — именованную политику.</p><p>Атрибут [EnableCors] можно применить к:</p><ul><li>Странице Razor Page;</li><li>Контроллеру целиком;</li><li>Методам действия контроллера (Action-methods).</li></ul><p>Если CORS включён одновременно через атрибут и промежуточное ПО, применяются обе политики.</p><p>Microsoft не рекомендует смешивать способы подключения CORS. Рекомендуется в одном приложении либо применять атрибуты [EnableCors], либо использовать ПО промежуточного слоя.</p><p>Вот пример, как применить специфическую политику к каждому экшн-методу контроллера:</p><p>Здесь показано, как создать две именованные политики CORS:</p><p>Чтобы обеспечить лучшее управление ограничением CORS-запросов, стоит:</p><ul><li>применять атрибуты [EnbleCors(“{policy_name}”)] с именованной политикой;</li><li>не объявлять CORS-политику по умолчанию;</li><li>не использовать маршрутизацию конечных точек.</li></ul><h2>Как запретить CORS</h2><p>Запретить CORS для отдельных экшн-методов контроллера можно с помощью атрибута [DisableCors].</p><p>Примечание: атрибут [DisableCors] не запрещает CORS, которая была подключена при помощи методов расширения RequireCors в настройках маршрутизации конечных точек.</p><p>Пример, как запретить CORS для экшн-метода GetValues2:</p><p>Обратите внимание, что политика CORS разрешена для всего контроллера, так как контроллер декорирован атрибутом [EnableCors(“MyPolicy”)], а экшн-метод GetValues2 — [DisableCors], значит, CORS-политика не будет применена к этому методу.</p><h2>Параметры политики CORS</h2><h3>Настройка разрешенных источников</h3><p>Есть два метода расширения для указания разрешенных источников:</p><ol><li>WithOrigins — позволяет указать список разрешенных источников;</li><li>AllowAnyOrigin — разрешает CORS-запросы к любым источникам.</li></ol><p>Они влияют на заголовок Access-Control-Allow-Origin предварительных запросов.</p><h3>Настройка разрешенных HTTP методов</h3><p>Для указания разрешенных HTTP-методов есть похожая на предыдущие пара методов:</p><ol><li>WithMethods — позволяет указать список разрешенных HTTP-методов;</li><li>AllowAnyMethod — разрешает использование любых HTTP-методов в CORS-запросах.</li></ol><p>Они тоже влияют на заголовок Access-Control-Allow-Methods preflight-запросов.</p><h3>Настройка разрешенных HTTP-заголовков</h3><p>Для указания разрешённых HTTP-заголовков используются:</p><ul><li>WithHeaders — задаёт список разрешённых заголовков,</li><li>AllowAnyHeader — разрешает любые заголовки.</li></ul><p>AllowAnyHeader влияет на preflight-запросы и заголовок Access-Control-Request-Headers. Если заголовок не разрешён в WithHeaders, запрос будет отклонён. Если сервер вернёт 200 OK, но без CORS-заголовков, браузер заблокирует cross-origin запрос.</p><h3>Настройка доступных заголовков ответов</h3><p>По умолчанию браузер не предоставляет все заголовки ответов приложениям. По умолчанию предоставляются только:</p><ul><li>Cache-Control</li><li>Content-Language</li><li>Content-Type</li><li>Expires</li><li>Last-Modified</li><li>Pragma</li></ul><p>В спецификации CORS эти заголовки называются simple response headers. Чтобы сделать другие заголовки доступными для приложения, вызовите метод расширения WithExposedHeaders, передав массив имен заголовков в качестве параметра:</p><h2>Передача учетных данных в запросах между источниками</h2><p>В CORS-запросах учетные данные нужно специально обрабатывать. Речь идет о cookie и схемах аутентификации HTTP. Чтобы отправить учетные данные в CORS-запросе, клиент должен выставить свойство XMLHttpRequest.withCredentials в значение true.</p><p>Пример использования XMLHttpRequest напрямую в коде JavaScript:</p><p>Пример использования Fetch API:</p><p>Сервер должен разрешить передачу учетных данных. Чтобы это сделать, вызовите метод расширения AllowCredentials:</p><p>В результате появится заголовок Access-Control-Allow-Credentials в ответе сервера, значит, он разрешил передачу данных. Если в ответе не будет этого заголовка, то браузер не предоставит ответ, и CORS-запрос завершится ошибкой.</p><p>Включение учетных данных в CORS-запросы — риск нарушения безопасности. Web-сайт из другого домена может отправить учетные данные аутентифицированного пользователя приложению от имени этого пользователя, но без его ведома.</p><p>Спецификация CORS также говорит, что при использовании заголовков Access-Control-Allow-Credentials нельзя применять вызов AllowAnyOrigin при создании политики CORS.</p><h2>Предварительные (preflight) запросы</h2><p>Для некоторых CORS-запросов браузер отправляет preflight-запрос с HTTP-методом OPTIONS перед отправкой самого CORS. Браузер может не отправлять предварительный запрос в этих случаях:</p><ul><li>HTTP-метод основного CORS-запроса один из GET, HEAD или POST;</li><li>Приложение не добавляет в запрос заголовки, кроме Accept, Accept-Language, Content-Language, Content-Type, Last-Event-ID;</li><li>Запрос содержит заголовок Content-Type, то у него должно быть одно из значений: application/x-www-form-urlencoded, multipart/form-data, text/plain</li></ul><p>Эти правила применяются к авторским заголовкам, которые задаются вызовом setRequestHeader объекта XMLHttpRequest. С User-Agent, Host, или Content-Length (заголовками браузера) так не работает.</p><p>У Preflight-запроса могут быть такие заголовки:</p><ul><li>Access-Control-Request-Method — HTTP-метод ( в основном CORS-запросе);</li><li>Access-Control-Request-Headers — набор заголовков, которые будут установлены приложением в основном запросе.</li></ul><p>Если предварительный запрос отклоняется сервером, то вылезет код 200 ОК, и браузер не будет пытаться отправлять CORS. При отладке в браузере (F12 tools) в консоли приложения появятся ошибки, если preflight-запрос отклонится сервером.</p><p>Чтобы разрешить передачу только определенных заголовков, вызывайте WithHeaders:</p><p>Чтобы разрешить передачу всех авторских заголовков, используйте вызов AllowAnyHeader.</p><h2>Автоматическая обработка предварительных запросов</h2><p>Если политика CORS применяется с помощью одного из приведенных ниже способов:</p><ul><li>глобально, с помощью вызова app.UseCors в модуле Program.cs;</li><li>с помощью атрибута [EnableCors],</li></ul><p>то ASP.NET будет автоматически обрабатывать запросы OPTIONS.</p><h3>Обработка предварительных запросов с помощью атрибута [HttpOptions]</h3><p>В ASP.NET предусмотрена возможность явного объявления методов для обработки предварительных запросов. Вот пример, как создать методы для обработки OPTIONS-запросов с [HttpOptions]:</p><h3>Установка срока действия ответов для предварительных запросов</h3><p>Браузер может закэшировать preflight-запросы, чтобы снизить нагрузку на сервер и сократить время обработки основных CORS-запросов. Чтобы ограничить срок хранения ответов в кэше, используйте заголовок Access-Control-Max-Age в ответе prefligh-запроса. Для этого при инициализации CORS-политики вызовите метод SetPreflightMaxAge:</p><p>CORS позволяет обращаться к ресурсам на других доменах, но требует аккуратной настройки, чтобы не сломать безопасность.</p><p>В примерах выше CORS-политики определялись в коде приложения, но в проде такой подход не всегда удобен. При переносе на другой хостинг или смене окружения настройки лучше вынести в конфигурацию сервера или прокси. Это упростит поддержку и адаптацию без правок в коде.</p><h3>Полезные ссылки</h3><p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">Cross-Origin Resource Sharing (CORS) - HTTP | MDN</a></p><p><a href="https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-9.0">Enable Cross-Origin Requests (CORS) in ASP.NET Core | Microsoft Learn</a></p><p>Больше про .NET — в нашем <a href="https://t.me/+L9Wi95tNHhs1MTIy">тг канале</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Часть 2: Как оптимизировать логирование в .NET: советы и примеры</title>
      <link>https://tproger.ru/articles/kak-optimizirovat-logirovanie-v--net--sovety-i-primery</link>
      <comments>https://tproger.ru/articles/kak-optimizirovat-logirovanie-v--net--sovety-i-primery?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Береговой]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-optimizirovat-logirovanie-v--net--sovety-i-primery</guid>
      <description><![CDATA[<p>Узнайте, как оптимизировать логирование в .NET на практике. Разбираем тесты производительности, сравниваем методы и показываем, как автоматизировать переход на эффективное логирование.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-optimizirovat-logirovanie-v--net--sovety-i-primery">Часть 2: Как оптимизировать логирование в .NET: советы и примеры</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Feb 2025 14:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Это продолжение нашей серии о логировании в .NET. <a href="https://tproger.ru/articles/pochemu-standartnoe-logirovanie-mozhet-tormozit--net-prilozheniya">В первой части</a> мы разобрали, как стандартные методы могут замедлять приложение, и познакомились с LoggerMessage. Теперь пора перейти к практике: мы покажем реальные тесты производительности и расскажем, как автоматизировать переход на эффективное логирование.</p><h2>Сравнение производительности: стандартное логирование против LoggerMessage</h2><p>Чтобы сравнить производительность LoggerMessage и методов расширения интерфейса, мы решили написать программу, подсчитывающую сумму четных элементов массива. Предварительно добавили несколько новых методов для записи дополнительных событий. Вот объявления для новых событий:</p><p>Обновленный код приложения:</p><p>Здесь строки вызова методов расширения ILogger закомментированы. А вызовы наших методов, построенных через механизм LoggerMessage, раскомментированы. Таким образом, можно прогнать программу, используя ILogger, либо, наоборот, LoggerMessage</p><p>При использовании механизма LoggerMessage затраты на выполнение методов логирования, которые мы вызывали в цикле (LogIterationStart и LogIterationComplete), составили <b>0,58%</b> и <b>0,52%</b> процессорного времени от общих затрат.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/e1164e87-c1a9-4e42-9847-a5d620953363.png" alt="" /></figure><p>При использовании методов расширения ILogger затраты на выполнение метода ILogger.LogInformation составили <b>35,12%</b><b></b> от общих затрат.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/a3f07e4f-0bf9-4df3-bf56-6f52b9d68277.png" alt="" /></figure><p>Да, можно заметить, что в затраты попали вызовы метода LoggerMessage.Define. Но заметим, что эти методы выполняются один раз на старте приложения. И если наше приложение серверное (долгоживущее), то затраты станут ничтожными по отношению к общим затратам за всё время жизни приложения.</p><p>При использовании же методов расширения ILogger затраты на выполнение будут расти, создавая нагрузку как на процессор, так и на память.</p><h2>AutoLoggerMessage: как легко перейти на высокопроизводительное логирование</h2><p>Мы рассмотрели два способа типизированных методов для ILogger. LoggerMessageAttribute упрощает процесс, но перевод готового проекта всё равно сложный.</p><p>К счастью, есть nuget-пакет, который умеет преобразовывать методы расширения ILogger.Log* из пространства имен Microsoft.Extensions.Logging в строго типизированные методы LoggerMessage.</p><p>Чтобы воспользоваться этим пакетом, нужно выполнить два простых шага:</p><p><b>Добавить в проект nuget-пакет stbychkov.AutoLoggerMessage</b></p><p>Это можно сделать либо через консоль с помощью инструмента Nuget package Manager, либо добавив ссылку на пакет в файл проекта.</p><p>Команда консоли Nuget Package Manager:</p><p>Install-Package stbychkov.AutoLoggerMessage</p><p>Добавление пакета с помощью утилиты dotnet:</p><p>dotnet add package stbychkov.AutoLoggerMessage</p><p><b>Разрешить перехватчики для генерации исходного кода</b></p><p>Для тестирования этого пакета мы создали отдельный проект консольного приложения и подключили в него указанный nuget-пакет. Далее добавили в модуль Program.cs пару строк с вызовами ILogger.LogInformation:</p><p>Если попытаться перейти к реализации метода LogInformation с помощью команды Go To Implementation, мы увидим, что попали не в метод расширения класса LoggerExtensions, а в строго типизированный метод в классе GenericLoggerExtensions:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/6f64462b-bed9-4e46-83cd-489887e518f7.png" alt="" /></figure><p>Для первого вызова, где передана только строка сообщения, будет вызван этот метод:</p><p>Для второго вызова, где передан параметр типа TimeSpan, будет вызван следующий метод:</p><p>Как видите, второй метод имеет обобщенный параметр.</p><p>Можно заметить, что внутри есть вызовы LoggerExtensions, которые не строго типизированы. Это нужно, поскольку во время компиляции вложенный вызов logger.Log должен быть заменен сгенерированным кодом, который в итоге будет вызывать подходящий строго типизированный метод расширения класса LoggerMessageExtensions.</p><p>Сборка проекта как в MS Visual Studio 2022, так и в <b>JetBrains Rider,</b> прошла без проблем. Так, если в <b>IDE Rider</b> запустить отладку проекта, предварительно поставив точку останова на вызове одного из методов logger.LogInformation(), то можно увидеть код, который будет вызван. Для этого выберите команду Step Into:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/b381b126-2726-4f1c-b771-6d1f9874372f.png" alt="" /></figure><p>Мы можем видеть, что дальше управление передается сгенерированному методу с типизированными параметрами:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/02872f1a-5598-4484-bbc9-dcb73c098fc0.png" alt="" /></figure><p>Этот код построен на LoggerMessage.Define – следующим шагом мы попадаем в один из методов расширения класса LoggerMessage:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/0f6d1cc7-39b0-4003-9c38-89b01a9a9cc3.png" alt="" /></figure><p>Таким образом, пакет AutoLoggerMessage позволяет перейти на высокопроизводительное логирование без ручного изменения исходного кода.</p><p>Правда, у AutoLoggerMessage есть ограничения:</p><ol><li>Поддерживается с .NET 8.0.8 и выше;</li><li>В ILogger.Log*() может быть не более 6 параметров, иначе параметры передаются как массив object, то есть вызывается упаковка значимых типов.</li></ol><h2>Какой подход к логированию выбрать</h2><p>Подводя итоги, приведем плюсы и минусы каждого подхода.</p><h3>ILogger и методы расширения Log*() класса LoggerExtensions</h3><p>+ Если используете ILogger из коробки, вам не нужно добавлять статический класс с объявлениями методов расширения.</p><p>- Так как дополнительные параметры передаются как object, то выполняется упаковка значимых типов.</p><p>- Разбор шаблонов сообщений выполняется при каждом вызове, что может увеличить нагрузку.</p><p>- Код загрязняется текстом шаблонов сообщений.</p><p>- Поскольку сообщения добавляются по мере необходимости прямо в код классов, то возможно дублирование сообщений.</p><h3>LoggerMessage и строго типизированные методы класса LoggerMessageExtensions</h3><p>+ Не загрязняют код шаблонами сообщений.</p><p>+ Методы расширений имеют строго типизированные параметры — это исключает упаковку значимых типов.</p><p>+ Шаблоны сообщений разбираются один раз во время старта приложения.</p><p>+ Все сообщения хранятся в одном статическом классе, которым проще управлять.</p><p>- Придется добавить статический класс и статический метод для каждого вновь добавляемого сообщения.</p><p>В целом, подход с LoggerMessage имеет больше преимуществ. А с пакетом AutoLoggerMessage можно легко перевести проекты на более производительное логирование.</p><p>Исходный код можно посмотреть на <a href="https://bitbucket.org/alexander-beregovoy/autologging/src/main/">bitbucket</a>. А узнать больше информации про .NET — в нашем <a href="https://t.me/+L9Wi95tNHhs1MTIy">канале</a>.</p><h2>Полезные ссылки</h2><p><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line">Logging in C# - .NET | Microsoft Learn</a></p><p><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/high-performance-logging#log-level-guarded-optimizations">High-performance logging - .NET | Microsoft Learn</a></p><p><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logger-message-generator?source=recommendations">Compile-time logging source generation - .NET | Microsoft Learn</a></p><p><a href="https://github.com/stbychkov/AutoLoggerMessage">AutoLoggerMessage</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Часть 1: Почему стандартное логирование может тормозить .NET-приложения</title>
      <link>https://tproger.ru/articles/pochemu-standartnoe-logirovanie-mozhet-tormozit--net-prilozheniya</link>
      <comments>https://tproger.ru/articles/pochemu-standartnoe-logirovanie-mozhet-tormozit--net-prilozheniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Береговой]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pochemu-standartnoe-logirovanie-mozhet-tormozit--net-prilozheniya</guid>
      <description><![CDATA[<p>Узнайте, как стандартное логирование в .NET может замедлять работу приложения. Разбираем основные проблемы, связанные с записью логов, и их влияние на производительность.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pochemu-standartnoe-logirovanie-mozhet-tormozit--net-prilozheniya">Часть 1: Почему стандартное логирование может тормозить .NET-приложения</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 11 Feb 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Логирование — один из ключевых инструментов для мониторинга и отладки .NET-приложений. Однако стандартные подходы к сбору и хранению логов могут незаметно снижать производительность системы. Избыточные записи в логах, блокирующие операции ввода-вывода, и неоптимальная работа с хранилищем данных — всё это может привести к задержкам и росту потребления ресурсов. В первой части нашей статьи разберём, какие проблемы могут возникнуть при стандартном логировании в .NET и почему бездумное использование логов способно замедлить работу приложения.</p><h2>Зачем нужно логирование</h2><p>Когда приложение уже в проде, а в нем что-то сломалось, подключиться отладчиком и просто пройтись по коду, чтобы разобраться в ошибке, не выйдет. В этом случае на помощь может прийти логирование — запись событий в журнал. Таким журналом могут быть:</p><ul><li>консоль,</li><li>обычный текстовый файл,</li><li>системный журнал операционной системы,</li><li>реляционная база данных,</li><li>специализированные средства, такие как Elastic.</li></ul><p>В .NET есть встроенная поддержка логирования, доступная в пространстве имен Microsoft.Extensions.Logging. О том, как инициализировать логирование, можно почитать в <a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line">документации</a>. Скажем лишь, что в результате мы можем получить экземпляр ILogger —  он предоставляет расширения, которые позволяют записывать события с различным уровнем серьезности (severity). Severity — атрибут, который определяет, насколько сильно дефект может повлиять на работу.</p><p>В высоконагруженных приложениях логирование может давать ощутимую нагрузку — как вычислительную, так и в части потребления памяти. Это происходит по следующим причинам:</p><ul><li>Методы расширения ILogger выполняют упаковку (boxing) значимых типов для преобразования их в object. Это верно для bool, int и др.;</li><li>Методы расширения ILogger выполняют разбор (parsing) шаблона сообщения каждый раз, когда вызывается соответствующий метод расширения.</li></ul><h3>Как работает высокопроизводительное логирование</h3><p>Microsoft предлагает другой механизм записи сообщений в журнал — с помощью LoggerMessage. Этот класс позволяет избежать следующих проблем:</p><ul><li><b>Проблема упаковки</b> (boxing). Решается за счет перегруженных методов с обобщенными параметрами.</li><li><b>Проблема разбора шаблона сообщения.</b> Решается так: разбор производится один раз в момент объявления специфического метода для записи сообщения.</li></ul><p>Ниже покажем, как использовать LoggerMessage в приложении, и сравним его производительность с методами расширения ILogger из LoggerExtensions и типизированными методами из LoggerMessageExtensions.</p><p>Для начала создадим новый проект типа Console Application. Будем использовать фреймворк .Net9.</p><p>После создания проекта нам нужно подключить следующие nuget-пакеты:</p><p>Далее инстанцируем в приложении экземпляр ILogger:</p><p>При использовании LoggerMessage для каждого типа события нам нужно создать отдельный метод логирования. Для начала — написать статический класс, который будет выступать хранилищем (реестром сообщений). Добавим LoggerExtensions:</p><p>Добавим метод для логирования старта приложения, сохраняя имя хоста. Метод должен соответствовать следующему делегату:</p><p>Где:</p><ul><li>T1..T6 —  обобщенные типы параметров, которые мы можем передать во время записи сообщения в журнал;</li><li>logLevel — уровень логирования (степень серьезности) события;</li><li>eventid — уникальный идентификатор события;</li><li>formatString — шаблон сообщения.</li></ul><p>В классе LoggerExtensions для каждого лог-сообщения объявляем Action-делегат в приватном статическом поле. Экземпляр этого делегата инициализируем через LoggerMessage.Define в конструкторе — для его вызова нужно определить public-метод. Код для метода LogApplicationStart:</p><h2>Как работает LoggerMessage.Define T</h2><p>Давайте разберемся немного глубже и посмотрим, что же делает метод Define. Код метода для одного обобщенного параметра приведен ниже:</p><p>В первой строке метод CreateLogValuesFormatter разбирает шаблон сообщения и проверяет соответствие количества плейсхолдеров числу обобщённых параметров Define. Если не совпадает — возбуждается исключение.</p><p>Локальная функция Log вызывает ILogger.Log и записывает сообщение в журнал.</p><p>Ниже идет проверка флага SkipEnabledCheck:</p><ul><li>Если true, сообщение записывается без учёта объявленного уровня логирования.</li><li>Если false (или options не предоставлен), сначала проверяется уровень логирования. Если наше событие объявлено с уровнем, подлежащим записи, то будет произведен вызов функции Log.</li></ul><p>Выводы:</p><ol><li>Результат метода, делегат Action, мы сохраняем в приватном статическом поле. То есть Define выполнится лишь один раз за время жизни приложения. То же самое и с разбором шаблона каждого сообщения.</li><li>Делегат проверяет уровень логирования, исключая ненужные вызовы ILogger.Log — это повышает производительность.</li><li>Наличие параметров Define и делегатов Action позволяет избежать упаковки значимых типов — это снижает нагрузку на память и процессор.</li></ol><p>Добавим вызов этого метода в наше приложение:</p><p>Если запустить, то в консоли мы увидим такой вывод:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/fdfdb0e8-6e51-4f4d-b721-c3549e2ce59b.png" alt="" /></figure><p>Добавим сообщение, которые говорит об окончании работы приложения. В качестве параметра выводим в лог время выполнения. Вот основные изменения в LoggerExtensions:</p><p>Выше добавили еще одно приватное поле, public-метод и код инициализации делегата.</p><p>Вот обновленный код приложения:</p><p>Вывод будет такой:</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-01-30/09e9b56e-d2bf-4730-bd92-94a0cbb78b59.png" alt="" /></figure><p>Резюмируем, что нужно сделать с LoggerMessage для каждого события:</p><ul><li>Добавить в статический класс приватное поле для сохранения ссылки на делегат.</li><li>Определить публичный метод расширения.</li><li>Добавить инициализацию делегата в конструктор статического класса.</li></ul><p>Это кажется сложнее, чем обычные методы ILogger. К счастью, есть LoggerMessageAttribute, который позволяет уменьшить объем работы.</p><h2>Как упростить переход на высокопроизводительное логирование в .NET</h2><p>С LoggerMessageAttribute, для объявления метода расширения, нужно сделать следующее:</p><ul><li>Пометить класс с методами расширения директивой partial — объявить класс частичным;</li><li>Объявить публичный метод расширения — тоже частичный;</li><li>Декорировать этот метод атрибутом LoggerMessageAttribute.</li></ul><p>Это приведет к тому, что во время компиляции сработает механизм перехватчика, который сгенерирует весь необходимый код за нас. Вот обновленный код класса LoggerExtensions:</p><p>До момента компиляции Visual Studio будет показывать, что в коде есть ошибки — нужно дописать тела объявленных методов. Не пугайтесь: просто выполните сборку проекта и ошибки уйдут.</p><p>Что же делает этот атрибут? Давайте посмотрим на сгенерированный код:</p><p>Для каждого частичного метода будет сгенерировано:</p><ul><li>Приватное поле для хранения ссылки на делегат. Имя поля начинается с двойного символа underscore(_), в этом случае  называется __LogApplicationFinishCallback,</li><li>Код инициализации делегата,</li><li>Тело метода расширения.</li></ul><p>Метод проверяет уровень логирования: если событие уровня Debug, а минимальный уровень — Information, делегат не вызывается. Это улучшает производительность. А LoggerMessageAttribute упрощает создание методов расширения, снижая трудозатраты.</p><p><a href="https://tproger.ru/articles/kak-optimizirovat-logirovanie-v--net--sovety-i-primery">В следующей статье</a> мы сравним производительность стандартного логирования и LoggerMessage на реальных примерах, а также покажем, как легко оптимизировать код с помощью AutoLoggerMessage. Не переключайтесь!</p><p>А если хотите больше узнать про .NET, сразу переходите в наш <a href="https://t.me/+L9Wi95tNHhs1MTIy">Telegram канал</a>, это точно ускорит время ожидания!</p>]]></content:encoded>
    </item>
    <item>
      <title>Безумное улучшение производительности в LINQ .NET 9</title>
      <link>https://tproger.ru/articles/bezumnoe-uluchwenie-proizvoditelnosti-v-linq--net-9</link>
      <comments>https://tproger.ru/articles/bezumnoe-uluchwenie-proizvoditelnosti-v-linq--net-9?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ponomareff]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/bezumnoe-uluchwenie-proizvoditelnosti-v-linq--net-9</guid>
      <description><![CDATA[<p>С каждым новым релизом .NET производительность и функциональность LINQ (Language Integrated Query) становятся всё лучше. .NET 9 принёс множество оптимизаций, направленных на повышение эффективности работы LINQ, улучшение управления памятью и внедрение новых возможностей для работы с асинхронными запросами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/bezumnoe-uluchwenie-proizvoditelnosti-v-linq--net-9">Безумное улучшение производительности в LINQ .NET 9</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Oct 2024 13:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>С каждым новым релизом .NET производительность и функциональность LINQ (Language Integrated Query) становятся всё лучше. .NET 9 принёс множество оптимизаций, направленных на повышение эффективности работы LINQ, улучшение управления памятью и внедрение новых возможностей для работы с асинхронными запросами. В этой статье мы рассмотрим основные улучшения LINQ в .NET 9, а также приведем примеры кода и бенчмарки для демонстрации прироста производительности.</p><h2>Основные улучшения LINQ в .NET 9</h2><h3>1. Улучшенная поддержка Span и Memory</h3><p>LINQ теперь лучше поддерживает типы Span и Memory. Использование Span позволяет избежать лишних аллокаций и улучшить доступ к памяти напрямую, что делает LINQ-запросы более быстрыми и эффективными.</p><h3>2. Оптимизированные итераторы</h3><p>LINQ-запросы теперь используют улучшенные итераторы, которые минимизируют накладные расходы при выполнении таких операций, как фильтрация (Where), проекция (Select) и сортировка (OrderBy). Эти высокопроизводительные версии уменьшают количество промежуточных объектов и увеличивают скорость выполнения запросов.</p><h3>3. Минимизация выделений памяти</h3><p>В .NET 9 LINQ реже вызывает выделения в управляемой куче за счет активного использования значимых типов (value types). Это сокращает нагрузку на сборщик мусора и ускоряет выполнение запросов, особенно при работе с большими объёмами данных.</p><h3>4. Улучшенные методы для работы с коллекциями</h3><p>В .NET 9 появились новые оптимизированные методы для работы с коллекциями. Например, теперь можно использовать операции для извлечения элементов в коллекциях напрямую без создания временных объектов, что значительно повышает производительность.</p><h3>5. Улучшенная поддержка асинхронных операций</h3><p>.NET 9 улучшил работу LINQ с асинхронными операциями, внедрив поддержку ValueTask вместо Task, что уменьшает накладные расходы при выполнении асинхронных запросов и снижает выделения памяти.</p><p>Использование ValueTask позволяет избежать создания избыточных объектов Task, что особенно важно при частых и многократных асинхронных вызовах.</p><p>Пример кода с приростом производительности на 300-500%:</p><p>В некоторых случаях LINQ в .NET 9 демонстрирует прирост производительности до 300-500% за счёт оптимизаций итераторов и снижения аллокаций памяти. Рассмотрим пример:</p><p>Бенчмарк производительности:</p><p>Результаты:</p><p>Версия Время выполнения (ms) Аллокации (B).NET 8550100,000.NET 915030,000</p><p>В этом примере .NET 9 показывает прирост производительности более чем в 3 раза благодаря оптимизации работы с памятью и снижению количества временных объектов.</p><h3>6. Адаптация под современные процессоры</h3><p>.NET 9 также включает оптимизации, адаптированные для работы на современных многоядерных процессорах, что позволяет параллельным запросам LINQ более эффективно использовать ресурсы системы. Например, метод AsParallel теперь выполняется быстрее за счёт улучшений в планировщике задач и лучшего распределения нагрузки между ядрами процессора.</p><h3>7. Улучшенные агрегации и группировки</h3><p>Методы агрегации и группировки, такие как GroupBy, Aggregate и Sum, были оптимизированы для работы с большими наборами данных. Эти методы теперь быстрее выполняются и используют меньше памяти при работе с коллекциями, что особенно полезно для аналитических запросов.</p><h2>Заключение</h2><p>.NET 9 принёс множество улучшений в LINQ, которые позволяют значительно повысить производительность и снизить нагрузку на память при работе с большими коллекциями данных. Оптимизированная поддержка типов Span и   Memory, улучшенные итераторы и новые методы для работы с коллекциями делают LINQ в .NET 9 мощным инструментом для обработки данных.</p><p>Для разработчиков это означает создание более быстрых и эффективных приложений, которые могут легко справляться с большими объёмами данных и асинхронными операциями с минимальными затратами на память и процессор.</p>]]></content:encoded>
    </item>
    <item>
      <title>Энтузиаст разобрался, как устроены паники в Rust «под капотом» и имплементировал их в .NET</title>
      <link>https://tproger.ru/news/--entuziast-razobralsya--kak-ustroeny-paniki-v-rust--pod-kapotom--i-implementirovat-ih-v--net</link>
      <comments>https://tproger.ru/news/--entuziast-razobralsya--kak-ustroeny-paniki-v-rust--pod-kapotom--i-implementirovat-ih-v--net?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--entuziast-razobralsya--kak-ustroeny-paniki-v-rust--pod-kapotom--i-implementirovat-ih-v--net</guid>
      <description><![CDATA[<p>Разработчик-энтузиаст подробно изучил механизм паник в Rust и успешно перенес его в .NET, используя статические конструкторы и исключения</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--entuziast-razobralsya--kak-ustroeny-paniki-v-rust--pod-kapotom--i-implementirovat-ih-v--net">Энтузиаст разобрался, как устроены паники в Rust «под капотом» и имплементировал их в .NET</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Sep 2024 07:21:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик-энтузиаст, работающий над переносом Rust на .NET, подробно <a href="https://fractalfir.github.io/generated_html/rustc_codegen_clr_v0_2_1.html">разобрал</a> механизм паник в Rust и реализовал их через .NET-исключения.</p><h2>Что такое паника в Rust?</h2><p>Паника в Rust — это механизм для обработки критических ошибок, приводящих к завершению программы.</p><p>Важно, что она не является исключением в привычном понимании, как в других языках, а скорее приводит к «размотке стека» (unwinding) или немедленному завершению программы (abort).</p><h2>Пример паники в Rust</h2><p>Этот код вызывает панику из-за попытки доступа к несуществующему элементу массива. Rust завершит программу, выбросив ошибку.</p><h2>Как это перенести в .NET?</h2><p>Для переноса паник в .NET разработчику пришлось столкнуться с рядом проблем. Основной вызов — корректная интеграция механизма паник в среду .NET, которая работает с исключениями.</p><p>Используя возможности платформы, такие как статические конструкторы (.cctor), разработчик смог создать аналог паник через механизм исключений.</p><p>Эта структура позволяет коду правильно взаимодействовать с .NET, вызывая обработку ошибок так, как это делал бы стандартный механизм паник в Rust.</p><h2>Почему это важно?</h2><p>Корректная работа паник в .NET важна для поддержки безопасности и надежности программ.</p><p>В Rust паники предотвращают некорректное поведение программы, а в .NET такой подход помогает адаптировать логику под экосистему другого языка, сохраняя ключевые принципы — безопасность памяти и управляемое завершение программы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft передала исходный код Mono разработчикам Wine</title>
      <link>https://tproger.ru/news/microsoft-peredala-ishodnyj-kod-mono-razrabotchikam-wine</link>
      <comments>https://tproger.ru/news/microsoft-peredala-ishodnyj-kod-mono-razrabotchikam-wine?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-peredala-ishodnyj-kod-mono-razrabotchikam-wine</guid>
      <description><![CDATA[<p>Microsoft передала исходный код проекта Mono разработчикам Wine, чтобы поддержать и сохранить развитие кроссплатформенного .NET. Проект Mono, запущенный в 2001 году, сыграл важную роль в создании кроссплатформенных приложений</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-peredala-ishodnyj-kod-mono-razrabotchikam-wine">Microsoft передала исходный код Mono разработчикам Wine</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 28 Aug 2024 02:30:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft <a href="https://www.mono-project.com/">приняла решение</a> передать исходный код проекта Mono разработчикам Wine.</p><p><b>Mono —</b> это открытая платформа для создания кроссплатформенных приложений, которая реализует .NET Framework на базе стандартов ECMA для C# и Common Language Runtime.</p><h2>История и значимость Mono</h2><p>Проект Mono был запущен в 2001 году и с тех пор сыграл важную роль в развитии экосистемы .NET.</p><p>После приобретения Xamarin в 2016-м, Microsoft взяла на себя управление проектом. Последний крупный релиз Mono вышел в июле 2019-го, а последнее обновление — в феврале 2024-го. Однако, со временем развитие проекта замедлилось.</p><h2>Передача проекта WineHQ</h2><p>Джефф Шварц из Microsoft сообщил на сайте Mono и на GitHub, что теперь управление проектом переходит к организации WineHQ.</p><p>Исходный код будет размещен на новой платформе, а существующие репозитории будут сохранены в архиве и останутся доступными для пользователей. Бинарные файлы также будут доступны в течение следующих 4 лет.</p><p>Microsoft также отметила, что завершила перенос всех рабочих нагрузок на современную ветку Mono в репозитории dotnet/runtime и рекомендует пользователям переходить на .NET, который включает эти разработки.</p><h2>Признание заслуг Mono</h2><p>В своём сообщении, Microsoft выразила благодарность всем разработчикам, которые трудились над Mono.</p><p>Компания подчеркнула, что Mono стал первым решением .NET для Android, iOS, Linux и других операционных систем, сделав кроссплатформенный .NET реальностью. Передача проекта WineHQ — это не только способ сохранить наследие Mono, но и признание важности работы команды Wine.</p><p>Подобное сотрудничество, по словам представителей Microsoft, откроет новые возможности для развития открытого программного обеспечения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Нюансы XML и бинарной сериализации в .Net</title>
      <link>https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net</link>
      <comments>https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Azizkhon Ishankhonov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net</guid>
      <description><![CDATA[<p>Статья объясняет, почему XML-сериализация игнорирует приватные члены. Также рассматриваются различия между XML и бинарной сериализацией</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net">Нюансы XML и бинарной сериализации в .Net</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 21 Aug 2024 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Почему при XML-сериализации не сериализуются приватные члены</h3><p>XML-сериализация — это мощный инструмент, используемый для преобразования объектов в XML-формат, который легко читается и редактируется человеком. Однако одним из ключевых аспектов этой технологии является то, что при XML-сериализации приватные члены класса не включаются в результирующий XML-документ. Это решение имеет свою логику и обусловлено несколькими важными факторами.</p><p><b>Безопасность данных</b></p><p>Одной из основных причин, по которой приватные члены не сериализуются, является безопасность данных. Приватные члены класса предназначены для внутреннего использования и должны быть защищены от внешнего вмешательства. Если бы XML-сериализация включала приватные члены, то любой мог бы получить доступ к этим данным, просто изменив XML-файл. Это создаёт потенциальные риски, такие как подмена значений или манипуляция данными, что может повлечь за собой серьёзные проблемы с безопасностью.</p><p><b>Целостность и корректность данных</b></p><p>Приватные члены часто содержат информацию, которая не предназначена для общего доступа, и её изменение может нарушить целостность объекта. При XML-сериализации важно сохранять только те данные, которые действительно нужны для обмена или хранения в формате XML. Включение приватных данных в XML-файл могло бы привести к нарушению инвариантов объекта или его внутреннего состояния.</p><p><b>Проектирование API</b></p><p>XML сериализация ориентирована на сериализацию состояния объекта в формат, понятный для внешнего мира. Приватные члены не предназначены для такого использования, и их отсутствие в XML-документе способствует более ясному и безопасному взаимодействию с объектами. Таким образом, XML-сериализация ориентируется на публичные данные, которые являются частью API и предназначены для использования за пределами класса.</p><h3>Асимметрия между XML и бинарной сериализацией</h3><p>Сериализация объектов — это процесс преобразования объектов в формат, который можно сохранить или передать, и существует множество методов для этого, включая XML и бинарную сериализацию. Эти два метода обладают определёнными различиями, которые можно объяснить их назначением и особенностями.</p><p><b>Разные цели</b></p><p>XML и бинарная сериализация были разработаны для решения разных задач. Бинарная сериализация предназначена для сохранения сложных графов объектов .NET с полной информацией о них. Она сохраняет все детали состояния объекта, включая приватные члены и типы данных. XML-сериализация, с другой стороны, используется для поддержки протокола SOAP и обмена данными в формате, который легко читаем и понятен человеку. Она ориентирована на сохранение данных в открытом формате, который может быть прочитан и проверен без необходимости специализированных инструментов.</p><p><b>Приватные члены и безопасность</b></p><p>Как уже упоминалось, XML-сериализация игнорирует приватные члены для обеспечения безопасности и целостности данных. Бинарная сериализация, напротив, сохраняет все данные объекта, включая приватные члены. Поэтому для бинарной сериализации требуется дополнительная настройка, чтобы контролировать, какие данные сохраняются, и для этого используются атрибуты, такие как `[NonSerialized]`, для исключения определённых полей из сериализации.</p><p><i>Пример класса с приватными членами:</i></p><figure><img src="https://media.tproger.ru/user-uploads/99933/2024-08-12/f95b1936-ea13-42b9-9ec8-e2fd68a8a2d1.png" alt="" /><figcaption>Бинарный вид переменной school</figcaption></figure><p><b>Циклические ссылки</b></p><p>В бинарной сериализации проблематика циклических ссылок решается путем проверки и недопущения дублирования сериализованных объектов. Это предотвращает бесконечные циклы и избыточность данных. XML-сериализация, в свою очередь, сталкивается с трудностями при представлении циклических ссылок в XML-документе. Поскольку XML-файлы предназначены для представления данных в текстовом формате, сложные графы объектов с циклическими ссылками требуют дополнительной обработки и представления.</p><p><i>Пример класса с циклической ссылкой:</i></p><p><b>Указание типа данных</b></p><p>Бинарная сериализация хранит метаданные о типах данных и структуре объектов, что может создавать проблемы совместимости при изменении версий. XML-сериализация, в отличие от бинарной, не требует указания типа данных при создании форматтера, что позволяет работать с данными независимо от конкретной реализации и версии .NET. XML-файлы могут быть использованы для обмена данными между различными системами, не привязанными к платформе .NET.</p><p>В заключение, асимметрия между XML и бинарной сериализацией обусловлена их различными назначениями и особенностями. XML-сериализация фокусируется на удобстве обмена данными в формате, понятном человеку, тогда как бинарная сериализация предназначена для сохранения полной информации о состоянии объекта .NET.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как использовать C# для сжатия размера PDF-документов</title>
      <link>https://tproger.ru/articles/kak-ispolzovat-c-dlya-szhatiya-razmera-pdf-dokumentov</link>
      <comments>https://tproger.ru/articles/kak-ispolzovat-c-dlya-szhatiya-razmera-pdf-dokumentov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Неопознанный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-ispolzovat-c-dlya-szhatiya-razmera-pdf-dokumentov</guid>
      <description><![CDATA[<p>Рассказываем, как сжать размер документа в PDF-формате при помощи скрипта на языке программирования C# с Spire.PDF for .NET.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-ispolzovat-c-dlya-szhatiya-razmera-pdf-dokumentov">Как использовать C# для сжатия размера PDF-документов</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 13 Jun 2023 11:06:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Документы<br />PDF являются очень распространенным форматом файлов, но они часто имеют больший<br />размер, чем другие форматы файлов. Это может вызвать проблемы, например, при<br />пересылке PDF-документов по электронной почте они могут долго загружаться или<br />скачиваться. Чтобы решить эту проблему, мы можем использовать<b> </b>Spire.PDF for .NET.</p><h2>Установка Spire.PDF for .NET</h2><p>Чтобы<br />использовать Spire.PDF for .NET, нам нужно сначала установить его. Самый<br />простой способ сделать это – установить его через NuGet. В Visual Studio мы<br />можем открыть менеджер пакетов NuGet и найти Spire.PDF. Затем мы можем выбрать<br />установку Spire.PDF for .NET.</p><h2>C# для сжатия PDF-документов</h2><p>После<br />установки Spire.PDF for .NET мы можем приступить к сжатию PDF-документа. Ниже<br />приведен простой пример кода:</p><p>Сначала<br />код загружает PDF-документ и инициализирует объект PdfCompressor путем к файлу<br />PDF. Затем он обращается к опции сжатия текста и устанавливает свойство<br />‘CompressFonts’ в true, что означает, что шрифты, используемые в PDF, будут<br />сжаты.</p><p>Далее<br />код обращается к опциям сжатия изображений и устанавливает свойство<br />‘ImageQuality’ в значение high, что означает, что качество изображения в PDF<br />останется на высоком уровне даже после сжатия. Он также устанавливает свойства<br />‘ResizeImages’ и ‘CompressImage’ в true, что означает, что изображения,<br />используемые в PDF, будут изменены по размеру и сжаты соответственно.</p><p>Наконец,<br />используйте метод ‘CompressToFile’ объекта PdfCompressor, чтобы сохранить<br />сжатый PDF в новый файл.</p><h2>Другие возможности</h2><p>Помимо<br />сжатия PDF-документов, Spire.PDF for .NET поддерживает множество других<br />функций. Например, с его помощью мы можем</p><p>– <a href="https://www.e-iceblue.com/Tutorials/NET/Spire.PDF-for-.NET/Program-Guide/Document-Operation/C-/VB.NET-Create-a-PDF-Document.html">C#Создавать PDF-документы</a></p><p>– <a href="https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/How-to-Create-a-PDF-Document-and-Insert-an-Image.html">C#Добавлять текст, изображения и таблицы</a></p><p>– <a href="https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/How-to-Extract-Text-from-PDF-Document-with-C-/VB.NET.html">C#Извлекать текст и изображения</a></p><p>– <a href="https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/How-to-Extract-Text-from-PDF-Document-with-C-/VB.NET.html">C#Шифровать и расшифровывать PDF-документы</a></p><h2>Резюме</h2><p>В<br />этой статье мы сначала познакомились с основой и проблемами сжатия<br />PDF-документов, затем описали, как установить Spire.PDF for .NET. Наконец, мы<br />также описали другие функции, поддерживаемые Spire.PDF for .NET. Мы надеемся,<br />что эта статья будет вам полезна!</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем тесты с временем в .NET 8+</title>
      <link>https://tproger.ru/articles/piwem-testy-s-vremenem-v-net-8</link>
      <comments>https://tproger.ru/articles/piwem-testy-s-vremenem-v-net-8?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Artur Ampilogov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/piwem-testy-s-vremenem-v-net-8</guid>
      <description><![CDATA[<p>Рассказываем, как тестировать на .NET 8 с использованием временных абстракций в виде TimeProvider и ITimer.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/piwem-testy-s-vremenem-v-net-8">Пишем тесты с временем в .NET 8+</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 May 2023 12:10:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>В .NET 8 представили абстракции улучшающие работу со временем.</p><h2>Немного истории</h2><h3>DateTime</h3><p>Основной структурой хранения даты и времени является <a href="https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=netframework-1.1">DateTime</a>, которая появилась в одном из первых релизов .NET — версии 1.1.</p><p>У структуры стуществует главный недостаток — отсутсвие временной зоны. Для обхода такого неприятного момента к DateTime добавили поле Kind со значениями: Local, Utc, или Unspecified. Так, можно получить местное время вызвав DateTime.Now, где Kind будет равен Local. А для перевода в UTC можно воспользоваться вызовом DateTime.Now.ToUniversalTime(), или что более просто, сразу вернуть DateTime.UtcNow.</p><p>Как же .NET понимает временную зону при переводе из местного времени в UTC? Метод <a href="https://referencesource.microsoft.com/#mscorlib/system/datetime.cs,fddce8be2da82dfc">ToUniversalTime</a> берет временную зону из операционной системы. Тогда, если создать на сервере Нью-Йорка экземпляр DateTime.Now, отправить его в Лондон, а потом на обеих машинах вызвать перевод в UTC, то результат будет разным.</p><p>В Microsoft выпустили <a href="https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/ms973825(v=msdn.10)?redirectedfrom=MSDN#the-rules">рекомендацию</a> по этому поводу, переложив всю ответственность на разработчиков:</p><blockquote>Разработчик несет ответственность за отслеживание информации о часовом поясе, связанной со значением DateTime через внешние механизмы.</blockquote><p>Иными словами сам разработчик должен хранить информацию о часовом поясе, дополнительно к DateTime.</p><p>Альтернативным решением может быть хранение времени только в формате UTC, и последующая конвертация к местному времени на стороне пользователя. К сожалению, это требует дополнительных проверок кода против случайного использования DateTime с локальным временем, а также не исключает таких нюансов, как изменения правил перехода на зимнее время.</p><h3>DateTimeOffset</h3><p>В качестве улучшения в .NET 2 появилась структура <a href="https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset?view=netframework-2.0">DateTimeOffset</a>, которая состоит из:</p><ul><li>структуры DateTime, и</li><li>свойства .Offset — разницы во времени по отношению к UTC.</li></ul><p>Описанной проблемы с серверами в разных временных зонах с DateTimeOffset.Now уже не произойдет.</p><p>Но и это не панацея от всех случаев. Допустим в Лондоне для пользователя необходимо сохранить запись к врачу на апрель. Добавляем запись c TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"), и .NET корректно посчитает время DateTimeOffset = 2023-04-01 14:00:00 с Offset = +1. В конце марта в Британии происходит переход на летнее время и к Offset добавляется +1 час, в а в началае марте Offset = 0. В некторых странах нет перехода на летнее время, например, в Нигерии Offset всегда равен +1. Вроде никаких проблем, но иногда правила перехода меняются, как это было недавно в Европейском союзе. Получается, для клиентов желательно хранить и зону времени с помощью типа TimeZoneInfo для возможного перерасчета Offset по новым правилам.</p><h2>Тестирование до .NET 8</h2><p>Для Unit тестирования важно иметь возможность заменить вызов функции у объекта на свой собственный. Для этого используются Mock’и или Stub’и над абстракциями. Так как DateTime и DateTimeOffset не предоставляют инетерфейсов, то можно создать свой, передавать его тип в качестве аргумента функциям, и далее делать Mock’и при тестировании. Например, можно создать такой:</p><p>Аналогичную работу сделали в Microsoft, добавив тот же самый код по меньшей мере в <a href="https://github.com/dotnet/aspnetcore/issues/16844">4 разные области .NET</a>.</p><h3>Какие еще есть решения</h3><p>Jon Skeet создал библиотеку <a href="https://github.com/nodatime/nodatime">NodaTime</a> с правильным расчетом времени в самых тонких моментах, и конечно, с поддержкой абстракций.</p><p>Хорошо, используем свою или стороннюю абстракцию над временем .NET. А как же проводить интеграционные тесты с внешними библиотеками, которые все еще требуют передачи данных типа DateTime / DateTimeOffset?</p><p>В Microsoft существует инструмент под названием <a href="https://learn.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2019&amp;tabs=csharp">.NET Fakes</a>. Он генерирует Fake’и для любой .NET библиотеки. Например, можно перезаписать статический вызов DateTime.Now в тестах:</p><p>Работает, но есть ограничения. Первое, генератор совместим только с Windows. Второе, генератор включен только в дорогую версию Visual Studio Enterpise. Так, несколько лет назад одной крупной компании пришлось купить лицензию Enterpise всей команде разработчиков и авто-тестировщиков только для покрытия кода тестами с использованием .NET Fakes. Больше никаких возможностей из обширного набора Enterprise версии не использовалось. Браво отделу продаж Microsoft!</p><h2>Тестируем с .NET 8</h2><p>После многолетних дебатов и сотней комментариев в .NET 8 RC <a href="https://github.com/dotnet/core/issues/8234#issuecomment-1530525108">добавили </a>долгожданные абстракции времени в виде TimeProvider и ITimer:</p><blockquote>В конце концов, мы ожидаем, что почти никто не будет использовать что-либо кроме TimeProvider.System в эксплуатации. В отличие от многих абстракций, эта особенная: она существует исключительно для тестируемости.</blockquote><p>Получилось все же не идеально, но и это большой прогресс.</p><h3>Ложки дегтя</h3><p>1. Абстрактный класс вышел громоздким. Если у вас есть метод принимающий в качестве аргумента TimeProvider, без знания деталей метода нет возможности понять нужно ли делать Mock для GetUtcNow() или GetLocalNow(), или даже CreateTimer(...) при тестировании. Что же в итоге будет вызвано? Разработчики предлагали разбить новый тип на небольшие интерфейсы, в частности аналогичный уже используемому внутри самого .NET:</p><p>Но от этой идеи в Microsoft отказались. Причина: идея хранения связанной логики времени в одном месте, даже если испоьзуются только ее небольшие части.</p><p>2. Добавили статическое свойство TimeProvider.System, которое возвращает системный экземпляр TimeProvider.</p><p>Пользователям очень легко использовать такой код, но это ничем не отличается от старого применения статического DateTime.Now. И так просто без FakeTimeProvider протестировать код не получится.</p><p>Вместо прямого вызова статического экземпляра, ожидается что программисты будут сразу использовать Dipendency Injection:</p><p>и далее в ASP.NET Core:</p><p>Для новичков это может быть совсем не тривиально.</p><h3>Хорошие новости</h3><p>1. Тестирование времени становится более универсальным. Например, можно сделать Mock метода TimeProvider.GetUtcNow:</p><p>2. Команда Mircosoft не стала привносить старую ошибку когда для сторонних эффектов использовались <a href="https://github.com/dotnet/runtime/issues/36617#issuecomment-1489501068">свойства вместо функций</a>. Так ошибочно реализованы DateTime.Now. При обработке времени TimeProvider использует только методы: GetUtcNow(), GetLocalNow(), GetTimestamp(), и т.д.</p><p>3. Добавили возможность тестировать события таймера через TimeProvider.CreateTimer(...) и ITimer.Change(...). Особенно это актуально для функций Task.Delay(...) и Task.WaitAsync(...), которые также перевели на использование нового TimeProvider. Разработчики сторонних библиотек хорошо приветствовали на эту новость.</p><p>4. Обещают сделать встроенный в .NET класс FakeTimeProvider для еще большего упрощения тестирования. Тогда возможно отрицательный пункт 2 не будет актуален.</p><h2>Выводы</h2><p>Новый класс TimeProvider предоставляет унифицированную абстракцию времени с возможностью тестирования в экосистеме .NET, пусть и с некоторыми недостатками. Разработчики Microsoft пометили свои предыдущие наработки как <a href="https://source.dot.net/#Microsoft.AspNetCore.Authentication/ISystemClock.cs,20a0094ab224bdde">устаревшие</a>, и рекомендуют переводить код на TimeProvider.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что скрывают привычные коллекции .Net Core — List</title>
      <link>https://tproger.ru/articles/chto-skryvajut-privychnye-kollekcii-net-core-list</link>
      <comments>https://tproger.ru/articles/chto-skryvajut-privychnye-kollekcii-net-core-list?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Юлия Волощенко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-skryvajut-privychnye-kollekcii-net-core-list</guid>
      <description><![CDATA[<p>Секреты работы коллекции .Net List из пространства System.Collections.Generic. Разработчики используют их, но не знают, как они устроены.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-skryvajut-privychnye-kollekcii-net-core-list">Что скрывают привычные коллекции .Net Core — List</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Apr 2022 10:50:08 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Зачем вообще иметь представление о работе этих коллекций и их особенностях:</b></p><ul><li>знание нюансов позволит более осознанно выбирать ту или иную коллекцию, а при их использовании — понимать вычислительную сложность выполняемых операции и/или потребление памяти</li><li>полезно понимать, какие решения принимали авторы оригинальных коллекций, изучение кода опытных коллег, позволяет местами оптимизировать собственные решения</li><li>в конце концов, об этом, бывает, спрашивают на собеседованиях</li></ul><p>Ниже рассмотрим коллекцию List, а в будущих статьях — и другие коллекции.</p><p>Disclaimer: далее исходные коды приводятся в объеме, необходимом для иллюстрации рассматриваемых нюансов работы коллекций. Комментарии, валидация значений, некоторые частные случаи и т.п. далее местами опущены. С исходниками в полном объеме любопытные читатели могут ознакомиться в публично доступном<a href="https://github.com/dotnet/runtime/tree/main/src/libraries/System.Private.CoreLib/src/System/Collections/Generic"> репозитории</a>.</p><h2>List</h2><p>Пожалуй, эту коллекцию используют каждый раз, когда нужно работать с переменным числом однотипных объектов, раз уж старые добрые массивы не слишком-то для этого удобны.</p><p>Итак, что же находится внутри:</p><p>Мы видим, что внутри находится все тот же массив и отдельно ведется учет фактического количества элементов списка в переменной <i>_size</i>. При этом конструктор по умолчанию инициализирует внутренний массив нулевым количеством элементов, но есть и конструктор, позволяющий явно задать количество элементов, что приведет к созданию массива соответствующего размера.</p><p>В этом обзоре не буду приводить пример, но также существует и конструктор, принимающий на вход экземпляр IEnumerable, который осуществляет последовательное добавление элементов в коллекцию, при этом существует упрощенная ветка для случая, когда был передан экземпляр ICollection, т.к. свойство Count позволяет сразу создать массив нужного размера и скопировать в него элементы.</p><p>Что же произойдет при попытке добавления элемента?</p><p>Итак, в оптимистичном сценарии (текущий размер массива позволяет поместить в него еще один элемент), увеличивается счетчик количества элементов, а в массив добавляется еще одно значение.</p><p>В случае, когда массив полностью заполнен, он будет принудительно увеличен. При этом массив с 0 элементов будет увеличен до размера по умолчанию (в текущей версии — 4), а вот далее массив будет каждый раз увеличиваться вдвое относительно текущего размера. Но как именно это будет сделано? Рассмотрим подробнее свойство Capacity.</p><p>Работая со свойством Capacity, мы можем проверять и манипулировать размером массива, сокрытого внутри List (главное — не пытаться сделать его меньше текущего количества элементов). При увеличении размера внутреннего массива будет выделен новый массив заданного размера, куда методом Array.Copy (сложность которого, как подсказывает<a href="https://docs.microsoft.com/en-us/dotnet/api/system.array.copy?view=net-6.0"> документация</a>, O(n)) будет скопирован текущий массив.</p><h2>Дополнительные методы:</h2><h3>Очистка массива</h3><p>Здесь мы видим, что количество элементов списка становится нулем, а если в массиве или его элементах содержатся ссылочные типы, они очищаются для сборщика мусора. Заметим, что в противном случае принудительного «зануления» не происходит, логика класса не позволит обычным образом получить доступ к значениям массива вне текущего количества элементов.</p><h3>Вставка элемента</h3><p>При попытке вставки, если есть такая необходимость, внутренний массив будет увеличен, затем будет осуществлено копирование элементов массива на одну позицию, начиная с индекса, куда предполагается вставить новый элемент, затем новый элемент будет помещен в массив.</p><p>Вставку набора элементов (InsertRange) приводить не буду, отмечу только, что логика в целом та же — массив будет по необходимости увеличен до необходимой величины, текущие элементы — перемещены, а новые — скопированы в увеличенный массив, начиная с целевой позиции.</p><p>Удаление элемента (RemoveAt) или набора элементов (RemoveRange) по позиции также приводить не будем, по сути своей они обратны вставке, только увеличения размера массива, естественно, не происходит.</p><h2>Выводы</h2><h3>Вычислительная сложность</h3><p>Ниже приведена сложность операций для List, внутри которого выделен массив размера N, заполненный на величину S. Сложность приведена, в том числе, для операций, которые не рассматривались выше, в связи с тем, что их реализация не отличается от уже рассмотренных методов или опирается на них. Методы поиска, проверок на наличие элементов и т.п. не приводятся за тривиальностью.</p><figure><img src="https://media.tproger.ru/uploads/2022/04/Snimok-jekrana-ot-2022-04-28-13-33-41.png" alt="" /></figure><h3>Какие практические выводы можно сделать из всего, изложенного выше:</h3><p>1. Помните, что внутри List находится массив, а не связанный список. Достаточно представить, как могут выполняться те или иные операции над массивом, чтобы оценить сложность той или иной операции.</p><p>2. Если это уместно, инициализируйте List, задавая предполагаемый размер коллекции. Если вы заранее знаете порядок количества элементов, которые предполагается поместить в коллекцию, используйте это. Данное знание позволит существенно сэкономить на операциях, связанных с изменением размера массива.</p><p>3. Тип значений, хранимых в List, может повлиять на вычислительную сложность выполняемых операций. Для ссылочных типов местами имеет место дополнительная обработка.</p><p>4. Рассмотренные участки кода методов, изменяющих коллекцию, достаточно наглядно показывают отсутствие гарантий потокобезопасности. Доступ к переменной _size, определяющей размер массива, самому массиву и его элементам никаким образом не синхронизируется. Как следствие, попытка одновременного изменения коллекции из нескольких потоков может иметь побочные эффекты. Чтобы их исключить, можно использовать коллекции из пространства имен System.Collections.Concurrent или, для особых случаев, реализовать собственные потокобезопасные коллекции.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как настроить работу .NET приложения, SQL Server, Flyway-миграций с помощью Docker, Docker Compose</title>
      <link>https://tproger.ru/articles/kak-nastroit-rabotu-net-prilozhenija-sql-server-flyway-migracij-s-pomoshhju-docker-docker-compose</link>
      <comments>https://tproger.ru/articles/kak-nastroit-rabotu-net-prilozhenija-sql-server-flyway-migracij-s-pomoshhju-docker-docker-compose?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елена Амельченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-nastroit-rabotu-net-prilozhenija-sql-server-flyway-migracij-s-pomoshhju-docker-docker-compose</guid>
      <description><![CDATA[<p>Разработчик Noveo Егор дает пошаговую инструкцию, как избежать проблем запуска приложения .NET, SQL Server на разных средах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-nastroit-rabotu-net-prilozhenija-sql-server-flyway-migracij-s-pomoshhju-docker-docker-compose">Как настроить работу .NET приложения, SQL Server, Flyway-миграций с помощью Docker, Docker Compose</a>»</p>]]></description>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Apr 2022 10:52:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Зачастую разработчикам необходимо устанавливать и настраивать разные приложения, технологии, сервисы для локальной разработки проектов. Когда проект один и вы работаете, например, с одной версией .NET, или если все разработчики работают на Windows, то какие-либо проблемы с настройкой проекта вряд ли появятся.</p><p>Но что, если вам периодически нужно переключаться между разными версиями Java, PHP, Node.js, да еще и у одного разработчика установлен Linux, а у другого Windows? Конечно, можно писать инструкции по установке и настройке, но это не решает проблему изолированности вашей операционной системы от среды приложения.</p><p>После удаления уже установленной версии .NET, SQL Server могут остаться какие-либо файлы конфигурации, которые могут привести к ошибке запуска другой установленной версии приложения.</p><p>Для решения подобных проблем запуска приложения .NET, SQL Server на разных средах можно использовать Docker, Docker Compose.</p><h2>1. Установка Docker, Docker Compose</h2><p>Для установки Docker нам нужно на странице <a href="https://docs.docker.com/engine/install/">Install Docker Engine</a> открыть руководство по необходимой ОС.</p><figure><img src="https://media.tproger.ru/uploads/2022/04/01.jpg" alt="" /></figure><p>Для установки Docker Compose — на странице <a href="https://docs.docker.com/compose/install/">Install Docker Сompose</a> также открыть руководство по необходимой ОС.</p><figure><img src="https://media.tproger.ru/uploads/2022/04/02-1.jpg" alt="" /></figure><p>Проверяем, что Docker и Docker Compose работает, выполняя команды в консоли:</p><h2>2. Создание структуры директорий проекта</h2><p>Для своих проектов, где используется Docker, я придерживаюсь следующей структуры:</p><ol><li>src — исходный код проекта</li><li>docker:</li></ol><ul><li>api — директория с файлами конфигурации, файлом docker для сборки образа .NET приложения,</li><li>db — директория с файлами конфигурации, файлом docker для сборки образа SQL Server, миграциями,</li></ul><p>docker-compose.yml — файл с настройками запуска контейнеров.</p><h2>3. Формирование Docker-файлов для .NET, SQL Server</h2><h3>3.1. Настройка образа .NET Docker</h3><p>Для работы .NET-приложения создадим файл Dockerfile в директории проекта с путем docker/api/Dockerfile:<b></b></p><h3>3.2. Настройка образа SQL Server Docker</h3><p>Для работы SQL Server создадим файл Dockerfile в директории проекта с путем docker/db/Dockerfile, содержимое которого:</p><h3>3.3. создадим файл конфигурации /docker/db/migrations/flyway.conf с содержимым:</h3><h3>3.3.1. создадим файл миграции в директории /docker/db/migrations/V1__DatabaseCreation.sql с содержимым:</h3><p>Подробнее о работе с миграциями с помощью Flyway можно почитать тут:</p><p>— <a href="https://flywaydb.org/documentation/">https://flywaydb.org/documentation/</a>,</p><p>— <a href="https://flywaydb.org/documentation/">https://flywaydb.org/documentation/</a></p><h2>4.Создание файла docker-compose.yml</h2><p>Итак, нам осталось создать только файл docker-compose.yml, чтобы описать в нем все сервисы:</p><ul><li>db — сервис для работы MS SQL Server,</li><li>db-migration — сервис для работы с Flyway-миграциями,</li><li>api — сервис для работы с .NET-приложением.</li></ul><p>Создадим файл docker-compose.yml в директории проекта с путем docker/docker-copmose.yml и содержимым:</p><h2>5. Запуск приложения</h2><p>Для запуска нам нужно запустить Docker-контейнеры при помощи команды docker-compose. Из директории проекта выполняем в терминале команду:</p><p>после чего наше приложение должно открыться в браузере по url: http://localhost:5000</p><p>К SQL Server мы можем подключиться с помощью команды:</p><p>указав пароль Your_password123</p><h2>Полезные ссылки</h2><ol><li><a href="https://docs.microsoft.com/ru-ru/dotnet/core/docker/build-container?tabs=linux">Учебник. Контейнеризация приложения .NET Core</a></li><li><a href="https://docs.microsoft.com/ru-ru/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-6.0">Образы Docker для ASP.NET Core</a></li><li><a href="https://hub.docker.com/_/microsoft-dotnet">Страница образами .NET</a></li><li><a href="https://docs.docker.com/samples/aspnet-mssql-compose/">Руководство по настройке .NET и SQL Server</a></li><li>Документация по Flyway: <a href="https://flywaydb.org/documentation/">https://flywaydb.org/documentation/</a>, <a href="https://flywaydb.org/documentation/">https://flywaydb.org/documentation/</a></li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Релиз первой беты Visual Studio 2022 — переход на х64, ИИ-помощник и кросс-платформенная разработка</title>
      <link>https://tproger.ru/news/reliz-pervoj-bety-visual-studio-2022-perehod-na-h64-ii-pomoshhnik-i-kross-platformennaja-razrabotka</link>
      <comments>https://tproger.ru/news/reliz-pervoj-bety-visual-studio-2022-perehod-na-h64-ii-pomoshhnik-i-kross-platformennaja-razrabotka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/reliz-pervoj-bety-visual-studio-2022-perehod-na-h64-ii-pomoshhnik-i-kross-platformennaja-razrabotka</guid>
      <description><![CDATA[<p>Компания сдержала обещание и выпустила первое превью в начале лета. Больше нововведений обещают в будущих бета-релизах Visual Studio 2022.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/reliz-pervoj-bety-visual-studio-2022-perehod-na-h64-ii-pomoshhnik-i-kross-platformennaja-razrabotka">Релиз первой беты Visual Studio 2022 — переход на х64, ИИ-помощник и кросс-платформенная разработка</a>»</p>]]></description>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Бета]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 18 Jun 2021 10:56:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft опубликовала в своём блоге пост. В нём компания анонсировала выход первой беты новейшей версии своей IDE — VIsual Studio 2022. Таким образом компания сдержала обещание выдать первую тестовую версию приложения летом.</p><figure><img src="https://media.tproger.ru/uploads/2021/06/1-19.jpg" alt="" /></figure><h3>Ключевые особенности</h3><ul><li>Возможность масштабировать и создавать комплексные проекты благодаря переходу к 64 битам по умолчанию.</li><li>Более быстрая разработка благодаря функции IntelliCode, в основу которой лёг искусственный интеллект Microsoft.</li><li>C# и .NET MAUI внедрили кросс-платформенную разработку приложений. Например, одновременно и десктопных, и мобильных.</li></ul><h3>Где скачать?</h3><p>Достаточно перейти на <a href="https://visualstudio.microsoft.com/vs/preview/vs2022/">сайт проекта</a> и выбрать версию для своей системы.</p><h3>Что дальше?</h3><p>Больше нововведений стоит ждать во второй бета-версии Visual Studio 2022. Подробнее о них можно почитать на странице с <a href="https://docs.microsoft.com/en-us/visualstudio/productinfo/vs-roadmap">дорожной картой</a> компании.</p><p>При этом Microsoft уже обратилась к разработчикам расширений. Они призвали «портировать» свои наработки для свежей версии Visual Studio. Для этого редмондцы даже создали отдельный документ, с которым вы можете ознакомиться по <a href="https://docs.microsoft.com/en-us/visualstudio/extensibility/migration/update-visual-studio-extension?view=vs-2022">ссылке</a>.</p><p>Источник: <a href="https://devblogs.microsoft.com/visualstudio/visual-studio-2022-preview-1-now-available/">Блог Microsoft</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Параллелизм, многопоточность, асинхронность: разница и примеры применения (.NET, C#)</title>
      <link>https://tproger.ru/articles/parallelizm-mnogopotochnost-asinhronnost-raznica-i-primery-primenenija-net-c</link>
      <comments>https://tproger.ru/articles/parallelizm-mnogopotochnost-asinhronnost-raznica-i-primery-primenenija-net-c?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/parallelizm-mnogopotochnost-asinhronnost-raznica-i-primery-primenenija-net-c</guid>
      <description><![CDATA[<p>Давайте разберёмся, сколько программных моделей используют C#-разработчики и в чём их отличия. Особенности каждой модели рассмотрим подробно.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/parallelizm-mnogopotochnost-asinhronnost-raznica-i-primery-primenenija-net-c">Параллелизм, многопоточность, асинхронность: разница и примеры применения (.NET, C#)</a>»</p>]]></description>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 Apr 2021 06:18:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие начинающие специалисты путают многопоточное, асинхронное и параллельное программирование. На первый взгляд, может показаться, что это одно и то же — но нет. Давайте разберёмся, сколько программных моделей используют C#-разработчики и в чём их отличия. Материал подготовлен совместно с Алексеем Гришиным, ведущим разработчиком DD Planet.</p><p>Существует несколько концепций: синхронное/асинхронное программирование и однопоточные/многопоточные приложения. Причём первая программная модель может работать в однопоточной или многопоточной среде. То есть приложение может быть: синхронным однопоточным, синхронным многопоточным и асинхронным многопоточным.</p><p>Отдельной концепцией считается параллелизм, который является подмножеством многопоточного типа приложений. Рассмотрим особенности каждой программной модели подробнее.</p><h2>Синхронная модель</h2><p>Потоку назначается одна задача, и начинается её выполнение. Заняться следующей задачей можно только тогда, когда завершится выполнение первой. Эта модель не предполагает приостановку одной задачи, чтобы выполнить другую.</p><h2>Однопоточность</h2><p>Система в одном потоке работает со всеми задачами, выполняя их поочерёдно.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1-27.jpg" alt="" /><figcaption>Однопоточная синхронная система</figcaption></figure><h2>Многопоточность</h2><p>В этом случае речь о нескольких потоках, в которых выполнение задач идет одновременно и независимо друг от друга.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/2-4.png" alt="" /><figcaption>Многопоточная синхронная система</figcaption></figure><p>Пример такого концепта — одновременная разработка веб- и мобильного приложений и серверной части, при условии соблюдения архитектурных «контрактов».</p><p>Использование нескольких потоков выполнения — один из способов обеспечить возможность реагирования приложения на действия пользователя при одновременном использовании процессора для выполнения задач между появлением или даже во время появления событий пользователя.</p><h2>Асинхронность</h2><p>Характеристики асинхронного кода:</p><ul><li>обрабатывает больше запросов сервера, предоставляя потокам возможность обрабатывать больше запросов во время ожидания результата от запросов ввода-вывода;</li><li>делает пользовательский интерфейс быстрым, выделяя потоки для обработки действий в пользовательском интерфейсе во время ожидания запросов ввода-вывода, передавая затратные по времени операции другим ядрам ЦП.</li></ul><p>Если у системы много потоков, то их асинхронная работа выглядит примерно так:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/3-2.jpg" alt="" /><figcaption>Многопоточная асинхронная система</figcaption></figure><h3>Конструкция async/await</h3><p>Для работы с асинхронными вызовами в C# необходимы два ключевых слова:</p><ul><li>async — используется в заголовке метода;</li><li>await — вызывающий метод содержит одно или несколько таких выражений.</li></ul><p>Они используются вместе для создания асинхронного метода. У асинхронных методов могут быть следующие типы возвращаемых значений:</p><ol><li>Task для асинхронного метода, который выполняет операцию, но не возвращает значение;</li><li>Task&lt;TResult&gt; для асинхронного метода, возвращающего значение;</li><li>void для обработчика событий;</li><li>начиная с версии 7.0 в языке C# поддерживаются любые типы с доступным методом GetAwaiter;</li><li>начиная с версии 8.0 в языке C# поддерживается интерфейс IAsyncEnumerable&lt;T&gt; для асинхронного метода, который возвращает асинхронный поток.</li></ol><p>Сама конструкция async/await появилась в C# 5.0 с выходом .NET Framework 4.5 и отчасти представляет собой синтаксический сахар. Механизм async/await не имеет реализации в CLR и разворачивается компилятором в сложную конструкцию на IL. Но эта конструкция — не сахар вокруг тасок, а отдельный механизм, использующий класс Task для переноса состояния исполняемой части кода.</p><p>Пример асинхронного метода:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/4.jpg" alt="" /><figcaption>Результат асинхронного вычисления факториала</figcaption></figure><p>Этот пример приведён лишь для наглядности, особого смысла делать логику вычисления факториала асинхронной нет. Опять же, для имитации долгой работы мы использовали задержку на 8 секунд с помощью методы Thread.Sleep(). Цель была показать: асинхронная задача, которая может выполняться долгое время, не блокирует основной поток — в этом случае метод Main(), и мы можем вводить и обрабатывать данные, продолжая работу с ним.</p><h2>Параллелизм</h2><p>Эта программная модель подразумевает, что задача разбивается на несколько независимых подзадач, которые можно выполнить параллельно, а затем объединить результаты. Примером такой задачи может быть Parallel LINQ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/5.jpg" alt="" /><figcaption>Обзор архитектуры параллельного программирования в .NET</figcaption></figure><p>Еще один пример — вычисление среднего значения двумерного массива, когда каждый отдельный поток может подсчитать сумму своей строки, а потом объединить результат и вычислить среднее.</p><p>Однако не стоит забывать, что не все задачи поддаются распараллеливанию. Например, описанная выше задача по вычислению факториала, в которой на каждом последующем этапе нужен результат предыдущего.</p><h2>Какую программную модель выбрать?</h2><p>Перечисленные программные модели должны применяться в зависимости от задач. Их можно использовать как отдельно во всём приложении, так и сочетать между собой. Главное, чтобы приложение было максимально эффективным и удовлетворяло требования пользователя.</p><p>Если речь идет о сложных многопользовательских приложениях, то стремиться стоит к использованию асинхронной модели, так как важна интерактивность и отзывчивость интерфейса. Взаимодействие с пользователем в активном режиме всегда должно быть максимально эффективным, даже если в фоновом режиме в то же время выполняются другие задачи. Издержки асинхронности, например, на переключение исполняемого контекста, в таком случае нивелируются за счет общей эффективности приложения.</p><p>В разработке простых приложений, к примеру, парсера документа, необходимости в асинхронности, или даже многопоточности, может и не быть.</p>]]></content:encoded>
    </item>
    <item>
      <title>Анонс Visual Studio 2022: дата выхода и что нового</title>
      <link>https://tproger.ru/news/anons-visual-studio-2022-data-vyhoda-i-chto-novogo</link>
      <comments>https://tproger.ru/news/anons-visual-studio-2022-data-vyhoda-i-chto-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/anons-visual-studio-2022-data-vyhoda-i-chto-novogo</guid>
      <description><![CDATA[<p>Microsoft переводит среду на x64 и снимает ограничение в 4 ГБ памяти, меняет иконки, шрифт и темы оформления и упрощает настройку среды под себя.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/anons-visual-studio-2022-data-vyhoda-i-chto-novogo">Анонс Visual Studio 2022: дата выхода и что нового</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 20 Apr 2021 07:53:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft анонсировала Visual Studio 2022. В блоге компании перечислены все ключевые особенности новой версии. И судя по ним, нас ждёт и вправду крупный апдейт.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/3-2.png" alt="" /></figure><h3>Что нового?</h3><p><b>Переход к x64.</b> Так как приложение становится 64-битным, основной процесс перестаёт быть ограничен 4 ГБ оперативной памяти. Это должно ускорить работу среды разработки на мощных компьютерах.</p><p><b>Изменённый интерфейс.</b> Многие элементы будут упрощены, что должно «снизить когнитивную нагрузку» на пользователя. В Visual Studio 2022 изменят иконки, шрифт и улучшат темы оформлений.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1-32.png" alt="" /></figure><p><b>Упрощённая персонализация.</b> Разработчикам теперь будет гораздо легче настроить IDE от Microsoft под себя.</p><p><b>Возможность создания множества типов приложения.</b> Новая версия Visual Studio будет поддерживать создание облачных Azure-приложений, а также проектов на .NET 6 (в том числе.NET Multi-platform App), приложений C++ 20 с новыми возможностями языка и улучшенной поддержкой Linux-приложений.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/2-autoconverted-2.jpeg" alt="" /></figure><p><b>Версия IDE для macOS.</b> Теперь Visual Studio для системы от Apple сможет обеспечить более высокую производительность и стабильность. Также апдейт под  macOS получит полную поддержку специальных возможностей ОС и предоставит новые функции Git.</p><h3>Когда ждать?</h3><p>Летом 2021 года выйдет первая предварительная версия Visual Studio 2022. Финальный релиз обещали ближе к концу года.</p><p>Источник: <a href="https://devblogs.microsoft.com/visualstudio/visual-studio-2022/">Microsoft</a></p>]]></content:encoded>
    </item>
    <item>
      <title>На каких языках написаны самые небезопасные проекты? Исследование от Veracode</title>
      <link>https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap</link>
      <comments>https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Почекутов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap</guid>
      <description><![CDATA[<p>Veracode изучила более 130 тысяч приложений: проблемы с безопасностью нашлись у 76% из них, а самым проблемным оказался код на PHP.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/nazvany-glavnye-problemy-v-bezopasnosti-koda-napisannogo-na-populjarnyh-jap">На каких языках написаны самые небезопасные проекты? Исследование от Veracode</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 21 Dec 2020 04:37:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Veracode, специализирующаяся на разработке инструментов для проведения аудита безопасности, <a href="https://www.veracode.com/state-of-software-security-report">опубликовала результаты</a> сравнения языков программирования. Оценивалась безопасность написанного на них кода.</p><p>В ходе исследования специалисты изучили более 130 тысяч приложений. Проблемы с безопасностью были выявлены у 76 % приложений. В каждом четвёртом случае найденные проблемы отнесены к категории опасных. В каждом третьем приложении уязвимости появились из-за использования сторонних библиотек.</p><p>Процент приложений с опасными проблемами безопасности:</p><ol><li>С++ — 59 %</li><li>PHP — 52,6 %</li><li>.NET — 25 %</li><li>Java — 23,8 %</li><li>Python — 9,6 %</li><li>JavaScript — 8,6 %</li></ol><p>Если говорить обо всех уязвимостях, то самым проблемным оказался код на PHP. В 74,6 % приложений встречается межсайтовый скриптинг, в 71,6 % случаев обнаружены проблемы с шифрованием.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/0_1608476837.png" alt="" /><figcaption>Результаты исследования</figcaption></figure><p>Результаты исследования с описаниями результатов <a href="https://info.veracode.com/state-of-software-security-volume-11-flaw-frequency-by-language-infosheet-resource.html">опубликованы</a> на странице State of Software Security. Там раскрыты наиболее распространённые уязвимости для каждого языка.</p><p>Есть также <a href="https://www.veracode.com/sites/default/files/pdf/resources/ipapers/security-flaw-heatmap/index.html">страница с подробным описанием</a> обнаруженных проблем и способов их исправления.</p>]]></content:encoded>
    </item>
    <item>
      <title>Примите участие в баттле языков программирования 2020. Старт уже завтра!</title>
      <link>https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra</link>
      <comments>https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Борисенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra</guid>
      <description><![CDATA[<p>Голосование выяснит, какие языки подписчики любят больше всего, пока Java и язык Си меняются местами на вершине рейтинга TIOBE.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra">Примите участие в баттле языков программирования 2020. Старт уже завтра!</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Лучший язык 2020]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 13 Dec 2020 08:00:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>В то время как Java и язык Си меняются местами на вершине рейтинга TIOBE, мы решили выяснить, какие языки программирования, наши подписчики любят больше всего.</p><p>Завтра начинается баттл языков программирования 2020. Правила просты:</p><ul><li>В баттле участвуют 16 языков;</li><li>ежедневно соревнуются две пары;</li><li>на каждое голосование отводится 24 часа;</li><li>вы выбираете язык который субъективно нравится вам больше чем его оппонент;</li><li>пары подбираются случайно;</li><li>в результате мы определим победителей, занявших первое, второе и третье места;</li><li>Старт завтра — 14 декабря, финал — 21 декабря.</li></ul><p>Так выглядит изначальная турнирная таблица:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Frame-4.png" alt="" /></figure><p>Подписывайтесь на уведомления на сайте, чтобы быть в курсе текущих лидеров и новых голосований.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышла новая версия платформы .NET под номером 5.0</title>
      <link>https://tproger.ru/news/dotnet-5-0-released</link>
      <comments>https://tproger.ru/news/dotnet-5-0-released?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/dotnet-5-0-released</guid>
      <description><![CDATA[<p>Единый набор API, библиотек и языков для десктопных, мобильных и веб-приложений; вместе с .NET 5.0 вышли ASP.NET Core, EF Core, C# 9 и F# 5.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/dotnet-5-0-released">Вышла новая версия платформы .NET под номером 5.0</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Nov 2020 11:32:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики постарались унифицировать платформу .NET, чтобы вы могли использовать один и тот же набор API, библиотек и языков для работы над десктопными, мобильными и веб-приложениями. Первые шаги в этом направлении <a href="https://devblogs.microsoft.com/dotnet/introducing-net-5/">начались</a> в прошлом году, а окончательно платформа станет общей для Cloud, IoT, Desktop и Web с выходом .NET 6.0.</p><h2>Что интересного в обновлении?</h2><p>Ключевые нововведения и улучшения:</p><ul><li>поддержка C# 9 и F# 5;</li><li>улучшение производительности сборщика мусора и отдельных компонентов;</li><li>библиотеки .NET для сериализации JSON, работы с HTTP и регулярными выражениями теперь работают быстрее и null-safe;</li><li>набор платформ расширен Windows Arm64 и WebAssembly.</li></ul><p>Вместе с .NET 5.0 вышли обновления <a href="https://devblogs.microsoft.com/aspnet/announcing-asp-net-core-in-net-5/">ASP.NET Core</a>, <a href="https://devblogs.microsoft.com/dotnet/announcing-the-release-of-ef-core-5-0/">EF Core</a>, <a href="https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/">C# 9</a> и <a href="https://devblogs.microsoft.com/dotnet/announcing-f-5/">F# 5</a>.</p><p>Подробности и ссылки на скачивание для всех доступных платформ доступны в <a href="https://devblogs.microsoft.com/dotnet/announcing-net-5-0/">блог-посте Microsoft</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>8 основных языков для бэкенда</title>
      <link>https://tproger.ru/articles/7-basic-languages-for-backend-development</link>
      <comments>https://tproger.ru/articles/7-basic-languages-for-backend-development?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-basic-languages-for-backend-development</guid>
      <description><![CDATA[<p>Языки для бэкенда, задачи, которые можно решать с их помощью, и примеры крупных компаний, использующих эти технологии в своих продуктах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-basic-languages-for-backend-development">8 основных языков для бэкенда</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jul 2020 16:16:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автор Мария Багулина</p><p>Бэкенд — это прослойка, которая соединяет интерфейс с базой данных, позволяет получать ответы от сервера и обеспечивает работу сайта. В этом материале расскажем о языках для бэкенда: что на них можно делать и какие крупные компании их используют.</p><h2>Java</h2><p>Java — один из самых популярных языков программирования. Он универсален и используется уже более 20 лет.</p><p>Универсальность обеспечивается виртуальной машиной Java (Java Virtual Machine, JVM). Во многих языках во время компиляции программа переводится в код, который может работать по-разному на разных устройствах или платформах. В Java этой проблемы нет. JVM играет роль промежуточного уровня — из программы на Java она делает код, который может выполняться на любом компьютере независимо от того, где код был скомпилирован.</p><p>У Java большое сообщество, и в интернете можно найти ответы практически на любые вопросы о языке.</p><h3>Что можно делать на Java</h3><p>Технологии Java могут использоваться для многих задач, среди которых:</p><ul><li>разработка мобильных приложений под Android;</li><li>разработка бэкенда веб-сайтов;</li><li>разработка API для работы с базами данных;</li><li>цифровая обработка изображений;</li><li>создание настольных приложений;</li><li>программирование сетевых задач.</li></ul><h3>Какие компании используют Java</h3><p>Airbnb, Uber, Pinterest, LinkedIn, Groupon, eBay, Evernote, FitBit, Hubspot.</p><h2>PHP</h2><p>PHP используют около 78% всех сайтов. Язык появился в 1995 году, когда было не так много возможностей для создания динамических веб-страниц. PHP динамически типизирован, и один и тот же фрагмент кода может вести себя по-разному в зависимости от контекста, что делает программы на PHP сложными для масштабирования и иногда медленными.</p><p>PHP — отличный язык для начинающих по ряду причин:</p><ul><li>он прощает ошибки: вы можете запустить программу, и она будет выполняться, пока не достигнет участка с проблемным кодом;</li><li>у языка большое сообщество, а для новичков доступно много обучающих материалов. Язык постоянно обновляется, поэтому убедитесь, что изучаете последнюю версию;</li><li>установить и настроить PHP достаточно легко по сравнению, например, с Ruby on Rails. Вы можете скачать MAMP (для Mac) или WAMP (для Windows), и всё будет готово к работе через 5 минут.</li></ul><h3>Что можно делать на PHP</h3><p>Согласно официальному сайту PHP, вы можете:</p><ul><li>собирать данные форм (ввод логина/пароля и прочее);</li><li>создавать динамический контент на страницах;</li><li>отправлять и получать куки;</li><li>писать скрипты в командной строке;</li><li>выполнять сценарии на стороне сервера;</li><li>разрабатывать настольные приложения.</li></ul><h3>Какие компании используют PHP</h3><p>Facebook, Lyft, Mint, Hootsuite, Viber, Buffer, DocuSign.</p><h2>.NET (C#, VB)</h2><p>Фреймворк с открытым исходным кодом ASP.NET от Microsoft используется для создания веб-сайтов с помощью таких языков, как Visual Basic (VB), C#, F# и других.</p><p>.NET работает на основе архитектурного шаблона MVC (Model-View-Controller, Модель-Представление-Контроллер). Контроллер принимает запросы пользователя и взаимодействует с моделью для обработки данных. Затем результат передаётся в представление и отображается в виде интерфейса веб-страницы.</p><p>Выложенный в открытый доступ в 2016 году, .NET может интегрироваться с iOS, Linux и Android через .NET Core. Он очень стабилен и надёжен, что делает его популярным выбором для бизнеса. Поскольку .NET — продукт Microsoft, у него достаточно хорошая поддержка.</p><h3>C#</h3><p>C# — высокоуровневый язык программирования. Это означает, что разработчики могут писать на нём программы, независимые от архитектуры процессора конкретного компьютера.</p><p>C# популярен среди разработчиков, потому что он обладает некоторыми преимуществами C++, но на нём проще писать код и избегать при этом грубых ошибок.</p><h3>VB</h3><p>Visual Basic — это потомок BASIC, который унаследовал его стиль и сочетает в себе элементы ООП. Это простой язык для начинающих: он широко распространён и обладает несложным синтаксисом. VB часто применяют для прототипирования.<br /> Недостатком программирования на VB является большой объём памяти, необходимый для установки и запуска инструментов разработки.</p><h3>Что можно делать на .NET</h3><p>С помощью .NET вы можете:</p><ul><li>создавать настольные приложения;</li><li>создавать мобильные приложения;</li><li>создавать веб-приложения и игры;</li><li>работать с большими данными;</li><li>и ещё много чего.</li></ul><h3>Какие компании используют .NET</h3><p>Microsoft, Starbucks, Docplanner, StackOverflow.</p><h2>Ruby + Ruby on Rails</h2><p>Ruby on Rails — это веб-фреймворк на языке программирования Ruby. Ruby on Rails имеет набор готовых инструментов, которые позволяют быстро выполнять базовые задачи.</p><p>Ruby достаточно лаконичный и не требует много кода для бэкенда, что позволяет разработчикам быстро создавать и запускать прототипы (этим Ruby похож на Python). Популярность Ruby выросла в начале 2000 годов, но с тех пор заметно снизилась.</p><p>Ruby — язык с открытым исходным кодом, а значит его можно модифицировать и дополнять.</p><h3>Что можно делать на Ruby</h3><p>Ruby позволяет:</p><ul><li>автоматизировать повторяющиеся задачи;</li><li>создавать веб-приложения;</li><li>писать мобильные приложения и игры;</li><li>создавать прототипы.</li></ul><h3>Какие компании используют Ruby</h3><p>Airbnb, Codecademy, TaskRabbit, Kickstarter, RapGenius, Scribd, AngelList.</p><h2>Python</h2><p>Python стал очень популярным языком программирования. Он используется как для веб-разработки, так и для создания настольных приложений. В Сети можно найти огромное число обучающих сайтов, учебных пособий и руководств по Python, что делает его доступным языком для новичков.</p><p>Кроме того, синтаксис Python прост и лёгок для понимания по сравнению с другими языками. Python поддерживает объектно-ориентированное, функциональное и аспектно-ориентированное программирование, а также это динамически типизированный язык с открытым исходным кодом.</p><h3>Что можно делать на Python</h3><p>Некоторые из наиболее популярных применений Python:</p><ul><li>кроссплатформенные shell-скрипты;</li><li>быстрая автоматизация;</li><li>веб-разработка:</li><li>Data Science, Machine Learning.</li></ul><h3>Какие компании используют Python</h3><p>Uber, Pinterest, Mozilla, Spotify, Quora, Pandora, Netflix, Asana.</p><h2>JavaScript</h2><p>JavaScript (не путать с Java) — гибкий язык, который можно использовать как для фронтенда, так и для бэкенда. Это хороший язык для начинающих, поскольку в нём мало настроек, и можно начать писать код прямо в браузере.</p><p>Гибкость JavaScript порой обходится дорого: скрипты работают медленно, их сложно поддерживать и масштабировать, как и в большинстве динамически типизированных языков.</p><p>У JavaScript большое сообщество, и для его изучения в Сети есть много полезных материалов.</p><p>Значительно расширяет возможности JS программная платформа Node.js. С её помощью код, написанный на JS, можно запускать без браузера на бэкенде. А наличие огромного количества готовых решений в пакетной экосистеме npm позволяет разработчику не тратить время на создание большинства типовых решений.</p><h3>Что можно делать на JavaScript</h3><p>С JavaScript создаются веб-приложения и программное обеспечение, а именно:</p><ul><li>фронтенд и бэкенд веб-сайтов;</li><li>мобильные приложения;</li><li>настольные приложения;</li><li>игры;</li><li>веб-серверы;</li><li>презентации;</li><li>и многое другое.</li></ul><h3>Какие компании используют JavaScript</h3><p>Airbnb, Codecademy, HotelTonight, eBay, Square, Asana.</p><h2>Go</h2><p>Go (часто также Golang) — компилируемый многопоточный язык программирования, разработанный внутри компании Google. Язык Go разрабатывался для создания высокоэффективных программ, работающих на современных распределённых системах и многоядерных процессорах.</p><p>Go — язык со строгой статической типизацией. Имеет достаточно лаконичный и простой синтаксис, основанный на Си, но существенно доработанный, с большим количеством синтаксического сахара.</p><h3>Что можно делать на Go</h3><ul><li>писать сетевые инструменты;</li><li>разрабатывать ПО для распределённых систем;</li><li>писать ПО, обрабатывающее большие объёмы информации.</li></ul><h3>Какие компании используют Go</h3><p>Dropbox, SoundCloud, Docker, CloudFlare, Alibaba, Xiaomi, Domino’s Pizza, Gett, Avito, Mail.ru, Tinkoff, 2GIS.</p><h2>Заключение</h2><p>В этом обзоре, конечно, далеко не полный список. Если вы планируете стать бэкенд-разработчиком, поищите интересующие вас вакансии и выделите технологии, которые требуются в большинстве компаний. Если же знаний в программировании у вас очень мало, можете начать обучение с базовых курсов и книг по конкретному языку.</p>]]></content:encoded>
    </item>
    <item>
      <title>Углубляемся в .NET: подборка докладов с московской конференции DotNext</title>
      <link>https://tproger.ru/articles/dotnext-2019-moscow-review</link>
      <comments>https://tproger.ru/articles/dotnext-2019-moscow-review?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dotnext-2019-moscow-review</guid>
      <description><![CDATA[<p>Записи докладов .NET-конференции DotNext 2019 Moscow разбиты по тематикам, чтобы проще было выбрать, что смотреть в первую очередь.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dotnext-2019-moscow-review">Углубляемся в .NET: подборка докладов с московской конференции DotNext</a>»</p>]]></description>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 30 Apr 2020 07:31:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если крупная конференция открывает для всего мира видеозаписи десятков докладов, в чём тут может быть проблема? В том, что глаза разбегаются: всё это смотреть не станешь, а за что именно браться в первую очередь — с ходу непонятно.</p><p>Чтобы это исправить, мы взяли доклады .NET-конференции DotNext 2019 Moscow и разбили их по тематикам — так вам должно быть удобнее найти подходящие для вас. А если вдруг вам всё-таки лучше подходит единый плейлист, он тоже доступен.</p><h2>Тренды</h2><h3>Platform Wars — Кирилл Скрыган (RUS)</h3><p>Между компаниям, конкурентами, партнёрами, современными платформами и сообществом постоянно происходят увлекательные взаимодействия. Кирилл Скрыган, тимлид Rider (одной из двух самых популярных сред разработки под .NET), на опыте побед и неудач разберётся в современном мире IT.</p><h3>An in-depth look at the new features in C# 8.0 and .NET Core 3.0 — Raffaele Rialdi (ENG)</h3><p>Релиз .NET Core 3.0 официально состоялся. Много раз обсуждали все нововведения, но каждый раз затрагивали одни фичи и умалчивали о других. Из доклада вы сможете узнать мнение Рафаэля о тех фичах, которые ему кажутся полезными и важными в новом релизе.</p><h3>Hot Chocolate: An introduction to GraphQL on ASP.Net Core — Michael Staib (ENG)</h3><p>В своём докладе Майкл, разработчик GraphQL-сервера, отвечает на вопрос: является ли GraphQL реальной альтернативой REST?</p><h3>Bring your ASP.NET Core solutions to Kubernetes in Azure — Marco De Sanctis (ENG)</h3><p>Доклад Марко интересен и глубиной подачи материала, и уверенностью лайв-кодинга во время презентации. Все заинтересованные вопросами разработки распределённых систем на основе контейнеров почерпнут для себя что-то новое из этого доклада.</p><h3>vvvv — visual programming for .NET — Joreg, Elias Holzer (ENG)</h3><p>В своём докладе Йорег и Элиас представили новый визуальный язык для экосистемы .NET, который называется «VL», и среду разработки для него под названием «vvvv gamma».</p><h2>Машинное обучение</h2><h3>Machine learning for C# developers: Introducing ML.NET — Jeff Prosise (ENG)</h3><p>ML.NET претендует на звание самой мощной библиотеки для машинного обучения на платформе .NET. Из доклада вы сможете узнать, так ли это, от Джеффа Просайза — коллеги Джеффри Рихтера по Wintellect, активно взаимодействующего с разработчиками продукта.</p><h3>Всё, что разработчик .NET хотел знать про глубокое обучение, но боялся спросить — Дмитрий Сошников (RUS)</h3><p>В этом докладе Дмитрий говорит про основные виды нейронных сетей, используемых на сегодняшний день, и как .NET-разработчики могут использовать готовые обученные сети для решения своих задач, а также как производить «дообучение» таких сетей. Основной акцент в демонстрациях делается на обработке изображений — вы сможете научиться распознавать и находить объекты на изображении.</p><h2>Архитектура</h2><h3>Введение в Event sourcing — Яков Повар (RUS)</h3><p>В этом докладе Яков рассказывает о том, что такое event sourcing и чем он отличается от других архитектурных стилей.</p><p>Доклад рассчитан на слушателей, которые ещё не работали с event sourced системами, но будет полезен и тем, кто уже знаком с этой концепцией.</p><h3>Блеск и нищета предметной модели — Максим Аршинов (RUS)</h3><p>Доклад отражает взгляд Максима на проектирование сложных корпоративных приложений с обеих сторон баррикад: разработки и бизнеса.</p><h3>The power of composition — Scott Wlaschin (ENG)</h3><p>Скотт Влашин зарекомендовал себя в последние годы как популяризатор функционального программирования и его применения к доменному моделированию (DDD). Вышедшую недавно книгу Влашина «Domain Modeling Made Functional» можно советовать всем интересующимся доменным моделированием, вне зависимости от языка программирования. Доклад зайдёт всем, кто хочет окунуться в мир функционального программирования.</p><h2>Лучшие практики</h2><h3>Nullable reference types — advanced guide — Андрей Дятлов (RUS)</h3><p>Одно из самых больших изменений в C# 8 — это nullable reference types. Андрей рассказал обо всех трудностях и проблемах, которые вы можете встретить при его применении.</p><p>Доклад будет интересен всем, кто планирует использовать nullable reference types, т. к. он раскрывает подробности работы этих типов.</p><h3>Roslyn: Мастерство статического анализа — Владимир Панченко (RUS)</h3><p>Владимир объяснил, как улучшить качество кода и сократить время на решение типовых проблем при работе с фреймворками (особенно самописными).</p><p>Этот доклад подойдёт разработчикам и билд-инженерам, особенно тем, кто занимается разработкой собственных фреймворков или работает с чужими, где отсутствует готовый статический анализ кода.</p><h3>Create your own serverless PKI with .NET &amp; Azure Key Vault — Eran Stiller (ENG)</h3><p>Когда речь заходит о безопасности, часто вспоминают про сертификаты. Про них все слышали, многие знают, что это и зачем, но не все знают, как правильно их готовить (выпускать, отзывать и т. п.). В докладе рассмотрена работа с сертификатами, когда их нужно много, и лучшее решение — сделать свой внутренний центр сертификации.</p><h3>Распределённая трассировка запросов в .NET — Егор Гришечко (RUS)</h3><p>В своём докладе Егор говорил про Jaeger — систему сбора trace-меток в распределённых системах, написанную компанией Uber и вдохновлённую Zipkin.</p><p>Доклад будет полезен разработчикам микросервисных систем, которые смогут открыть для себя эту систему, а также backend разработчикам, интересующимся метриками и мониторингом.</p><h3>Мутационный анализ — Николай Молчанов (RUS)</h3><p>Доклад ориентирован на широкий круг слушателей, заинтересованных в достижении высокого качества программных продуктов.</p><p>В докладе рассматривается теория мутационного анализа, как можно реализовать в .NET инструмент для анализа, рассматриваются самые распространённые мутации и примеры из реальной жизни.</p><h3>Code Review — искусство развивать — Роман Просин (RUS)</h3><p>Как превратить Code Review в процесс, который позволит сделать проект лучше, станет одним из двигателей прогресса у вас и членов команды? В своём докладе Роман делится опытом его команды, полезными практиками и рассказывает о том, как грамотно построить процесс инспекции кода.</p><h2>Под капотом</h2><h3>From ETW to EventPipe: dig into .NET monitoring pipelines for healthier applications — Christophe Nasarre-Soulier (ENG)</h3><p>Кристоф — известный любитель ETW и прочих техник профилирования и измерения производительности .NET-приложений. Но ETW — это снова только Windows. В докладе Кристоф показал, что предлагает .NET Core и как с этим работать на всех платформах.</p><h3>Beating CoreCLR’s own C++ code with CoreCLR 3.0 intrinsics — Dan Shechter (ENG)</h3><p>С появлением поддержки интринсик в .NET Core 3.0 стало возможным писать очень быстрый код. В своём докладе Дэн раскрывает, насколько этот код быстрый и насколько получится ускорить обычные алгоритмы, если копать глубоко в оптимизацию.</p><h3>.NET 5: runtimes — Егор Богатов (RUS)</h3><p>Егор работает в команде .NET 5 и знает обо всём, что происходит, по собственному опыту. В своём докладе Егор разобрал нововведения .NET 5, улучшения скорости запуска посредством Tired Compilation и R2R, производительности рантайма, а также подробно рассмотрел новую фичу — подмену рантайма CoreCLR на Mono (LLVM) для любого приложения, и рассказал, зачем это может понадобиться.</p><h3>Pragmatic memory management — Анатолий Жмур (RUS)</h3><p>Про .NET и память было уже много докладов. Большинство из них сводится к «следите за memory traffic», «не надо допускать Gen2 collections, особенно LOH» и т. п. Анатолий представил альтернативный взгляд на проблемы работы с памятью.</p><h3>Writing a .NET Core cross platform profiler in an hour — Pavel Yosifovich (ENG)</h3><p>Про внутренности Windows лучше всего может рассказать один из авторов книги «Windows Internals» Павел Йосифович.</p><h3>Asynchronous streams — Stephen Cleary (ENG)</h3><p>Про Стивена Клири можно сказать, что «он всерьёз занялся многопоточным программированием ещё до того, как это стало модным». В своём докладе он говорит о важности асинхронности для программирования, рассматривает подходы работы с потоками асинхронных данных на основе библиотек. Доклад подойдёт всем, кто хочет работать с асинхронностью в своих проектах.</p><h3>Metaprogramming for the masses — Federico Lois (ENG)</h3><p>В своём докладе Федерико показывает, как убедить JIT делать то, что нам нужно, чтобы сгенерировать высокооптимизированный код.</p><h3>The debugging mindset — Kevin Gosse (ENG)</h3><p>Сталкиваясь с проблемой, каждый разработчик приступает к решению по-своему: кто-то пишет больше логов, кто-то сразу хватается за отладчик. Кевин рассказал, как решать проблемы системно, не тратить время на лишнее и получать максимум информации из имеющихся данных.</p><h3>.NET: Лечение зависимостей — Евгений Пешков (RUS)</h3><p>Скорее всего, любой, кто разрабатывал относительно большое приложение, рано или поздно сталкивался с проблемами из-за assembly redirect. Помимо этого существуют и другие трудности при работе со сборками в .NET. Евгений на практических примерах показал, что бывает и как с этим бороться.</p><h2>Кейноут</h2><h3>Фантастические биотехнологии и где они обитают — Александр Панчин (RUS)</h3><p>Какие фантастические биотехнологии ждут нас в будущем, а какие уже реальны? В чём правы, а в чём ошибались фантасты?</p><p>Подробнее об этом в своём докладе рассказал кандидат биологических наук, старший научный сотрудник Института проблем передачи информации РАН Александр Панчин.</p><p>Подборка получилась большая. Плейлист с прошедшей конференции доступен по ссылке, а новая конференция DotNext 2020 Piter пройдёт в новом онлайн-формате уже в июне этого года.</p>]]></content:encoded>
    </item>
    <item>
      <title>JetBrains выпустила ReSharper Ultimate 2018.3</title>
      <link>https://tproger.ru/news/resharper-ultimate-2018-3</link>
      <comments>https://tproger.ru/news/resharper-ultimate-2018-3?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/resharper-ultimate-2018-3</guid>
      <description><![CDATA[<p>Последнее мажорное обновление ReSharper Ultimate: аннотирование аргументов именами параметров, определение формата кода и поддержка TypeScript 3.0.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/resharper-ultimate-2018-3">JetBrains выпустила ReSharper Ultimate 2018.3</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 19 Dec 2018 15:15:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>JetBrains <a href="https://blog.jetbrains.com/dotnet/2018/12/18/resharper-ultimate-2018-3-released/">выпустила</a> последнее в этом году мажорное обновление семейства дополнений для .NET-инструментов ReSharper Ultimate. В частности, редактор кода ReSharper получил автоматическое аннотирование аргументов и определение формата кода, а также поддержку TypeScript 3.0 и раннюю — Visual Studio 2019.</p><h3>Новое в ReSharper</h3><p>При вызове методов редактор кода теперь <a href="https://blog.jetbrains.com/dotnet/2018/11/27/inline-parameter-name-hints-c-vb-net-resharper-rider/">аннотирует</a> значение аргумента именем параметра. Это позволяет лучше понять, за что именно оно отвечает. К примеру, сложно понять, в чём смысл аргументов в вызове:</p><p>Редактор отображает для этих значений имена параметров:</p><figure><img src="https://media.tproger.ru/uploads/2018/12/xmldoc-on-hover1.png" alt="" /></figure><p>Разработчики <a href="https://blog.jetbrains.com/dotnet/2018/12/05/detection-code-styles-naming-resharper/">настроили</a> автоматическое определение и «выравнивание» формата кода. Инструмент доступен в меню ReSharper &gt; Edit &gt; Detect formatting settings. Кроме того, появилось автоопределение стиля используемых имён. Обычно ReSharper придерживается <a href="https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines">правил именования</a>, предложенных Microsoft. Однако теперь, если разработчик отклоняется от них, редактор сам подстраивается под новые принципы и не отображает предупреждения о несоответствии имён.</p><p>Для упрощения юнит-тестирования команда JetBrains добавила набор методов проверки кода с быстрыми правками и подсказками дальнейших действий в зависимости от контекста. Чтобы ReSharper соответствовал стандартам обработки информации (<a href="https://ru.wikipedia.org/wiki/%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D1%8B_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8">FIPS</a>, США), разработчики отказались от алгоритма хеширования md5 и ликвидировали все случаи его использования в коде редактора.</p><p>Что поддерживает ReSharper 2018.3:</p><ul><li>Интеграцию с Visual Studio 2019 Preview 1. Полная поддержка будет доступна после официального релиза IDE.</li><li><a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.1">Новую процедуру локализации</a> в ASP.NET Core.</li><li>Улучшенную работу деконструкторов в C# 7.</li><li>NET 15.3 и 15.5.</li><li>TypeScript 3.0.</li></ul><h3>Новое в ReSharper Ultimate</h3><ul><li><a href="https://www.jetbrains.com/resharper-cpp/whatsnew">ReSharper C++</a>: улучшены рефакторинг кода, поддержка C++/CLI, работа команд Go to Declaration и Search Everywhere, обнаружение ошибок в шаблонах.</li><li><a href="https://www.jetbrains.com/dotcover/whatsnew/">dotCover</a>: улучшена система фильтров. Теперь они разбиты на две группы — фильтры среды выполнения и фильтры результатов.</li><li><a href="https://www.jetbrains.com/profiler/whatsnew/">dotTrace</a>: добавлена интеграция инструмента в JetBrains Rider. Теперь можно настраивать и запускать сессии профайлинга, делать снапшоты и анализировать их во встроенном инструменте просмотра.</li><li><a href="https://www.jetbrains.com/dotmemory/whatsnew/">dotMemory</a>: добавлено новое условие для получения снапшота — если объём используемой памяти превысит определённое количество мегабайтов.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/12/snapshot_by_condition1.png" alt="" /></figure><ul><li><a href="https://www.jetbrains.com/decompiler/whatsnew/">dotPeek</a>: добавлена поддержка декомпиляции большего количества функций C# 7.x и копирования в буфер обмена полного имени (<a href="https://en.wikipedia.org/wiki/Fully_qualified_name">fully qualified name</a>, FQN) символа.</li></ul><p>Подробное описание нововведений доступно <a href="https://www.jetbrains.com/resharper/whatsnew/#v2018-3">на странице What’s New</a> в блоге .NET Tools.</p><p>Предыдущая версия ReSharper Ultimate <a href="https://tproger.ru/news/resharper-ultimate-2018-2/">вышла</a> в августе. ReSharper получил поддержку C# 7.3, проверку правописания с ReSpeller и встроенные инструменты для анализа кода на JS/TS.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фонд .NET объявил о новых принципах существования сообщества</title>
      <link>https://tproger.ru/news/net-foundation-changes</link>
      <comments>https://tproger.ru/news/net-foundation-changes?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Штукатуров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/net-foundation-changes</guid>
      <description><![CDATA[<p>Заявку на членство в фонде .NET может подать любой участник, вложившийся в развитие платформы; совет директоров вырос с трёх до семи человек.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/net-foundation-changes">Фонд .NET объявил о новых принципах существования сообщества</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Dec 2018 10:57:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>На официальном сайте фонда .NET опубликована информация об изменениях в порядке членства и организации выборов. Фонд вводит открытое членство и расширяет состав совета директоров. Техническая управляющая группа также реорганизована с включением новых участников. Изменения в организации фонда .NET отражают растущее число разработчиков, принимающих участие в совершенствовании платформы.</p><h3>Подробности о членстве и выборах</h3><p>Новая структура вдохновлена принципами фонда GNOME и включает следующие элементы:</p><ul><li>Подать заявку на вступление в фонд может человек или организация, внёсшие вклад в развитие .NET. Под вкладом понимается работа над кодом, документацией или другие улучшения.</li><li>После одобрения заявки участнику сообщат о действиях, необходимых для завершения процедуры. Стандартный ежегодный членский взнос составляет 100 долларов, однако фонд может сделать исключения из этого правила для студентов и участников с финансовыми затруднениями.</li><li>Каждый действительный член .NET имеет право баллотироваться на ежегодных выборах в совет директоров;</li><li>Каждый участник организации имеет право голосовать на выборах. Выборы организуются на платформе <a href="https://www.opavote.com/">OpaVote</a>.</li></ul><p>Первые выборы пройдут уже в январе 2019 года.</p><h3>Совет директоров</h3><p>Состав совета директоров расширен с трёх до семи участников, один из которых назначается Microsoft, а остальные избираются членами фонда. Microsoft уже назвала своего представителя. Это Бета Масси (Beth Massi), принимавшая участие в развитии фонда с самого его появления в 2014 года.</p><h3>Программа корпоративных спонсоров</h3><p>Техническая управляющая группа реорганизована и теперь называется программой корпоративных спонсоров. Помимо прежних участников, Red Hat, JetBrains, Google, Unity, Microsoft и Samsung, в неё вошли <a href="https://content.pivotal.io/blog/you-re-investing-in-net-and-so-are-we-pivotal-is-now-a-corporate-sponsor-of-the-net-foundation">Pivotal</a>, <a href="https://www.telerik.com/blogs/progress-announces-support-visual-studio-2019-net-core-3-net-foundation-more">Progress Telerik</a> и Insight. Руководство фонда .NET предлагает обсудить возможность участия в программе всем заинтересованным в развитии платформы компаниям.</p><p>Будучи важным элементов развития платформ с открытым исходным кодом, фонды, объединяющие участников проектов, постоянно развиваются, совершенствуя свою структуру. Так, в октябре 2018 года Node.js Foundation и JS Foundation <a href="https://tproger.ru/news/nodejs-javascript-union/">объявили</a> о намерении объединиться.</p>]]></content:encoded>
    </item>
    <item>
      <title>Введение в делегаты C#</title>
      <link>https://tproger.ru/translations/dotnet-delegates</link>
      <comments>https://tproger.ru/translations/dotnet-delegates?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Corewood]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/dotnet-delegates</guid>
      <description><![CDATA[<p>Делегат в C# — референсный тип, который инкапсулирует метод с определённой сигнатурой и работает как аналог функциональных указателей из C и C++.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/dotnet-delegates">Введение в делегаты C#</a>»</p>]]></description>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 08 Nov 2018 17:37:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Делегаты в C# подобны функциональным указателям в C или C++. Они объявляются в качестве объектов, содержащих адрес метода. Делегаты — референсный класс, инкапсулирующий метод со специфичной сигнатурой и типом возвращаемого значения.</p><blockquote>«Делегат ссылается на метод и после назначения метода ведёт себя идентично ему. Делегат можно использовать как любую функцию с параметром и возвращаемым значением», — официальная документация MSDN.</blockquote><p>Несмотря на то, что .NET использует концепцию функционального указателя посредством делегатов, есть несколько существенных отличий:</p><ul><li>делегаты нечувствительны к ошибкам ввода;</li><li>объектно-ориентированы;</li><li>безопасны.</li></ul><p>Делегаты C# обладают следующими свойствами:</p><ul><li>позволяют обрабатывать методы в качестве аргумента;</li><li>могут быть связаны вместе;</li><li>несколько методов могут быть вызваны по одному событию;</li><li>тип делегата определяется его именем;</li><li>не зависят от класса объекта, на который ссылается;</li><li>сигнатура метода должна совпадать с сигнатурой делегата.</li></ul><h2>Синтаксис</h2><p>Шаг 1 — Объявление</p><p>Шаг 2 — Инициализация</p><p>Делегат инициализируется путём передачи ему имени метода в качестве аргумента.</p><p>Шаг 3 — Вызов</p><p>Вызываем созданный делегат с указанием параметров, если это необходимо.</p><h2>Пример 1</h2><p>Нижеприведённый код складывает между собой два числа:</p><p>Выводом будет следующий результат:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/Delegate20Example1.jpg" alt="" /></figure><h2>Пример 2</h2><p>Теперь рассмотрим реализацию сортировки «пузырьком» с помощью делегатов. Для этого мы создадим несколько классов:</p><ul><li>BubbleSortClass</li><li>Student</li><li>Program</li></ul><h3>BubbleSortClass.cs</h3><p>Этот класс будет содержать статическую функцию Sort(), у которой нет возвращаемого значения. В качестве аргумента она принимает массив, который будет отсортирован путём сравнивания пар элементов.</p><h3>Student.cs</h3><p>Объект этого класса и будет использован для сортировки.</p><h3>Program.cs</h3><p>Код основной программы. Здесь создаётся делегат и выводится отсортированный массив.</p><h2>Мультикаст-делегаты</h2><p>Делегаты, включающие в себя более одного метода, называются мультикаст-делегатами. При вызове они выполняют каждый метод в заданном порядке, позволяя таким образом связывать несколько методов в цепочку.</p><p>Для работы мультикаст-делегатов те не должны возвращать какой-либо результат. В противном случае обработается результат последнего метода цепочки.</p><h3>Пример 3</h3><p>Пример использования мультикаст-делегата для вывода приветствия:</p><figure><img src="https://media.tproger.ru/uploads/2018/10/Multicast20Delegate1.jpg" alt="" /></figure><h3>Пример 4</h3><p>Данный код умножает полученное число на два и возводит его же в квадрат:</p><h2>Типы делегатов</h2><h3>System.Delegate</h3><p>Смысл примерно тот же, что и у указателей на методы в C++. Однако, в C# делегаты не используют указатели, а сохраняют метаданные, определяющие целевой метод для последующего вызова. Также System.Delegate содержит экземпляр класса System.Reflection.MethodInfo — метаданные .NET для вызова метода через отражения.</p><p>Ещё одним важным аспектом System.Delegate является экземпляр объекта, для которого вызывается метод. При наличии неограниченного числа объектов с необходимой сигнатурой нам также нужно определить, какому именно объекту его назначить. Исключение — использование статичного метода, определённого MetodInfo, ведь в таком случае ссылка на объект вернёт null.</p><h3>System.MulticastDelegate</h3><p>Этот тип делегатов позволяет использовать их для нескольких объектов. Это возможно благодаря тому, что делегаты типа System.MulticastDelegate содержат в себе экземпляр этого же класса, который создаётся при назначении объекта предыдущему. Новый экземпляр получает ссылку на следующий объект списка экзепляров делегатов. Таким образом, System.MulticastDelegate поддерживает связанный список объектов для делегатов.</p><h3>Цепочка делегатов</h3><p>При вызове мультикаст-делегатов каждый экземпляр в цепочке вызывается последовательно. Однако это может обернуться проблемой, если в одном из экземпляров сработало исключение или он вернул результат не void-типа.</p><h2>Заключение</h2><p>Итак, в данной статье были рассмотрены базовые принципы работы делегатов на C#, а также примеры их реализации для использования в реальных кейсах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft представила .NET Standard 2.1</title>
      <link>https://tproger.ru/news/microsoft-net-standard-21</link>
      <comments>https://tproger.ru/news/microsoft-net-standard-21?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Галадей]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-net-standard-21</guid>
      <description><![CDATA[<p>В спецификацию общих интерфейсов для .NET Framework, .NET Core, Mono и Xamarin добавят около трёх тысяч API и решения для высоких нагрузок.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-net-standard-21">Microsoft представила .NET Standard 2.1</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Nov 2018 10:13:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики Microsoft <a href="https://blogs.msdn.microsoft.com/dotnet/2018/11/05/announcing-net-standard-2-1/">обновили</a> .NET Standard до версии 2.1, добавив в него ряд улучшений и большое количество API. .NET Standard — это набор спецификаций общих интерфейсов для платформ .NET Framework, .NET Core, Mono, Xamarin и других. Библиотека, удовлетворяющая спецификациям .NET Standard, может использоваться на остальных платформах .NET.</p><h3>Главные изменения</h3><p>Основные новшества в .NET Standard 2.1:</p><ul><li>Добавлена поддержка типа данных Span для всех платформ. Span позволяет работать со строками, массивами и другими типами данных, а также вводит абстракцию доступа к некоторому участку памяти как на чтение, так и на запись. Это позволит упростить разработку. Вообще, Span лежит в основе большинства улучшений, касающихся производительности в .NET Core 2.1. Подробнее об этом можно <a href="https://github.com/dotnet/standard/milestone/3">узнать</a> в GitHub.</li><li>Foundational-API — обновление стандарта, касающееся производительности. Оно, в отличие от Span, расширяет список именно программных интерфейсов, а не типов данных.</li><li>Обновлён тип ValueTask для высоконагруженных сценариев. ValueTask возвращает результат, если операция выполнена синхронно без создания новой задачи, что отражается на общей производительности ПО. Использование ValueTask позволяет минимизировать накладные расходы на ПК или сервер. Сам тип появился в .NET Core 2.1, а в новой версии он дополнительно использует такие типы, как Socket и NetworkStream.</li><li>Reflection emit добавляет технологию генерации типов на лету. Отдельно она уже использовалась, но теперь её включили в стандарт. Экосистема .NET обычно активно использует динамические функции, поэтому Reflection emit позволяет оптимизировать производительность системы.</li><li>Ранее используемый API SIMD теперь внесён в .NET Standard в пакет NuGet.</li><li>Появился примитив DbProviderFactories. Он облегчает библиотекам и приложениям использование технологии ADO.NET. Зарегистрированный экземпляр DbProviderFactory выбирается по имени из параметров конфигурации базы данных.</li><li>Добавлены функции System.HashCode и System.String в библиотеки базовых классов.</li></ul><p>В .NET Standard 2.1 планируется добавить около 3 тысяч API, часть которых будут просто обновлены, а другие полностью новыми. Это решит проблему совместного использования кода для разработчиков .NET на всех платформах.</p><h3>Использование .NET Standard 2.1</h3><p>Новую версию стандарта не планируют использовать в .NET Framework 4.8, который продолжит работать на версии 2.0. А вот .NET Core 3.0, Xamarin, Mono и Unity обновят до версии 2.1. При этом обновление всех библиотек не планируется, во всяком случае сейчас.</p><p>В июне 2018 года Microsoft <a href="https://tproger.ru/news/release-dot-net-core-2-1/">представила</a> .NET Core 2.1 с поддержкой Alpine Linux версии 3.7 и выше, а также чипов ARM32. А в августе 2018 года компания <a href="https://tproger.ru/news/windows-community-toolkit-4/">обновила</a> Windows Community Toolkit до версии 4.0. Одним из нововведений стал перевод Twitter, LinkedIn, Microsoft Translator и других веб-сервисов на пакеты .NET Standard.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft выпустила руководства для авторов библиотек .NET</title>
      <link>https://tproger.ru/news/microsoft-dotnet-libraries-guides</link>
      <comments>https://tproger.ru/news/microsoft-dotnet-libraries-guides?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Артем Гаврилов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-dotnet-libraries-guides</guid>
      <description><![CDATA[<p>Публикация рекомендаций по созданию библиотек .NET снабжена пояснениями к каждому пункту, а от сообщества открытого кода компания ждёт обратной связи.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-dotnet-libraries-guides">Microsoft выпустила руководства для авторов библиотек .NET</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Oct 2018 08:20:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft <a href="https://blogs.msdn.microsoft.com/dotnet/2018/10/15/guidance-for-library-authors/">рассказала</a> в блоге <a href="https://docs.microsoft.com/ru-ru/dotnet/standard/library-guidance/">о публикации</a> рекомендаций для разработчиков библиотек .NET. Слова «нужно», «учесть», «избегать», «не нужно» дополняют рекомендации в каждой статье. Компания ожидает от сообщества Open Source обратной связи и, по её словам, готова идти навстречу для поиска совместных решений.</p><h3>Качество — превыше всего</h3><p>Разработчики Microsoft надеются, что новые библиотеки будут обладать следующими качествами:</p><ul><li>Содержательность. По мнению сотрудников Microsoft, хорошая библиотека .NET поддерживает большинство платформ и приложений.</li><li>Стабильность. Они сосуществуют в экосистеме .NET и запускаются в приложениях с другими библиотеками.</li><li>Развитие. Разработчики библиотек совершенствуют их и обеспечивают поддержку пользователей.</li><li>Отладка. Подобная библиотека включает последние инструменты отладки.</li><li>Надёжность. Они надёжны и публикуются в NuGet с учётом мер по обеспечению безопасности.</li></ul><p>В середине октября 2018 года <a href="https://tproger.ru/news/microsoft-security-patch/">стало</a> известно, что специалистам Microsoft не удалось полностью исправить уязвимость в JET. О ней <a href="https://tproger.ru/news/windows-jet-vulnerability/">сообщили</a> специалисты Trend Micro Zero Day Initiative в сентябре 2018 года. Уязвимость в составе СУБД Microsoft Jet Database Engine затрагивала все актуальные версии ОС Windows. Проблему решили за счёт неофициального патча, а затем, в рамках «вторника обновлений», выпустили и официальный. Но специалисты Acros Security утверждают, что его эффективность не слишком высока.</p>]]></content:encoded>
    </item>
    <item>
      <title>JetBrains выпустила Rider 2018.2</title>
      <link>https://tproger.ru/news/rider-2018-2-release</link>
      <comments>https://tproger.ru/news/rider-2018-2-release?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rider-2018-2-release</guid>
      <description><![CDATA[<p>Обновление среды принесло новый алгоритм автозавершения кода, поддержку Docker в отладчике, проверку правописания и работу с MacBook Touch Bar.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rider-2018-2-release">JetBrains выпустила Rider 2018.2</a>»</p>]]></description>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Aug 2018 20:50:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда JetBrains <a href="https://blog.jetbrains.com/dotnet/2018/08/23/rider-2018-2-released/">обновила</a> свою кроссплатформенную среду для .NET-разработки Rider до версии 2018.2. В новом выпуске появилась поддержка Docker для отладчика, встроенная проверка правописания, покрытие кода unit-тестами и возможность работы с MacBook Touch Bar.</p><h3>Что нового в Rider 2018.2</h3><ul><li>В отладчик добавлена поддержка Docker, усовершенствовано отображение стека вызовов, а также точек останова для каждого из потоков в случае многопоточного кода.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-23.-rider-2018.2_1.png" alt="" /></figure><ul><li>Реализованы две новые конфигурации запуска: Publish to IIS и Publish to custom server — для развертывания созданного в ASP.NET Core веб-приложения на локальном или удаленном сервере.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-23.-rider-2018.2_2.png" alt="" /></figure><ul><li>Усовершенствовано автозавершение кода с помощью основанного на статистике алгоритма. Кроме того, Rider обращает внимание, насколько часто пользователь использует его подсказки, и в зависимости от обратной связи вносит поправки.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-23.-rider-2018.2_3.gif" alt="" /></figure><ul><li>В настройки IDE добавлена возможность создавать шаблоны, а также редактировать и управлять ими через Editor | Live Templates и Editor | File Templates.</li><li>Проведен редизайн обозревателя решений: появилась новая панель инструментов с иконками для отображения всех файлов, синхронизации обозревателя и редактора и еще несколько новых навигационных кнопок.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-23.-rider-2018.2_4.png" alt="" /></figure><ul><li>Обновлена macOS-версия: добавлены поддержка MacBook Touch Bar, новые иконки и темная тема для заголовков окон.</li><li>Интеграция с Unity: реализована поддержка файлов .asmdef и csc.rsp, функция отключения Unity Reload Assembles в Play mode, исправление недействительного предупреждения this == null, а также улучшенная поддержка для удаленной отладки.</li><li>Вместе с интеграцией с dotCover среда получила покрытие кода unit-тестами и поддержку непрерывного тестирования (только для Windows-версии).</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-23.-rider-2018.2_5.png" alt="" /></figure><ul><li>Добавлен плагин ReSpeller для проверки правописания в идентификаторах, комментариях и строковых литералах, а также для быстрого исправления обнаруженной ошибки. Кроме того, реализована поддержка C# 7.3, экспериментального проекта Blazor и другие возможности <a href="https://tproger.ru/news/resharper-ultimate-2018-2/">ReSharper 2018.2</a>.</li><li>Появились новые возможности для фронтенд-разработки: поддержка TypeScript версий 2.9 и 3.0, улучшенная интеграция с React, Angular и Vue.js.</li><li>В содержание контекстного меню C# Interactive добавлена опция Reference, а кроме того, обновлена поддержка F# и NuGet.</li></ul><p>Полный список изменений доступен на странице <a href="https://www.jetbrains.com/rider/whatsnew/#v2018-2-c-interactive-update">What’s New</a> в блоге, посвященному IDE Rider.</p><p>В августе 2018 года также <a href="https://tproger.ru/news/resharper-ultimate-2018-2/">вышла</a> новая версия целого семейства инструментов для .NET-разработки — ReSharper Ultimate 2018.2. В него входит обновление RеSharper, которое получило поддержку C# 7.3, встроенную проверку правописания и несколько новых возможностей для навигации.</p>]]></content:encoded>
    </item>
    <item>
      <title>JetBrains обновила ReSharper Ultimate до версии 2018.2</title>
      <link>https://tproger.ru/news/resharper-ultimate-2018-2</link>
      <comments>https://tproger.ru/news/resharper-ultimate-2018-2?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/resharper-ultimate-2018-2</guid>
      <description><![CDATA[<p>Релиз семейства .NET-инструментов принёс ReSharper поддержку C# 7.3, встроенную проверку правописания и новые возможности навигации по коду.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/resharper-ultimate-2018-2">JetBrains обновила ReSharper Ultimate до версии 2018.2</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Aug 2018 11:45:33 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда JetBrains <a href="https://blog.jetbrains.com/dotnet/2018/08/21/resharper-ultimate-2018-2-hits-rtm/">объявила</a> о релизе новой версии семейства дополнений .NET-инструментов — ReSharper Ultimate 2018.2. В частности, обновление RеSharper <a href="https://www.jetbrains.com/resharper/whatsnew/">получило</a> поддержку C# 7.3, встроенную проверку правописания и несколько новых возможностей для навигации.</p><h3>Что нового в ReSharper?</h3><ul><li>Повышение производительности: разработчики внесли около 30 исправлений для увеличения эффективности работы с инструментом.</li><li>Поддержка C# 7.3.</li><li>Встроенные инструменты для анализа JavaScript/TypeScript-кода: JSLint, ESLint и TSLint.</li><li>Встроенная проверка правописания с ReSpeller в идентификаторах, комментариях и строковых литералах.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-22.-ReSharper_1.png" alt="" /></figure><ul><li>Поддержка проекта Blazor — это написанный на .NET экспериментальный одностраничный фреймворк для веб-приложений, который запускается в браузере с WebAssembly.</li><li>Несколько новых инструментов для навигации, включая возможность исключить из поиска файлы по определенной маске.</li><li>Дополнения для IntelliSense: различение по цвету информации о параметре и возвращаемых значениях в всплывающем окне.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-22.-ReSharper_2.png" alt="" /></figure><ul><li>Обновленный пользовательский интерфейс для рефакторинга.</li></ul><h3>Что нового в других инструментах?</h3><p>Помимо ReShаrper, семейство инструментов включает в себя ReShаrper C++, dotMemory, dotTrace, dotCover и dotPeek.</p><ul><li><a href="https://www.jetbrains.com/resharper-cpp/whatsnew/">ReSharper C++</a>: поддержка C++/CLI, C++17 и C++20.</li><li><a href="https://www.jetbrains.com/dotcover/whatsnew/">dotCover</a>: интеграция с JetBrains Rider IDE и использование внутреннего инструмента для запуска из командной строки в качестве расширения для dotnet.exe.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-22.-ReSharper_3.png" alt="" /></figure><ul><li><a href="https://www.jetbrains.com/profiler/whatsnew/">dotTrace</a>: улучшение производительности и фильтр .NET-процессов.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-22.-ReSharper_4.png" alt="" /></figure><ul><li><a href="https://www.jetbrains.com/dotmemory/whatsnew/">dotMemory</a>: профилирование конфигураций запуска проекта и улучшенный временной график распределения памяти.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/2018-08-22.-ReSharper_5.png" alt="" /></figure><ul><li><a href="https://www.jetbrains.com/decompiler/whatsnew/">dotPeek</a>: улучшенная поддержка типов с методами без реализации.</li></ul><p>Незадолго до релиза ReSharper Ultimate 2018.2 <a href="https://tproger.ru/news/vs-2017-15-8-released/">вышла</a> версия Microsoft Visual Studio 2017 15.8. Она получила новый инструмент для отслеживания размещения в памяти каждого .NET-объекта, профиль для раскладки клавиатуры ReSharper, а также дополнительные функции в окне Go To All.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft обновила Windows Community Toolkit до версии 4.0</title>
      <link>https://tproger.ru/news/windows-community-toolkit-4</link>
      <comments>https://tproger.ru/news/windows-community-toolkit-4?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Морозова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/windows-community-toolkit-4</guid>
      <description><![CDATA[<p>Microsoft анонсировала четвёртую версию Windows Community Toolkit после миллиона загрузок; обновление включает элемент управления DataGrid.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/windows-community-toolkit-4">Microsoft обновила Windows Community Toolkit до версии 4.0</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Aug 2018 13:13:51 GMT</pubDate>
      <content:encoded><![CDATA[<p>В своем блоге Microsoft <a href="https://blogs.windows.com/buildingapps/2018/08/08/announcing-windows-community-toolkit-v4-0/">анонсировала</a> 4-ю версию Windows Community Toolkit. Обновление произошло после недавнего достижения сообществом одного миллиона загрузок во всех пакетах NuGet. Подробнее ознакомиться с выпуском можно на <a href="https://github.com/Microsoft/WindowsCommunityToolkit/releases">странице</a> Windows Community Toolkit в GitHub.</p><h3>Основные обновления</h3><ul><li>Добавлен DataGrid с плавным дизайном для всех разработчиков.</li><li>Добавлены новые элементы управления Microsoft Graph: PlannerTaskList и PowerBIEmbedded.</li><li>Twitter, LinkedIn и Microsoft Translator перешли на пакеты .NET Standard.</li><li>Реализована поддержка темной темы для примеров приложений, а также выбор тем для каждого образца.</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/08/a50f5b37a049312300548b30923da89d-1024x626.jpg" alt="" /></figure><h3>Контроль DataGrid</h3><p>DataGrid — элемент управления, который позволяет свободно отображать данные в строках и столбцах. Он сохраняет модель программирования для DataGrid от Silverlight и WPF. Поэтому разработчики теперь могут создавать чёткую таблицу данных, редактировать её, проверять данные и функции их формирования с помощью простого кода в Windows 10.</p><p>О всех возможностях контроля DataGrid можно прочесть в <a href="https://docs.microsoft.com/en-us/windows/communitytoolkit/controls/datagrid">документации</a>, включающей в себя примеры кода.</p><h3>Новый Microsoft Graph</h3><p>В Toolkit v3.0 была введена новая категория управления UWP, что позволяет разработчикам иметь доступ к Microsoft Graph, а именно: добавлять пользовательский интерфейс, искать сотрудников и друзей, просматривать SharePoint и многое другое. В версии 4.0 теперь появились два новых элемента управления: PlannerTaskList и PowerBIEmbedded.</p><p>PlannerTaskList позволяет разработчикам интегрировать задачи в приложения и разрешать пользователям взаимодействовать с задачами Microsoft Planner.</p><figure><img src="https://media.tproger.ru/uploads/2018/08/bd25ebabfa7a97657a7330784602f813-1024x738.jpg" alt="" /></figure><p>PowerBIEmbedded позволяет разработчикам встраивать виджет PowerBI в приложения и позволяет пользователям взаимодействовать с данными.</p><h3>Перемещение Twitter, LinkedIn и Microsoft Translator в .NET Standard</h3><p>Windows Community Toolkit содержит API, которые упрощают работу с веб-сервисами Twitter, OneDrive, LinkedIn, Microsoft Graph и другими. С обновлениями большинство служб перешли к пакету .NET Standard (Microsoft.Toolkit.Services), и теперь они доступны для фреймворков.</p><p>Microsoft регулярно занимается обновлениями. Еще в июне 2018 года компания <a>анонсировала</a> версию Windows Community Toolkit 3.0 с новыми пакетами и API.</p>]]></content:encoded>
    </item>
    <item>
      <title>Компания Microsoft выпустила июльское обновление .NET Core</title>
      <link>https://tproger.ru/news/microsoft-released-net-core-update</link>
      <comments>https://tproger.ru/news/microsoft-released-net-core-update?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Сергей Штукатуров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-released-net-core-update</guid>
      <description><![CDATA[<p>Обновление охватывает .NET Core 1.0.12, 1.1.9, 2.0.9 и 2.1.2: закрыты уязвимости ASP.NET Core, включая атаку по отказу в обработке запроса.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-released-net-core-update">Компания Microsoft выпустила июльское обновление .NET Core</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Asp.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Jul 2018 09:43:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания Microsoft выложила в открытый доступ обновление .NET Core. Оно охватывает .NET Core 1.0.12, .NET Core 1.1.9, .NET Core 2.0.9 и .NET Core 2.1.2.</p><h3>Ключевые изменения .NET Core</h3><p>Microsoft акцентировала внимание на решении проблем с безопасностью. Устранены некоторые уязвимости в ASP.NET Core. Исправлена <a href="https://github.com/aspnet/Announcements/issues/311">ошибка при прерывании неверного запроса</a>, позволявшая злоумышленнику реализовать атаку по отказу в обработке. Помимо этого, компания составила руководство для разработчиков, в продуктах которых присутствует эта уязвимость.</p><p>Устранена ошибка, позволявшая производить <a href="https://github.com/aspnet/Announcements/issues/310">бесконечное количество попыток авторизации</a>. Уязвимость делала продукт неустойчивым к брутфорсу. Теперь приложение будет считать количество попыток аутентификации.</p><p>В ASP.NET Core исправлена <a href="https://github.com/dotnet/announcements/issues/73">ошибка в обработке сертификатов</a>, позволявшая предъявлять по запросу данные с истекшим сроком.</p><p><a href="https://www.microsoft.com/net/download/all">Скачать</a> обновление можно на сайте Microsoft.</p><p>Напомним, NET Core 2.1 <a href="https://tproger.ru/news/release-dot-net-core-2-1/">вышла</a> в конце мая 2018 года, и Microsoft регулярно дорабатывает эту платформу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Проведено сравнение производительности WordPress-проекта на PHP и на .NET - Peachpie</title>
      <link>https://tproger.ru/news/wordpress-benchmarking-php-vs-dotnet</link>
      <comments>https://tproger.ru/news/wordpress-benchmarking-php-vs-dotnet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Семён Алексин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wordpress-benchmarking-php-vs-dotnet</guid>
      <description><![CDATA[<p>Компания Peachpie, занимающаяся разработкой инструмента для переноса PHP на .NET провела сравнение быстродействия сайта написанного на чистом PHP и с использованием технологий .NET — как оказалось, на .NET сайты работают быстрее.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wordpress-benchmarking-php-vs-dotnet">Проведено сравнение производительности WordPress-проекта на PHP и на .NET - Peachpie</a>»</p>]]></description>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jan 2018 20:31:04 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Результаты тестирования</h3><p>Для сравнения быстродействия были установлены четыре клиента, отсылающие одновременно 128 запросов на главную страницу сайта. При этом использовалась WordPress 4.7, MySQL и две платформы: .NET Core 2.0 и Apache с PHP 7.2.</p><p>Из полученных данных выясняется, что на весь тест Peachpie потратил всего 7,7 секунд, в то время как у PHP на это ушло целых 11,7 секунд. Общее значение быстродействия у Peachpie составило 833,34 кбит/с, а у PHP — 593,94 кбит/с. Два значения, играющие основную роль в исследовании — это requests per second и time per request — сколько запросов обработал сервер за секунду, и сколько времени у него ушло на один запрос. Как оказалось, Peachpie смог обработать примерно 16 запросов за одну секунду, против 11 запросов у PHP. А 60,414 мс потраченного в среднем на один запрос времени у .NET превосходит 84,992 мс/запрос у Apache. Следующие графики визуализируют эти данные:</p><figure><img src="https://media.tproger.ru/uploads/2018/01/php-vs-dotnet-first-test1.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2018/01/php-vs-dotnet-second.png" alt="" /></figure><p>Следуя информации, полученной на графиках, Peachpie обрабатывает на 40 % больше запросов в секунду, да и делает это на 40 % быстрее, чем PHP. Но и это не окончательный результат, ведь исследователи не брали в расчет оптимизацию кода и тому подобные детали. Для полноты картины рассмотрим также различные типы страниц в WordPress и различные уровни параллелизма, используя те же методы:</p><figure><img src="https://media.tproger.ru/uploads/2018/01/main-page-requests.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2018/01/post-to-blog-requests.png" alt="" /></figure><p>Как видно из графиков, Peachpie работает быстрее Apache, причем с уменьшением параллелизма возрастает разница в производительности. Так, при одном пользователе .NET работает почти в два раза быстрее.</p><p>Мы не считаем себя экспертами в проведении бенчмарков, и в наших методах могут быть изъяны. Тестирование проводилось исключительно на платформе Windows, а не на каких-нибудь особенных дистрибутивах Linux с особенным ПО. К тому же, мы не настраивали PHP и не устанавливали opcache. Настроенный PHP будет работать гораздо быстрее, чем тот, что в примере. Однако, мы и не оптимизировали наш код на Peachpie.</p><h3>Выводы</h3><p>Приведенные выше тесты показали, что PHP может хорошо показать себя при работе с .NET. Однако эти цифры не являются окончательными. Разработчикам еще предстоит хорошо поработать над оптимизацией производительности Peachpie. К тому же, существует ряд настроек, которые исследователи опустили при тестировании и которые могли бы ускорить работу Apache. Однако, уже эти тесты показали, что Peachpie вполне работоспособная платформа, которую после ряда улучшений веб-разработчики смогут использовать в своих проектах бок о бок с .NET.</p>]]></content:encoded>
    </item>
    <item>
      <title>.NET Framework 4.7 теперь доступен для всех поддерживаемых версий Windows</title>
      <link>https://tproger.ru/news/announcing-the-net-framework-4-7</link>
      <comments>https://tproger.ru/news/announcing-the-net-framework-4-7?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/announcing-the-net-framework-4-7</guid>
      <description><![CDATA[<p>Общедоступное обновление .NET Framework 4.7 после Windows 10 Creators Update можно установить на другие поддерживаемые версии Windows.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/announcing-the-net-framework-4-7">.NET Framework 4.7 теперь доступен для всех поддерживаемых версий Windows</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 03 May 2017 19:59:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня Microsoft выпустила общедоступное обновление .NET Framework 4.7. Новая версия фреймворка была выпущена в рамках обновления Windows 10 Creators Update месяц назад. Теперь же её можно установить и на другие версии Windows.</p><h3>Что нового в .NET Framework 4.7 ?</h3><p>Обновление содержит следующие улучшения:</p><ul><li>Поддержка высокого DPI в приложениях на базе Windows Forms в Windows 10;</li><li>Поддержка Touch для WPF-приложений в Windows 10;</li><li>Расширенная поддержка криптографии.</li><li>Поддержка C# 7 и VB 15, включая ValueTuple.</li><li>Поддержка .NET Standard 1.6.</li><li>Повышение производительности и надежности.</li></ul><p>Информацию о каждом из этих улучшений можно найти в <a href="https://blogs.msdn.microsoft.com/dotnet/2017/04/05/announcing-the-net-framework-4-7/">обзоре обновления</a>, а полный список изменений — <a href="https://github.com/Microsoft/dotnet/blob/master/releases/net47/README.md">в примечаниях к выпуску</a> на GitHub.</p><h3>Для каких версий Windows доступен фреймворк?</h3><p>.NET Framework 4.7 поддерживается в следующих версиях Windows:</p><ul><li>Windows 10 Creators Update (из коробки);</li><li>Windows 10 Anniversary Update;</li><li>Windows 8.1;</li><li>Windows 7 SP1;</li><li>Windows Server 2016;</li><li>Windows Server 2012 R2;</li><li>Windows Server 2012;</li><li>Windows Server 2008 R2 SP1.</li></ul><p>Вы можете скачать <a href="https://www.microsoft.com/en-us/download/details.aspx?id=55170">онлайн-</a> или <a href="https://www.microsoft.com/en-us/download/details.aspx?id=55167">офлайн-установщик</a> обновления с официального сайта.</p>]]></content:encoded>
    </item>
    <item>
      <title>.NET Core теперь доступен для Raspberry Pi</title>
      <link>https://tproger.ru/news/dotnet-for-pi</link>
      <comments>https://tproger.ru/news/dotnet-for-pi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/dotnet-for-pi</guid>
      <description><![CDATA[<p>ARM32-версия .NET Core появилась на GitHub: над портированием кроссплатформенного фреймворка на IoT-платформы работают Samsung, Microsoft и сообщество.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/dotnet-for-pi">.NET Core теперь доступен для Raspberry Pi</a>»</p>]]></description>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Mar 2017 19:19:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Не секрет, что компания Microsoft постепенно заменяет свои проприетарные технологии .NET на открытый кроссплатформенный фреймворк .NET Core. В то время, как она работает над поддержкой крупных систем, таких как Windows, macOS и Linux, Open Source сообщество портирует .NET Core на IoT-платформы, в том числе и на Raspberry Pi 2 и 3.</p><p>На этой неделе <a href="http://www.cio.com/article/3179218/application-development/microsofts-net-core-slowly-marches-onto-raspberry-pi-3.html">стало известно</a>, что на GitHub появилась ARM32-версия .NET Core. Над <a href="https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md">этой реализацией</a> работают Samsung, Microsoft, а также сторонние разработчики. Вероятно, фреймворк также будет поддерживаться и Tizen, операционной системой Samsung.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google входит в команду .NET Foundation, а Samsung вводит поддержку .NET для ОС Tizen</title>
      <link>https://tproger.ru/news/google-and-samsung-dotnet</link>
      <comments>https://tproger.ru/news/google-and-samsung-dotnet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Мингалеев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/google-and-samsung-dotnet</guid>
      <description><![CDATA[<p>На конференции Connect() компания Microsoft объявила о вступлении Google в группу технического надзора .NET Foundation и о поддержке .NET в Tizen.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/google-and-samsung-dotnet">Google входит в команду .NET Foundation, а Samsung вводит поддержку .NET для ОС Tizen</a>»</p>]]></description>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Nov 2016 19:45:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня в Нью-Йорке Microsoft провела ежегодную конференцию для разработчиков, <a href="https://tproger.ru/news/connect-2016/">Connect()</a>. Что неудивительно, компания сделала несколько анонсов касательно платформы .NET. В основном всё крутилось вокруг <a href="https://www.dotnetfoundation.org/">.NET Foundation</a>, Open Source проекта, созданного для руководства последующей разработкой .NET Core.</p><p>Как сегодня <a href="https://cloudplatform.googleblog.com/2016/11/Google-Cloud-to-join-NET-Foundation-Technical-Steering-Group.html">анонсировала</a> компания, Google теперь является членом группы по надзору за технологиями (Technical Steering Group) вместе с Microsoft, Red Hat, Unity, Samsung и JetBrains.</p><p>Благодаря поддержке Windows Server и двумстам библиотекам для облачных серверов Google уже <a href="https://cloud.google.com/dotnet/docs/">позволяет</a> разработчикам создавать .NET приложения на своей облачной платформе. Конечно, сегодняшний анонс не был полным сюрпризом, но всё еще странно осознавать, что две компании, соревнующиеся в столь многих областях, могут работать вместе.</p><p>Samsung тоже не осталась в стороне. Компания запустила поддержку .NET на своей <a href="https://www.tizen.org/">ОС Tizen</a> (Вообще, в последнее время компания очень активно <a href="https://tproger.ru/news/samsung-tizen-money/">продвигает</a> свою ОС). Samsung долго искала фреймворк в дополнение к технологиям, которые используются для разработки под Tizen в данный момент. Благодаря обширной встроенной базе и огромному сообществу выбор пал на .NET.</p><p>Используя .NET с её существующей экосистемой, компания надеется в скором будущем расширить и экосистему своей собственной Tizen. Сегодня, в качестве превью для разработчиков, .NET будет запущена на смартфонах. Однако Tizen используется не только в смартфонах, но и в телевизорах и умных часах. Поэтому со временем Samsung планирует добавить поддержку .NET и на остальные девайсы. Также компания работает на расширениями для Visual Studio и документацией, специально для тех, кто хочет разрабатывать приложения для операционной системы Tizen.</p>]]></content:encoded>
    </item>
    <item>
      <title>ASP .NET роутинг в JavaScript</title>
      <link>https://tproger.ru/projects/asp-net-routing</link>
      <comments>https://tproger.ru/projects/asp-net-routing?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/projects/asp-net-routing</guid>
      <description><![CDATA[<p>Способ подключить к JavaScript роутинг с backend на ASP .NET, чтобы не указывать URL вручную при каждой отправке данных формы через AJAX.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/projects/asp-net-routing">ASP .NET роутинг в JavaScript</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Рассказы о своих проектах]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 29 May 2016 23:11:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Наш читатель поделился с нами удобным способом обработки запросов на JavaScript в ASP .NET.</p><p>Я — студент 2-го курса, в свободное от учебы время пилю для себя небольшой сайтик на ASP .NET. И в какой-то момент, при написании очередной формы, которая отправляет данные при помощи AJAX, я поймал себя на мысли, что мне надоело снова и снова указывать URL для отправки запроса, и было бы неплохо подключить к JavaScript’y роутинг, который есть у меня на backend’е.</p><h3>Выбор способа реализации</h3><p>Немного подумав и спросив на StackOverflow (и не получив ответа), я пришел к выводу, что у меня есть два простых пути реализации этого:</p><ul><li>через URL вида route/{routename} c последующим редиректом;</li><li>через реплейсмент-тег вида «[Route:%route_name%]», который при отдаче файла будет заменяться на URL cамого роута.</li></ul><p>Первый вариант практически сразу был отброшен как слишком скучный, и я приступил к реализации задуманной функциональности.</p><h3>Реализация</h3><p>Немного почитав про то, как ASP .NET обрабатывает реквесты, я решил, что мне следует написать кастомный HttpHandler, который будет по регулярному выражению искать в файлах *.js строку вида «[Route:%route_name%]» и заменять ее на искомый URL.</p><h3>Итоговый код:</h3><p>После регистрации этого хэндлера в web.config’e все заработало, как нужно.</p><p>Файл, который был запрошен:</p><p>Файл, который был получен:</p><p>Надеюсь, кому-либо сможет помочь данный очерк. Спасибо за внимание!</p>]]></content:encoded>
    </item>
    <item>
      <title>Фреймворк .NET был портирован на NetBSD</title>
      <link>https://tproger.ru/news/dotnet-ported-on-netbsd</link>
      <comments>https://tproger.ru/news/dotnet-ported-on-netbsd?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/dotnet-ported-on-netbsd</guid>
      <description><![CDATA[<p>Коммит в код CoreCLR на GitHub показал, что ядро .Net заработает на NetBSD — системе, известной лёгкой портируемостью на любые архитектуры.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/dotnet-ported-on-netbsd">Фреймворк .NET был портирован на NetBSD</a>»</p>]]></description>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 May 2016 08:21:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>NetBSD — свободно распространяемая операционная система под лицензией BSD, главное преимущество которой в лёгкой портируемости на любые компьютерные архитектуры. <a href="https://github.com/dotnet/coreclr/pull/4504/files">Недавний коммит</a> в код CoreCLR на GitHub говорит о том, что теперь ядро .Net будет работать и на NetBSD.</p><h3>Microsoft и свободные операционные системы? Вы шутите?</h3><p>Вообще-то, это не очень удивительно. Кроме того, что недавно Microsoft <a href="https://tproger.ru/news/microsoft-has-released-debian-based-os/">выпустила</a> свою операционную систему на основе Debian (для сетевых коммутаторов), так и .Net был доступен для FreeBSD, Linux и OS X уже достаточно давно. Это вполне вписывается в <a href="https://tproger.ru/articles/microsoft-trends/">тренды</a> развития Microsoft.</p><h3>Что же тогда вообще интересного в этой новости?</h3><p>Программы для NetBSD могут быть запущены и на его урезанном ядре с библиотекой языка C (<a href="https://en.wikipedia.org/wiki/Rump_kernel">rumpkernel</a>), которые, в свою очередь, могут быть запущены на любой компьютерной архитектуре, при этом практически не занимая места. Таким образом, для платформы .Net этот порт может открыть дверь в совершенно новые области применения, о которых раньше никто и не думал.</p>]]></content:encoded>
    </item>
    <item>
      <title>20 разработчиков .NET, на которых стоит подписаться</title>
      <link>https://tproger.ru/digest/20-net-developers-follow-online</link>
      <comments>https://tproger.ru/digest/20-net-developers-follow-online?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/20-net-developers-follow-online</guid>
      <description><![CDATA[<p>Блоги и аккаунты в соцсетях двадцати специалистов — от Скота Аллена до Дамиана Эдвардса — как источник новостей о языках и лучших практиках.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/20-net-developers-follow-online">20 разработчиков .NET, на которых стоит подписаться</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 03 Apr 2016 18:22:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы подготовили для вас подборку из двадцати лучших .NET разработчиков со ссылками на их блоги и аккаунты в соцсетях. Эти ресурсы обязательно станут для вас бесценными источниками актуальной информации о языках и лучших практиках программирования.</p><p>1. Скот Аллен. Основатель Ode to Code и технический директор <a href="http://medisolv.com/">Medisolv</a>. Учитель, докладчик, подкастер.</p><ul><li><a href="http://odetocode.com/">Блог</a></li><li><a href="https://twitter.com/OdeToCode">Twitter</a></li><li><a href="https://github.com/OdeToCode">GitHub</a></li></ul><p>2. Ирис Классон. Технический евангелист <a href="http://www.telerik.com/">Telerik</a>, Microsoft MVP, член Microsoft Extended Experts Team (MEET).</p><ul><li><a href="http://irisclasson.com/">Блог</a></li><li>Twitter</li><li><a href="https://www.youtube.com/user/MrsIrisD">YouTube</a></li><li><a href="https://github.com/IrisClasson">GitHub</a></li><li><a href="https://stackoverflow.com/users/984153/iris-classon">Stack Overflow</a></li></ul><p>3. Давид Эббо. Как написано в его профиле Twitter: «Один из главных разработчиков Microsoft, работаю над веб-сайтами на Windows Azure, сфокусирован на <a href="https://github.com/projectkudu/kudu">Project Kudu </a>(движок OSS git)».</p><ul><li><a href="http://blog.davidebbo.com/">Блог</a></li><li><a href="https://twitter.com/davidebbo">Twitter</a></li><li><a href="https://github.com/davidebbo">GitHub</a></li><li><a href="https://stackoverflow.com/users/111888/david-ebbo">Stack Overflow</a></li></ul><p>4. Дамиан Эдвардс. Программный менеджер ASP.NET в Microsoft, создатель SignalR и Web Forms MVP.</p><ul><li><a href="http://damianedwards.wordpress.com/">Блог</a></li><li><a href="https://twitter.com/damianedwards">Twitter</a></li><li><a href="https://github.com/DamianEdwards">GitHub</a></li><li><a href="https://stackoverflow.com/users/405892/damian-edwards">Stack Overflow</a></li></ul><p>5. Девид Фаулер. Разработчик ПО на ASP.NET из Microsoft. Создатель и основной разработчик SignalR.</p><ul><li>Блог</li><li><a href="https://twitter.com/davidfowl">Twitter</a></li><li><a href="https://github.com/davidfowl">GitHub</a></li></ul><p>6. Джон Галловей. Главный технический евангелист Microsoft, специализирующийся на ASP.NET MVC. Соавтор <a href="http://shop.oreilly.com/product/9780980285819.do">The ASP.NET Anthology</a>. Участвует в подкасте <a href="http://herdingcode.com/">Herding Code</a>.</p><ul><li><a href="http://weblogs.asp.net/jgalloway/">Блог</a></li><li><a href="https://twitter.com/jongalloway">Twitter</a></li><li><a href="https://github.com/jongalloway">GitHub</a></li><li><a href="https://stackoverflow.com/users/5/jon-galloway">Stack Overflow</a></li></ul><p>7. Дамиен Гуард. Технический директор <a href="http://attackpattern.com/">Attack Pattern</a>, ранее работал в Netflix над Windows 8/Windows Phone/Silverlight, в Microsoft над Xbox.com, LINQ to SQL, Entity Framework &amp; CodeFirst.</p><ul><li><a href="http://damieng.com/">Блог</a></li><li><a href="https://twitter.com/damienguard">Twitter</a></li><li><a href="https://github.com/damieng">GitHub</a></li></ul><p>8. Скотт Гатри.  вице-президент подразделения разработки Microsoft. Управлял командами, разрабатывающими ASP.NET, Silverlight, WPF, CLR, IIS, Media Server и Visual Studio Tools для веб разработки и Windows Phone 7. Вместе с Марком Андерсом, создатель ASP.NET.</p><ul><li><a href="http://weblogs.asp.net/scottgu/">Блог</a></li><li>Twitter</li><li><a href="https://github.com/scottgu">GitHub</a></li></ul><p>9. Фил Хаак. Вице-президент подразделения разработки GitHub. Ранее главный программный менеджер в команде ASP.NET в Microsoft.</p><ul><li><a href="http://haacked.com/">Блог</a></li><li><a href="https://twitter.com/haacked">Twitter</a></li><li><a href="https://github.com/Haacked">GitHub</a></li></ul><p>10. Кори Хайнз. Докладчик, учитель, сооснователь Code Retreat, разработчик MercuryApp и Slottd.com.</p><ul><li><a href="http://blog.coreyhaines.com/">Блог</a></li><li><a href="https://twitter.com/coreyhaines">Twitter</a></li><li><a href="https://github.com/coreyhaines">GitHub</a></li><li><a href="https://stackoverflow.com/users/1413577/coreyhaines">Stack Overflow</a></li></ul><p>11. Скотт Хэнсельман. Программист, писатель, учитель, докладчик. Соавтор <a href="http://www.amazon.com/exec/obidos/ASIN/0764576100/diabeticbooks">Professional ASP.NET 2.0</a>. Ведущий подкаста <a href="http://hanselminutes.com/">Hanselminutes</a>.</p><ul><li><a href="http://www.hanselman.com/blog/">Блог</a></li><li><a href="https://twitter.com/shanselman">Twitter</a></li><li><a href="https://www.youtube.com/user/shanselman">YouTube</a></li><li><a href="https://github.com/shanselman">GitHub</a></li><li><a href="https://stackoverflow.com/users/6380/scott-hanselman"> Stack Overflow</a></li></ul><p>12. Андерс Хейисберг. Главный архитектор C# и главный разработчик TypeScript. Главный автор Turbo Pascal, главный архитектор Delphi. Соавтор <a href="http://www.amazon.com/The-Programming-Language-3rd-Edition/dp/0321562992">The C# Programming Language</a>.</p><ul><li>Twitter</li></ul><p>13. Скотт Кун. Старший разработчик в Russell Investment Group. Соведущий подкаста <a href="http://herdingcode.com/">Herding Code</a>.  Внёс вклад в развитие Witty,  WPF .NET клиента Twitter.</p><ul><li><a href="http://lazycoder.com/weblog/">Блог</a></li><li>Twitter</li><li><a href="https://github.com/drub0y">GitHub</a></li></ul><p>14. Эрик Лауренс. Разработчик из Telerik. Создал <a href="http://www.telerik.com/fiddler">Fiddler</a> и <a href="http://download.cnet.com/SlickRun/3000-2344_4-10108758.html">SlickRun</a>. Программный менеджер команды разработки Internet Explorer  в Microsoft.</p><ul><li><a href="http://www.ericlawrence.com/eric/">Блог</a></li><li>Twitter</li><li><a href="https://github.com/squaretone"> GitHub</a></li><li><a href="https://stackoverflow.com/users/126229/ericlaw"> Stack Overflow</a></li></ul><p>15. Дрю Марш. Старший архитектор программного обеспечения <a href="http://www.mimeo.com/">Mimeo.com</a>.</p><ul><li><a href="http://blog.hackedbrain.com/"> Блог</a></li><li><a href="https://twitter.com/drub0y"> Twitter</a></li><li><a href="https://github.com/drub0y"> GitHub</a></li><li><a href="https://stackoverflow.com/users/185859/drew-marsh"> Stack Overflow</a></li></ul><p>16. Чад Майерс. Директор разработки в <a href="http://dovetailsoftware.com/">Dovetail Software</a>. Спикер в Austin .NET User Group и ADNUG Code Camp.</p><ul><li><a href="http://lostechies.com/chadmyers/author/chadmyers/"> Блог</a></li><li><a href="https://twitter.com/chadmyers">Twitter</a></li><li><a href="https://github.com/chadmyers">GitHub</a></li></ul><p>17. Джон Папа. Эксперт по Silverlight. Технический евангелист Microsoft по Silverlight и Windows 8. Докладчик, писатель.</p><ul><li><a href="http://www.johnpapa.net/">Блог</a></li><li><a href="https://twitter.com/John_Papa"> Twitter</a></li><li><a href="https://github.com/johnpapa"> GitHub</a></li><li><a href="https://stackoverflow.com/users/13375/john-papa"> Stack Overflow</a></li></ul><p>18. Джон Скит. Разработчик программного обеспечения Google в Лондоне. Автор <a href="http://www.manning.com/skeet2/">C# in Depth</a>.</p><ul><li><a href="https://msmvps.com/blogs/jon_skeet/"> Блог</a></li><li><a href="https://twitter.com/jonskeet"> Twitter</a></li><li><a href="https://github.com/jskeet">GitHub</a></li><li><a href="https://stackoverflow.com/users/22656/jon-skeet"> Stack Overflow</a></li></ul><p>19. Майк Столл. Главный разработчик програмного обеспечения в Microsoft.</p><ul><li>Блог</li><li><a href="https://github.com/MikeStall"> GitHub</a></li></ul><p>20. Рик Страул. Президент West Wind Technologies. Писатель, докладчик, член команды <a href="http://www.codemag.com/Magazine">CODE Magazine</a>.</p><ul><li><a href="http://weblog.west-wind.com/">Блог</a></li><li><a href="https://twitter.com/RickStrahl"> Twitter</a></li><li><a href="https://github.com/RickStrahl"> GitHub</a></li><li><a href="https://stackoverflow.com/users/11197/rick-strahl"> Stack Overflow</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Project Rider — новая IDE для .NET/C# от JetBrains — доступна для загрузки</title>
      <link>https://tproger.ru/news/project-rider-available</link>
      <comments>https://tproger.ru/news/project-rider-available?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/project-rider-available</guid>
      <description><![CDATA[<p>Подписчики получили по почте ссылки на загрузку среды на платформе IntelliJ: она использует Resharper как бэкенд и работает на Windows и Mac.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/project-rider-available">Project Rider — новая IDE для .NET/C# от JetBrains — доступна для загрузки</a>»</p>]]></description>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Mar 2016 22:53:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Недавно в твиттере Project Rider появилось сообщение о том, что все подписчики проекта получили на свой e-mail ссылку на скачивание новой IDE для .NET/C# от JetBrains.</p><blockquote>Are you subscribed to Project Rider EAP? If you are, watch your mailbox for download links pic.twitter.com/FIqwh43pVH— Project Rider (@JetBrainsRider) 1 марта 2016 г.</blockquote><p>Подписаться на рассылку можно на <a href="https://www.jetbrains.com/rider/">официальном сайте</a> проекта.</p><p>Напомним, Project Rider была <a href="http://blog.jetbrains.com/dotnet/2016/01/13/project-rider-a-csharp-ide/">анонсирована</a> 13 января. Новая IDE на платформе IntelliJ для своей работы использует Resharper, который запускается в отдельном процессе, и служит в качестве бэкенда для редактора кода. IDE поддерживает .NET Framework, Mono и DNX/CoreCLR, и работает на платформах Windows, Mac OS X и Linux.</p><p>Предполагаемая дата полноценного релиза — осень 2016 года.</p><p>Послушать более подробный рассказ о Project Rider можно в записи выступления команды JetBrains на NDC London этого года.</p>]]></content:encoded>
    </item>
  </channel>
</rss>