<?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>Rust</title>
    <description>Rust — это мультипарадигменный компилируемый язык программирования общего назначения. Он сочетает парадигмы функционального и процедурного программирования с объектной системой, основанной на типажах.</description>
    <link>https://tproger.ru/tag/rust</link>
    <atom:link href="https://tproger.ru/tag/rust/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 03 Oct 2026 14:15:38 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Rust</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Дэн Лу проверил ИИ-агентов: больше тестов не сделало код надёжнее</title>
      <link>https://tproger.ru/news/den-lu-proveril-ii-agentov-bolwe-testov-ne-sdelalo-kod-nadyozhne</link>
      <comments>https://tproger.ru/news/den-lu-proveril-ii-agentov-bolwe-testov-ne-sdelalo-kod-nadyozhne?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/den-lu-proveril-ii-agentov-bolwe-testov-ne-sdelalo-kod-nadyozhne</guid>
      <description><![CDATA[<p>Дэн Лу сравнил инструкции по тестированию ИИ-кода на Rust. Разбираем, почему зелёные тесты не гарантируют корректность и что проверить при следующем ревью кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/den-lu-proveril-ii-agentov-bolwe-testov-ne-sdelalo-kod-nadyozhne">Дэн Лу проверил ИИ-агентов: больше тестов не сделало код надёжнее</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 08 Sep 2026 11:05:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>ИИ-агент может увеличить число тестов и всё равно пропустить ошибки в коде. Разработчик Дэн Лу <a href="https://danluu.com/agentic-testing/">сравнил инструкции по тестированию</a> на реализации декодера Zstd. 8 сентября его эксперимент <a href="https://news.ycombinator.com/item?id=49605246">обсуждают на Hacker News</a>: одного требования «используй TDD — разработку через тестирование» или «добавь фаззинг» оказалось недостаточно.</p><p>В эксперименте использовались Codex с GPT-5.6 Sol, Rust, 26 вариантов инструкций и 4 дополнительных набора правил. Вывод относится к этой постановке задачи, а не ко всем ИИ-моделям и методикам разработки.</p><h2>Что проверял Дэн Лу</h2><p>За основу взят <a href="https://danluu.com/pl-tokens/#zstd">его прежний тест с Zstd</a>, форматом сжатия данных. Агент получает спецификацию и пишет декодер в контейнере без интернета. Контрольные тесты ему не показывают: они отдельно проверяют результат. Такой подход позволяет проверить решение на независимом наборе сценариев.</p><p>В новом сравнении для каждой комбинации инструкции и уровня вычислительных усилий модели, medium или xhigh, проведено 80 запусков. Основная метрика — доля запусков, прошедших 100% скрытых тестов. Вариант без специальных указаний оказался выше среднего; убедительного универсального победителя автор не выделяет.</p><h2>Как тесты пропускали ошибки</h2><p>При явном требовании использовать встроенные тесты Rust их число удваивалось на medium и увеличивалось на 25% на xhigh, но корректность не улучшалась. В отдельных тестах обработки четырёх битовых потоков встречались одинаковые входы: перестановка потоков оставалась незаметной. Фаззинг часто сводился к случайным байтам, которые проверяли преимущественно отказ на некорректном вводе.</p><p>Фаззинг — проверка программы на множестве автоматически сгенерированных входов. Если все они отбрасываются в начале, глубокая логика обработки может остаться нетронутой. В тестировании свойств задают правило для целого класса входов: например, после сжатия и распаковки должны восстановиться исходные данные. <a href="https://proptest-rs.github.io/proptest/proptest/index.html">Библиотека Proptest</a> также умеет уменьшать найденный сбойный пример, чтобы причину было проще разобрать.</p><h2>Что это меняет для ревью</h2><p><b>Практический вывод редакции:</b> в ревью ИИ-кода стоит проверять, какую ошибку способен поймать каждый тест и откуда взят ожидаемый результат. Для декодера полезны разные корректные потоки и независимые эталонные ответы. Для бизнес-логики — проверка результата операции, повторного запроса и отказа зависимости, а не только наличия функции.</p><p>Результаты одного эксперимента не заменяют проверку на ваших задачах.</p>]]></content:encoded>
    </item>
    <item>
      <title>Producer-Consumer на Java, Go и Rust: одна задача и три уровня решения</title>
      <link>https://tproger.ru/articles/producer-consumer-na-java-go-i-rust-odna-zadacha-i-tri-urovnya-r</link>
      <comments>https://tproger.ru/articles/producer-consumer-na-java-go-i-rust-odna-zadacha-i-tri-urovnya-r?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/producer-consumer-na-java-go-i-rust-odna-zadacha-i-tri-urovnya-r</guid>
      <description><![CDATA[<p>Три уровня решения задачи производителя и потребителя: BlockingQueue в Java, каналы в Go и очередь без блокировок на Rust. Разбираемся, какой уровень нужен вам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/producer-consumer-na-java-go-i-rust-odna-zadacha-i-tri-urovnya-r">Producer-Consumer на Java, Go и Rust: одна задача и три уровня решения</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Паттерны проектирования]]></category>
      <category><![CDATA[Потоки и блокировки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 08 Sep 2026 09:00:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задача Producer-Consumer звучит обманчиво просто: одни потоки производят элементы, другие их разбирают, а между ними стоит буфер. На собеседовании её просят решить почти всегда, и почти всегда кандидат берётся писать координацию потоков руками.</p><p>Между тем у этой задачи есть три принципиально разных уровня решения, и выбор уровня определяется не языком, а требованиями к задержке. Разбираем все три: блокирующую очередь на Java, каналы и горутины в Go и очередь без блокировок на Rust.</p><p>Producer-Consumer — это схема, в которой производители и потребители работают независимо, обмениваясь данными через общий буфер конечной ёмкости. Ёмкость здесь работает главным механизмом защиты: именно она не даёт быстрым производителям завалить медленных потребителей.</p><p>Ручная координация через wait() и notifyAll() в блоках синхронизации даёт гонки и ложные пробуждения, а активное ожидание в цикле впустую жжёт процессор.</p><p>Готовая блокирующая очередь решает задачу целиком: при переполнении она сама останавливает производителя, обеспечивая обратное давление вместо переполнения памяти.</p><p>Горутины — это не потоки операционной системы, а лёгкие единицы, которые планировщик рантайма раскладывает по потокам, поэтому создавать их можно в количествах, немыслимых для системных потоков.</p><p>Три гарантии прогресса различаются строго: obstruction-free требует отсутствия помех, lock-free гарантирует прогресс системы в целом, wait-free — завершение каждой операции за ограниченное число шагов.</p><p>Отсутствие блокировок и использование атомарных операций сами по себе не дают wait-free: цикл повторных попыток без верхней границы — это lock-free, как бы его ни называли в описании библиотеки.</p><h2>Уровень первый: блокирующая очередь Producer-Consumer</h2><p>С этого уровня начинают почти все, и здесь же <a href="https://dev.to/machinecodingmaster/mastering-the-producer-consumer-pattern-in-java-lld-the-restaurant-kitchen-khn">делают три типовые ошибки</a>:</p><ul><li>Писать собственную логику блокировок через wait() и notifyAll() внутри синхронизированных блоков. Это приносит тонкие гонки и баги ложного пробуждения, когда поток просыпается без всякого уведомления.</li><li>Крутить активное ожидание в бесконечном цикле поверх коллекции, не рассчитанной на многопоточность. Процессор загружен постоянной проверкой размера очереди, а корректности всё равно нет.</li><li>Не предусмотреть обратного давления. Когда производители быстрее потребителей, буфер растёт, пока приложение не упрётся в нехватку памяти.</li></ul><p>Правильная ментальная модель здесь кухонная: повара выкладывают блюда на раздачу фиксированной вместимости, официанты забирают их по готовности. Раздача заполнена — повар ждёт, и это нормальная работа системы, а не сбой.</p><p>В Java всё это уже реализовано в стандартной библиотеке:</p><p>Вся координация потоков спрятана внутри реализации очереди, и явных блокировок в коде не остаётся вовсе. Метод put останавливает производителя при переполнении, и это и есть обратное давление, ради которого затевалась ограниченная ёмкость.</p><h2>Уровень второй: передача сообщений вместо общей памяти</h2><p>Go подходит к задаче с другой стороны. Вместо того чтобы защищать общий буфер, язык предлагает передавать данные между независимыми исполнителями. Запускается такой исполнитель одним словом:</p><p>Ключевое слово go перед вызовом запускает функцию конкурентно. Правда, у примера выше есть подвох: когда main завершается, программа выходит целиком, и горутина может не успеть отработать. Дожидаться её нужно явно:</p><h3>Где здесь, собственно, очередь</h3><p>Горутины сами по себе задачу производителя и потребителя не решают: WaitGroup лишь дожидается завершения, буфера и обратного давления в нём нет. Роль ограниченной очереди в Go играет буферизированный канал, и это прямой аналог кухонной раздачи из предыдущего раздела:</p><p>Поведение совпадает с блокирующей очередью один в один: отправка встаёт при переполнении, приём встаёт на пустом канале. Разница в акценте. В Java вы защищаете общий буфер, в Go передаёте значение из одной горутины в другую, и владение данными переходит вместе с ним.</p><h3>Почему это не просто потоки с коротким именем</h3><p>Горутина не является потоком операционной системы. Это лёгкая единица конкурентного исполнения, которой управляет рантайм языка: он раскладывает горутины по небольшому набору системных потоков сам. Отсюда и практическое следствие — можно оперировать очень большим числом конкурентных задач, не создавая и не сопровождая отдельный системный поток под каждую.</p><p>Здесь же полезно развести два понятия, которые постоянно путают. Конкурентность — это способ структурировать программу так, чтобы несколько задач продвигались независимо. Параллелизм означает фактическое одновременное исполнение на нескольких вычислительных ресурсах. Программа может быть конкурентной, и при этом ни одна пара её задач не выполняется буквально в один момент.</p><h2>Уровень третий: очередь без блокировок</h2><p>Третий уровень нужен, когда неприемлема сама возможность того, что поток уснёт на блокировке. Это низкая задержка в торговых системах, обработка звука, ядра планировщиков. И здесь начинается терминология, в которой путаются чаще всего.</p><h3>Три гарантии прогресса</h3><p><b>Obstruction-free.</b> Операция завершится, если в какой-то момент ей дадут поработать без помех со стороны других потоков. При непрерывных помехах прогресс не гарантирован вообще. Самая слабая из трёх гарантий.</p><p><b>Lock-free.</b> Гарантирует прогресс системы в целом: даже если один поток застрял, какой-то другой обязательно завершит свою операцию. Отдельный поток при этом может голодать сколь угодно долго, но система не встаёт целиком.</p><p><b>Wait-free.</b> Каждая операция завершается за ограниченное число шагов независимо от того, что делают остальные потоки. Ключевая формулировка здесь именно «ограниченное число шагов», а не «обычно быстро», «не использует блокировок» или «работает на атомарных операциях». Это формальное свойство, а не характеристика скорости.</p><p><b>Два неравенства, которые стоит запомнить:</b><br />Отсутствие блокировок не равно wait-free. Использование атомарных операций тоже не равно wait-free.</p><h3>Почему мьютекса недостаточно</h3><p>Очередь, обёрнутая в мьютекс, — это совершенно корректный многопоточный код на Rust. Но wait-free она не является: поток, захвативший блокировку, может быть снят с процессора планировщиком, и все остальные будут ждать его возвращения неограниченно долго. Для большинства задач это приемлемо, для систем с жёсткими требованиями по задержке уже нет.</p><h3>Атомарность и упорядочивание — разные вещи</h3><p>Процессор гарантирует, что атомарная операция неделима. Этого мало: нужно ещё, чтобы потребитель увидел записи, сделанные производителем <b>до</b> публикации флага. За это отвечает модель упорядочивания памяти.</p><p>Пара «освобождение и захват» создаёт отношение синхронизации: если потребитель увидел освобождающую запись, он гарантированно видит и все предшествовавшие ей записи. Это одна из центральных идей программирования без блокировок, и именно её упускают, заменяя мьютекс на атомарную операцию без всего остального.</p><h3>Кольцевой буфер и номера последовательности</h3><p>Практическая конструкция ограниченной очереди для нескольких производителей и нескольких потребителей строится на кольцевом буфере с двумя атомарными счётчиками логических позиций. Физический слот вычисляется как остаток от деления позиции на ёмкость, а при ёмкости, равной степени двойки, деление заменяется маской по битам.</p><p>Каждый слот хранит не только значение, но и номер последовательности, по которому определяется, какому логическому поколению этот слот сейчас принадлежит:</p><p>Тип UnsafeCell здесь означает ровно то, что написано на упаковке: обращаться к значению можно только из блока unsafe, компилятор проверку прекращает, и инвариант «в конкретный момент со слотом работает один поток» держится на номере последовательности, а не на системе типов.</p><p>Тип MaybeUninit здесь не для красоты: при ёмкости в 1024 элемента нужны 1024 места под значения, а не 1024 сконструированных объекта. Производитель получает уникальную позицию одним атомарным инкрементом, и никакого соревнования за неё не возникает:</p><p>Последние три строки стоит запомнить, потому что через абзац они окажутся важны. Позиция достаётся производителю без соревнования, а вот дальше он крутится в ожидании, пока слот не перейдёт к его поколению. Верхней границы у этого ожидания нет.</p><h3>Где заканчивается честность в названиях</h3><p>Неприятная правда, которую стоит знать до выбора библиотеки: многое из того, что продаётся как wait-free очередь, на деле является lock-free. Причина в устройстве ядра алгоритма:</p><p>Операция обычно завершается быстро, но верхней границы на число неудачных попыток здесь нет, а именно она и определяет wait-free. И да, ровно такой цикл вы только что видели в нашей собственной очереди: строго говоря, на этом шаге она тоже lock-free, а не wait-free, и автор исходного разбора это прямо оговаривает. Строгая реализация требует ограниченной стратегии резервирования или механизма помощи: когда поток B встречает незавершённую операцию потока A, он не ждёт возвращения A, а доводит его операцию до конца сам. Так прогресс перестаёт зависеть от того, что планировщик сделал с конкретным потоком.</p><h2>Какой уровень выбрать</h2><p>Правило простое и почти всегда работает от обратного.</p><ul><li>Блокирующая очередь из стандартной библиотеки закрывает подавляющее большинство задач. Начинайте с неё и не пишите координацию потоков вручную.</li><li>Модель с передачей сообщений выигрывает, когда конкурентных задач много, а связи между ними хочется описать явно, а не через набор общих структур под блокировками.</li><li>Алгоритмы без блокировок берутся, когда есть измеренное требование к задержке, которое блокировка нарушает: не «хочется быстрее», а конкретная цифра в бюджете. И в продакшене их берут готовыми из библиотек вроде crossbeam, а разбирают по косточкам ради понимания механики.</li></ul><p>Ошибка почти всегда идёт в одну сторону: за атомарные операции берутся раньше, чем появилась причина, и получают код, который сложнее отлаживать, а гарантий даёт не больше.</p><h2>Что забрать с собой</h2><p>Задача Producer-Consumer решается на трёх уровнях, и уровень выбирается требованиями, а не вкусом. Ограниченный буфер с обратным давлением закрывает большинство случаев. Передача сообщений упрощает структуру, когда конкурентных задач становится много. Алгоритмы без блокировок нужны там, где блокировка нарушает измеренный бюджет задержки, и тогда важно понимать, какую именно гарантию вы покупаете.</p><p>Материалы разбора: <a href="https://dev.to/machinecodingmaster/mastering-the-producer-consumer-pattern-in-java-lld-the-restaurant-kitchen-khn">задача о ресторанной кухне на Java</a>, <a href="https://dev.to/ashitoshh01/why-does-go-have-goroutines-understanding-gos-lightweight-concurrency-341p">введение в горутины и модель конкурентности Go</a> и <a href="https://dev.to/derekmwale/building-a-wait-free-queue-in-rust-2329">построение wait-free очереди на Rust</a>.</p><p>Если в вашем коде есть класс, где потоки координируются через ручные ожидания и уведомления, у вас уже есть кандидат на замену стандартной очередью. Начните с него.</p>]]></content:encoded>
    </item>
    <item>
      <title>Jujutsu 0.45 научился сам сводить расходящиеся коммиты командой jj converge</title>
      <link>https://tproger.ru/news/jujutsu-0-45-nauchilsya-sam-svodit-rashodyashhiesya-kommity-komandoj</link>
      <comments>https://tproger.ru/news/jujutsu-0-45-nauchilsya-sam-svodit-rashodyashhiesya-kommity-komandoj?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/jujutsu-0-45-nauchilsya-sam-svodit-rashodyashhiesya-kommity-komandoj</guid>
      <description><![CDATA[<p>В jj 0.45.0 появилась команда jj converge для автоматического сведения divergent-коммитов, изменился выбор конфига при --user и импорт detached HEAD из Git. Что проверить после обновления.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/jujutsu-0-45-nauchilsya-sam-svodit-rashodyashhiesya-kommity-komandoj">Jujutsu 0.45 научился сам сводить расходящиеся коммиты командой jj converge</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:33:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект Jujutsu 3 сентября в 07:47 мск <a href="https://github.com/jj-vcs/jj/releases/tag/v0.45.0">выпустил</a> версию 0.45.0 своей системы контроля версий jj, которая работает поверх обычного Git-репозитория. Главное в релизе новая команда jj converge: она находит расходящиеся версии одного изменения и заменяет их одним коммитом, сама подбирая решение и спрашивая пользователя только там, где эвристики не справились.</p><p>Для тех, кто уже пользуется jj, это закрывает самую неприятную бытовую проблему инструмента, а два ломающих изменения в том же релизе стоит проверить сразу после обновления: команды jj config с флагом --user больше не спрашивают, какой файл править, а jj git import перестал подтягивать коммиты из отсоединённого HEAD в репозиториях без совмещения с Git. Предыдущая версия 0.44.0 выходила 6 августа, релизы у проекта идут примерно раз в месяц.</p><ul><li>jj converge заменяет две и больше видимых ревизии одного change ID одним коммитом; потомки перебазируются на решение, локальные закладки переезжают сами.</li><li>Если эвристики не уверены, команда задаёт вопросы: слить описания, выбрать родителей, редко выбрать автора; в режиме --no-interactive операция прерывается, если нужен вопрос пользователю.</li><li>Ломающее: jj config edit/set/unset --user теперь правит первый загруженный пользовательский конфиг, для точного выбора файла добавлен --file ПУТЬ.</li><li>Ломающее: jj git import в неколоцированных репозиториях больше не импортирует коммиты с отсоединённого Git HEAD.</li><li>Git HEAD теперь хранится отдельно для каждого worktree, существующие репозитории мигрируют автоматически; исправлен баг с duplicateEntries в git fsck после git add.</li></ul><h2>Откуда в jj берутся расходящиеся коммиты</h2><p>В jj у каждого изменения есть постоянный change ID, который переживает перезапись коммита: можно поправить старый коммит в середине стека, и потомки перебазируются автоматически. Расхождение, или divergence, возникает, когда одно и то же изменение оказалось переписано дважды по разным веткам истории операций. Типичный сценарий: правка в двух рабочих пространствах, откат через jj undo после того, как часть работы уже ушла дальше, или неудачный конфликт при синхронизации с удалённым Git-репозиторием. В логе это выглядит как два коммита с одинаковым change ID, и до 0.45 их приходилось сводить руками через jj abandon, jj squash и jj rebase.</p><h2>Что делает jj converge на самом деле</h2><p>По <a href="https://github.com/jj-vcs/jj/blob/v0.45.0/cli/src/commands/converge.rs">описанию команды</a> в исходниках, jj converge берёт ревизии из аргумента --revisions или из настройки revsets.converge, группирует их по change ID и считает расходящимися те группы, где ревизий больше одной. Если расходящихся изменений несколько, команда спросит, какое сводить. Дальше она применяет эвристики, чтобы собрать новую ревизию, а если те дали неоднозначный результат, задаёт вопросы: объединить ли описания, каких родителей выбрать и, в редких случаях, кого считать автором.</p><p>Когда решение найдено, новая ревизия заменяет расходящиеся, потомки перебазируются на неё, а локальные закладки, указывавшие на любую из старых версий, переезжают на новую. Два ограничения авторы оговаривают прямо. Во-первых, сводятся только ревизии, попавшие в revset: если у того же change ID есть видимые версии вне выборки, расхождение уменьшится, но не исчезнет. Во-вторых, в результате могут появиться файловые конфликты, даже если до этого их не было. Проверить, что именно сделала команда, можно через jj op show -p, посмотреть историю изменения через jj evolog, а откатить всё одним jj undo.</p><p>Режим --no-interactive нужен для скриптов и хуков: если без вопроса не обойтись, команда не зависнет в ожидании ввода, а прервётся с предупреждением.</p><h2>Что сломается после обновления</h2><p>Первое ломающее изменение касается конфигов. Раньше jj config edit --user, set --user и unset --user при нескольких пользовательских файлах, например ~/.config/jj/config.toml плюс каталог conf.d/, спрашивали, какой файл править. Теперь они молча берут первый загруженный. Если у вас конфиг разложен по нескольким файлам, нужный указывается явно:</p><p>Второе касается репозиториев, где jj живёт рядом с Git, но не в колоцированном режиме, то есть .jj и .git не делят один рабочий каталог. jj git import в них больше не импортирует коммиты с отсоединённого Git HEAD. Если рабочий процесс опирался на то, что jj подхватит коммит, сделанный в Git в состоянии detached HEAD, теперь такой коммит нужно закрепить веткой или тегом на стороне Git.</p><p>Внутреннее изменение, которое тоже стоит знать: состояние Git HEAD теперь хранится отдельно для каждого worktree. Это подготовка к поддержке нескольких Git worktree в колоцированных репозиториях, когда у каждого рабочего пространства jj свой HEAD. Существующие репозитории мигрируют автоматически при первом запуске новой версии.</p><h2>Исправления, которые заметят те, кто уже обжигался</h2><ul><li>В колоцированных репозиториях git add после команды jj больше не оставляет в индексе устаревший cache-tree, из-за которого git fsck ругался на duplicateEntries. Уже испорченные репозитории исправление не лечит.</li><li>Ctrl+C в пейджере less теперь выходит чисто: во флаги по умолчанию добавили -K, раньше терминал мог остаться в raw-режиме с мусором из escape-последовательностей.</li><li>Сторона конфликта, оканчивающаяся на символ возврата каретки, больше не теряет этот байт при повторном разборе материализованного конфликта.</li><li>jj run останавливается на первой ревизии, где процесс завершился с ненулевым кодом, вместо того чтобы идти дальше.</li><li>Набор immutable_heads() по умолчанию теперь включает untracked_remote_tags(); jj bisect предупреждает, когда из-за пропусков не может однозначно назвать первую плохую ревизию; починен краш jj log на скрытых ревизиях с revset log-graph-prioritize.</li></ul><h2>Как обновиться</h2><p>Готовые сборки для Windows, macOS и Linux лежат на странице релиза, вариант с musl должен работать на любом дистрибутиве. По <a href="https://docs.jj-vcs.dev/v0.45.0/install-and-setup/">документации</a> установить последний релиз можно так:</p><p>Кому обновление ничего не изменит: тем, кто держит jj в одном файле конфига и работает только в колоцированных репозиториях. Им достанется jj converge и исправления, а ломающие изменения не затронут. Следующий сигнал, за которым стоит следить, это планируемая поддержка нескольких Git worktree, под которую в 0.45 подготовили хранение HEAD.</p><p>Источники: <a href="https://github.com/jj-vcs/jj/releases/tag/v0.45.0">Релиз jj v0.45.0 на GitHub</a>, <a href="https://docs.jj-vcs.dev/v0.45.0/install-and-setup/">Документация: установка и настройка jj 0.45</a>, <a href="https://github.com/jj-vcs/jj/blob/v0.45.0/cli/src/commands/converge.rs">Исходник команды converge (описание в cli/src/commands/converge.rs)</a></p><p>Изображение на обложке: Логотип: J. Jennings, CC BY 4.0</p>]]></content:encoded>
    </item>
    <item>
      <title>Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</title>
      <link>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</link>
      <comments>https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza</guid>
      <description><![CDATA[<p>Байткод Plush переписан со стековой модели на регистровую: медиана 2,07 раза, максимум 3,37, на fib быстрее Lua на 24%. Как устроено и что не выросло.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/interpretator-plush-perewyol-na-registry-i-uskorilsya-do-3-37-raza">Интерпретатор Plush перешёл на регистры и ускорился до 3,37 раза</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:32:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Максим Шевалье-Буавер, автор языка Plush и в прошлом разработчица JIT-компилятора YJIT для Ruby, 2 сентября <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">описала</a>, как переписала виртуальную машину Plush со стекового байткода на регистровый. На наборе синтетических тестов новый интерпретатор быстрее старого в 2,07 раза по медиане и до 3,37 раза в лучшем случае; на тестах fib и binary_tree Plush обогнал Lua 5.5.1 на 24% и 55%.</p><p>Практический интерес здесь не в самом Plush, минималистичном динамическом языке на Rust, а в измеренном ответе на старый вопрос: сколько стоит стековая модель байткода. Вывод автора сформулирован жёстко: «вам, вероятно, не стоит писать стековые байткод-интерпретаторы в 2026 году» (перевод редакции). Для тех, кто пишет свои DSL, скриптовые движки или встраиваемые интерпретаторы, это готовый аргумент с цифрами и с честным списком того, что не ускорилось.</p><ul><li>Медианное ускорение 2,07 раза, максимальное 3,37; геометрическое среднее 1,94 раза, из них 1,55 дала сама регистровая модель без оптимизаций, ещё 25% добавили специализированные инструкции.</li><li>Инструкция теперь 64-битное слово вместо enum на 24 байта; трёхадресная форма reg(a) = reg(b) + reg(c), до 64 000 локальных переменных, 76 опкодов.</li><li>Замеры: MacBook Air M5 (10 ядер, arm64), rustc 1.96.0, 11 чередующихся запусков на тест, медиана; повторный прогон дал те же результаты.</li><li>Против Lua 5.5.1: быстрее на 24% в fib и на 55% в binary_tree; сравнение с CPython 3.14.6 и CRuby 4.0.6 автор ограничивает оговорками о разной семантике и составе тестов.</li><li>Тесты сборщика мусора почти не изменились: регистровая модель ускоряет диспетчеризацию, а не аллокацию.</li></ul><h2>Почему стековая машина медленнее</h2><p>В стековой VM выражение a + b превращается в три инструкции: положить a, положить b, сложить. Каждая инструкция проходит через диспетчер: прочитать опкод, перейти на обработчик, сдвинуть указатель. В регистровой VM то же выражение записывается одной инструкцией с тремя операндами: куда положить и что сложить. Главный тезис статьи: в интерпретаторе самый большой рычаг производительности это число инструкций, которые нужно продиспетчеризовать, и регистровая модель сокращает его в разы. Автор цитирует это как основной вывод: «снова, в интерпретаторе главный рычаг это уменьшение числа инструкций» (перевод редакции).</p><p>Второй эффект: значения не гоняются между локальными переменными и временным стеком. Локальные переменные и есть регистры фрейма, поэтому x = y + z не требует ни загрузки, ни сохранения.</p><h2>Как устроен новый байткод</h2><p>Старая инструкция была Rust-перечислением Insn размером 24 байта. Новая упакована в 64-битное слово: опкод и операнды-регистры. Для сравнения автор приводит Lua: там 32-битное слово с 8-битными полями, отсюда лимит в 255 регистров на фрейм и 200 именованных локальных переменных. У Plush поля шире, до 64 000 локальных переменных, ценой вдвое большего размера инструкции. Всего опкодов 76. Сверху добавлены оптимизации, каждая из которых убирает инструкции: слитые сравнение-и-переход, сдвиги и маски с непосредственными операндами, свёртка констант, устранение лишних пересылок. Инлайн-кэши вынесены в отдельные таблицы, чтобы не раздувать слово инструкции.</p><p>Замену enum на 64-битное слово автор описывала <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">неделей раньше</a>, тогда это дало 17% на старой стековой модели; нынешняя статья седьмая в серии о Plush.</p><h2>Что показали замеры и где их границы</h2><p>Методика описана подробно: MacBook Air M5, rustc 1.96.0, для каждого сравнения 11 чередующихся запусков старой и новой версии, берётся медиана, весь набор прогнан дважды. Сравнивались конкретные коммиты репозитория. Неоптимизированная регистровая VM дала 1,55 раза по геометрическому среднему, оптимизации добавили ещё 25%, итого 1,94; медиана по отдельным тестам 2,07, максимум 3,37. Тесты, упирающиеся в сборщик мусора, остались на месте: диспетчеризация там не узкое место.</p><p>Сравнение с другими языками автор сопровождает оговорками: CPython 3.14.6, CRuby 4.0.6 и Lua 5.5.1 имеют другую семантику, а набор тестов синтетический. Заявлены только два прямых результата против Lua: fib на 24% быстрее, binary_tree на 55%. Отдельная демонстрация: программный рендеринг уровня Quake в 800 на 600 в один поток, около 47 кадров в секунду, с живой кучей до 1 ГБ без заметных пауз GC по оценке автора.</p><h2>Что из этого забрать в свой интерпретатор</h2><ul><li>Если вы проектируете байткод с нуля, начинайте с регистровой модели: выигрыш от неё больше, чем от любой микрооптимизации диспетчера.</li><li>Считайте инструкции, а не такты: слитые инструкции (сравнение плюс переход) и непосредственные операнды окупаются именно сокращением диспетчеризации.</li><li>Не ждите ускорения там, где узкое место в аллокации: GC-тесты Plush не изменились.</li><li>Готовые бинарники Plush есть для Linux и macOS (x86-64 и arm64) и через PowerShell-установщик для Windows x86-64; код под Apache-2.0, примеры под CC0, всё в <a href="https://github.com/maximecb/plush">репозитории</a>.</li></ul><p>Кому это не пригодится: тем, кто использует готовые рантаймы и не пишет свои. CPython, к слову, остаётся стековой машиной, и разница подходов хорошо видна на его фоне; о цене операций в самом Python мы недавно писали в связи с новой <a href="https://tproger.ru/news/vywel-python-3-15-0rc2-abi-zamorozhen-finalnyj-reliz-1-oktyabrya">3.15.0rc2</a>. Другой свежий пример переписанного интерпретатора с подробным разбором каждой оптимизации: <a href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0</a>, где тоже сменили промежуточное представление и получили 2,2 раза.</p><p>Источники: <a href="https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter/">Pointers Gone Wild: Plush's New Register-Based Interpreter</a>, <a href="https://github.com/maximecb/plush">Репозиторий Plush</a>, <a href="https://pointersgonewild.com/2026-08-25-replacing-a-rust-enum-with-a-64-bit-word/">Предыдущая статья серии: Replacing a Rust enum with a 64-bit word</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Rust std и musl неверно округляют fmaf на редких числах</title>
      <link>https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah</link>
      <comments>https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah</guid>
      <description><![CDATA[<p>Одинаковая ошибка округления fmaf в f32::mul_add, std::simd и musl: результат отличается на один младший бит. Затронуты x86 без AVX2 и 32-битный ARM, ARM64 нет.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rust-std-i-musl-neverno-okruglyayut-fmaf-na-redkih-chislah">Rust std и musl неверно округляют fmaf на редких числах</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 09:20:07 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик под ником Shnatsel 2 сентября <a href="https://shnatsel.github.io/implementing-fma-finding-bugs-in-std/">описал</a>, как, реализуя fused multiply-add для библиотеки fearless_simd, нашёл ошибку округления на субнормальных числах, а затем ту же ошибку обнаружил в f32::mul_add стандартной библиотеки Rust, в std::simd и в функции fmaf() из libc musl. Результат отличается от правильного на один младший бит; в исходном контрпримере это около 15 частей на миллион.</p><p>Ошибка проявляется только там, где FMA эмулируется программно: на x86 это дешёвые или старые Intel без AVX2 и процессоры Hygon без аппаратного FMA, а также 32-битный ARM и старые встраиваемые тулчейны. 64-битный ARM, по словам автора, не затронут. На практике это касается детерминированных симуляций и численных библиотек, где одинаковый код обязан давать одинаковые биты на разных машинах: сетевые игры с lockstep, физические движки, воспроизводимые вычисления. Автор честно пишет, что не знает, насколько ошибка важна в реальных программах.</p><ul><li>Ошибка: неправильное округление fmaf на субнормальных входах, отличие на один младший бит.</li><li>Затронуты f32::mul_add и std::simd в Rust, fmaf() в musl; проверка одна и та же: a = 0x97000800, b = 0x1cfff001, c = 0x00010002, верный ответ 0x00010001, ошибочный 0x00010002.</li><li>Исправлены fearless_simd и ABI f128 в компиляторе Rust на 32-битном ARM; патч в стандартную библиотеку Rust на момент публикации ждал ревью, исправления musl не влиты.</li><li>Аппаратный FMA (x86 с AVX2/FMA3, 64-битный ARM) не затронут: ошибка живёт в программной эмуляции.</li><li>Контрпример к первой версии исправления в Rust нашла языковая модель, которую автор попросил искать ошибки.</li></ul><h2>Что такое FMA и откуда берётся лишний бит</h2><p>Fused multiply-add вычисляет a*b+c с одним округлением в конце вместо двух: после умножения и после сложения. Так требует IEEE 754, и именно на это рассчитывают численные алгоритмы: одно округление даёт предсказуемую ошибку. Когда у процессора нет аппаратной инструкции, библиотека эмулирует FMA через операции с расширенной точностью и ручную коррекцию округления. Ошибка, которую нашёл автор, живёт в этой коррекции на субнормальных числах, то есть очень маленьких значениях, у которых часть мантиссы уже ушла в ноль. В таких случаях программная реализация округляла не в ту сторону.</p><p>Автор переносил формально верифицированный алгоритм и гонял его в CI на эмуляторах SIMD, добавив тесты на миллион субнормальных значений и ещё миллион случаев, требующих коррекции округления. Отдельно он попросил языковую модель искать контрпримеры, и она нашла случай, ломающий первую версию исправления для стандартной библиотеки Rust: там ошибка приводила ещё и к неправильной установке флагов исключений плавающей точки.</p><h2>Как проверить свою платформу</h2><p>Достаточно трёх чисел. Ниже проверка на C для fmaf из системной libc; в Rust то же самое делается через f32::from_bits и mul_add:</p><p>Если вывод 00010002, ваша libc или тулчейн эмулируют FMA с ошибкой. На машине с аппаратным FMA (любой современный x86 с AVX2, 64-битный ARM) результат будет верным независимо от библиотеки, поэтому проверять имеет смысл именно сборки под старое или встраиваемое железо и контейнеры на musl (Alpine) на таких хостах.</p><h2>Состояние исправлений</h2><ul><li>fearless_simd: исправлено, можно использовать как реализацию FMA без этой ошибки.</li><li>Rust, тип f128 на 32-битном ARM: ошибка ABI исправлена в компиляторе (тип доступен только в nightly).</li><li>Стандартная библиотека Rust (f32::mul_add, std::simd): патч на момент публикации ожидал ревью; номер версии с исправлением не назван.</li><li>musl: предложены минимальное исправление и полная переработка fmaf(), ни то ни другое не влито. Автор отмечает, что код FreeBSD, откуда растёт реализация, мог копироваться и в другие тулчейны.</li></ul><p>Кому это ничего не меняет: сервисам на современных x86 и ARM64, где FMA аппаратный, и коду, не зависящему от битовой точности. Кому стоит проверить: авторам физических движков и симуляций с детерминизмом между машинами, разработчикам под 32-битный ARM и тем, кто собирает статические бинарники под musl для старых серверов. Про то, как выбор libc влияет на скорость тех же бинарников, мы <a href="https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na">писали</a> на примере Rust Coreutils; смежная тема из этой же недели: <a href="https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri">переписывание линкера mold на Rust</a>. Что мы проверим дальше: когда патч попадёт в стабильный Rust и появится ли исправление в релизе musl.</p><p>Источники: <a href="https://shnatsel.github.io/implementing-fma-finding-bugs-in-std/">Shnatsel: Implementing FMA and finding bugs in C and Rust standard libraries</a>, <a href="https://lobste.rs/s/qq9jpo/implementing_fma_finding_bugs_c_rust">Обсуждение на Lobsters</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Polars 2.0 RC переводит LazyFrame на потоковый движок и ломает тихие касты</title>
      <link>https://tproger.ru/news/polars-2-0-rc-perevodit-lazyframe-na-potokovyj-dvizhok-i-lomaet-t</link>
      <comments>https://tproger.ru/news/polars-2-0-rc-perevodit-lazyframe-na-potokovyj-dvizhok-i-lomaet-t?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/polars-2-0-rc-perevodit-lazyframe-na-potokovyj-dvizhok-i-lomaet-t</guid>
      <description><![CDATA[<p>Первый release candidate Polars 2.0: LazyFrame.collect() идёт через streaming-движок, порядок строк в join и group_by не гарантирован, is_in и concat больше не молчат об ошибках типов. Как проверить свой код.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/polars-2-0-rc-perevodit-lazyframe-na-potokovyj-dvizhok-i-lomaet-t">Polars 2.0 RC переводит LazyFrame на потоковый движок и ломает тихие касты</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Анализ данных]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 06:53:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда Polars 2 сентября <a href="https://pola.rs/posts/announcing-polars-2/">выпустила</a> первый release candidate версии 2.0 библиотеки для работы с таблицами на Python и Rust. Финальный релиз обещан «в ближайшие недели». Главное изменение одно: любой вызов collect() у LazyFrame теперь по умолчанию выполняется потоковым движком, который обрабатывает промежуточные данные порциями и, по словам авторов, заметно снижает расход памяти. Автор библиотеки Ричи Винк пишет, что новых функций в 2.0 почти нет, а мажорная версия нужна, чтобы избавиться от старых архитектурных решений и поменять дефолты.</p><p>Для тех, кто гоняет Polars в пайплайнах, это значит два дела на сегодня. Во-первых, после обновления часть запросов может вернуть строки в другом порядке: потоковый движок не гарантирует порядок для join, group_by и unpivot, если явно не попросить. Во-вторых, код, который годами «работал» на неявных приведениях типов и молчаливом заполнении пропусков, начнёт падать с ошибкой. Разработчики называют это осознанной политикой: ошибка сразу лучше неверного результата через двадцать минут работы пайплайна.</p><ul><li>RC ставится командой pip install polars==2.0rc1; финальный 2.0 выйдет в ближайшие недели, точной даты нет.</li><li>LazyFrame.collect() по умолчанию идёт через streaming-движок; по ожиданиям авторов, в совокупности он «легко в 5 раз быстрее» старого in-memory и заметно экономит память; независимых замеров RC нет.</li><li>Порядок строк после join, group_by и unpivot больше не гарантирован; для join и group_by порядок возвращает параметр maintain_order, для unpivot нужен явный sort; старый движок включается через pl.Config.set_engine_affinity("in-memory") или collect(engine="in-memory").</li><li>is_in с разными типами, горизонтальный concat с разной высотой, касты строк в даты и целых в Enum теперь бросают исключение вместо тихого приведения.</li><li>Большинство удалённых методов и параметров отвечают типизированными ошибками AttributeRemovedError и ArgumentRemovedError с подсказкой, чем заменить.</li></ul><h2>Почему потоковый движок потребовал мажорной версии</h2><p>Polars давно развивает два движка. Классический in-memory собирает результат каждой операции целиком в памяти. Потоковый разбивает данные на куски и прогоняет их через план запроса конвейером, поэтому промежуточные результаты не раздуваются. До 2.0 потоковый движок нужно было включать явно; теперь режим engine="auto" выбирает именно его.</p><p>Цена такого дефолта в порядке строк: потоковый движок для ряда операций его не гарантирует. Старый движок порядок сохранял, и на это молча полагалось много кода: например, брали первую строку после группировки и считали её «самой ранней». В 2.0 такие места нужно найти и явно попросить порядок (у join и group_by есть параметр maintain_order, после unpivot остаётся явный sort):</p><p>Заявление о скорости стоит читать как оценку вендора: «в сумме мы ожидаем, что потоковый движок будет легко в 5 раз быстрее», со ссылкой на <a href="https://pola.rs/posts/benchmarks/">собственные бенчмарки</a> Polars. Независимых замеров на RC пока нет, и выигрыш зависит от запроса: на маленьких таблицах, которые целиком помещаются в кеш, разница будет меньше, чем на группировках по десяткам гигабайт.</p><h2>Где код перестанет молчать об ошибках</h2><p>Вторая тема релиза сформулирована в посте так: ошибки должны подниматься заранее, а не через 20 минут работы пайплайна, и неявное поведение при несовпадении данных должно включаться явно, а не быть дефолтом. Авторы отдельно отмечают, что строгость стала ценнее с приходом ИИ-агентов: агент может вызвать collect_schema(), проверить типы без чтения данных и быстро получить обратную связь. Примеры из поста и <a href="https://docs.pola.rs/releases/upgrade/2/">руководства по миграции</a>:</p><ul><li>is_in с разными типами. Раньше Int64 и Float64 приводились к общему супертипу, даже если это теряло точность. В примере из поста идентификатор 9007199254740993 при касте в float64 округлялся до 9007199254740992 (граница, до которой float64 представляет все целые точно), и проверка по списку «помеченных» аккаунтов давала ложное совпадение. В 2.0 это InvalidOperationError: кастовать нужно самому и осознанно.</li><li>Горизонтальный concat. Таблицы высотой 5 и 4 раньше склеивались, а недостающая ячейка молча становилась null; типичный сценарий из поста: тихо упавшая задача за один из дней. Теперь ShapeError, а старое поведение включается через how="horizontal_extend".</li><li>Касты заменены специализированными методами. Целые в Enum или Categorical и обратно: вместо cast() нужны .cat.to() и .cat.physical(). Строка в дату: вместо cast(pl.Date) методы .str.to_date() и .str.to_datetime(), которым можно явно задать формат. Кастовать плоскую колонку в List через cast(pl.List(...)) тоже нельзя, для этого есть pl.list().</li><li>Булевы операторы между Boolean и целыми числами теперь ошибка; std() и var() для Duration удалены, сначала переводите в микросекунды через .dt.total_microseconds().</li><li>Каст между Struct с разным числом полей при strict=True (дефолт) падает, а не обрезает лишние поля; руководство помечает это отдельным предупреждением, потому что раньше данные терялись молча.</li></ul><p>Отдельный набор изменений касается чтения CSV. При сканировании набора файлов схема теперь выводится по первым 10 файлам, а не по всем (параметр infer_schema_files). Автоматические имена колонок для файлов без заголовка начинаются с column_0, а не column_1; это же касается read_excel и read_ods. Пользовательская схема в scan_csv сопоставляется с файлом по именам колонок, а не по позиции: раньше первая запись схемы молча получала данные первой колонки файла, даже если имена не совпадали. Для лишних и недостающих колонок появились параметры extra_columns и missing_columns, по умолчанию оба бросают ошибку.</p><h2>Что будет со старым кодом</h2><p>Для большинства удалений библиотека получила два типизированных исключения (документация предупреждает, что часть удалённого по-прежнему даёт обычные AttributeError и TypeError): polars.exceptions.AttributeRemovedError для удалённых методов и атрибутов и polars.exceptions.ArgumentRemovedError для удалённых параметров. Оба сообщения указывают на замену:</p><p>По словам Винка, большая часть удалённого давно помечена как deprecated, и у тех, кто обновлялся регулярно, пайплайны пострадать не должны. Команда просит сообщать, если из библиотеки убрали что-то, на что реально полагались. Смена движка не затрагивает eager-API DataFrame: выигрыша в скорости там не будет, потому что дефолт меняется только у LazyFrame. Остальные несовместимости на eager распространяются полностью: строгий concat, новые правила read_csv, убранные касты и удалённые методы.</p><h2>Как проверить свой проект до финального релиза</h2><ol><li>Поставьте RC в отдельное окружение: pip install polars==2.0rc1. В прод его тащить рано, это кандидат в релиз.</li><li>Прогоните тесты и посмотрите на исключения AttributeRemovedError, ArgumentRemovedError, InvalidOperationError и ShapeError: каждое сообщение содержит подсказку с заменой.</li><li>Найдите места, где код полагается на порядок строк после join, group_by или unpivot: сортировки «по умолчанию», head(1) после группировки, сравнение с эталоном по позициям. Добавьте maintain_order (join, group_by) или явный sort (unpivot).</li><li>Если результат обязан совпадать со старым до байта, зафиксируйте старый движок на время миграции: pl.Config.set_engine_affinity("in-memory").</li><li>Проверьте чтение CSV без заголовка (сдвиг нумерации колонок на единицу) и scan_csv с явной схемой (сопоставление по именам).</li></ol><p>В планах ветки 2.x, о которых команда, по её словам, «недостаточно говорила публично»: полноценная out-of-core обработка для потокового движка, новая архитектура IO-плагинов, собственный читатель S3, расширенное покрытие SQL, планировщик на основе оценки стоимости с переупорядочиванием join и отказ от mmap, после которого конвейер станет асинхронным от начала до конца. Сроков по этим пунктам нет. Замечания по RC команда принимает в <a href="https://github.com/pola-rs/polars/issues">issues на GitHub</a>.</p><p>Источники: <a href="https://pola.rs/posts/announcing-polars-2/">Pre-release of Polars 2.0 (блог Polars, Ritchie Vink)</a>, <a href="https://docs.pola.rs/releases/upgrade/2/">Руководство по переходу на Polars 2.0</a>, <a href="https://pola.rs/posts/benchmarks/">Бенчмарки Polars</a></p><p>Изображение на обложке: Логотип: Polars</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть</title>
      <link>https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na</link>
      <comments>https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na</guid>
      <description><![CDATA[<p>Вышел Rust Coreutils 0.11.0: сообщения об ошибках с указателем на проблемный символ в 28 утилитах, PGO-сборки до 31% быстрее, cp ускорен на 32,93%, совместимость с GNU 653 из 685 тестов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rust-coreutils-0-11-pokazyvaet-owibku-karetkoj-i-uskoryaet-cp-na">Rust Coreutils 0.11 показывает ошибку кареткой и ускоряет cp на треть</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты командной строки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:34:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проект uutils 31 августа <a href="https://github.com/uutils/coreutils/releases/tag/0.11.0">выпустил</a> Rust Coreutils 0.11.0, переписанный на Rust набор базовых утилит Linux. Главное изменение видно сразу: cut, chmod, sort и ещё 25 утилит при ошибке в аргументах показывают строку с указателем на проблемный символ, как это делают компиляторы Rust и Clang. Плюс сборки с PGO, которые, по данным команды, дают до 31% прироста, и cp, ускоренный на 32,93%.</p><p>Для тех, кто пользуется обычными GNU Coreutils, ничего не меняется, пока дистрибутив не переключится сам. Но тенденция понятна: Ubuntu уже ставит Rust-реализацию по умолчанию, и вопрос «а чем это отличается» становится практическим. Ответ версии 0.11: сообщениями об ошибках, скоростью и очередным шагом к полной совместимости с GNU.</p><ul><li>Новый диагностический движок на библиотеке ariadne: подсказки с указателем в 28 утилитах.</li><li>Переменная UUTILS_DIAG принимает always, never и auto; в скриптах и пайпах по умолчанию сохраняется однострочное сообщение.</li><li>PGO-сборки для Linux, macOS и Windows дают до 31% прироста; cp ускорен на 32,93%, join в одном сценарии в 2,5 раза быстрее GNU.</li><li>Совместимость с тестами GNU: 653 успешных, 22 неудачных, 10 пропущенных из 685; было 645 и 28.</li><li>Исправлены TOCTOU-проблемы в mv, cp, rm и chmod; 358 pull request от 26 новых участников.</li></ul><h2>Как выглядит новая ошибка</h2><p>Идея, описанная Сильвестром Ледрю в <a href="https://uutils.org/blog/2026-08-error-diagnostics/">блоге проекта</a>, проста: GNU-утилиты десятилетиями отвечали на опечатку сухой строкой вроде «invalid field specification», и пользователь сам искал, где именно ошибся. Теперь под командой печатается сама команда, а под ней каретка, указывающая на неверный символ, и короткое объяснение. Реализовано это на библиотеке ariadne, той же, что используют некоторые парсеры на Rust.</p><p>Важная деталь для тех, кто пишет скрипты: многострочная диагностика включается только в интерактивном терминале. В пайпах и при перенаправлении вывода по умолчанию остаётся привычное однострочное сообщение, поэтому парсеры stderr не сломаются. Управляет этим переменная окружения UUTILS_DIAG со значениями always, never и auto. Попробовать без установки можно в <a href="https://uutils.org/playground/?cmd=sort%20-k2.3x%20notes.txt">браузерной песочнице</a> проекта.</p><h2>Скорость: «медленнее GNU теперь считается багом»</h2><p>Команда прямо формулирует новую политику: «утилита, которая значительно медленнее GNU, теперь считается багом» (перевод редакции). В релизе это подкреплено PGO-сборками для Linux, macOS и Windows, которые, по замерам проекта, дают до 31% прироста. Отдельно названы cp, ускоренный на 32,93%, и join, который в одном из сценариев работает в 2,5 раза быстрее GNU-версии. Это замеры самого проекта на его наборах; на других данных разница будет иной.</p><h2>Совместимость с GNU</h2><p>Таблица в релизе сравнивает результаты на тестовом наборе GNU Coreutils: в 0.10.0 было 645 успешных и 28 неудачных тестов из 683, в 0.11.0 стало 653 успешных, 22 неудачных и 10 пропущенных из 685. Оставшиеся расхождения касаются редких флагов и краевых случаев, но именно они всплывают в старых скриптах, поэтому перед заменой системных утилит стоит прогнать свои сценарии.</p><p>Из исправлений безопасности названы TOCTOU-проблемы, то есть гонки между проверкой и использованием файла, в mv, cp, rm и chmod; также закрыты зависания и переполнения. Реализации kill и uptime доработаны для Windows.</p><h2>Как попробовать</h2><p>Проект распространяется под лицензией MIT и рассчитан на Linux, Windows, Redox и Fuchsia. Самый безопасный способ познакомиться: поставить uutils рядом с системными утилитами, а не вместо них. По README проекта, сборка из исходников выполняется через cargo, а в ряде дистрибутивов пакет называется uutils-coreutils или rust-coreutils и ставит бинарники в отдельный каталог. Точные имена пакетов зависят от дистрибутива, поэтому проверять их стоит в его репозитории.</p><p>Если ваши скрипты парсят stderr утилит, оставьте UUTILS_DIAG в значении auto: тогда в неинтерактивном режиме формат ошибок не изменится.</p><p>В релиз вошли 358 pull request от 26 новых участников; всего в проекте отметились более 1000 контрибьюторов. Редакция проверит, как изменится таблица совместимости в 0.12.</p><p>Источники: <a href="https://github.com/uutils/coreutils/releases/tag/0.11.0">Релиз 0.11.0 на GitHub</a>, <a href="https://uutils.org/blog/2026-08-error-diagnostics/">Блог uutils: новая диагностика ошибок</a></p><p>Изображение на обложке: uutils</p>]]></content:encoded>
    </item>
    <item>
      <title>Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</title>
      <link>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</link>
      <comments>https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza</guid>
      <description><![CDATA[<p>Вышел Wasmi 2.0, интерпретатор WebAssembly на Rust: новый исполнитель, четыре режима dispatch, аккумуляторные регистры и стабильный fuel metering. Замеры авторов на M2 Pro, EPYC и Xeon и что это значит для плагинов и embedded.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wasmi-2-0-uskoril-interpretaciyu-webassembly-v-2-2-raza">Wasmi 2.0 ускорил интерпретацию WebAssembly в 2,2 раза</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 02 Sep 2026 01:28:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Робин Фрайлер, автор интерпретатора WebAssembly Wasmi, 1 сентября <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">объявил</a> о выходе Wasmi 2.0. По замерам самого проекта, новая версия исполняет Wasm-код примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему набора бенчмарков. Для тех, кто запускает Wasm там, где JIT недоступен или нежелателен, это означает заметное ускорение без смены рантайма.</p><p>Wasmi написан на Rust и рассчитан на сценарии, где нужен именно интерпретатор: плагины в приложениях, встраиваемые устройства, песочницы, смарт-контракты. Релиз <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">опубликован</a> на GitHub и crates.io; работа над ним заняла восемь месяцев.</p><ul><li>Wasmi 2.0 примерно в 2,2 раза быстрее Wasmi 1.0 по геометрическому среднему; замеры вендора на Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C.</li><li>Появились четыре режима dispatch; indirect-threaded на 10–15% медленнее direct-threaded, но экономит память под IR.</li><li>Новое промежуточное представление с аккумуляторными регистрами ireg, freg32 и freg64 и 64-битными ячейками стека.</li><li>Fuel metering стал стабильным и привязан к входному Wasm-коду; появился deterministic profile и новый CLI.</li><li>Включение SIMD больше не замедляет обычный код: в 1.0 это стоило около 8%, в 2.0 разница в пределах шума.</li></ul><h2>Откуда взялись 2,2 раза</h2><p>Автор подробно разбирает три источника ускорения. Первый: режимы диспетчеризации инструкций. В 1.0 был один switch-loop, теперь их четыре: direct-threaded, indirect-threaded, switch-loop и call-loop. Режим auto-dispatch включён по умолчанию и выбирает threaded-код там, где компилятор и платформа это позволяют. Indirect-threaded вариант примерно на 10–15% медленнее direct-threaded, зато требует меньше памяти на промежуточное представление, что важно для микроконтроллеров.</p><p>Второй источник: новое промежуточное представление. В 1.0 операнды адресовались смещениями в стеке; в 2.0 появились аккумуляторные регистры ireg, freg32 и freg64, через которые проходит большая часть значений. Ячейки стека стали всегда 64-битными, а SIMD-значения занимают две соседние ячейки, поэтому поддержка SIMD больше не стоит производительности обычного кода.</p><p>Третий: структура CodeMap, в которой хранятся скомпилированные функции. Она стала append-only с раздельными buckets, поэтому вызов внутренней функции на горячем пути не требует ни одного lookup и не берёт блокировок. Доступ к данным экземпляра модуля, по бенчмарку count/globals, улучшился примерно на 35%; таблицы Wasm уменьшились в 2–4 раза за счёт 32-битных ссылок.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/9fd51160-93fb-4066-847b-01cefb14b81b.webp" alt="График геометрического среднего времени исполнения для Wasmi 1.0, Wasmi 2.0, Wasm3, WAMR, Stitch и Wasmtime Pulley" /><figcaption>Геометрическое среднее времени исполнения по набору wasmi-benchmarks на Apple M2 Pro. Источник: Wasmi Labs</figcaption></figure><h2>Как измеряли и с кем сравнивали</h2><p>Замеры сделаны на проекте wasmi-benchmarks, который можно запустить самостоятельно, на трёх машинах: Apple M2 Pro, AMD EPYC 7763 и Intel Xeon Platinum 8370C. Кроме Wasmi 1.0 в сравнении участвовали интерпретаторы Wasm3, WAMR в режиме fast-interpreter, Wasmtime Pulley и Stitch. Это замер вендора: набор тестов, машины и конфигурации выбирал сам проект, и автор оговаривает, что цифры зависят от нагрузки.</p><p>В посте есть поучительный эпизод про компилятор. Rust 1.92 включил оптимизацию DestinationPropagation, из-за чего CoreMark у интерпретатора Stitch упал с более чем 3000 до примерно 2200 баллов; после исправления результат вернулся выше 3000. Похожая проблема нашлась и в Wasmi: её устранение подняло CoreMark примерно с 2800 до более чем 4200 баллов, то есть примерно на 50%. Вывод для практики: производительность интерпретатора на Rust заметно зависит от версии компилятора, и после обновления toolchain бенчмарки стоит перепрогонять.</p><h2>Что изменилось кроме скорости</h2><ul><li>Fuel metering, то есть учёт «топлива» на выполнение, стал стабильным и считается по входному Wasm-коду, а не по внутренним инструкциям; это важно для смарт-контрактов и лимитов на плагины.</li><li>Deterministic profile гарантирует одинаковый результат на разных платформах.</li><li>Поддержка memory64 стала опциональной; отключение валидации через feature validate уменьшает бинарник примерно на 200–300 КБ.</li><li>Обновлённый CLI и C-API.</li></ul><p>Кому обновление ничего не даст: тем, кто запускает Wasm через JIT-рантаймы вроде Wasmtime или V8 на сервере и в браузере. Интерпретатор нужен там, где JIT запрещён (iOS, некоторые блокчейн-среды), где нет памяти под скомпилированный код или где важна предсказуемость времени запуска.</p><h2>Как попробовать</h2><p>Wasmi ставится как обычный crate из crates.io; для Rust-проекта достаточно обновить зависимость wasmi до версии 2.0 и прогнать тесты: автор предупреждает о смене внутреннего представления, а значит, поведение при ошибках и лимитах стоит перепроверить. Проект открыт, спонсируется Stellar Development Foundation с октября 2024 года.</p><p>В планах на Wasmi 3.0 названы оставшиеся части WebAssembly 3.0: function-references, exception-handling и gc. Сроков автор не называет.</p><p>Источники: <a href="https://wasmi-labs.github.io/blog/posts/wasmi-v2.0/">Блог Wasmi Labs: Wasmi v2.0</a>, <a href="https://github.com/wasmi-labs/wasmi/releases/tag/v2.0.0">Релиз v2.0.0 на GitHub</a></p><p>Изображение на обложке: Wasmi Labs</p>]]></content:encoded>
    </item>
    <item>
      <title>Линкер mold переписывают на Rust: версия 3.0 научится собирать ядра</title>
      <link>https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri</link>
      <comments>https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Tproger]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri</guid>
      <description><![CDATA[<p>Руи Уэяма объявил, что линкер mold переписывают на Rust. В версии 3.0 появится поддержка линкер-скриптов, чтобы mold мог заменить GNU ld при сборке ядер и встраиваемых программ. Свежие бенчмарки против lld и wild, как включить mold сегодня и кому ждать 3.0.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/linker-mold-perepisyvayut-na-rust-versiya-3-0-poluchit-linker-skri">Линкер mold переписывают на Rust: версия 3.0 научится собирать ядра</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 01 Sep 2026 17:25:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Руи Уэяма, автор линкера <b>mold</b> и один из создателей LLVM lld, 1 сентября <a href="https://x.com/rui314/status/2094677980857680052">сообщил</a>, что mold переписывают на Rust. Будущая версия получит номер 3.0 и главную недостающую функцию: поддержку линкер-скриптов, без которой mold нельзя было использовать для сборки ядер операционных систем и встраиваемых программ. Сроков выхода автор не назвал.</p><p>Линкер склеивает скомпилированные объектные файлы в исполняемый файл, и на больших проектах это минуты ожидания при каждой пересборке. mold появился в 2021 году именно как ответ на это: по свежему бенчмарку автора он в 4,9 раза быстрее lld по медиане. Но проекты, которые собираются через сложные линкер-скрипты GNU ld, вроде ядра Linux, до сих пор были для него закрыты; 3.0 должна это изменить.</p><ul><li>mold переписывают на Rust; новая версия выйдет как mold 3.0, дата не названа.</li><li>Цель: поддержка линкер-скриптов, чтобы mold собирал всё, что умеет GNU ld, включая ядра и прошивки.</li><li>Текущий mold написан на C++20; по бенчмарку августа 2026 года он быстрее lld в 4,9 раза, а wild в 1,9 раза по медиане.</li><li>Debug-сборка Chromium 145 на Threadripper 7980X: lld 16,64 с, wild 3,98 с, mold 1,65 с; TensorFlow 2.21: lld 50,73 с, mold 3,15 с.</li><li>Текущий mold продолжает работать как замена ld и lld; включается флагом -fuse-ld=mold или через .cargo/config.toml.</li></ul><h2>Зачем линкеру скрипты</h2><p>Линкер-скрипт описывает, как раскладывать секции кода и данных по адресам памяти. Обычному приложению это не нужно: там всё решает стандартная раскладка. Ядру, загрузчику или прошивке микроконтроллера критично, чтобы таблица прерываний лежала по конкретному адресу, а код инициализации попал в нужную область флеш-памяти. Всё это описывается на языке скриптов GNU ld, и до сих пор mold понимал лишь их малую часть: в собственной документации проект называет этот язык переусложнённым и ещё недавно прямо писал, что расширять поддержку не планирует.</p><p>Уэяма пишет, что цель новой версии — совместимость со всем, что умеет собирать GNU ld. Именно это открывает дорогу к тому, чтобы дистрибутивы Linux сделали mold линкером по умолчанию: пока хоть один важный пакет не собирается, менять умолчание никто не будет. Конкретных дистрибутивов с такими планами в README пока не названо.</p><blockquote>We are rewriting the mold linker in Rust. This will be mold 3.0.</blockquote><h2>Насколько mold быстрее сегодня</h2><p>Автор обновил бенчмарки в <a href="https://github.com/rui314/mold">README репозитория</a> в августе: девять крупных программ, медиана трёх запусков после прогрева, два стенда — Threadripper 7980X с 64 ядрами и Apple M1 Ultra, у которого использовались 16 производительных ядер. Сравнивались lld, wild (ещё один линкер на Rust) и mold. Результаты на Threadripper выглядят так.</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-09-02/cd378d06-61ff-4b48-ba6c-22b4678f3f27.webp" alt="Столбчатая диаграмма времени линковки debug-сборок Chromium 145 и TensorFlow 2.21 линкерами lld, wild и mold" /><figcaption>Время линковки debug-сборок на Threadripper 7980X, секунды. График: Tproger по данным README mold, бенчмарк августа 2026 года.</figcaption></figure><p>На Chromium 145 lld тратит 16,64 секунды, wild 3,98, mold 1,65. На TensorFlow 2.21 разрыв ещё больше: 50,73 секунды у lld против 3,15 у mold. На Apple M1 Ultra картина ровнее: debug-сборка Clang 21 линкуется за 2,96 секунды у mold, 4,40 у lld и 2,78 у wild, то есть в этом тесте конкурент на Rust слегка впереди, хотя на большинстве остальных задач M1-стенда mold быстрее. Артефакты бенчмарка опубликованы на Zenodo, их можно повторить.</p><h2>Почему Rust, если и так быстро</h2><p>В сообщении Уэямы причин не названо. Из README видно другое: текущий mold требует GCC 10.2 или Clang 16 и написан на C++20, а конкурент wild с самого начала на Rust и на части задач уже догоняет. Переписывание с добавлением линкер-скриптов означает во многом новую кодовую базу, и выбор языка для неё делается один раз. Всё остальное — предположения, и мы их не делаем.</p><h2>Как включить mold сегодня</h2><p>Для C и C++ с GCC или Clang достаточно флага компоновки -fuse-ld=mold. Для Rust README предлагает настройку в .cargo/config.toml:</p><ul><li>Проекты с собственными линкер-скриптами (ядра, прошивки, загрузчики) пока остаются на GNU ld; ждите mold 3.0.</li><li>Если пользуетесь wild, сравните на своём проекте: на M1 Ultra он выигрывает лишь в части тестов, по общей медиане бенчмарка mold быстрее в 1,9 раза.</li><li>mold распространяется под лицензией MIT через GitHub и пакеты дистрибутивов; наличие пакета в репозиториях Astra Linux и РЕД ОС проверяйте отдельно, в README они не перечислены.</li></ul><h2>Что дальше</h2><p>mold используется в проде с 2021 года, и текущая C++-версия никуда не денется до выхода 3.0. Следить стоит за двумя сигналами: появится ли в репозитории ветка на Rust с первыми тестами линкер-скриптов и объявит ли какой-нибудь дистрибутив о планах сделать mold линкером по умолчанию. Второе и будет настоящей новостью.</p><p>Источники: <a href="https://x.com/rui314/status/2094677980857680052">Сообщение Руи Уэямы в X</a>, <a href="https://github.com/rui314/mold">Репозиторий mold с бенчмарками</a></p><p>Изображение на обложке: Tproger по данным README mold</p>]]></content:encoded>
    </item>
    <item>
      <title>Кроах-Хартман: Rust поможет Linux и делает кодинг веселее</title>
      <link>https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee</link>
      <comments>https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee</guid>
      <description><![CDATA[<p>Грег Кроах-Хартман заявил, что Rust становится частью Linux и поможет убрать до 80% уязвимостей ядра. Рассказываем, что это значит.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/kroah-hartman-rust-pomozhet-linux-i-delaet-koding-veselee">Кроах-Хартман: Rust поможет Linux и делает кодинг веселее</a>»</p>]]></description>
      <category><![CDATA[Безопасный код]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Операционные системы]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 Jul 2026 08:09:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Один из главных мейнтейнеров стабильной ветки ядра Linux <b>Грег Кроах-Хартман</b> заявил, что Rust уже не эксперимент, а часть долгосрочной стратегии экосистемы. По его словам, переход на Rust поможет убрать львиную долю рутинных уязвимостей ядра и облегчит жизнь мейнтейнерам.</p><p>На конференции <b>Open Source Summit India 2026</b> в Мумбаи Кроах-Хартман выступил с докладом <a href="https://www.youtube.com/watch?v=1nYl_9wBBhE&amp;list=PLEAGIV5X5B1U&amp;index=19">«Rust and Linux: How the Rust Language is Going to Help Linux Succeed»</a>. В нём он признался, что поначалу относился к языку скептически и считал, что всё необходимое уже есть в C. Сейчас он считает иначе: Rust действительно делает программирование интереснее и безопаснее.</p><ul><li>Грег Кроах-Хартман назвал Rust постоянной частью Linux, а не временным экспериментом.</li><li>По его оценке, около 80% уязвимостей ядра за последние 25 лет можно было бы поймать на этапе компиляции Rust.</li><li>Linux получает около 13 CVE в день и почти 9 изменений в час на протяжении десяти лет и более.</li><li>Binder — ключевой механизм IPC Android — уже имеет параллельную реализацию на Rust, а C-версия скоро уйдёт.</li><li>Git и ряд других крупных проектов также движутся в сторону Rust.</li></ul><h2>От скептицизма к поддержке</h2><p>Кроах-Хартман рассказал, что несколько лет назад друг советовал ему попробовать Rust, но он отмахнулся: C казался достаточным. Со временем он изменил мнение. «Он был прав. Я должен был сделать это тогда. Rust на самом деле весёлый. Он заставляет программирование быть весёлым», — сказал мейнтейнер.</p><p>Главное преимущество языка в ядерной разработке — владение и типизация, которые убирают массу мелких ошибок: непроверенные указатели, забытые разблокировки, неправильная очистка ресурсов. Именно такие баги, по словам Кроах-Хартмана, составляют большинство ежедневных CVE.</p><h2>Масштаб проблемы</h2><p>Linux развивается с огромной скоростью. Кроах-Хартман привёл цифры: ядро набирает примерно <b>девять изменений в час</b> уже больше десяти лет, а количество публично раскрываемых уязвимостей держится на уровне <b>около 13 CVE в день</b>. Большая часть из них — не сложные атаки, а простые ошибки в C-коде.</p><blockquote>Я видел каждую CVE ядра за последние 25 лет. Думаю, 80% исчезли бы просто потому, что Rust поймал бы их.</blockquote><h2>Что уже меняется в ядре</h2><p>Rust постепенно становится обязательным выбором для отдельных подсистем. Кроах-Хартман отметил, что <b>новые драйверы некоторых подсистем будут приниматься только на Rust</b>. Яркий пример — Binder, межпроцессный механизм Android, от которого зависят миллиарды устройств. В ядре уже существуют параллельные реализации Binder на C и Rust, и C-версия «скоро исчезнет».</p><p>Это означает, что Rust станет фундаментом не только для экспериментальных модулей, но и для ключевой инфраструктуры мобильной экосистемы.</p><p><b>Контекст:</b><br />Binder — это механизм межпроцессного взаимодействия (IPC) в Android. Он позволяет приложениям и системным сервисам безопасно обмениваться данными. Переписывание Binder на Rust напрямую влияет на безопасность и стабильность почти всех Android-устройств.</p><h2>Выводы</h2><p>Позиция Кроах-Хартмана — ещё один сигнал того, что Rust перешёл из разряда «перспективного языка» в разряд инфраструктурного инструмента. Если оценка в 80% CVE верна, массовый переход на Rust в ядре может существенно снизить количество исправлений безопасности и освободить время мейнтейнеров для сложных логических задач.</p><p>Источник: <a href="https://developers.slashdot.org/story/26/07/20/0417244/rust-will-help-linux-succeed-and-makes-coding-fun-says-greg-kroah-hartman">Slashdot</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</title>
      <link>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</link>
      <comments>https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend</guid>
      <description><![CDATA[<p>Сравниваем Rust, Go и Zig для высоконагруженных сервисов: производительность, сложность, экосистема и реальные кейсы миграции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rust-go-ili-zig-kak-vybrat-yazyk-dlya-vysokonagruzhennogo-bekend">Rust, Go или Zig: как выбрать язык для высоконагруженного бэкенда в 2026 году</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Высокие нагрузки]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Jul 2026 06:41:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы строите высоконагруженный бэкенд, выбор языка сегодня сводится к тройке: Rust, Go и Zig. У каждого — своя цена, своя скорость разработки и свои сценарии, в которых он выигрывает. Разбираем, как не ошибиться и когда смешивать их в одном проекте.</p><p>Речь пойдёт не о сравнении синтаксиса в вакууме, а о бэкенд-сервисах: API, шлюзах, обработке событий, парсинге данных и всём, что работает под нагрузкой. В статье — авторский взгляд на материал блога инженера Pooya Golchian, дополненный российским контекстом и поправками на реальное состояние экосистем.</p><p><b>Go</b> остаётся стандартным выбором для большинства микросервисов: быстрая компиляция, простота найма, огромная экосистема.</p><p><b>Rust</b> выигрывает там, где важны предельная задержка и контроль над памятью, но требует опытной команды и времени на обучение.</p><p><b>Zig</b> подходит для узких, критичных к производительности участков и для интеграции с существующим C-кодом, но экосистема пока незрелая.</p><p>В больших системах работает гибридный подход: Go для скорости разработки, Rust/Zig для горячих путей.</p><p>Мигрировать стоит только после профилирования: оптимизация без замеров обычно дороже, чем выгода.</p><h2>Почему именно эти три языка</h2><p>В 2026 году для нового backend-проекта по-прежнему можно взять Java, C#, Python или Node.js. Но если речь заходит о высоких нагрузках, низкой задержке и контроле над ресурсами, внимание смещается к трём игрокам.</p><ul><li><b>Rust</b> — язык с владением и заимствованием, дающий безопасность памяти без сборщика мусора.</li><li><b>Go</b> — язык с простой моделью конкурентности, статической линковкой и минималистичной философией.</li><li><b>Zig</b> — язык в духе C, но с современной системой сборки, comptime и явным управлением памятью.</li></ul><p>Все трое компилируются в нативный код, дают один бинарник на выходе и не требуют виртуальной машины. Именно это отличает их от Java, C# и Python на старте.</p><h2>Rust: максимум производительности, максимум сложности</h2><h3>Сильные стороны</h3><ul><li>Безопасность памяти на этапе компиляции — нет use-after-free, data races и большинства утечек.</li><li>Нулевая стоимость абстракций: высокоуровневый код часто компилируется так же эффективно, как ручной C.</li><li>Мощная модель конкурентности поверх tokio или async-std.</li><li>Зрелая экосистема: axum, actix-web, serde, sqlx.</li></ul><h3>Слабые стороны</h3><ul><li>Крутая кривая обучения: borrow checker требует перестройки мышления.</li><li>Долгая компиляция: полная пересборка крупного проекта занимает десятки секунд и минуты.</li><li>Меньше кадров на рынке, чем у Go или Java.</li><li>Итерации медленнее: каждая ошибка компилятора — это время на переделку.</li></ul><h3>Когда выбирать Rust</h3><p>Rust логичен, если вы строите инфраструктуру — прокси, базы данных, очереди, edge-сервисы — или если профилирование показывает, что горячий путь съедает CPU и память. Примеры из продакшена: Cloudflare использует Rust на edge, Discord переписал на Rust часть read-path сервисов.</p><h2>Go: скорость разработки в масштабе</h2><h3>Сильные стороны</h3><ul><li>Компиляция за секунды и один статический бинарник для деплоя.</li><li>Встроенные горутины и каналы — простая, но мощная конкурентность.</li><li>Отличная стандартная библиотека и быстрое тестирование через go test.</li><li>Большая база инженеров и проверенные практики в крупных компаниях.</li></ul><h3>Слабые стороны</h3><ul><li>Сборщик мусора может давать всплески задержек, хотя в последних версиях паузы сокращаются.</li><li>Меньше контроля над расположением памяти и размером структур.</li><li>Пиковая пропускная способность ниже, чем у Rust и Zig, на CPU-bound задачах.</li><li>Система типов и обработка ошибок минималистичны — кому-то этого достаточно, кому-то не хватает.</li></ul><h3>Когда выбирать Go</h3><p>Go — выбор по умолчанию для команд из 5–50 человек, которым нужно быстро запускать CRUD-сервисы, API-шлюзы и data pipeline. Uber, Google и Яндекс активно используют Go в микросервисах. Если главная метрика — time to market, а не последний процент производительности, Go обычно выигрывает.</p><h2>Zig: новый игрок с C-душой</h2><h3>Сильные стороны</h3><ul><li>Производительность уровня C с более современным синтаксисом и системой сборки.</li><li>comptime — выполнение кода на этапе компиляции для генерации оптимизированных структур.</li><li>Прямое взаимодействие с C без FFI-слоёв.</li><li>Маленькие быстрые бинарники и явное управление памятью.</li></ul><h3>Слабые стороны</h3><ul><li>Экосистема backend-фреймворков и библиотек пока существенно меньше, чем у Rust и Go.</li><li>Сообщество и количество инженеров на рынке ограничены.</li><li>Ручное управление памятью перекладывает ответственность на разработчика.</li><li>Некоторые части языка и стандартной библиотеки всё ещё эволюционируют.</li></ul><h3>Когда выбирать Zig</h3><p>Zig хорош, когда нужна C-производительность, но с более удобным инструментарием, или когда приходится интегрироваться с существующим C-кодом. Пример из продакшена: финансовая база данных TigerBeetle написана на Zig. Для универсального backend в 2026 году Zig ещё рано называть mainstream-выбором.</p><h2>Сравнение в цифрах</h2><p>Ниже — иллюстративные цифры из оригинального материала, полученные на AWS c7g.2xlarge (Graviton3). Относитесь к ним как к точке отсчёта, а не как к гарантии для вашего сервиса: в реальности большее значение имеют I/O, запросы к базе данных и сетевая задержка.</p><p><b>Бенчмарки:</b><br />HTTP throughput — Rust 892K req/s, Go 734K req/s, Zig 812K req/s.<br />JSON-сериализация — Rust 1,2M/s, Go 890K/s, Zig 1,1M/s.<br />Память на 10K соединений — Rust 45MB, Go 78MB, Zig 38MB.<br />Размер бинарника — Rust 8,2MB, Go 12,4MB, Zig 6,1MB.<br />Время компиляции с нуля — Rust 42s, Go 3,2s, Zig 18s.<br />P99 latency — Rust 2,1ms, Go 3,8ms, Zig 2,4ms.</p><h2>Реальные истории миграции</h2><h3>Discord: Go → Rust</h3><p>Discord переводил read-path сервисы с Go на Rust из-за пауз сборщика мусора, которые проявлялись в хвостовых задержках. По данным компании, throughput вырос в несколько раз, а tail latency снизилась. Ключевой вывод: мигрировать стоит только горячие пути, а не весь сервис целиком.</p><h3>Uber: Python → Go</h3><p>Uber мигрировал часть микросервисов с Python на Go, чтобы обойти ограничения GIL и упростить масштабирование. Переход занял годы, но зато проходил постепенно: Go-совместимость и простота языка позволяли быстро обучать команду.</p><h3>TigerBeetle: C++ → Zig</h3><p>TigerBeetle — финансовая база данных, ориентированная на корректность и производительность. Команда выбрала Zig, отказавшись от сложности C++ и сборщика мусора. comptime позволил генерировать специализированные структуры данных под задачу.</p><h2>Гибридная архитектура</h2><p>На практике редко выбирают один язык на весь проект. Гораздо чаще используют гибрид:</p><ul><li><b>API Gateway и CRUD</b> — Go: быстро писать, просто деплоить, легко искать людей.</li><li><b>Горячие пути</b> — Rust: низкая задержка и контроль над памятью.</li><li><b>Специализированные компоненты</b> — Zig: парсинг бинарных форматов, криптография, интеграция с C.</li></ul><p>Такая схема позволяет получить скорость разработки в большинстве сервисов и производительность там, где она действительно нужна. Главное — разделять систему по чётким границам и не превращать проект в зоопарк ради самого зоопарка.</p><h2>Что выбрать в 2026 году</h2><p>Выбор зависит от приоритетов команды и задачи:</p><ul><li><b>Нужна скорость разработки и лёгкий найм</b> — Go.</li><li><b>Нужна максимальная производительность и безопасность памяти</b> — Rust.</li><li><b>Нужна C-производительность с современной сборкой и интеграцией с legacy на C</b> — Zig.</li><li><b>Команда маленькая и сроки горят</b> — начинайте с Go, профилируйте, мигрируйте горячие пути при необходимости.</li><li><b>Строите базу данных, прокси или edge</b> — Rust становится очень сильным кандидатом.</li></ul><h2>FAQ</h2><h2>Выводы</h2><p>Rust, Go и Zig — не конкуренты в прямом смысле, а инструменты для разных условий. Go задаёт темп разработки, Rust отвечает за надёжность и производительность, Zig покрывает специализированные ниши. Лучшая стратегия для 2026 года — начать с Go, измерять, а затем точечно внедрять Rust или Zig там, где данные это оправдывают.</p><blockquote>Нет универсального лучшего языка — есть лучший язык для конкретной команды, задачи и бюджета на обучение.</blockquote><p><b>Источник:</b> <a href="https://pooya.blog/blog/rust-go-zig-high-performance-backend-2026/">Pooya Golchian — Rust vs Go vs Zig: High-Performance Backend Services in 2026</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</title>
      <link>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</link>
      <comments>https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan</guid>
      <description><![CDATA[<p>Разбираем, почему async Rust генерирует лишние state machine, как это бьёт по embedded и WASM, и что можно сделать в коде прямо сейчас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/async-rust-kak-umenwit-binarnik-poka-rustc-ne-optimizirovan">Async Rust: как уменьшить бинарник, пока rustc не оптимизирован</a>»</p>]]></description>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 29 Jun 2026 10:21:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Асинхронный Rust обещал нам zero-cost abstraction: пишете почти как на обычном синхронном языке, а runtime сам разбирается с конкурентностью. На сервере с десятками гигабайт RAM это обещание обычно сбывается. Но стоит перейти к embedded-прошивке на 256 КБ flash или к WebAssembly-модулю, который гонится за каждым килобайтом, — и картина меняется. Функция с двумя await-точками превращается в state machine из 360 строк MIR, тогда как синхронный аналог укладывается в 23. Почему так происходит и что с этим делать уже сегодня?</p><p>Тема получила новый импульс после серии публикаций Диона Доктера (Dion Dokter) из голландской компании Tweede golf. Во второй части он заглядывает внутрь rustc и утверждает: async Rust так и не вышел из состояния MVP. Я не буду дословно переводить его рассуждения, а переосмыслю их с упором на практику: как понять, платите ли вы за async-удобство лишними байтами, и как снизить налог, пока компилятор не научился делать это сам.</p><ul><li>Асинхронный Rust компилируется в state machine: на каждую await-точку приходится отдельное состояние плюс служебные Unresumed, Returned и Panicked.</li><li>Простая функция с двумя await-точками даёт 360 строк MIR против 23 у синхронного кода. Часть излишков LLVM убирает, но не все, особенно при оптимизации по размеру.</li><li>Компилятор не схлопывает идентичные состояния, не инлайнит futures через await, генерирует state machine даже для async-блоков без await и оставляет panic-путь в состоянии Returned.</li><li>В release-сборках замена panic в Returned на возврат Pending может сократить прошивку на 2–5%. Убирание state machine у пустых async-блоков — ещё около 0,2%.</li><li>Пока rustc не исправлен, можно вручную: возвращать impl Future из «прозрачных» функций, использовать std::future::ready, схлопывать await-точки через match и передавать большие данные по ссылке.</li></ul><h2>Почему async-функция — это всегда state machine</h2><p>Когда вы пишете async fn, компилятор не просто оборачивает тело в callback. Он строит конечный автомат: enum, где каждый вариант — состояние между await-точками. Это называется coroutine desugaring и происходит на уровне MIR (Mid-level IR) — до того, как код попадает в LLVM.</p><p>Рассмотрим минимальный пример. Есть две функции, каждая из которых просто возвращает число, и третья складывает результаты:</p><p>У bar две await-точки, поэтому минимум два пользовательских состояния. Но если сдампить MIR после прохода coroutine_resume, картина шире:</p><p>Три служебных состояния добавляются всегда. Они нужны, чтобы соблюсти контракт Future::poll: опрос завершённой future не должен приводить к неопределённому поведению. Поэтому после первого Ready future переходит в Returned, а повторный poll паникует. Аналогично Panicked блокирует future после пойманного panic — похоже на poisoning мьютекса.</p><p>Логика корректная, но цена высокая: bar порождает 360 строк MIR, а эквивалентный синхронный код — 23. В 15 с лишним раз больше. LLVM часть этого выбросит, но на opt-level = "z" или в толстых async-графах вызовов он быстро сдаётся.</p><h2>Четыре места, где компилятор работает вхолостую</h2><h3>1. Panic в состоянии Returned</h3><p>Контракт future требует только отсутствия UB. Паниковать при повторном poll — не обязательно. Можно просто вернуть Pending снова: ничего опасного не произойдёт, а ветка panic — это лишний побочный эффект, который плохо оптимизируется.</p><p>Дион сделал экспериментальный патч rustc: в release-режиме Returned больше не паникует. На embedded-прошивках это дало <b>2–5% экономии бинарного размера</b>. В debug-сборках панику можно оставить, чтобы быстро ловить ошибочный повторный poll, — по аналогии с overflow-checks.</p><h3>2. State machine без await</h3><p>Взгляните на функцию без единой await-точки:</p><p>Идеальная реализация — всегда возвращать Poll::Ready(5) безо всякого enum. А rustc генерирует полноценный CoroutineLayout с тремя служебными состояниями и switch по дискриминанту. Такие функции часто появляются в трейтах, где один интерфейс должен быть async, но конкретная реализация ничего не ждёт. Патч, убирающий state machine у async-блоков без await, даёт ещё <b>0,2%</b> размера — мало, но правка тривиальная.</p><h3>3. Futures не инлайнятся через await</h3><p>Классический шаблон: адаптер просто пересылает вызов вниз.</p><p>Сейчас bar получает собственный state machine, который вызывает state machine foo. Вручную мы бы написали fn bar(blah) -&gt; impl Future { foo(blah) } и избавились бы от лишнего enum. Аналогично с преамбулой и постамбулой: их можно перенести на FutureExt::map из крейта futures.</p><h3>4. Одинаковые состояния не схлопываются</h3><p>Если в async-функции несколько веток match ведут к одинаковому await, компилятор создаёт отдельное состояние на каждую ветку:</p><p>Здесь send_response вызывается с разными аргументами, но структура состояний дублируется. Если вынести выбор аргумента за await, получится одно состояние вместо двух:</p><p>В одном примере из статьи MIR сокращается с 456 до 302 строк, а ассемблер — примерно на 11%. Оптимизации stack, поэтому выигрыш в реальном коде может быть заметнее.</p><h2>Что делать сегодня, не дожидаясь rustc</h2><p>Всё перечисленное выше — это работа для команды компилятора. Но релиз с этими патчами может занять месяцы, а то и годы. Пока он не вышел, можно снизить async-bloat в своём коде.</p><p><b>Главный принцип:</b> каждый лишний async fn — это лишний state machine. Если функция не содержит await, не делайте её async.</p><h3>Заменяйте async-пустышки на impl Future</h3><p>Типичный случай — трейт, где одна реализация реально ждёт ввода-вывода, а другая просто возвращает значение.</p><p>Вместо полноценного state machine получается готовая future, которая сразу возвращает Ready. Это особенно полезно в embedded-HAL, где трейты часто async, но конкретный драйвер может делать только прямой доступ к регистрам.</p><h3>Прозрачные обёртки без await</h3><p>Если функция только пересылает await вниз, уберите await:</p><h3>Схлопывайте await-точки</h3><p>Если несколько веток match заканчиваются одним и тем же await, вынесите выбор аргументов наружу. Это уменьшает число состояний state machine и облегчает жизнь LLVM.</p><h3>Передавайте большие данные по ссылке</h3><p>Async-функция захватывает в state machine всё, что живёт через await. Если передать массив по значению, он окажется внутри future целиком:</p><p>Разница в 52 раза по размеру future — и это без учёта memcpy, который компилятор вынужден вставлять при перемещении больших значений.</p><h2>Перспективы: Project Goal и финансирование</h2><p>Дион оформил эти идеи как <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal</a> — формальный механизм, через который команды заявляют цели на полугодие. По его оценке, работа требует порядка <b>€30 000</b> финансирования. Для компиляторного проекта это скромная сумма: речь идёт о 2–5% размера прошивки практически в любом async-проекте.</p><p>Есть и другой подход к той же проблеме: не убирать state machine на входе, а научить LLVM лучше их оптимизировать на выходе. Дион считает, что оба направления дополняют друг друга. Чем проще state machine попадает в LLVM, тем эффективнее её можно проинлайнить и упростить на поздних проходах.</p><h2>Выводы</h2><blockquote>Async Rust never left the MVP state. The compiler generates state machines with a lot of unnecessary baggage. With a few targeted optimizations in rustc we can get smaller binaries and better performance for everyone.</blockquote><p>Утверждение «async Rust так и не вышел из MVP» звучит резко, но поясняет, почему наши «zero-cost» абстракции иногда всё-таки стоят дорого. Компилятор делает корректный, но не оптимальный код: лишние panic-ветки, неинлайненные futures, дублирующиеся состояния и state machine там, где они не нужны.</p><p>Для embedded и WASM это не абстрактная проблема, а конкретные килобайты прошивки. Пока rustc учится, разработчик может снизить налог вручную: убирать async у функций без await, возвращать impl Future из прозрачных обёрток, схлопывать await-точки и не передавать большие структуры по значению.</p><p>Если ваш проект на Rust бьётся о лимит flash, имеет смысл посмотреть на async-граф вызовов свежим взглядом. Часто проще убрать одну лишнюю async-обёртку, чем месяцами ждать патч в компиляторе.</p><p><b>Источники:</b><br />— <a href="https://tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state" rel="noopener">Dion Dokter, «Async Rust never left the MVP state»</a>;<br />— <a href="https://tweedegolf.nl/en/blog/235/debloat-your-async-rust" rel="noopener">Dion Dokter, «Debloat your async Rust»</a>;<br />— <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Rust Project Goal: Async state machine optimisation</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как мы нашли баг в HTTP-библиотеке hyper</title>
      <link>https://tproger.ru/translations/kak-my-nawli-bag-v-http-biblioteke-hyper</link>
      <comments>https://tproger.ru/translations/kak-my-nawli-bag-v-http-biblioteke-hyper?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/kak-my-nawli-bag-v-http-biblioteke-hyper</guid>
      <description><![CDATA[<p>Перестраивая Images binding, команда Cloudflare случайно обнаружила баг в открытой библиотеке hyper, который существовал сразу в нескольких мажорных версиях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/kak-my-nawli-bag-v-http-biblioteke-hyper">Как мы нашли баг в HTTP-библиотеке hyper</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Сетевые протоколы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Баги и ошибки]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jun 2026 15:29:36 GMT</pubDate>
      <content:encoded><![CDATA[<p>Перевод статьи Дины Лам (Deanna Lam), Диретнана Домнана (Diretnan Domnan) и Мэтта Льюиса (Matt Lewis) из Cloudflare Blog, оригинал: <a href="https://blog.cloudflare.com/hyper-bug/">https://blog.cloudflare.com/hyper-bug/</a></p><p>Сервис Images, написанный на Rust и работающий в Workers, запущен на каждой машине в edge-сети Cloudflare. Чтобы обрабатывать клиентские соединения, мы используем hyper — открытую HTTP-библиотеку для Rust.</p><p>В прошлом году мы представили Images binding — он позволяет создавать кастомные программные сценарии обработки удалённых изображений в Workers. В конце 2025 года мы перестроили binding, чтобы сделать связь между Workers runtime и сервисом Images более прямой и локальной.</p><p>Вскоре после выкатки мы получили сообщения о том, что запросы на трансформацию из binding падают — но только иногда и только для больших изображений. Ещё страннее было то, что ответы на эти запросы возвращали статус 200, и в логах не было никаких ошибок. Данные изображения просто обрывались: ответ, который должен был весить два мегабайта, мог прийти всего в несколько сотен килобайт.</p><p>Мы потратили шесть недель на охоту за почти невидимым багом — состоянием гонки, которое проявлялось только при определённых условиях, — в библиотеке hyper, который влиял на то, как Images binding возвращает обработанные изображения клиенту. В итоге исправление заняло четыре строки кода.</p><p>Cloudflare Images binding перешёл на прямое локальное соединение через Unix-сокеты в декабре 2025 года.</p><p>После выкатки большие изображения стали иногда возвращаться обрезанными: HTTP 200, но тело ответа короче Content-Length.</p><p>Причина — состояние гонки в hyper: цикл poll_loop отбрасывал результат poll_flush, даже если тот возвращал Poll::Pending.</p><p>Баг существовал в hyper 0.14.x, 1.7 и 1.8; прежний посредник FL читал данные достаточно быстро, чтобы он не проявлялся.</p><p>Исправление заняло четыре строки кода: flush теперь выполняется перед shutdown.</p><h2>Прыжки, передачи и hyper</h2><p>Когда разработчики создают приложения на Cloudflare, они собирают full-stack приложения из набора платформенных сервисов, доступных Workers через bindings. Bindings предоставляют прямые API к ресурсам Developer Platform: вычислениям, хранилищам, ИИ-инференсу и обработке медиа.</p><p>Images binding отделяет оптимизацию изображений от доставки: вы можете транскодировать, компоновать или изменять изображения, не возвращая результат в виде HTTP-ответа. Также он позволяет применять параметры оптимизации в любом порядке, а не в фиксированной последовательности, которую навязывает URL-интерфейс. Вот пример: воркер передаёт данные изображения напрямую в Images API, объединяет операции в цепочку и получает обработанный результат в виде потока:</p><p>На высоком уровне так выглядит движение данных через наши сервисы:</p><figure><img src="https://media.tproger.ru/user-uploads/133946/2026-06-23/4ed76cb3-414e-4ac0-bf31-81e0ba01bb2e.webp" alt="Схема движения данных между Workers runtime, посредником и сервисом Images" /><figcaption>Схема движения данных между Workers runtime, посредником и сервисом Images при использовании Images binding</figcaption></figure><p>Труба на схеме обозначает сокетное соединение между посредником и Images, через которое данные передаются от одного процесса к другому через буфер ядра.</p><p>Binding взаимодействует с Images через сокетное соединение, управляемое Workers runtime. Сокет — это канал связи между двумя процессами. У каждого конца сокета есть буферы, управляемые ядром операционной системы; эти буферы — временные области, где данные остаются после записи одной стороной, но до чтения другой.</p><p>Hyper управляет соединением на стороне сервиса Images: читает входящие запросы из сокета и пишет ответы обратно в него.</p><p>Когда запрос использует Images binding, сервис Images читает входные данные, выполняет запрошенные операции оптимизации и кодирует результат. Затем он передаёт всё закодированное изображение hyper как один непрерывный блок в памяти.</p><p>Hyper записывает эти данные ответа в свой внутренний буфер. На этом моменте hyper считает кодирование завершённым, потому что у него есть все байты, которые нужно отправить. Следующий шаг — сбросить внутренний буфер в исходящий буфер сокета, переместив данные от сервиса Images к посреднику на другом конце.</p><p>Если читатель на другом конце быстрый, hyper может сбросить всё за один проход — в исходящем буфере будет место, потому что читатель потребляет данные по мере поступления. Как только все данные отправлены, hyper вызывает shutdown на сокете, сигнализируя, что соединение завершено и больше данных записано не будет. Но если читатель медленнее (хотя бы на несколько миллисекунд), исходящий буфер заполняется, и hyper должен ждать, пока появится место, чтобы продолжить запись.</p><h2>Локальное соединение</h2><p>Весь входящий трафик в сети Cloudflare проходит через FL — внутренний сервис-посредник, который включает функции безопасности и производительности и маршрутизирует запросы к нужному бэкенду. Когда мы только запустили binding, данные изображений шли из Workers runtime через FL в сервис Images.</p><p>Этот путь хорошо подходил для первого релиза и повторял архитектуру URL-интерфейса. Но со временем связь с FL стала ограничением: любое изменение binding приходилось согласовывать с циклом релизов FL.</p><p>В декабре 2025 года команда Images заменила FL новым посредником — внутренним worker binding, который работает на той же машине. В исходной архитектуре данные шли через FL по сетевым сокетам; этот путь нёс накладные расходы полного конвейера обработки FL, такие как DNS-lookup'ы и маршрутизация.</p><p>Внутренний binding заменил их на Unix-сокеты, чтобы напрямую соединить сервисы на одной машине, минуя FL и накладные расходы сетевого стека. Это ускорило путь запроса к Images и дало команде независимый контроль над релизами binding.</p><p>В течение нескольких дней после выкатки мы получили первый отчёт от клиента.</p><h2>200 OK (не OK)</h2><p>Первый признак проблемы пришёл от клиента с нестандартной конфигурацией: два уровня обработки изображений, где один pipeline был вложен в другой.</p><p>Сначала их воркер с помощью Images binding компоновал несколько больших исходных изображений из R2 — JPEG-фон и PNG-оверлеи — в один объединённый JPEG. Затем результат дополнительно сжимался, транскодировался и изменялся размер через URL-интерфейс.</p><p>Баг возникал на обратном пути внутреннего pipeline, где ответ обрезался до того, как достигал внешнего.</p><p>Внутренний pipeline (transformation binding) отвечал за компоновку. Внешний pipeline (transformation URL) отвечал за оптимизации доставки: масштабирование и конвертацию формата. Такая многоуровневая схема означала, что когда внутренний pipeline молча возвращал обрезанный ответ, видимая ошибка появлялась на уровень выше:</p><p>Внешний pipeline получал от внутреннего HTTP 200 с заголовком Content-Length, который обещал несколько мегабайт. Фактическое тело было лишь частью от этого: в одном запросе из ожидаемых 3,3 МБ пришло всего около 200 КБ. Ошибка всплывала во внешнем pipeline, но обрезка могла произойти в binding, посреднике, сервисе Images или где-то между ними.</p><p>Когда браузер получает обрезанное изображение, результат виден невооружённым глазом. В зависимости от формата изображение либо отрисовывается частично (например, с отсутствующей или серой нижней частью), либо полностью не декодируется и отображается как битое.</p><h2>Отладка вслепую</h2><p>Отсюда мы двигались вглубь по пути запроса, проверяя каждый уровень, чтобы локализовать место обрезки. Некоторые усилия зашли в тупик; другие оставили зацепки, которые сузили поиск:</p><ul><li><b>Сборка репродукции.</b> Мы собрали воркер, повторяющий вложенную схему клиента, и постепенно убирали уровни, пока не смогли воспроизвести баг только с binding. Небольшой скрипт отправлял запросы пачками. На одном из первых прогонов 19 из 25 запросов упали. Объём данных, которые всё-таки приходили, — примерно 200 КБ — настораживающе близко к размеру сокетного буфера в продакшене. Это подтвердило, что проблема не связана с конфигурацией клиента, и дало надёжный способ воспроизводить баг по запросу.</li><li><b>Проверка таймаутов.</b> Сначала мы подозревали, что обрезка связана с поведением таймаутов (то есть соединение закрывалось по истечении лимита времени). Эта теория не подтвердилась: обрезка не коррелировала с длительностью запроса.</li><li><b>Обновление версии hyper.</b> Когда баг впервые зарепортили, мы использовали 0.14.x, а последняя версия hyper была около 1.8.x. Мы протестировали версии 0.14, 1.7 и 1.8 — на случай, если самый очевидный ответ окажется правильным (и самым простым). Но баг проявлялся в каждой версии, значит, upstream-исправления не было.</li><li><b>Локальное воспроизведение.</b> Мы запускали интеграционные тесты на macOS и Debian-виртуалке. Даже под значительной нагрузкой локальные запросы никогда не падали. Прямые curl-запросы к сокету binding и повтор отловленных запросов всегда работали. Баг проявлялся только на полном продакшен-пути при реальной конкурентности и реальном клиенте Workers runtime на другом конце сокета. Это натолкнуло нас на подозрение, что виноват сам runtime.</li><li><b>Исключение Workers runtime.</b> Мы изучили HTTP-клиент, который Workers runtime использует для связи с Images через сокет binding. Ни на одной из сторон соединения в трассировках не было системных вызовов, указывающих на неожиданное закрытие или преждевременное завершение. Клиент вёл себя корректно, и несколько других сервисов использовали того же клиента без проблем.</li><li><b>Распределённая трассировка.</b> Изучив сквозные трассировки запросов, мы подтвердили, что обрезанное тело уже присутствовало до того, как достигало внешнего уровня трансформации в схеме клиента. Это сузило проблему до внутреннего pipeline — пути binding через сервис Images.</li><li><b>Инструментирование посредника.</b> Мы добавили инструментирование в посредник, чтобы измерять размеры тел перед пересылкой ответа. Тела уже были обрезаны к моменту выхода из сервиса Images, так что посредник был исключён.</li><li><b>Углублённая трассировка внутри Images.</b> На уровне сервиса запрос обрабатывался, изображение корректно кодировалось, и ответ отправлялся с HTTP 200.</li></ul><p>Единственный постоянный сигнал заключался в том, что баг зависел от тайминга: он появлялся только на продакшен-пути, при реальной конкурентности и только для больших изображений.</p><h2>Зерно истины</h2><p>Инструменты отладки на уровне приложения показывали лишь то, что система <i>считала</i>, что делает. Но по мнению системы всё было в порядке: трассировка утверждала, что ответ отправлен; логи не сообщали об ошибках; сервис Images возвращал 200 на каждый запрос.</p><p>Чтобы увидеть, что система делала на самом деле, мы подключили strace к сервису Images. strace записывает системные вызовы, которые процесс делает ядру; это позволило показать, какие именно байты были записаны, когда вызывался shutdown и посылал ли клиент сигнал завершения.</p><p>Настройка трассировки была деликатной. strace работает, перехватывая системные вызовы по мере их выполнения, что добавляет небольшие накладные расходы по времени к каждому вызову. Фильтрация узкого набора системных вызовов держала эти накладные расходы минимальными. Однако расширение фильтра замедляло процесс ровно настолько, чтобы сдвинуть тайминг между flush и проверкой shutdown — и баг полностью исчезал. Одно это уже подкрепляло теорию о тайминг-зависимости проблемы.</p><p>Используя воркер-репродукцию, мы спровоцировали баг и сравнили вывод системных вызовов между успешными и упавшими запросами.</p><p>При успешном запросе ответ пишется кусками по мере освобождения сокетного буфера, а shutdown вызывается только после отправки всех данных. Например, это может выглядеть так:</p><p>Когда мы воспроизвели баг, упавший запрос выглядел так:</p><p>Здесь есть только одна запись — лишь заголовки и крошечная часть тела — перед немедленным вызовом shutdown. Из ответа в 14,9 МБ было отправлено около 219 КБ. Оставшиеся ~14,8 МБ данных изображения никогда не покидали внутренний буфер hyper, и не было никакого сигнала завершения от клиента между записью и shutdown. Вместо этого сервис Images преждевременно закрывал соединение самостоятельно, искренне полагая, что работа завершена.</p><p>Упавшие запросы подтвердили, что баг — состояние гонки, которое срабатывало непостоянно. Успех или провал зависели от того, перекрывались ли операции flush и shutdown, и это менялось от запроса к запросу. Когда буфер был полон в тот самый момент, когда hyper решил, что соединение завершено, данные терялись.</p><p>Когда читатель потребляет медленнее, чем hyper пишет, исходящий буфер заполняется. Если hyper закрывает соединение до того, как буфер опустеет, то лишь часть ответа попадает к посреднику; эти неполные данные пересылаются обратно в Workers runtime и клиенту.</p><p>Перестройка в декабре не ввела этот баг — он существовал в hyper годами в нескольких мажорных версиях. Но новый посредник изменил того, кто читал ответ на другом конце сокета. Наша рабочая теория: прежний посредник FL потреблял данные достаточно быстро, чтобы сокетный буфер редко заполнялся во время ответа. Новый читатель работал в темпе, который иногда позволял буферу заполняться при больших ответах.</p><p>Этих нескольких миллисекунд обратного давления, внесённых улучшением, которое ускорило всё остальное, хватило, чтобы выявить изъян, который скрывался на виду.</p><h2>Внутри цикла dispatch</h2><p>Жизненный цикл HTTP/1-соединения в hyper управляется конечным автоматом в файле под названием dispatch.rs. Он выполняет цикл, который читает запросы, пишет ответы, сбрасывает буфер записи в сокет и решает, когда закрываться. В упрощённом виде:</p><p>Точнее, именно let _ перед poll_flush — это место, где живёт баг.</p><p>В Rust let _ = expr отбрасывает результат выражения, включая Poll::Pending — сигнал о том, что flush ещё не завершён. В буфере flush может остаться несколько мегабайт, но цикл об этом никогда не узнаёт.</p><p>Когда запрос падает, последовательность событий выглядит так:</p><ol><li>Сервис Images завершает кодирование изображения и передаёт весь ответ hyper как один блок в памяти.</li><li>Hyper записывает блок во внутренний буфер и помечает состояние записи как Writing::Closed. С точки зрения кодирования работа сделана — кодировать больше нечего.</li><li>Hyper вызывает poll_flush, чтобы перенести буферизованные данные в сокет. В нашем примере сокет принял около 219 КБ. Оставшиеся ~14,8 МБ остаются в буфере hyper. Сокет полон, поэтому ядро возвращает Poll::Pending.</li><li>poll_loop отбрасывает Poll::Pending с помощью let _.</li><li>Он проверяет wants_read_again(). Полный запрос уже получен, поэтому возвращается false.</li><li>poll_loop возвращает Poll::Ready(Ok(())), сигнализируя, что цикл завершён, хотя flush ещё не сделан.</li><li>Срабатывает poll_shutdown(). Выполняется системный вызов SHUT_WR.</li><li>Клиент получает 219 КБ и EOF (end-of-file), указывающий, что соединение закрыто, хотя он ожидает 14,9 МБ.</li></ol><p>На втором шаге hyper помечает операцию записи как завершённую, как только тело ответа оказывается в буфере (то есть когда кодирование закончено), а не когда данные фактически сброшены. В большинстве случаев flush завершается за один проход, и это различие незаметно. В редких случаях, когда сокетный буфер полон, flush приходится ждать — но hyper не ждёт. Байты всё ещё сидят в буфере hyper, ожидая сброса в сокет. Hyper при этом закрывает соединение с этими данными всё ещё в буфере.</p><p>Это также объясняет, почему curl никогда не воспроизводил баг. Curl читает данные так быстро, как они приходят: сокетный буфер никогда не заполняется, flush всегда завершается мгновенно, и отброшенное возвращаемое значение безобидно. Продакшен-путь с читателем, который иногда паузил на несколько миллисекунд, был единственной конфигурацией, где буфер заполнялся в нужный момент.</p><h2>Не забывайте сбрасывать буфер</h2><p>После недель расследования само исправление было концептуально простым. Hyper должен был проверять, завершён ли flush, прежде чем двигаться дальше.</p><p>Наш reproduction-воркер подтвердил, что баг существует, но не мог объяснить, почему падает конкретный запрос. Прежде чем писать исправление, нам нужен был тест, который мог бы спровоцировать точные сокетные условия внутри hyper.</p><p>Мы знали условия, вызывающие баг: сокет, который принимает один кусок данных, а затем блокируется. Для контролируемого сценария мы построили обёртку вокруг TCP-потока, имитирующую полный сокетный буфер. Обёртка принимала 8 КБ при первой записи, а затем возвращала Poll::Pending на каждой последующей записи, имитируя читателя, который перестал опустошать буфер.</p><p>Тест отправлял 500 КБ ответа через этот ограниченный сокет и проверял, вызывает ли hyper shutdown, пока в буфере остаётся 492 КБ. Без исправления — вызывал. С исправлением — ждал.</p><p>Сначала мы применили исправление в цикле dispatch hyper. Вместо отбрасывания результата poll_flush мы проверяли, завершён ли flush на самом деле:</p><p>Если flush не завершён, цикл возвращает Poll::Pending асинхронному runtime. Runtime ждёт, пока сокет не станет доступен для записи, а затем будит задачу, чтобы продолжить flush. Соединение закрывается только после того, как все данные отправлены.</p><p>Когда мы выкатили это исправление, мы увидели, что записан каждый байт, а shutdown вызывался только после того, как буфер действительно опустел. Клиент, который сделал первый репорт, тоже подтвердил, что проблема исчезла.</p><p>Хотя первоначальное решение работало, цикл dispatch был неправильным местом для исправления. Ранний возврат Poll::Pending мог замедлять другие операции на том же соединении, уменьшая частоту опроса чтения и вызывая нежелательное обратное давление. Также это корректно не обрабатывает keepalive-соединения, где одно соединение обрабатывает несколько запросов подряд — они должны оставаться пригодными к использованию, даже пока предыдущий ответ всё ещё сбрасывается. Ни одна из этих проблем не затрагивала наш сервис (где keepalive отключён), но обе могли повлиять на других пользователей hyper, если бы исправление было предложено upstream.</p><p>Мы проследили жизненный цикл соединения hyper и нашли более точечный подход. Вместо изменения поведения цикла dispatch мы применили исправление в том месте, где shutdown вызывается на самом деле. Перед закрытием сокета hyper должен сначала сбросить оставшиеся данные в буфере:</p><p>Это оставляет цикл dispatch без изменений. Flush добавляется только в тот точный момент, где иначе произошла бы потеря данных — непосредственно перед shutdown.</p><h2>Что осталось с нами</h2><p>Ни один из инструментов на уровне приложения не выдавал ошибок, падений или полезных записей в логе. Наблюдаемость на уровне приложения может иметь слепое пятно для багов, которые живут ниже её уровня осознанности.</p><p>Сбой происходил непостоянно, масштабировался с размером ответа, не воспроизводился простыми инструментами вроде curl и исчезал, когда мы наблюдали за системой внимательнее. Эти сигналы указывали на тайминг-зависимый баг в слое соединения, а не в логике приложения.</p><p>Прорыв случился благодаря инструментарию уровня ядра — strace, единственному слою, который фиксирует, что на самом деле происходило на сокете. Базовый баг жил в нескольких миллисекундах между частичным flush и преждевременным shutdown — окне, которое открылось только после того, как мы ускорили систему.</p><p>Мы влили исправление и детерминированный тест в hyperium/hyper через PR #4018. Оно появится в будущем релизе hyper, гарантируя, что любой сервис, использующий HTTP/1-реализацию hyper, не потеряет данные ответа из-за того же состояния гонки.</p><p>Пока мы используем внутренний форк с применённым патчем. Это исправление стабилизировало архитектуру binding, создав надёжную основу для расширения его функциональности.</p><p>Изначально Images binding покрывал только трансформации удалённых изображений. В начале этого месяца мы объявили, что Images binding теперь поддерживает операции для hosted-изображений, давая разработчикам единый способ строить медиа-насыщенные приложения на Cloudflare.</p><p>Подробнее о том, как работает binding, — в нашей <a href="https://developers.cloudflare.com/images/worker-bindings/">документации</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>EchoBird — настольный менеджер ИИ-инструментов на Rust</title>
      <link>https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust</link>
      <comments>https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust</guid>
      <description><![CDATA[<p>EchoBird — бесплатный настольный менеджер для установки ИИ-агентов, локальных LLM и управления моделями. Узнайте, кому он пригодится и как устроен изнутри.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/echobird-desktopnyj-menedzher-ii-instrumentov-na-rust">EchoBird — настольный менеджер ИИ-инструментов на Rust</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Лучшая практика]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Архитектура приложений]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 Jun 2026 08:30:33 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://echobird.ai/">EchoBird</a> — open-source настольный менеджер для установки ИИ-агентов и локальных больших языковых моделей (LLM). Если вы хоть раз объясняли другу, как установить Claude Code, настраивали API-ключи для Codex CLI или искали, куда пропал config.json после очередного эксперимента с локальной моделью, вы знаете главную боль запуска ИИ-инструментов на новой машине: каждый инструмент живёт по своим правилам. EchoBird сводит эту кашу в одно кроссплатформенное приложение.</p><p>EchoBird — это open-source настольный лаунчер для ИИ-агентов и локальных больших языковых моделей (LLM). Написан на Rust + Tauri, работает на Windows, macOS и Linux. Автор, разработчик с ником edison7009, собрал его после того, как друзья не раз просили помочь «поставить этот ваш ИИ» на новой машине. Сейчас проект насчитывает 2200 звёзд на GitHub, 162 ответвления и 112 релизов; актуальная версия — v5.2.7.</p><p>Идея простая: вместо того чтобы запускать терминал для каждого инструмента, вбивать команды установки и копаться в переменных окружения, вы открываете одно окно. Там устанавливаются агенты, подключаются API-ключи, запускаются локальные модели и управляются собственные ИИ-проекты. В российских условиях локальные LLM и альтернативные поставщики часто воспринимаются не как эксперимент, а как рабочая необходимость: ограничения на доступ к западным сервисам и требования к данным делают собственное железо привлекательнее облака.</p><ul><li>EchoBird — это open-source менеджер ИИ-инструментов на Rust + Tauri для Windows, macOS и Linux.</li><li>Четыре сценария: установка и починка агентов, локальные LLM, личные ИИ-проекты и единое средство запуска приложений.</li><li>Model Nexus объединяет API-ключи, модели и протоколы OpenAI / Anthropic в одном центре конфигурации.</li><li>Локальные модели запускаются через llama.cpp, vLLM или SGLang с автоподбором под железо.</li><li>Расширяется через plugin.json: новый инструмент можно добавить без изменения кода приложения.</li></ul><h2>Четыре сценария, которые покрывает EchoBird</h2><p>Приложение не претендует на роль универсального рабочего стола, а решает конкретные задачи вокруг «поставил — настроил — запустил». Все четыре сценария используют общий Model Nexus — о нём ниже.</p><h3>Установка и починка агентов</h3><p>EchoBird сканирует систему, находит уже установленные инструменты и проверяет зависимости. Если чего-то не хватает, ведёт установку в режиме диалога. Если что-то сломалось — запускает починку. Поддерживаются Claude Code, Codex CLI, OpenCode, Aider, Hermes Agent, MiMo Code от Xiaomi и собственная линейка агентов автора — OpenClaw, ZeroClaw, NanoBot и PicoClaw. Новый инструмент добавляется через файл plugin.json, поэтому сообщество может расширять список без запросов на слияние в основной репозиторий.</p><h3>Локальные LLM в один клик</h3><p>Встроены три runtime'а под разное железо: llama.cpp для CPU и слабых машин, vLLM для серверных GPU NVIDIA на Linux и SGLang для агентских сценариев с жёстко заданным выводом — например, когда модель должна вернуть JSON строго по схеме. EchoBird сам определяет наличие видеокарты NVIDIA и предлагает runtime с подходящими параметрами — например, размер батча и offloading слоёв на GPU. После запуска модель отдаёт совместимые с OpenAI и Anthropic endpoints — остальные инструменты не замечают подмены. Про локальный запуск LLM через Ollama у нас есть <a href="https://tproger.ru/articles/zapuskaem-llm-lokalno-cherez-ollama-gajd-ot-ustanovki-do-claude">пошаговый гайд</a>.</p><h3>Мои ИИ-проекты</h3><p>Раздел для утилит, демок, игр и скриптов, созданных в режиме vibe coding (импровизационной разработки с ИИ), которые рождаются за один вечер с ИИ-помощником. Вместо того чтобы искать директорию и вспоминать команду запуска, проект живёт в едином списке с кнопкой «старт».</p><h3>Менеджер приложений</h3><p>Центральная панель запуска для всего, что уже установлено. Можно запустить Claude Code, Codex CLI или локальную модель из одного списка, не открывая отдельные терминалы и окна.</p><h2>Model Nexus: единая точка входа для моделей</h2><p>Главная архитектурная идея — Model Nexus. Это прослойка между приложением и поставщиками моделей, которая хранит API-ключи, проверяет задержки, транслирует OpenAI- и Anthropic-совместимые протоколы.</p><p>Без него каждый инструмент требует своей конфигурации: Claude Code требует свой API-ключ, Codex CLI — свой .env, Hermes Agent — свой config.toml, а локальный vLLM — свой путь к модели. Model Nexus заменяет это на «ввёл один раз, используешь везде».</p><p>Поддерживаются 14+ поставщиков: Anthropic, OpenAI, Gemini, xAI Grok, Mistral, Together AI, DeepSeek, MiniMax, GLM, SiliconFlow, а также Ollama, llama.cpp, vLLM, SGLang, OpenRouter и любой OpenAI-совместимый endpoint. Каждому агенту можно назначить свой протокол независимо от остальных.</p><h2>Почему Tauri + Rust, а не Electron</h2><p>Выбор стека для менеджера, который управляет чужими тяжёлыми моделями, логичен. Tauri даёт бинарник менее 10 МБ против типичных 100+ МБ у Electron. Rust напрямую дёргает системные API, работает с файловой системой, процессами и детекцией GPU без лишних мостов. Для инструмента, который постоянно запускает подпроцессы и читает конфигурации, это надёжнее и предсказуемее.</p><h2>Сравнение: классическая установка Claude Code и EchoBird</h2><p>Традиционный путь — пять шагов, каждый из которых может обломаться:</p><ol><li>Проверить версию Node.js (нужен 18+).</li><li>Убедиться, что права npm настроены правильно.</li><li>Выполнить npm install -g @anthropic-ai/claude-code.</li><li>Прописать переменную окружения ANTHROPIC_API_KEY.</li><li>Проверить: claude --version. При смене машины — повторить.</li></ol><p>Путь через EchoBird — короче в разы:</p><ol><li>Открыть EchoBird.</li><li>Install &amp; Repair → Claude Code → установить в один клик.</li><li>Model Nexus → ввести API-ключ один раз для всех инструментов.</li></ol><h2>Расширение через plugin.json</h2><p>Новый инструмент описывается JSON-файлом с командами установки, проверки, починки и запуска. Пример минимального плагина:</p><p>Такой подход отделяет ядро приложения от рецептов установки. Теоретически сообщество может добавить плагины для российских моделей — например, GigaChat, YandexGPT или локальных сборок на базе Saiga — без необходимости ждать официальных обновлений.</p><h2>Что нового в ветке v5.x</h2><p>Релизы выходят активно. Несколько примечательных изменений последних недель:</p><ul><li>v5.2.4 — зеркала для установки из Китая (Tsinghua, Alibaba, Huawei), чтобы зависимости качались без VPN.</li><li>v5.2.0 — переключатель Responses-протокола OpenAI для моделей, которые говорят на нём нативно, например MiniMax-M3 и Qwen3.7.</li><li>v5.2.6 — поддержка MiMo Code от Xiaomi и починка автоуплотнения контекста в Codex V2, из-за которого разговоры обрывались.</li><li>v5.2.4 — нативные элементы управления окном и стандартные горячие клавиши macOS (⌘W, ⌘M, ⌘,).</li></ul><h2>Как попробовать</h2><p><b>Безопасность:</b><br />Перед запуском любого установочного скрипта из интерната рекомендуем открыть его в редакторе или скачать официальный инсталлятор из <a href="https://github.com/edison7009/EchoBird/releases">GitHub Releases</a>.</p><p>После установки: открываете Model Nexus, добавляете ключи; переходите в Install &amp; Repair, выбираете инструменты; запускаете их из App Manager. Для локальных моделей — Local LLM → runtime → модель.</p><h2>Кому пригодится</h2><ul><li>Тимлидам и DevRel'ам, которым часто нужно «поднять окружение» на новой машине коллеги.</li><li>Разработчикам, кто переключается между рабочими и личными ПК и устал от повторяющегося адаптации.</li><li>Энтузиастам локальных LLM, которым надоело вручную ставить CUDA, vLLM и искать пути к моделям.</li><li>Авторам плагинов, которые хотят добавить поддержку отечественных или нишевых ИИ-сервисов.</li></ul><h2>Выводы</h2><p>EchoBird не изобретает ИИ-инструменты заново — он убирает трение на границе между «хочу попробовать» и «уже работает». Model Nexus решает проблему разрозненных конфигураций, встроенные runtime'ы — проблему локальных моделей, а плагины — проблему поддержки новых сервисов. Выбор Rust + Tauri выглядит обоснованным: приложение остаётся лёгким, хотя самые тяжёлые модели грузятся вне его.</p><blockquote>EchoBird родился из собственной боли: друзья постоянно просили меня установить Claude Code на их машины. Я хотел, чтобы любой мог нажать одну кнопку и получить рабочее окружение, не разбираясь в Node.js, npm и переменных окружения.</blockquote><p>Если в вашем рабочем процессе регулярно фигурируют Claude Code, Codex CLI, Aider или локальные LLM, стоит потратить несколько минут на установку и посмотреть, сколько ручных шагов отпадёт.</p><h2>Источники</h2><p>Оригинальный материал: <a href="https://dev.to/wonderlab/open-source-project-of-the-day-97-echobird-one-app-to-install-configure-and-run-all-your-ai-2bpi">Open Source Project of the Day (#97): EchoBird</a> — DEV Community. Дополнительно: <a href="https://github.com/edison7009/EchoBird">репозиторий EchoBird на GitHub</a>, <a href="https://echobird.ai/">официальный сайт</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>OwnCloud – аналог Nextcloud: для чего использовать и как настроить облачное хранилище</title>
      <link>https://tproger.ru/articles/owncloud-analog-nextcloud-dlya-chego-ispolzovat-i-kak-nastroi</link>
      <comments>https://tproger.ru/articles/owncloud-analog-nextcloud-dlya-chego-ispolzovat-i-kak-nastroi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Oksana Karelina]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/owncloud-analog-nextcloud-dlya-chego-ispolzovat-i-kak-nastroi</guid>
      <description><![CDATA[<p>ownCloud vs Nextcloud, что лучше? Какое облачное хранилище выбрать? Как может помочь связка S3 с ownCloud?
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/owncloud-analog-nextcloud-dlya-chego-ispolzovat-i-kak-nastroi">OwnCloud – аналог Nextcloud: для чего использовать и как настроить облачное хранилище</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Конференции]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Redis]]></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[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 07 May 2026 08:40:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы когда-нибудь задумывались, сколько информации производит человечество?</p><p>Если верить статистике, сейчас ежедневно создается около <a href="https://explodingtopics.com/blog/data-generated-per-day">402,74</a> миллионов терабайт данных.</p><p>Согласитесь, довольно внушительная цифра.</p><p>В этих реалиях, когда объем данных постоянно растет, у каждого из нас рано или поздно может возникнуть вопрос – где хранить рабочие и личные файлы, да еще и так, чтобы сохранить абсолютный контроль над ними.</p><p>Меня зовут Оксана, я маркетолог в Beget и в этой статье хочу поделиться решением, которое мы выбрали у себя в отделе для хранения файлов, когда заметили, что их стало слишком много.</p><p>Мы решили перейти на гибкое объектное хранилище S3 – чтобы централизовано хранить и управлять текстами, креативами, отчетами и другими маркетинговыми материалами с удобным доступом внутри команды, ведь S3 позволяет хранить файлы любого типа и объема и масштабируется автоматически. Осталось только выбрать ПО для хранения файлов в облаке, к которому можно подключить S3.</p><p>Ранее у нас был опыт использования Nextcloud, однако его функционал, подобный швейцарскому ножу (встроенные календарь, конференции, таск-трекер и т. д.), оказался слишком объемен для нашей, по сути, скромной задачи – удобного и стабильного хранения файлов.</p><p>Вот почему мы подыскали аналог Nextcloud – ownCloud. В отличие от более функционального <a href="https://beget.com/ru/cloud/marketplace/nextcloud">Nextcloud</a>, ownCloud заточен исключительно на работу с файлами. И при этом он поддерживает подключение облачного объектного хранилища S3. Поэтому для нас в сравнении Nextcloud vs ownCloud выбор был очевиден.</p><p>В этой статье я расскажу, какие возможности есть у ownCloud, почему это ПО может быть полезно и как настроить связку ownCloud и S3. Если вы хотите организовать безопасное, контролируемое хранение и обмен данными на работе или дома, то этот материал будет для вас полезен.</p><h2>Что может ownCloud</h2><p>Для начала – буквально несколько слов об ownCloud и его возможностях.</p><p>Это программное обеспечение с открытым исходным кодом для хранения, синхронизации и обмена файлами появилось в 2010 году благодаря усилиям разработчика KDE Франка Карличека, который <a href="https://ru.wikipedia.org/wiki/OwnCloud">стремился</a> создать бесплатную альтернативу коммерческим облачным сервисам хранения данных.</p><h3>OwnCloud позволяет:</h3><ol><li>получать доступ к данным из любой точки мира и хранить файлы на собственном сервере – под вашим полным контролем;</li><li>синхронизировать данные между устройствами – доступ к файлам возможен с компьютеров (Windows, macOS, Linux), смартфонов (iOS, Android) и через браузер, изменения на одном устройстве мгновенно появляются на всех остальных;</li><li>делиться файлами и папками по ссылке, настраивая права доступа, пароли и срок действия ссылок;</li><li>совместно работать с документами, отслеживать историю изменений и возвращаться к любой предыдущей версии файла.</li></ol><blockquote>Только ownCloud сочетает в себе полный контроль над данными с простыми в использовании функциями обмена файлами, делая совместную работу более эффективной и безопасной.</blockquote><p>Сегодня ownCloud используют <a href="https://owncloud.com/customers/">компании</a> (Philips, Nationwide, Zeppelin и др.) в самых разных сферах (IT, машиностроение, медицина и т. д.).</p><p>При этом решение подходит не только для работы, но и для личных целей, когда нужно обменяться фото и видео с родственниками и друзьями, ведь, по мнению пользователей, среди преимуществ ownCloud – <a href="https://www.capterra.com/p/176602/ownCloud/reviews/">простота настройки</a> и <a href="https://www.temjournal.com/content/102/TEMJournalMay2021_954_960.pdf">удобная синхронизация с различными гаджетами</a>.</p><blockquote>С ownCloud мне не нужно слепо доверять какой-то неопределенной организации. Я контролирую, как происходит обмен файлами, и ownCloud помогает мне на каждом этапе.</blockquote><p>OwnCloud позволяет решать самые разные задачи, связанные с работой с файлами, – расскажем на примере трех кейсов, как это облачное хранилище помогает нам в отделе маркетинга.</p><h2>Для каких задач мы используем ownCloud и S3</h2><h3>1. Централизованное управление материалами</h3><p>Мы часто работаем с текстами, изображениями и презентациями. Дизайнеры и авторы загружают эти материалы в ownCloud, файлы автоматически сохраняются в S3, а для удобства поиска у нас настроены теги.</p><p>В итоге каждый член команды может видеть версии файлов (это важно для правок), нет хаоса в почте и мессенджерах.</p><h3>2. Безопасное взаимодействие с подрядчиками</h3><p>Связка ownCloud и S3 позволяет выгружать внешним специалистам материалы и получать результаты работ без прямого доступа к внутренней сети компании. Мы создали папку с публичной ссылкой, но жесткими ограничениями – паролем, сроком жизни ссылки в течение нескольких дней и разрешением на загрузку файлов без права просмотра папки.</p><p>На практике это работает так: менеджер создает ссылку и отправляет подрядчику, подрядчик переходит по ссылке и загружает архив с готовыми материалами, файл попадает в ownCloud, а его содержимое сохраняется в S3. Таким образом, подрядчик не видит, какие еще файлы лежат в папке, а мы контролируем, кто, что и когда загрузил.</p><h3>3. Долгосрочный архив креативов и отчетов</h3><p>По закону (152-ФЗ в РФ или GDPR в Европе) компания обязана хранить персональные данные клиентов, а также отчеты о рассылках и рекламных акциях на протяжении определенного времени.</p><p>Для решения этой задачи мы настроили правило: файлы старше 90 дней автоматически перемещаются в S3 Glacier (холодное хранилище) – этот класс снижает стоимость хранения, а если, например, юристу понадобится скачать какой-нибудь отчет спустя 2–3 года, он просто выгрузит его из ownCloud буквально за 5–10 минут.</p><p>Теперь – в деталях и по шагам о том, как начать использовать ownCloud в связке с S3.</p><h2>Как развернуть ownCloud и подключить S3</h2><p>OwnCloud удобно использовать с объектным хранилищем S3 – таким образом можно:</p><ol><li>масштабировать систему – S3 расширяется автоматически и не имеет ограничений по объему и количеству размещаемых данных и файлов;</li><li>оптимизировать затраты – можно платить не за дорогую конфигурацию виртуального сервера с большим объемом диска, а лишь за фактически занимаемое место, по модели pay as you go (оплата по мере потребления);</li><li>повысить надежность хранения – за счет встроенной в S3 тройной репликации данных (файлы хранятся в 3 копиях и размещаются на независимых серверах в разных стойках для абсолютной сохранности данных).</li></ol><h3>Итак, разберем, как настроить связку ownCloud и S3.</h3><p>Разработчики ownCloud предлагают два варианта установки. Можно скачать ownCloud и установить его вручную или использовать Docker-контейнеры. Мы выберем второй вариант.</p><p>Для размещения ownCloud в нашем примере создадим виртуальный сервер на базе <a href="https://beget.com/ru/cloud/marketplace/docker">готового решения Docker</a>.</p><p>Можно подключиться к серверу по SSH или с помощью терминала в панели управления.</p><p>Для размещения файлов создайте бакет объектного хранилища S3. Реквизиты доступа к нему будут в карточке бакета в панели:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/ee49d00b-7e32-4b8d-8ad4-bbbaeb0c3bb0.webp" alt="" /></figure><p>Создайте директорию для размещения конфигурационных файлов проекта и перейдите в нее:</p><p>Затем вставьте в файл docker-compose.yml следующее содержимое с помощью любого текстового редактора:</p><p>После этого создайте файл .env, в котором будут храниться значения переменных. Шаблон файла следующий:</p><p>Теперь необходимо отредактировать эти строки:</p><ol><li>ownCloud_DOMAIN и ownCloud_TRUSTED_DOMAINS – укажите домен (так как ownCloud будет размещен за обратным прокси, указывать рабочий порт здесь не требуется);</li><li>ADMIN_USERNAME – логин администратора;</li><li>ADMIN_PASSWORD – пароль администратора.</li></ol><p><i>Обратите внимание! Изменение ADMIN_USERNAME и ADMIN_PASSWORD уже после развертывания контейнеров не возымеет эффекта. Изменить пароль администратора вы можете в настройках пользователя в веб-интерфейсе.</i></p><p>Далее необходимо указать параметры подключения к S3.</p><ul><li>ownCloud_OBJECTSTORE_BUCKET – имя бакета S3;</li><li>ownCloud_OBJECTSTORE_ENDPOINT – эндпоинт хранилища (например, https://s3.ru1.storage.beget.cloud);</li><li>ownCloud_OBJECTSTORE_REGION – регион (ru1 для Beget);</li><li>ownCloud_OBJECTSTORE_KEY – Access key бакета;</li><li>ownCloud_OBJECTSTORE_SECRET – Secret key бакета.</li></ul><p>Сохраните файл.</p><p>Остается лишь добавить файл конфигурации для Caddy – обратного прокси, через который пользователи будут получать доступ к ownCloud.</p><p>Создайте директорию config:</p><p>После чего создайте в ней файл конфигурации Caddyfile. Добавьте в него следующее содержимое, указав вместо ownCloud.betutorial.ru ваш домен ownCloud:</p><p><i>Обратите внимание! Caddy выпустит SSL-сертификат на домен автоматически.</i></p><p>Все запросы к домену будут проксироваться в контейнер ownCloud_server.</p><p>На этом настройка конфигурационных файлов завершена, можно запускать контейнеры:</p><p>Потребуется несколько минут, чтобы docker загрузил образ и развернул контейнеры.</p><p>После запуска перейдите по домену, чтобы проверить работу хранилища:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/934faf67-2939-40f3-840e-88af18ebfde3.webp" alt="" /></figure><p>Выполните вход со стандартными доступами.</p><p><i>Обратите внимание! Если ownCloud недоступен или вы получаете ошибку при входе со стандартными доступами, проверьте корректность конфигурационных файлов. После внесения изменений перезапустите контейнеры.</i></p><p>После входа вы попадете на главную страницу ownCloud. Перед началом работы мы крайне рекомендуем сменить стандартный пароль администратора. Сделать это можно, нажав на кнопку с именем пользователя в верхней правой части страницы и открыв раздел настроек.</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/9f93c25a-3922-4223-b3bd-b45aaaf61edf.webp" alt="" /></figure><p>Теперь проверим работу объектного хранилища – перейдем на главную страницу и загрузим файлы:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/51a6e16f-ee9b-4e96-9a5c-7ef765f62286.webp" alt="" /></figure><p>Файлы также появились и в объектном хранилище:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/16e65ad7-28f9-462c-9af6-990d2cf3c878.webp" alt="" /></figure><p><i>Обратите внимание! Файлы, которые вы удалите в ownCloud, будут перемещены в корзину и останутся в S3. Для их полного удаления очистите корзину ownCloud.</i></p><p>Чтобы делиться паролями с новыми пользователями, необходимо настроить отправку почты в ownCloud, сделать это можно в разделе Settings&gt;General.</p><p>В нашем примере мы настроим отправку через SMTP:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/45e39a41-4bb1-4d19-9bfe-1e1db3afc4a6.webp" alt="" /></figure><p>После указания данных введите тестовый email и нажмите “Send email”. Если отправка успешна, вы получите уведомление об этом:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/5a22786d-3995-4e86-9b48-0a17363c8a18.webp" alt="" /></figure><p>А на почтовый ящик поступит письмо:</p><figure><img src="https://media.tproger.ru/user-uploads/105012/2026-04-29/f4043b49-9a17-42ed-a627-34502c2a16e8.webp" alt="" /></figure><p>На этом настройка завершена – можно начинать работать с файлами, используя связку ownCloud и S3.</p><h2>Заключение</h2><p>Если вы ловите себя на мысли, что данных стало настолько много, что поиск нужного файла порой происходит дольше, чем работа с ним (особенно если одни файлы хранятся на почте или в мессенджере, а другие – на ноутбуке или флешке), облачное хранилище может вам помочь.</p><p>Подобное ПО пригодится как для личных целей, так и для бизнеса – недаром в 2025 году в нашей стране был <a href="https://www.kommersant.ru/doc/8178724">зафиксирован</a> рост интереса крупного и среднего бизнеса к технологии облачного хранилища.</p><p>Надеюсь, эта статья была для вас полезна, а облачные хранилища помогут сделать ежедневную работу комфортнее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Async Rust до сих пор в MVP: четыре оптимизации компилятора</title>
      <link>https://tproger.ru/translations/async-rust-do-sih-por-v-mvp-chetyre-optimizacii-kompilyatora</link>
      <comments>https://tproger.ru/translations/async-rust-do-sih-por-v-mvp-chetyre-optimizacii-kompilyatora?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/async-rust-do-sih-por-v-mvp-chetyre-optimizacii-kompilyatora</guid>
      <description><![CDATA[<p>Tweede golf разобрал, откуда bloat в async Rust, и предложил Project Goal на €30 000. 2–5% размера прошивки только за замену panic на Pending в Returned-состоянии.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/async-rust-do-sih-por-v-mvp-chetyre-optimizacii-kompilyatora">Async Rust до сих пор в MVP: четыре оптимизации компилятора</a>»</p>]]></description>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 May 2026 13:15:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Async Rust продавали как «zero cost abstraction» — обещание, что асинхронный код по размеру и скорости должен быть равен ручному state machine на синхронном Rust. На бумаге это даёт executor-agnostic код (один и тот же исходник запускается под Tokio на сервере и под Embassy на микроконтроллере), на практике — на embedded особенно — видно: каждый байт прошивки на счету, а async добавляет десятки и сотни лишних строк сгенерированного кода. Команда из голландской Rust-консалтинговой компании Tweede golf разобрала, откуда берётся этот bloat и как его срезать на уровне компилятора — с конкретными цифрами и Rust Project Goal.</p><p>Это вторая часть серии. В первой — обходные приёмы для async-кода прямо в пользовательском коде. Во второй — автор копает в MIR (Mid-level Intermediate Representation — внутреннее представление rustc между исходником и LLVM IR) и формулирует, что должен научиться делать сам компилятор. Цель — не лечить симптомы, а добраться до корня и улучшить генерацию futures.</p><ul><li>Async-функция в Rust разворачивается в state machine: компилятор генерирует enum с одним состоянием на каждую точку await плюс три служебных — Unresumed (старт), Returned (после завершения) и Panicked (после пойманного catch_unwind).</li><li>Функция с двумя await-точками у автора разворачивается в 360 строк MIR против 23 у синхронного аналога — больше чем в 15 раз. Часть этого LLVM срежет, но не всё.</li><li>Замена panic! в состоянии Returned на возврат Pending в release-сборках даёт 2–5% экономии размера прошивки на embedded.</li><li>Ещё четыре оптимизации: убрать state machine у async-блоков без await-точек, заинлайнить futures с одним await, схлопнуть одинаковые состояния из ветвей match, под panic=abort вообще убрать состояние Panicked.</li><li>Автор подал <a href="https://github.com/rust-lang/rust-project-goals" rel="noopener">Rust Project Goal</a> и оценил работу примерно в €30 000 финансирования.</li></ul><h2>Что компилятор делает с async-блоком</h2><p>Возьмём простой пример из статьи:</p><p>У bar два await-points — значит, в state machine минимум два состояния. Просим компилятор сдампить MIR на этапе coroutine_resume (последний async-специфичный pass) и видим:</p><p>Returned и Panicked — служебные. Future::poll — безопасная функция, и опросить уже завершённую future нельзя так, чтобы получить undefined behaviour. Поэтому компилятор после первого Ready переключает future в Returned, и при повторном poll она паникует. Похожая логика для Panicked: после пойманного unwind future блокируется от повторного poll, иначе можно дёрнуть её в неконсистентном состоянии — автор сам отмечает, что точная документация по этому состоянию ему не нашлась, и сравнивает механизм с mutex poisoning.</p><p>Логично, но автор замечает: bar генерирует 360 строк MIR, а синхронный аналог — 23 строки. То есть в 15+ раз больше. Часть этого добавления LLVM оптимизирует позже, но не всё — и на embedded остаток ощутимо влияет на размер прошивки.</p><h2>Оптимизация 1: вместо panic — снова Pending</h2><p>Future в состоянии Returned <i>обязана</i> не вызывать UB. А <i>не обязана</i> паниковать. Можно вместо panic! просто возвращать Pending: контракт Future не нарушается, ничего опасного не происходит.</p><p>Panic — относительно дорого: добавляется ветка с побочным эффектом, которая плохо оптимизируется. Автор пропатчил компилятор и измерил: <b>2–5% сокращение размера бинарника</b> для async-прошивок на embedded.</p><p>Идеальное место — флаг по аналогии с overflow-checks = false: в debug-сборке оставляем panic, чтобы быстро ловить ошибочный повторный poll, в release — экономим. Аналогично, при panic = abort состояние Panicked потенциально можно убрать целиком — автор хочет это отдельно исследовать.</p><h2>Оптимизация 2: лишняя state machine у пустого async-блока</h2><p>Возвращаемся к foo: там нет ни одного await-point, future просто возвращает число. Логично было бы реализовать вручную как:</p><p>Никакого состояния не нужно — просто вернуть 5. На деле компилятор генерирует CoroutineLayout с тремя вариантами (Unresumed, Returned, Panicked) и честный switch по дискриминанту перед каждым возвратом — даже там, где без него можно было обойтись. Когда await-точек ноль, state machine можно убирать целиком — это <b>около 0,2% размера бинарника</b>. Поведение чуть меняется только для неконформных executor-ов: future всегда возвращает Ready без переходов между состояниями.</p><h2>Ещё две оптимизации в плане работ</h2><ul><li>Inlining futures с одним await-point. В таких future внутреннее состояние сводится к Suspend0 + Returned + Panicked, а ветка управления при правильной работе компилятора схлопывается в обычный вызов с одним переключением.</li><li>Схлопывание идентичных состояний из ветвей match. Если в функции несколько await-точек попадают в одинаковые по смыслу варианты (одни и те же сохранённые поля), их можно объединить в одно состояние state machine — без потери семантики.</li></ul><p>Каждый из этих кейсов даёт меньше, чем замена panic на Pending, но вместе с ней образуют связный набор патчей в компилятор. Автор формулирует план так: вынести проблему из «каждая embedded-команда со своими обходными приёмами» в «исправление в rustc раз и навсегда».</p><h2>Project Goal и финансирование</h2><p>Изменения требуют времени на проектирование, обсуждение в Rust-проекте и собственно правки. Автор оформил это как <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">Project Goal по async state machine optimisation</a> и оценил необходимое финансирование примерно в <b>€30 000</b> — в основном на работу embedded-инженера над патчами компилятора. Платит обычно либо сам Tweede golf, либо Rust Foundation через программу грантов, либо отдельный спонсор; Project Goal — публичный механизм, чтобы заявить цель и собрать поддержку, в том числе финансовую. По меркам компиляторных проектов это недорого: типичная цена «уберём 2–5% размера прошивки в любом async-проекте» — десятки тысяч евро.</p><blockquote>Это вторая часть серии. В первой я показывал, что вы можете сделать в своём async-коде, чтобы избежать части bloat. Во второй мы лезем во внутренности и переводим методы из первой части в оптимизации для компилятора.</blockquote><h2>Выводы</h2><p>Async в Rust — давно главный болевой пункт у embedded-сообщества: обещания zero cost не подтверждаются, а обходные приёмы на уровне пользовательского кода сильно ограничены. Tweede golf формулирует разговор иначе: показывает, какие именно паттерны генерации виноваты, и предлагает их закрывать в компиляторе.</p><p>Для практика это значит две вещи. Первое — писать async-код можно не оглядываясь на «не сделать ли я ещё одно состояние»; bloat лежит в компиляторе, и просьба к нему — править генерацию, а не ваши async fn. Второе — следить за статусом Project Goal: если его подхватят, размер async-кода в release-сборках уменьшится у всех пользователей сразу, без правок в их репозиториях.</p><p>Оригинал — на <a href="https://tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state" rel="noopener">tweedegolf.nl/en/blog/237/async-rust-never-left-the-mvp-state</a>. Первая часть серии — <a href="https://tweedegolf.nl/en/blog/235/debloat-your-async-rust" rel="noopener">«Debloat your async Rust»</a>. Project Goal лежит на <a href="https://rust-lang.github.io/rust-project-goals/2026/async-statemachine-optimisation.html" rel="noopener">rust-project-goals/2026/async-statemachine-optimisation</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Box в Rust: как уменьшить память программы с 895 до 420 МБ</title>
      <link>https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb</link>
      <comments>https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb</guid>
      <description><![CDATA[<p>Перевод dystroy.org: как заменой Option на Option&gt; и кастомным Deserializer уменьшить память Rust-программы с 895 до 420 МБ. Читайте разбор с кодом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/box-v-rust-kak-umenwit-pamyat-programmy-s-895-do-420-mb">Box в Rust: как уменьшить память программы с 895 до 420 МБ</a>»</p>]]></description>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 27 Apr 2026 10:54:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если ваши Rust-структуры с Option&lt;BigStruct&gt; заполнены процентов на 20–30 — следующие 5 минут вероятно вернут вам сотни мегабайт RAM. Разработчик <a href="https://dystroy.org/">Дени «Canop» де Майе</a> (автор файлового менеджера <a href="https://github.com/Canop/broot">broot</a>) сократил потребление памяти своей программы <b>с 895 МБ до 420 МБ — это минус 475 МБ</b>. Изменил только layout структур и стратегию десериализации serde. Перевод <a href="https://dystroy.org/blog/box-to-save-memory/">его статьи</a> с пояснениями.</p><p>Главная идея: в Rust поле типа Option&lt;BigStruct&gt; занимает <i>столько же</i>, сколько BigStruct — даже когда оно None. Чтобы пустое поле «весило одно слово», нужно обернуть значение в Box. Компилятор тогда применяет niche-оптимизацию (использует нулевой указатель как маркер None) — Option&lt;Box&lt;T&gt;&gt; весит ровно как один указатель. На задачах с массой опциональных полей это даёт двукратное сокращение памяти.</p><ul><li>Кейс: десериализация всех JSON-моделей AWS SDK (Smithy Shapes) через serde в Rust</li><li>Было: 895 МБ. Стало: 420 МБ. Экономия 475 МБ (-53%)</li><li>Изменения: только layout структур + кастомный Deserializer для пустых полей</li><li>Ключевая мысль: Option&lt;Big&gt; ≠ Option&lt;Box&lt;Big&gt;&gt; по памяти</li><li>Niche-оптимизация компилятора: Option&lt;Box&lt;T&gt;&gt; весит как один указатель</li><li>Verification: jemalloc через feature-флаг profile, замер до/после загрузки</li><li>Цена: десериализация чуть дороже по CPU (значение всё равно создаётся, потом отбрасывается)</li></ul><h2>Реальный кейс</h2><p>Программа автора десериализует все JSON-файлы из репозитория <a href="https://github.com/awslabs/aws-sdk-rust/tree/main/aws-models">awslabs/aws-sdk-rust/aws-models</a> в структуры «Smithy Shape». Эти файлы содержат тысячи объявлений вроде такого:</p><p>Как принято в Rust-коде, для разбора используется serde. Соответствующие структуры выглядят естественно — это обычная вложенность структур со множеством опциональных полей и serde-атрибутов. Не нужно вчитываться в код: обратите внимание только на сами имена полей и на россыпь Option&lt;...&gt;:</p><p>Это типичный для Rust код. Но именно такой layout приводит к тому, что после десериализации структуры занимают 895 МБ. При этом анализ показывает: большинство опциональных строк отсутствуют — это и стало рычагом для радикального сокращения объёма. Чтобы понять механизм, нужен короткий теоретический отступ.</p><h2>Как устроены структуры в памяти Rust</h2><p>На 64-битной платформе одно «слово» — это 8 байт. Например, столько занимает usize.</p><p>Тип String занимает 3 слова: указатель на буфер, длину и ёмкость (capacity). Это <b>24 байта</b> на сам тип String (проверить можно через dbg!(std::mem::size_of::&lt;String&gt;())) — не считая место под содержимое строки на heap. Подробности в <a href="https://doc.rust-lang.org/std/string/struct.String.html">документации Rust</a>.</p><p>Существует niche-оптимизация компилятора: Option&lt;String&gt; весит столько же, сколько String. Дополнительный байт под пометку «это None» не нужен — пустое значение определяется по нулевому указателю.</p><p>Поэтому такая структура, когда все строки None, занимает ровно <b>120 байт</b> (5 × 24):</p><h3>Композиция структур</h3><p>Дальше — самое важное. Что будет, если такая структура встроена в другую? Пусть это будет Container1, у которой одно поле Option&lt;String&gt; и одно — SmithyServiceTrait:</p><p>Размер Container1 — 24 + 120 = 144 байта: 24 под Option&lt;String&gt; и 120 под SmithyServiceTrait. А что, если поле trait сделать опциональным — на случай, когда trait отсутствует?</p><p>Сколько занимает Container2, когда оба поля None? <b>Те же 144 байта.</b> Опциональность ничего не сэкономила: место под структуру уже зарезервировано в layout родителя, и компилятор всё равно держит его готовым. Везёт ещё, что внутри SmithyServiceTrait только поля Option&lt;String&gt; — это позволяет компилятору не добавлять дополнительный байт-discriminant для внешнего Option.</p><p>Применив эту арифметику к SmithyTraits, видно, почему наивная реализация так разбухает в памяти.</p><h3>Почему в Java и других языках с GC такой проблемы нет</h3><p>В языках с reference-семантикой полей композиция работает иначе. Когда у класса Container есть поле-объект, это поле — указатель на heap. Если поле null, оно занимает только одно слово.</p><p>Чтобы добиться того же поведения в Rust — то есть чтобы пустое поле занимало одно слово, — нужно явно вынести содержимое на heap, обернув в Box:</p><p>Теперь, когда оба поля None, Container3 занимает всего <b>32 байта</b>: 3 слова под Option&lt;String&gt; и одно слово под Option&lt;Box&lt;...&gt;&gt;. Та же niche-оптимизация работает и здесь: Option&lt;Box&lt;...&gt;&gt; весит столько же, сколько голый Box&lt;...&gt;.</p><h2>Что именно поменялось</h2><p>Изменение свелось к трём шагам:</p><ol><li>Найти структуры, которые часто оказываются «пустыми» (все поля — None).</li><li>Сделать их опциональными в родительской структуре, переместив на heap через Box.</li><li>Написать кастомный Deserializer, чтобы пустые структуры вообще не попадали в результат.</li></ol><p>Было:</p><p>Стало:</p><p>Аналогично, в SmithyShape все поля Option&lt;SmithyReference&gt; заменены на Option&lt;Box&lt;SmithyReference&gt;&gt;. Местами пришлось поправить акцессоры, потому что путь к данным удлинился на одну разыменовку. И всё — память на хранение десериализованных AWS-shape снизилась вдвое, экономия 475 МБ.</p><h3>Подводные камни</h3><ul><li><b>CPU чуть дороже.</b> Десериализация полного объекта всё равно происходит — а потом он отбрасывается, если оказался пустым. Парадокс: суммарно задача стала <i>быстрее</i>, потому что меньше памяти = меньше работы аллокатора, меньше TLB-промахов, лучше попадания в L2/L3-кеш. На больших объёмах эти эффекты перевешивают накладные расходы на лишний разбор.</li><li><b>Фрагментация heap.</b> Много мелких Box ведёт к фрагментированной куче. В авторском случае это не было проблемой, но в долгоживущих сервисах — стоит держать в уме.</li></ul><h2>Как проверить, что экономия реальная</h2><p>Чутьё подсказывает, где можно сэкономить и сколько примерно. Но без замеров — не работа. В Rust нет простого способа узнать, сколько весит композитный объект со всеми полями и аллокациями за указателями. Решение автора — использовать аллокатор, умеющий отдавать статистику. В стандартной поставке такие данные ограничены, поэтому подключается <a href="https://github.com/tikv/jemallocator">jemalloc</a>:</p><p>В Cargo.toml объявляется feature-флаг profile, чтобы не таскать jemalloc в обычные сборки:</p><p>В main.rs аллокатор подключается под этим же флагом:</p><p>И в самой функции загрузки структур делается замер: до и после.</p><p>Совет автора: tikv_jemalloc_ctl отдаёт ещё кучу деталей, которые полезно мониторить в серверных приложениях.</p><h2>Что запомнить из статьи</h2><ul><li>Применяйте Option&lt;Box&lt;T&gt;&gt; только там, где поле пусто в большинстве случаев — иначе heap-fragmentation и разыменовка перевесят выигрыш.</li><li>Размер типа узнать просто: std::mem::size_of::&lt;T&gt;(). Реальное потребление с heap — только через jemalloc-ctl, dhat-rs или heaptrack.</li><li>Niche-оптимизация работает не для всего: String, Box, Vec, &amp;T — да; кастомный enum без явных #[repr] — обычно нет.</li><li>При desered-через-serde: голая замена типа на Option&lt;Box&gt; не даёт выигрыша — нужен кастомный Deserializer, который вернёт None для «пустых» структур.</li><li>Перед оптимизацией — всегда замер. После оптимизации — снова замер. Без цифр это карго-культ.</li></ul><h2>От редакции</h2><p>Один практический совет от редакции: чтобы быстро найти кандидатов на оптимизацию в большом проекте, прогоните код через <a href="https://github.com/nnethercote/dhat-rs">dhat-rs</a> — это профайлер аллокаций от автора «Rust Performance Book». Он покажет, какие типы съедают больше всего heap. Альтернатива Option&lt;Box&lt;T&gt;&gt; — <a href="https://docs.rs/bumpalo/">arena-аллокаторы</a> вроде bumpalo: если вся группа объектов живёт один пакетный жизненный цикл, разовый bump-аллокатор может оказаться эффективнее множества мелких Box.</p><p>Если интересна тема Rust в крупных продакшенах, у Tproger есть свежий материал про то, как <a href="https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro">WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</a> — там тоже про экономию памяти и скорость, только в другом масштабе.</p><p>Источник: <a href="https://dystroy.org/blog/box-to-save-memory/">«Box to save memory» — dystroy.org/blog</a>. Автор оригинала — <a href="https://dystroy.org/">Дени «Canop» де Майе</a>, разработчик файлового менеджера <a href="https://github.com/Canop/broot">broot</a> и других open-source утилит на Rust.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Ubuntu 26.04 LTS «Resolute Raccoon» — Rust в core, Wayland-only и ARM64 desktop</title>
      <link>https://tproger.ru/news/vywel-ubuntu-26-04-lts-resolute-raccoon-rust-v-core-wayland</link>
      <comments>https://tproger.ru/news/vywel-ubuntu-26-04-lts-resolute-raccoon-rust-v-core-wayland?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-ubuntu-26-04-lts-resolute-raccoon-rust-v-core-wayland</guid>
      <description><![CDATA[<p>Canonical выпустила Ubuntu 26.04 LTS Resolute Raccoon: ядро Linux 7.0, GNOME 50 на Wayland, утилиты на Rust, ARM64 desktop ISO впервые. Поддержка до 2031 года.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-ubuntu-26-04-lts-resolute-raccoon-rust-v-core-wayland">Вышел Ubuntu 26.04 LTS «Resolute Raccoon» — Rust в core, Wayland-only и ARM64 desktop</a>»</p>]]></description>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 22 Apr 2026 15:00:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если держите сервер или ноутбук на Ubuntu LTS — 23 апреля у вас появилась новая опция. <a href="https://documentation.ubuntu.com/release-notes/26.04/" rel="nofollow">Ubuntu 26.04 LTS «Resolute Raccoon»</a> пришёл с ядром Linux 7.0, десктоп-оболочкой GNOME 50, Rust-переписанными системными утилитами и, впервые в истории Ubuntu, официальным ARM64 desktop ISO. Поддержка — до апреля 2031 года, с подпиской Ubuntu Pro — до апреля 2036 года.</p><p>Релиз замыкает двухлетний LTS-цикл: между Ubuntu 24.04 LTS «Noble Numbat» и 26.04 LTS вышли три промежуточных релиза (24.10, 25.04, 25.10), и именно в них Canonical обкатал большую часть изменений — от замены классических GNOME-приложений на Rust-варианты до Wayland-only сессии и NTSYNC-драйвера для Windows-игр в Proton. К моменту LTS эти переходы уже прошли стадию «сыро» — в 26.04 они приходят готовыми.</p><p><b>Ядро и безопасность</b>: Linux 7.0 как дефолтное ядро, post-quantum подписи модулей (ML-DSA), OpenSSH 10.2p1 с гибридным обменом ключами mlkem768x25519-sha256.</p><p><b>Десктоп</b>: GNOME 50 на Wayland-only сессии, GIMP 3.0, LibreOffice 25.8, Firefox 149, Thunderbird 140 «Eclipse».</p><p><b>Rust в ядре системы</b>: новый монитор ресурсов Resources (с трекингом NPU), PDF-вьюер Papers, просмотрщик картинок Loupe, терминал Ptyxis с интеграцией podman и distrobox — все переписаны на Rust.</p><p><b>Железо</b>: официальный ARM64 desktop ISO с поддержкой Snapdragon X Elite, полноценный Wayland на NVIDIA, apt install rocm для AMD GPU из коробки.</p><p><b>Поддержка</b>: security-обновления до 2031 года, до 2036 года — с Ubuntu Pro ESM.</p><h2>Rust въехал в базовые утилиты — и это главное изменение</h2><p>Главный технический сдвиг 26.04 — системные утилиты GNOME переписываются на Rust. Это не эксперимент энтузиастов, а дефолт новой LTS. Вот что поменялось на вашем рабочем столе:</p><ul><li><b>Resources</b> заменяет System Monitor и Power Statistics. Группирует процессы в приложения, трекает использование GPU (включая видеокодеры), NPU, частоты CPU/GPU/памяти. Написан на Rust с GTK 4.</li><li><b>Papers</b> пришёл на смену Evince как дефолтный PDF-вьюер. Перенесён на GTK4 и частично переписан на Rust.</li><li><b>Loupe</b> вместо Eye of GNOME для картинок — чистый Rust поверх библиотеки Glycin.</li><li><b>Ptyxis</b> заменяет GNOME Terminal. Из интересного — прямая интеграция с podman, toolbox и distrobox (вкладка сразу в контейнере), session-save для восстановления вкладок после перезапуска.</li><li><b>gst-thumbnailers</b> генерирует превью для видео и аудио — через Rust-биндинги к GStreamer. Лучше находит «интересные» кадры, чем Totem.</li></ul><p>Параллельно ядро Linux 7.0 окончательно признало Rust-драйверы как часть основного дерева ядра — они собираются вместе с остальными модулями без отдельных галок в конфиге. Это тот момент, когда «Rust в Linux» перестаёт быть новостью и становится инфраструктурой.</p><h2>Wayland-only, ARM64 desktop и NVIDIA</h2><p>Ubuntu 26.04 окончательно выкидывает X.org-сессию из GDM — десктоп GNOME запускается только под Wayland. Приложения под X.org продолжат работать через XWayland-слой совместимости, а если нужен именно X11 — остаются сессии KDE on X11, Xfce, MATE, i3 и другие.</p><p>Для NVIDIA это первый LTS с полной поддержкой Wayland — включая то, что раньше ломало композитор: XID-ошибки GPU, suspend/resume, Secure Boot-модули. Работает без возни.</p><p>Отдельный пункт — первый в истории Ubuntu официальный ARM64 Desktop ISO. Прицел на виртуальные машины, ACPI+EFI-платформы и устройства на Snapdragon (включая Snapdragon X Elite). Это запуск Ubuntu Desktop как гражданина первого класса на ARM-ноутбуках с UEFI.</p><p>Для AMD ROCm теперь ставится <a href="https://rocm.docs.amd.com/" rel="nofollow">прямо из репозиториев Ubuntu</a> — одной командой sudo apt install rocm. До 26.04 нужно было подключать сторонний репо от AMD и следить за версией — теперь это стандартный deb-пакет.</p><h2>Серверная часть: OpenSSH, post-quantum и разблокировка DSA</h2><p>OpenSSH прыгнул с 9.6p1 в 24.04 LTS до 10.2p1. Главные изменения — про криптографию следующих десяти лет:</p><ul><li>Поддержка гибридного post-quantum обмена ключами <b>mlkem768x25519-sha256</b> — по умолчанию. Это та самая защита от «harvest now, decrypt later».</li><li>Предупреждение при подключении без post-quantum-алгоритмов — чтобы администраторы видели устаревающие SSH-конфиги.</li><li>Слабый DSA-алгоритм подписи <b>удалён</b>. Если у вас где-то остались DSA-ключи — не обновляйте хосты без миграции на ed25519 или RSA.</li><li><b>PerSourcePenalties</b> штрафует IP, которые не дожимают аутентификацию — мягкий встроенный fail2ban.</li><li>Хост-ключи DSA больше не генерируются при установке.</li></ul><p>На уровне ядра появились post-quantum подписи модулей через ML-DSA — CA для kernel modules защищён от будущих квантовых атак. Не ваша ежедневная боль, но LTS со сроком до 2036 обязана это учитывать.</p><h2>Игры под Windows и ускорение видео</h2><p>Для пользователей Steam Play и Wine в Ubuntu 26.04 — новый драйвер NTSYNC, эмулирующий примитивы синхронизации Windows NT. На синтетических тестах даёт заметный прирост FPS в играх, использующих многопоточность через WaitForSingleObject и подобные API.</p><p>Hardware-accelerated video encoding и decoding теперь включены по умолчанию для AMD и Intel через VA-API — никаких дополнительных пакетов. JPEG XL поддерживается из коробки.</p><p>Для Windows-пользователей, которые ставят Ubuntu рядом — улучшен dual boot с BitLocker. Установщик теперь видит зашифрованные разделы и корректно рядом с ними размещается.</p><h2>Как обновиться и что проверить до апдейта</h2><p>Путь обновления с точки зрения Canonical:</p><ol><li>С Ubuntu 24.04 LTS (Noble Numbat) — прямое обновление через do-release-upgrade, Canonical запустит автоматическое предложение через пару недель после релиза.</li><li>С Ubuntu 25.10 (Questing Quokka) — тоже прямое обновление.</li><li>С Ubuntu 22.04 LTS (Jammy Jellyfish) — только через промежуточный апгрейд до 24.04 LTS, и уже потом на 26.04 LTS.</li><li>С Ubuntu 25.04 (EOL с января 2026) — сначала на 25.10, затем на 26.04 LTS. Либо — чистая переустановка.</li><li>Требования: для десктопа нужен двухъядерный 2 GHz, минимум 4 ГБ RAM и 25 ГБ свободного места. Если меньше — смотрите в сторону Xubuntu или Lubuntu.</li></ol><p>Что стоит проверить до нажатия кнопки:</p><ul><li>Кастомные X11-утилиты, которые вы использовали годами, — под Wayland не все работают. Если зависите от autokey, xbindkeys или специфичных скриншотилок — протестируйте в live-сессии сначала.</li><li>Кастомные сборки ядра или out-of-tree модули — Linux 7.0 требует обновления драйверов.</li><li>DSA-ключи в SSH — мигрируйте на ed25519 до апдейта.</li><li>NVIDIA-сетапы с проприетарным драйвером — Canonical обещает полный Wayland, но протестировать на своём железе безопаснее отдельно.</li></ul><h2>Выводы</h2><p>Ubuntu 26.04 LTS — это не «ещё один LTS с обновлёнными пакетами». Это точка, в которой Canonical одновременно закрывает три длинных перехода: Wayland-only на десктопе, Rust в системных утилитах и официальная ARM64-платформа для десктопа. Плюс криптография нового поколения в SSH и ядре, которая закладывает основу на десятилетие вперёд — как раз под срок поддержки LTS.</p><p>Если вы в продакшне на 22.04 LTS — теперь двигаться через 24.04 LTS к 26.04 LTS без спешки, но планово: 22.04 LTS теряет стандартную поддержку в апреле 2027. Если на 24.04 LTS — обновление посимпатичнее, потому что промежуточные релизы пропустили большую часть «переходных болей».</p><p>Источники: <a href="https://documentation.ubuntu.com/release-notes/26.04/" rel="nofollow">Ubuntu 26.04 LTS release notes</a>, <a href="https://documentation.ubuntu.com/release-notes/26.04/summary-for-lts-users/" rel="nofollow">Summary for LTS users</a>, <a href="https://kernel.org/category/releases.html" rel="nofollow">The Linux Kernel Archives</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Xilem — реактивный GUI на чистом Rust с GPU-рендерингом: 5 000 звёзд и архитектура в духе SwiftUI</title>
      <link>https://tproger.ru/news/xilem-reaktivnyj-gui-na-chistom-rust-s-gpu-renderingom-5000-zv</link>
      <comments>https://tproger.ru/news/xilem-reaktivnyj-gui-na-chistom-rust-s-gpu-renderingom-5000-zv?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Стребков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/xilem-reaktivnyj-gui-na-chistom-rust-s-gpu-renderingom-5000-zv</guid>
      <description><![CDATA[<p>Xilem — экспериментальный GUI-фреймворк на чистом Rust от создателя Vello. Архитектура React/SwiftUI, GPU-рендеринг через wgpu, 5 000 звёзд. Разбираем архитектуру.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/xilem-reaktivnyj-gui-na-chistom-rust-s-gpu-renderingom-5000-zv">Xilem — реактивный GUI на чистом Rust с GPU-рендерингом: 5 000 звёзд и архитектура в духе SwiftUI</a>»</p>]]></description>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 08 Apr 2026 06:40:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы пишете на Rust и мечтаете о нормальном GUI без обёрток над C++ — посмотрите на <a href="https://github.com/linebender/xilem">Xilem</a>. Это экспериментальный реактивный фреймворк от команды <a href="https://linebender.org/">Linebender</a> (основатель — Raph Levien, автор <a href="https://github.com/linebender/vello">Vello</a> и бывший инженер Google Fonts), который набрал 5 000 звёзд на GitHub и стал самой серьёзной попыткой решить «GUI-проблему» Rust.</p><p>Xilem вдохновлён архитектурами React, SwiftUI и Elm — но реализован на чистом Rust с GPU-рендерингом через Vello и wgpu. Никаких биндингов к Qt или GTK.</p><ul><li>Xilem — реактивный GUI-фреймворк на чистом Rust, вдохновлённый React/SwiftUI/Elm</li><li>GPU-рендеринг через Vello (2D) + wgpu — нативная производительность без C++ зависимостей</li><li>Два уровня: Xilem (высокоуровневый, для приложений) и Masonry (низкоуровневый, для фреймворков)</li><li>Веб-бэкенд через xilem_web — те же компоненты работают и в браузере</li><li>5 000 звёзд на GitHub, активная разработка командой Linebender (Raph Levien)</li></ul><h2>Зачем ещё один GUI-фреймворк для Rust</h2><p>GUI на Rust — давняя боль сообщества. Существующие решения делятся на две категории:</p><ul><li><b>Обёртки над C/C++ библиотеками</b> (gtk-rs, Qt bindings) — работают, но тянут за собой чужую экосистему, сборочные зависимости и не-Rust-идиоматичный API</li><li><b>Чисто Rust-решения</b> (Iced, Druid, egui) — каждое с компромиссами: Iced ближе к Elm но ограничен, Druid заброшен, egui — immediate mode без retained state</li></ul><p>Xilem занимает нишу <b>retained-mode реактивного фреймворка</b>: как React, но для десктопа, с типобезопасностью Rust и без virtual DOM overhead.</p><h2>Архитектура: Xilem + Masonry</h2><p>Проект состоит из двух слоёв:</p><ul><li><b>Masonry</b> — низкоуровневый тулкит. Retained widget tree, event handling, layout passes. Можно использовать отдельно, если нужен полный контроль. Аналог: Flutter's rendering layer</li><li><b>Xilem</b> — высокоуровневый реактивный слой поверх Masonry. Лёгкое view tree, автоматическое обновление UI при изменении данных. Аналог: SwiftUI или React</li></ul><p>Стек технологий под капотом:</p><ul><li><a href="https://github.com/nickel-org/winit">winit</a> — кроссплатформенное создание окон (Windows, macOS, Linux, Web)</li><li><a href="https://github.com/linebender/vello">Vello</a> + <a href="https://wgpu.rs/">wgpu</a> — GPU-ускоренный 2D-рендеринг</li><li><a href="https://github.com/linebender/parley">Parley</a> + Fontique — текстовый стек (шрифты, layout, шейпинг)</li><li><a href="https://github.com/AccessKit/accesskit">AccessKit</a> — accessibility API (screen readers, навигация с клавиатуры)</li></ul><h2>Как выглядит код</h2><p>Простой счётчик на Xilem:</p><p>Если вы знакомы с React или SwiftUI — паттерн узнаваем: состояние (&amp;mut i32) передаётся в функцию, которая возвращает описание UI. Фреймворк сам определяет, что изменилось, и обновляет только нужные виджеты.</p><h2>Веб-бэкенд</h2><p>Через xilem_web те же компоненты работают в браузере. Xilem компилируется в WebAssembly и рендерит через DOM — подход, аналогичный <a href="https://yew.rs/">Yew</a> или <a href="https://leptos.dev/">Leptos</a>, но с единой кодовой базой для десктопа и веба.</p><h2>Текущий статус и ограничения</h2><p>Xilem — <b>экспериментальный проект</b>. Команда прямо об этом говорит: API нестабилен и будет меняться. Вот что важно учитывать:</p><ul><li>Нет готовых виджетов для сложных сценариев (таблицы, rich text editor, drag-and-drop)</li><li>Документация минимальна — основной источник знаний: примеры в репозитории</li><li>Masonry (нижний слой) стабильнее Xilem — если нужна предсказуемость, начинайте с него</li><li>Linux-зависимости: нужны пакеты wayland, libxkbcommon, vulkan-loader</li></ul><p>Но для тех, кто следит за экосистемой Rust GUI, — это самый перспективный проект: активная разработка, сильная команда и продуманная архитектура.</p><h2>Как попробовать</h2><h2>Выводы</h2><p>Нативный GUI на Rust без обёрток над C++ — больше не фантазия. Xilem предлагает знакомую реактивную модель (React/SwiftUI), GPU-ускоренный рендеринг и кроссплатформенность из коробки. Проект экспериментальный, но архитектура и команда внушают доверие.</p><p>Если вы Rust-разработчик и давно ждали нормальный GUI-фреймворк — <a href="https://github.com/linebender/xilem">попробуйте Xilem</a> и оцените, насколько он подходит под ваши задачи.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что случилось с WebAssembly — и почему вы не заметили, как он победил</title>
      <link>https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po</link>
      <comments>https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po</guid>
      <description><![CDATA[<p>WebAssembly не заменил JavaScript — и не должен был. Figma, Cloudflare, Godot, Squoosh уже используют Wasm. Разбираем, как Wasm стал мостом между языками.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/chto-sluchilos-s-webassembly---i-pochemu-vy-ne-zametili--kak-on-po">Что случилось с WebAssembly — и почему вы не заметили, как он победил</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Архитектура ПО]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 27 Mar 2026 16:15:20 GMT</pubDate>
      <content:encoded><![CDATA[<p>В каждом обсуждении WebAssembly найдётся комментарий в стиле «а что с ним стало?». Его рекламировали как революцию. Мы не видим сайтов, полностью написанных на Wasm. Он провалился? Это новый JVM-апплет?</p><p>Нет. WebAssembly победил — просто не так, как все ожидали.</p><p><b>Главное:</b> WebAssembly не заменил JavaScript в браузере — и не должен был. Его главная роль — мост между языками. Figma, Godot, Squoosh, Cloudflare Workers, Zellij — все они используют Wasm, но вы этого не замечаете — и это нормально.</p><h2>Где Wasm уже работает</h2><ul><li><b>Figma</b> — конвертирует C++ кодовую базу в браузерное приложение + запускает пользовательские плагины в песочнице через QuickJS+Wasm</li><li><b>Godot</b> — сборка игр для веба</li><li><b>Squoosh.app</b> — использует C/C++ библиотеки сжатия изображений прямо в браузере</li><li><b>Stackblitz</b> — веб-контейнеры на Wasm</li><li><b>Ruffle</b> — эмулятор Flash в браузере</li><li><b>Cloudflare Workers</b> — запуск недоверенного кода через V8 isolates</li><li><b>Zellij, Envoy, Lapce</b> — экосистема плагинов на Wasm</li></ul><h2>Что такое WebAssembly на самом деле</h2><p>WebAssembly — это <b>язык</b>. Более точно — байткод, похожий на JVM bytecode, но с меньшим API, более строгими гарантиями безопасности и без мнений о том, как управлять памятью.</p><p>Он достаточно низкоуровневый, чтобы чисто компилироваться под большинство архитектур без значительных потерь скорости. При этом Wasm-программа не может ничего без явного разрешения хоста — ни читать файлы, ни ходить в сеть. Всё внешнее — через импорты.</p><h2>Цель компиляции, не язык разработки</h2><p>В Wasm компилируются десятки языков: <b>Rust, C, Zig, Go, Kotlin, Java, C#</b>. Даже интерпретируемые языки работают — их рантаймы компилируются в Wasm (<b>Python</b> через Pyodide, <b>PHP, Ruby</b>). Есть и языки, которые компилируются исключительно в Wasm: <b>AssemblyScript, Grain, MoonBit</b>.</p><p>Ваш браузер уже умеет запускать Wasm. Но есть и автономные рантаймы: <b>Wasmtime</b>, <b>WasmEdge</b>, <b>Wasmer</b> — аналоги JVM, но для Wasm.</p><h2>Безопасность — главное преимущество</h2><p>Всё внешнее взаимодействие — явные импорты от хоста. Это даёт <b>изоляцию на уровне процесса внутри одного процесса</b>. Cloudflare запускает недоверенный код через V8 isolates — старт <b>в 100 раз быстрее</b>, чем отдельный процесс. Fermyon заявляет о старте менее чем за миллисекунду.</p><h2>Мост между языками — главная роль</h2><p>Самое распространённое применение — <b>мост между языками</b>. В большинстве случаев Wasm прозрачен для вас — какая-то библиотека просто использует его в дереве зависимостей. Это обработка изображений, OCR, физические движки, рендеринг, базы данных, парсеры.</p><h2>Ограничения</h2><ul><li>В браузере Wasm работает через тот же пайплайн, что и JS — потолок на производительность</li><li>Пересечение границы хост-программы стоит дорого — пост-мортем Zaplib показал, что постепенная миграция может не дать выигрыша</li><li>Нет нативного строкового типа — системные API приходится пересоздавать, WASI помогает частично</li><li>Самые компактные бинарники даёт Zig, самые тяжёлые без оптимизации — Rust</li></ul><h2>Почему кажется, что ничего не произошло</h2><p>Wasm-инструменты массово используются <b>авторами библиотек</b>, а не разработчиками приложений. Внутренности непрозрачны — и это нормально. Многие ожидали, что можно будет обойтись без .js файлов вообще — это крайне маловероятно, ни один вендор браузеров не работает над этим.</p><p>Фреймворки <b>Blazor</b> (.NET) и <b>Leptos</b> (Rust) позволяют писать веб-приложения без прямого контакта с JS. Стандартизация идёт: <b>WasmGC</b> уже в Chrome, Firefox и Safari; <b>Component Model</b> развивается в Bytecode Alliance.</p><h2>FAQ</h2><h3>WebAssembly быстрее JavaScript?</h3><p>Некорректный вопрос — скорость зависит от рантайма. Но конструкции Wasm хорошо ложатся на современное железо, поэтому в вычислительных задачах Wasm часто быстрее.</p><h3>Wasm заменит JavaScript?</h3><p>Крайне маловероятно. JS остаётся языком браузера, Wasm дополняет его там, где нужны вычисления, безопасность или доступ к библиотекам из других языков.</p><h3>С чего начать?</h3><p>Попробуйте <a href="https://github.com/nicolo-ribaudo/watlings">watlings</a> — упражнения по ручному написанию WAT в стиле rustlings. А для практического применения — wasm-pack для Rust.</p><p>Источник: <a href="https://emnudge.dev/blog/what-happened-to-webassembly/">What Happened To WebAssembly</a> — EmNudge</p>]]></content:encoded>
    </item>
    <item>
      <title>Ютубер научил свою собаку «программировать» игры с помощью Claude и Raspberry Pi</title>
      <link>https://tproger.ru/news/yutuber-nauchil-svoyu-sobaku--programmirovat--igry-s-pomoshhyu-claud</link>
      <comments>https://tproger.ru/news/yutuber-nauchil-svoyu-sobaku--programmirovat--igry-s-pomoshhyu-claud?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/yutuber-nauchil-svoyu-sobaku--programmirovat--igry-s-pomoshhyu-claud</guid>
      <description><![CDATA[<p>Ютубер превратил пса в «геймдизайнера»: Claude и Raspberry Pi собирают игру по случайным нажатиям клавиш, интерпретируя их как креативные идеи</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/yutuber-nauchil-svoyu-sobaku--programmirovat--igry-s-pomoshhyu-claud">Ютубер научил свою собаку «программировать» игры с помощью Claude и Raspberry Pi</a>»</p>]]></description>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Raspberry Pi]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Feb 2026 12:21:58 GMT</pubDate>
      <content:encoded><![CDATA[<p>YouTube-блогер Калеб Лик <a href="https://www.pcgamer.com/software/ai/i-taught-my-dog-to-vibe-code-games-yup-someone-actually-managed-to-get-claude-ai-to-code-a-game-based-on-the-keyboard-inputs-of-a-pooch/">превратил</a> своего пса-кавупу по кличке Момо в… геймдизайнера. Ему для этого оказалось достаточно Claude Code, Raspberry Pi и умной кормушки.</p><h2>Как это работает</h2><p>Момо нажимает клавиши на Bluetooth-клавиатуре. Сигнал проходит через Raspberry Pi 5 в небольшое Rust-приложение DogKeyboard, которое фильтрует спецклавиши и передает ввод ИИ Claude.</p><p>После определенного количества символов система:</p><ul><li>отправляет текст в Claude Code,</li><li>запускает сборку игры (на Godot 4.6, логика — на C#),</li><li>выдает собаке лакомство через автоматическую кормушку,</li><li>звуковым сигналом сообщает, что ИИ готов к следующему «брифингу».</li></ul><p>Один цикл — и еще один уровень готов. На создание играбельной сборки уходит 1–2 часа.</p><h2>Главный трюк — не в собаке</h2><p>Самое сложное, по словам Лика, было не научить собаку «долбить» клавиши, а убедить Claude воспринимать бессмысленный ввод как осмысленные команды.</p><p>Решение — хитрый системный промпт. Искусственному интеллекту сообщили, что перед ним «эксцентричный гениальный геймдизайнер, который говорит загадками». Любой набор символов нужно интерпретировать как скрытую креативную идею.</p><h2>Это глупость или в этом все же что-то есть?</h2><p>Формально Момо не «кодит». Но эксперимент показывает, насколько гибко современные агенты могут интерпретировать даже абсурдный ввод.</p><p>Да и в целом, как фановый проект, ставший популярным мемом — отличное отражение времени.</p>]]></content:encoded>
    </item>
    <item>
      <title>Единственный мейнтейнер sudo попросил о финансовой поддержке спустя 30 лет разработки</title>
      <link>https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu</link>
      <comments>https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu</guid>
      <description><![CDATA[<p>Единственный мейнтейнер sudo после 30 лет работы попросил финансирование: без спонсора развитие и безопасность утилиты под угрозой</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/edinstvennyj-mejntejner-sudo-poprosil-o-finansovoj-podderzhke-spu">Единственный мейнтейнер sudo попросил о финансовой поддержке спустя 30 лет разработки</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 06 Feb 2026 10:49:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик <b>sudo</b> Тодд Миллер, который поддерживает утилиту с 1993 года, публично попросил о финансовой поддержке, чтобы продолжать ее развитие и разработку.</p><p>Об этом Миллер <a href="https://www.theregister.com/2026/02/03/sudo_maintainer_asks_for_help/">написал</a> на своем личном сайте, отметив, что уже более 30 лет остается фактически единственным мейнтейнером одного из ключевых инструментов Unix- и Linux-систем.</p><h2>Что произошло</h2><p>До февраля 2024 года разработку sudo спонсировала компания Quest Software (позже — One Identity). После завершения сотрудничества и ухода Миллера из компании, финансирование прекратилось. С тех пор поддержка проекта ведется без стабильного источника дохода.</p><p>При этом разработка sudo не останавливалась: за последние два года выходили обновления и исправления, включая патчи для критических уязвимостей. Однако, по словам Миллера, из-за нехватки времени и ресурсов работа над проектом заметно замедлилась.</p><h2>Почему это проблема</h2><p>Sudo — базовая утилита для управления привилегиями, от которой напрямую зависит безопасность системы.</p><p>За последние годы в ней неоднократно находили серьезные уязвимости, включая баги, позволявшие локальным пользователям получать root-доступ. Некоторые из них существовали в коде более 10 лет.</p><p>Именно из-за регулярных проблем с безопасностью в экосистеме появился sudo-rs — новая реализация утилиты на Rust, ориентированная на безопасную память. В Ubuntu 25.10 она уже используется по умолчанию.</p><h2>Что будет дальше</h2><p>Миллер подчеркивает, что не планирует бросать sudo, но и не видит очевидного преемника. После истории с закладкой в xz-utils, он с осторожностью относится к передаче проекта сторонним разработчикам.</p><p>При этом он считает, что в долгосрочной перспективе именно sudo-rs станет основной версией инструмента. Он уже даже сотрудничает с командой этого проекта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Впервые сделал кроссплатформенное приложение на Tauri и Rust</title>
      <link>https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust</link>
      <comments>https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust</guid>
      <description><![CDATA[<p>Это история о том, как я впервые сделал настоящее (наверное, если его вообще можно таковым считать с учётом использования Tauri) приложение под macOS и Windows и о боги даже скомпилировал его под RedOS</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vpervye-sdelal-krossplatformennoe-prilozhenie-na-tauri-i-rust">Впервые сделал кроссплатформенное приложение на Tauri и Rust</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 04 Feb 2026 09:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет.</p><p>Меня зовут Максим, я не совсем разработчик, хотя и работаю в IT.</p><p>Это история о том, как я впервые сделал <b>настоящее</b> (наверное, если его вообще можно таковым считать с учётом использования Tauri) приложение под macOS и Windows и о боги даже скомпилировал его под RedOS</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2026-02-04/304fb854-6c38-4c87-bcbb-093e85c27e69.webp" alt="" /></figure><p>Честно, я пытался собрать его и под АльтЛинукс, но не осилил корректную работу с глобальными хоткеями.</p><p>Возможно, соберусь силами, мыслями и помощью ИИ и всё-таки это поправлю 🙂</p><p>Было больно, интересно и очень познавательно.</p><p>По воле случая(работы) мне часто приходится использовать однотипные ответы для коллег на базовые вопросы и типовые вещи. Думаю, многие с таким сталкиваются, ну или не многие(везет же вам!)</p><p>И каждый раз это выливается в:</p><ul><li>копипаст,</li><li>переключение окон,</li><li>поиск нужного файла, как в посте так и на компе</li></ul><p>Да, есть готовые решения, но они меня не устроили: где-то оверхед по функционалу, где-то я просто забивал болт (будем честны)</p><p>Плюс был ещё один минус — отсутствие нормальной мультиплатформы.</p><p>Перепробовав несколько вариантов, я понял, что хочу что-то своё родное, со своими багами, приколами и нужным мне функционалом.</p><p>Ну и, конечно, чтобы это было мультиплатформенно.</p><p>Изначально проект писался на C# под Windows. Он даже работал, и в целом всё было неплохо — кроме внешнего вида (привет дефолтным формам Visual Studio).</p><p>А потом у меня появился Mac, и стало понятно: нужно одно приложение, один внешний вид, привычные команды и одинаковый функционал на всех платформах.</p><p>Начались изыскания.</p><p>В теории можно было использовать .NET и Avalonia, но не срослось.</p><p>Потом взгляд упал на Electron - вроде всё хорошо, я даже собрал тестовый билд.Но на тот момент у меня было дикое желание привязывать к шаблонам глобальные хоткеи, а делать это из-под Electron, да ещё и мультиплатформенно, оказалось для меня слишком сложно.</p><p>Я не осилил это зло и… просто забил.</p><p>Вообще забил на приложение и идею его делать.</p><p>Спустя время мне на глаза попался <b>Tauri</b>.</p><p>Я немного потыкался в него и мне понравилось:</p><ul><li>размеры билдов небольшие</li><li>не тащим за собой целый браузер ради маленького desktop-приложения (в отличие от Electron)</li><li>UI на обычном HTML/CSS</li><li>ну и как тут не залететь в хайп-поезд под названием Rust 🙂</li></ul><p>Так, собственно, за месяц неспешной работы на свет появился <b>EasyPaste</b>.</p><h4>Что было самым сложным</h4><p>Честно не UI и даже не логика(ведь приложение простое).</p><p>Самое сложное:</p><ul><li>сборки под разные платформы(первый раз таким занимался, да еще и через воркфлоу)</li><li>системные зависимости</li><li>tray и hotkeys</li><li>и просто понять, как правильно делать вещи в Tauri</li></ul><h4>Что же такое EasyPaste</h4><p>По факту это библиотека шаблонов со следующим функционалом:</p><ul><li>хранение шаблонов в виде дерева (разделы и файлы)</li><li>открытие через быстрое окно шаблонов</li><li>поиск по названию, тексту и тегам</li><li>избранные шаблоны</li><li>работа с форматированным текстом (жирный, курсив, таблицы)</li><li>вложения файлов к шаблонам</li><li>перетаскивание текста или файлов прямо в любое приложение</li></ul><h2>Для кого это</h2><p>Изначально я делал это для себя, но довольно быстро понял, что инструмент полезный и подойдет для:</p><ul><li>служб поддержки</li><li>sales-менеджеров</li><li>HR и рекрутеров</li><li>людей, которые часто отвечают на типовые вопросы</li></ul><h2>Почему вообще я написал весь этот текст</h2><p>Сейчас EasyPaste уже работает и используется, но я не хочу превращать его в продукт в вакууме.</p><p>Мне очень нужен живой фидбек:</p><ul><li>удобно ли</li><li>чего не хватает</li><li>что лишнее</li><li>где больно.</li></ul><p>Поэтому я ищу людей, которые готовы потестировать приложение и честно сказать своё мнение.</p><p>Я не обещаю «революцию», но, возможно вы поможете сделать продукт более полезным и функциональным.</p><p>Скачать приложение и получить свежий триальный ключ можно на сайте:</p><p>Буду очень благодарен за любой фидбек 🙏</p><p>PS ах да тк я зажопил(будем честны) деньги на сертификаты, то будут алерты, но настанут светлые дни и Майкрософт мне подтвердить уз, чтобы я через Azure мог подписывать приложения за 9.99$ в месяц и оплачу Apple Developer Account(как большие разработчики), то все проблемы исчезнут а пока вот вам лайфхаки:</p><p>Windows: можно нажать «Доверяю / Установить», проверив любым понравившимся антивирусом Если будет спрос то выложу портабл версию без инсталятора</p><p>macOS (Intel и ARM): выполните в терминале после того как перенесете приложение в Applications</p>]]></content:encoded>
    </item>
    <item>
      <title>*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</title>
      <link>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</link>
      <comments>https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro</guid>
      <description><![CDATA[<p>*WhatsApp переписал медиадвижок на Rust, убрав 160 тыс строк C++, чтобы снизить уязвимости и повысить безопасность медиа</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-whatsapp-perepisal-mediadvizhok-na-rust-i-vykinul-160-tysyach-stro">*WhatsApp переписал медиадвижок на Rust и выкинул 160 тысяч строк C++</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 29 Jan 2026 02:14:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>*Meta тихо <a href="https://engineering.fb.com/2026/01/27/security/rust-at-scale-security-whatsapp/">провернула</a> одну из самых крупных миграций на Rust в пользовательском софте.</p><p>*WhatsApp заменил более 160 000 строк C++-кода на Rust в критически важной части приложения — обработке медиафайлов. Новый код уже развернут на миллиардах устройств: от Android и iOS до веба, десктопа и носимых гаджетов.</p><p>Цель проста и прагматична: снизить класс уязвимостей, которые годами преследуют мессенджеры — ошибки управления памятью.</p><h2>Откуда вообще взялась проблема</h2><p>История тянется с 2015 года и уязвимости Stagefright в Android. Тогда выяснилось неприятное: достаточно отправить специально собранный видеофайл и он выполнит код на устройстве жертвы еще до того, как пользователь что-то нажмет.</p><p>Проблема была в системных медиабиблиотеках операционной системы. Именно поэтому приложения вроде *WhatsApp не могли решить ее самостоятельно.</p><p>После этого в *WhatsApp появился собственный C++-модуль wamedia, который проверял медиафайлы на соответствие стандартам, чтобы не скормить ОС заведомо опасный контент.</p><p>Все это работало, но с оговоркой: код автоматически обрабатывал недоверенные данные, а значит сам становился идеальной мишенью для эксплойтов.</p><h2>Почему именно Rust</h2><p>В *WhatsApp довольно рано сделали неприятный, но честный вывод: значительная часть критических багов связаны с банальными ошибками работы с памятью в C и C++. Rust эту категорию проблем убирает на уровне языка.</p><p>Вместо аккуратного «подкручивания гаек», разработчики пошли чуть более радикальным путем: переписали медиабиблиотеку целиком, параллельно поддерживая две реализации — на C++ и на Rust.</p><p>Их прогоняли через дифференциальный фаззинг, тесты и сравнение поведения, пока результаты не совпали.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2026-01-29/fdbeec47-e345-4933-b0d8-8ba73ae9944a.webp" alt="" /></figure><h2>Что получилось на выходе</h2><p>Итог оказался даже лучше ожидаемого. 160 000 строк на C++ превратились примерно в 90 000 строк на Rust. И это уже с тестами.</p><p>Производительность не просела, а потребление памяти в ряде сценариев даже снизилось. Основные сложности были не в коде, а вокруг него: размер бинарников из-за стандартной библиотеки Rust и сборка под десятки платформ.</p><p>Тем не менее, библиотеку полностью выкатили в прод. Сейчас этот Rust-код ежемесячно доставляется на миллиарды устройств, включая *WhatsApp, *Messenger и *Instagram.</p><p>В *Meta прямо называют это крупнейшим клиентским деплоем Rust, о котором им известно.</p><h2>Зачем это пользователю, который «просто шлет мемы»</h2><p>Новая система, внутри компании получившая имя Kaleidoscope, проверяет файлы еще до того, как ими займутся системные библиотеки.</p><p>Она отсекает битые и нестандартные структуры, ловит подмену типов (когда «картинка» на деле исполняемый файл), отдельно помечает рискованные форматы вроде PDF со скриптами и вложениями.</p><p>По сути, это еще один слой защиты. Пользователь его не видит, но это и не нужно.</p>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</title>
      <link>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</link>
      <comments>https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu</guid>
      <description><![CDATA[<p>Microsoft планирует полностью отказаться от C и C++ и переписать ключевые компоненты Windows на Rust к 2030 году, используя ИИ для массового рефакторинга кода</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-perepiwet-ves-svoj-c-i-c---kod-na-rust-uzhe-k-2030-godu">Microsoft перепишет весь свой C и C++ код на Rust уже к 2030 году</a>»</p>]]></description>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Графы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Dec 2025 03:45:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Microsoft намерена полностью отказаться от C и C++ к концу десятилетия. Об этом заявил один из разработчиков компании Галент Хант в <a href="https://www.linkedin.com/posts/galenh_principal-software-engineer-coreai-microsoft-activity-7407863239289729024-WTzf/">публикации</a> на LinkedIn.</p><p>Его формулировка предельно прямолинейна: цель — <b>убрать каждую строку C и C++ к 2030 году и заменить их кодом на Rust</b>.</p><p>Microsoft собирается переписать крупнейшие и самые критичные системы. В том числе компоненты Windows и прочие низкоуровневые продукты.</p><h2>Ставка на ИИ и автоматическую переработку кода</h2><p>Ключевым инструментом в этом процессе станет ИИ. По словам Ханта, Microsoft уже выстроила инфраструктуру, которая <b>объединяет алгоритмы анализа кода и ИИ-агентов</b>.</p><p>Система строит графы зависимостей на уровне миллионов строк исходников, после чего ИИ применяет изменения автоматически и в промышленных масштабах.</p><p>Внутренняя цель проекта звучит амбициозно: <b>«1 инженер, 1 месяц, 1 миллион строк кода»</b>. По утверждению Microsoft, базовая часть этой инфраструктуры уже работает — как минимум для задач на понимание и анализа кода.</p><h2>Почему именно Rust</h2><p>Переход на Rust не стал сюрпризом. Еще в 2023 году Microsoft объявила, что <b>новые компоненты ядра Windows больше нельзя писать на C и C++</b>. Тогда же Марк Русинович, CTO Azure, прямо заявил: компания «полностью делает ставку на Rust».</p><p>Причина банальна — Rust обеспечивает безопасность памяти по умолчанию. Для Microsoft, которая десятилетиями сталкивается с уязвимостями классов use-after-free и buffer overflow, это банально стратегический выбор.</p><h2>Кто будет переписывать код Microsoft</h2><p>Хант уже ищет Principal Software Engineer, который поможет развивать инфраструктуру автоматического перевода C и C++ в Rust.</p><p>Кандидат должен иметь серьезный опыт системного программирования на Rust, а также быть готовым разбираться в компиляторах, операционных системах и низкоуровневой архитектуре.</p><p>Команда входит в группу Future of Scalable Software Engineering внутри Microsoft CoreAI. Ее задача — не только переписать код компании, но и создать инструменты, которые позволят устранять технический долг «в промышленных масштабах».</p>]]></content:encoded>
    </item>
    <item>
      <title>В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic</title>
      <link>https://tproger.ru/news/v-rust-kode-yadra-linux-nawli-opasnyj-bag--privodivwij-k-kernel-panic</link>
      <comments>https://tproger.ru/news/v-rust-kode-yadra-linux-nawli-opasnyj-bag--privodivwij-k-kernel-panic?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-rust-kode-yadra-linux-nawli-opasnyj-bag--privodivwij-k-kernel-panic</guid>
      <description><![CDATA[<p>В Rust-коде ядра Linux обнаружили опасный баг в Binder, приводивший к повреждению памяти и kernel panic. Исправление уже включено в стабильные обновления</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-rust-kode-yadra-linux-nawli-opasnyj-bag--privodivwij-k-kernel-panic">В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Dec 2025 05:10:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>В <b>стабильной ветке ядра Linux</b> <a href="https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=3e0ae02ba831da2b707905f4e602e43f8507b8cc">выявили</a> серьезную ошибку в коде, написанном на <b>Rust</b>.</p><p>Баг находился в Rust-реализации <b>Binder</b> — ключевого механизма межпроцессного взаимодействия в Android. Ошибка могла приводить к повреждению памяти и, как следствие, к <b>kernel panic</b>.</p><p>Исправление уже принято в стабильное дерево Linux и распространяется через обновления.</p><h2>Что пошло не так</h2><p>Проблема возникла в логике работы со списком death_list, который используется для отслеживания завершенных объектов Binder.</p><p>В коде применялся небезопасный вызов remove, который предполагал, что элемент либо присутствует в списке, либо не используется параллельно.</p><p>На практике это допущение оказалось неверным. В момент, когда один поток извлекал элементы списка и переносил их во временный локальный список, другой поток мог одновременно обращаться к тем же структурам данных.</p><p>Это создавало <b>гонку данных</b> и приводило к повреждению указателей prev/next в связанном списке.</p><p>В результате происходило обращение к невалидным адресам памяти внутри ядра. В логах такие ситуации проявлялись как ошибки обработки страничных запросов и завершались kernel panic.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-19/624ef167-951e-48d4-b050-69b70a4ac971.jpeg" alt="" /></figure><h2>Почему это особенно важно</h2><p>Binder — один из базовых компонентов Android. Любые ошибки в его реализации потенциально затрагивают миллионы устройств.</p><p>При этом баг находился именно в Rust-коде, что делает ситуацию особенно чувствительной на фоне дискуссий о безопасности Rust в ядре Linux.</p><p>Напомним, что Rust активно продвигается как язык, снижающий риск ошибок работы с памятью. Однако этот случай показывает важную деталь: <b>использование </b>unsafe<b> снимает часть гарантий языка</b> и ошибки проектирования многопоточности никуда не исчезают.</p><h2>Как баг исправили</h2><p>Разработчики изменили логику очистки death_list. Вместо извлечения элементов во временный список и последующей обработки вне блокировки, код теперь:</p><ul><li>работает <b>напрямую</b> с оригинальным списком;</li><li>извлекает элементы по одному <b>под защитой блокировки</b>;</li><li><b>исключает</b> параллельный доступ к структурам данных.</li></ul><p>Таким образом, опасный сценарий с одновременной модификацией списка стал невозможен.</p><h2>Что это значит для Rust в ядре</h2><p>Этот инцидент не отменяет преимуществ Rust, но служит напоминанием: <b>безопасность — это не только язык, но и архитектура кода</b>.</p><p>Даже в Rust ошибки синхронизации и неверные предположения о владении данными могут приводить к критическим сбоям.</p><p>Для ядра Linux это еще один аргумент в пользу осторожного и постепенного расширения Rust-кода — с тщательным аудитом, ревью и минимизацией unsafe-участков.</p>]]></content:encoded>
    </item>
    <item>
      <title>Go против Rust против Zig: какой язык для чего нужен</title>
      <link>https://tproger.ru/articles/go-protiv-rust-protiv-zig--kakoj-yazyk-dlya-chego-nuzhen</link>
      <comments>https://tproger.ru/articles/go-protiv-rust-protiv-zig--kakoj-yazyk-dlya-chego-nuzhen?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/go-protiv-rust-protiv-zig--kakoj-yazyk-dlya-chego-nuzhen</guid>
      <description><![CDATA[<p>Это попытка понять философию языков и определить, какой язык ближе лично вам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/go-protiv-rust-protiv-zig--kakoj-yazyk-dlya-chego-nuzhen">Go против Rust против Zig: какой язык для чего нужен</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 12 Dec 2025 10:05:36 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Это перевод статьи для Tproger. Автор оригинала делится опытом изучения трёх системных языков программирования и размышляет, почему каждый из них сделал именно такие компромиссы в дизайне. Это попытка понять философию языков и определить, какой подход ближе лично вам.</i></p><p>Недавно я понял, что вместо того, чтобы использовать “правильный инструмент для задач” я просто использую инструменты, которые сказали на работе — и это определило языки программирования, которые я знаю. Последние пару месяцев я потратил много времени на эксперименты с языками, которые не использую в рабочих проектах. Цель не была в том, чтобы стать экспертом — я хотел сформировать мнение о том, для чего каждый язык действительно хорош.</p><p>Языки программирования отличаются по многим параметрам, и сравнивать их сложно, не скатываясь к совершенно скучному или бесполезному выводу “везде есть компромиссы”. Конечно, компромиссы есть всегда. Интересный вопрос — почему этот конкретный язык выбрал именно такой набор компромиссов?</p><p>Этот вопрос важен для меня, потому что я не хочу выбирать язык по чек-листу, будто покупаю увлажнитель воздуха. Меня волнует создание софта и мои инструменты. Делая свои компромиссы, языки выражают набор ценностей. Я хочу понять, какие ценности резонируют со мной.</p><p>Этот вопрос также помогает прояснить разницу между языками, которые на первый взгляд сильно пересекаются по возможностям. Судя по количеству вопросов статей вроде “Go или Rust” и “Rust или Zig”, люди тоже не понимают, что происходит. Сложно запомнить, что язык X лучше для веб-сервисов, потому что у него есть фичи a, b и c, а у языка Y только a и b. Гораздо проще запомнить, что язык X лучше для веб-сервисов, потому что язык Y создан человеком, который ненавидит интернет (условно) и считает, что нужно вырубить всю сеть.</p><p>Я собрал здесь мнение о трёх языках, с которыми недавно экспериментировал: Go, Rust и Zig. Я попытался превратить свой опыт с каждым языком в общий вывод о том, что этот язык представляет из себя и насколько хорошо реализует свои ценности. Да, это упрощение, но кристаллизация упрощённых предубеждений — именно то, что я здесь и делаю.</p><h2>Go: минимализм для корпораций</h2><p>Go выделяется своим минимализмом. Его называют “современным C”. Go не похож на C, потому что у него есть сборщик мусора и полноценная среда выполнения, но он похож на C тем, что весь язык помещается в голове.</p><p>Весь язык помещается в голове, потому что в Go очень мало возможностей. Долгое время Go был известен отсутствием дженериков. Их наконец добавили в Go 1.18, но только после 12 лет, в течение которых люди умоляли это сделать. Другие возможности, обычные для современных языков — например, размеченные объединения (tagged unions) или синтаксический сахар для обработки ошибок — в Go так и не появились.</p><p>Похоже, команда разработки Go ставит высокую планку для добавления новых возможностей. В результате получился язык, который заставляет писать много шаблонного кода для реализации логики, которую на другом языке можно выразить короче. Но в результате также получился язык, стабильный во времени и лёгкий для чтения.</p><p>Ещё один пример минимализма Go — тип slice. И в Rust, и в Zig есть slice, но это толстые указатели (fat pointers) и только они. В Go slice — это толстый указатель на непрерывную последовательность в памяти, но slice также может расти. То есть он объединяет функциональность типа Vec&lt;T&gt; из Rust и ArrayList из Zig. Кроме того, поскольку Go управляет памятью за вас, он сам решает, где будет жить память вашего slice — в стеке или куче. В Rust или Zig вам придётся сильно задуматься, где живёт ваша память.</p><p>История происхождения Go, насколько я понимаю, примерно такая: Роб Пайк устал ждать компиляции проектов на C++ и устал от ошибок, которые другие программисты Google делали в тех же проектах на C++. Поэтому Go прост там, где C++ перегружен. Это язык для рядовых программистов, спроектированный быть достаточным для 90% задач и при этом простым для понимания, даже (или особенно) при написании конкурентного кода.</p><p>Я не использую Go на работе, но думаю, что должен бы. Go минималистичен ради корпоративного сотрудничества. Я не считаю это недостатком — создание софта в корпоративной среде имеет свои вызовы, которые Go решает.</p><h2>Rust: максимализм ради безопасности</h2><p>Если Go минималистичен, то Rust максималистичен. Популярный слоган Rust — “абстракции с нулевой стоимостью” (zero-cost abstractions). Я бы дополнил: “абстракции с нулевой стоимостью, и их очень много!”</p><p>У Rust репутация сложного для изучения языка. Я согласен с Джейми Брэндоном, который пишет, что Rust делает сложным не система времён жизни (lifetimes), а количество концепций, запиханных в язык. Я не первый, кто приводит в пример этот конкретный комментарий на GitHub, но он идеально показывает концептуальную плотность Rust:</p><p>Тип Pin&lt;&amp;LocalType&gt; реализует Deref, но не реализует DerefMut. Типы Pin и &amp; помечены #[fundamental], так что возможна реализация DerefMut для Pin&lt;&amp;LocalType&gt;&gt;. Вы можете использовать LocalType == SomeLocalStruct или LocalType == dyn LocalTrait, и можете привести Pin&gt; к Pin&gt;. (Действительно, два слоя Pin!!) Это позволяет создать пару “умных указателей, реализующих CoerceUnsized, но имеющих странное поведение” на стабильной версии (Pin&lt;&amp;SomeLocalStruct&gt; и Pin&lt;&amp;dyn LocalTrait&gt; становятся умными указателями со «странным поведением», и они уже реализуют CoerceUnsized).</p><p>Конечно, Rust не пытается быть максималистичным просто так, как Go пытается быть минималистичным. Rust сложный, потому что пытается достичь двух целей — безопасности и производительности — которые частично противоречат друг другу.</p><p>Цель производительности понятна сама по себе. Что означает “безопасность” — менее очевидно, по крайней мере для меня (хотя, может быть, я просто слишком долго писал на Python). “Безопасность” означает “безопасность памяти” — идею, что вы не должны иметь возможность разыменовать невалидный указатель или сделать двойное освобождение памяти. Но это также означает больше. “Безопасная” программа избегает всего неопределённого поведения (undefined behavior, или UB).</p><p>Что такое ужасное UB? Лучший способ понять это — вспомнить, что для любой работающей программы ЕСТЬ СУДЬБЫ ХУЖЕ СМЕРТИ. Если в программе что-то идёт не так, немедленное завершение — это прекрасно! Потому что альтернатива, если ошибка не поймана — ваша программа переходит в сумеречную зону непредсказуемости, где её поведение может определяться тем, какой поток выиграет следующую гонку данных, или тем, какой мусор оказался по конкретному адресу памяти. Теперь у вас хайзенбаги и дыры в безопасности. Очень плохо.</p><p>Rust пытается предотвратить UB без потери производительности во время выполнения, проверяя всё во время компиляции. Компилятор Rust умный, но не всеведущий. Чтобы проверить ваш код, ему нужно понимать, что код будет делать во время выполнения. Поэтому в Rust есть выразительная система типов и множество трейтов, которые позволяют объяснить компилятору то, что в другом языке было бы просто видимым поведением кода во время работы.</p><p>Это делает Rust сложным, потому что вы не можете просто взять и сделать что-то! Вы должны узнать, как Rust это называет — найти нужный трейт или что-то ещё — и реализовать это так, как Rust ожидает. Но если вы это делаете, Rust может дать гарантии о поведении вашего кода, которые другие языки не дают, а это в зависимости от приложения может быть критично. Он также может давать гарантии о чужом коде, что делает использование библиотек в Rust простым и объясняет, почему проекты на Rust имеют почти столько же зависимостей, сколько проекты в экосистеме JavaScript.</p><h2>Zig: свобода и контроль</h2><p>Из трёх языков Zig самый новый и наименее зрелый. На момент написания статьи Zig на версии 0.14. У его стандартной библиотеки почти нет документации, и лучший способ научиться её использовать — читать исходный код напрямую.</p><p>Не знаю, правда ли это, но мне нравится думать о Zig как о реакции одновременно на Go и Rust. Go прост, потому что скрывает детали того, как работает компьютер. Rust безопасен, потому что заставляет прыгать через свои обручи. Zig освободит вас! В Zig вы контролируете вселенную, и никто не может указывать, что делать.</p><p>И в Go, и в Rust выделить объект в куче просто — достаточно вернуть указатель на структуру из функции. Выделение памяти неявное. В Zig вы выделяете каждый байт сами, явно. (В Zig ручное управление памятью.) У вас больше контроля, чем даже в C: чтобы выделить байты, нужно вызвать alloc() на конкретном виде аллокатора, то есть вы должны выбрать лучшую реализацию аллокатора для вашего случая.</p><p>В Rust создать изменяемую глобальную переменную настолько сложно, что на форумах идут длинные обсуждения, как это сделать. В Zig вы просто создаёте её, без проблем.</p><h3>Неопределённое поведение всё ещё важно в Zig</h3><p>Zig называет его “нелегальным поведением” (illegal behavior). Он пытается обнаружить его во время выполнения и обрушить программу, когда это происходит. Для тех, кого беспокоит стоимость таких проверок по производительности, Zig предлагает четыре разных “режима релиза” на выбор при сборке программы. В некоторых проверки отключены. Идея в том, что вы можете запустить программу достаточно раз в проверяемых режимах, чтобы иметь разумную уверенность: в непроверяемой сборке нелегального поведения не будет. Это кажется мне очень прагматичным дизайном.</p><p>Ещё одно различие между Zig и двумя другими языками — отношение Zig к объектно-ориентированному программированию. ООП давно не в моде, и Go, и Rust избегают наследования классов. Но в Go и Rust достаточно поддержки других идиом ООП, чтобы вы могли построить программу как граф взаимодействующих объектов, если захотите. В Zig есть методы, но нет приватных полей структур и нет языковой возможности для полиморфизма во время выполнения (динамической диспетчеризации), хотя std.mem.Allocator просто умирает стать интерфейсом. Насколько я могу судить, эти исключения намеренны; Zig — язык для дата-ориентированного дизайна (data-oriented design).</p><p>Ещё одна вещь, которую я хочу сказать, потому что она открыла мне глаза: может показаться безумием создавать язык программирования с ручным управлением памятью в 2025 году, особенно когда Rust показал, что сборка мусора не нужна и компилятор может всё сделать за вас. Но это дизайнерский выбор, тесно связанный с выбором исключить возможности ООП. В Go, Rust и множестве других языков вы обычно выделяете маленькие кусочки памяти за раз для каждого объекта в графе объектов. У вашей программы тысячи маленьких скрытых malloc() и free(), и, следовательно, тысячи разных времён жизни. Это RAII. В Zig может показаться, что ручное управление памятью потребует много утомительной, подверженной ошибкам работы, но это так только если вы настаиваете на привязке выделений памяти к каждому маленькому объекту. Вместо этого вы можете просто выделять и освобождать большие куски памяти в определённых разумных точках программы (например, в начале каждой итерации цикла событий) и использовать эту память для данных, с которыми работаете. Именно этот подход и поощряет Zig.</p><p>Многие люди не понимают, зачем нужен Zig, если уже есть Rust. Дело не только в том, что Zig пытается быть проще. Думаю, разница более важная. Zig хочет, чтобы вы вырезали ещё больше объектно-ориентированного мышления из своего кода.</p><p>У Zig весёлая, подрывная атмосфера. Это язык для разрушения корпоративной классовой иерархии (объектов). Это язык для мегаломанов и анархистов. Мне он нравится. Надеюсь, он скоро выйдет в стабильный релиз, хотя текущий приоритет команды Zig — переписать все свои зависимости. Не исключено, что они попытаются переписать ядро Linux, прежде чем мы увидим Zig 1.0.</p><p>Go — для командной работы и быстрой разработки, Rust — для критически важных систем, где нужны максимальные гарантии, Zig — для тех, кто хочет полного контроля и готов от ООП отказаться в пользу дата-ориентированного подхода. Выбор зависит не от списка фич, а от того, какая философия вам ближе.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эксперимент с Rust в ядре Linux официально завершен. Что будет дальше</title>
      <link>https://tproger.ru/news/eksperiment-s-rust-v-yadre-linux-oficialno-zaverwen--chto-budet-dalwe</link>
      <comments>https://tproger.ru/news/eksperiment-s-rust-v-yadre-linux-oficialno-zaverwen--chto-budet-dalwe?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/eksperiment-s-rust-v-yadre-linux-oficialno-zaverwen--chto-budet-dalwe</guid>
      <description><![CDATA[<p>Эксперимент по внедрению Rust в ядро Linux завершен: язык доказал пользу, но масштабирование упирается в ABI, сложность и техдолг</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/eksperiment-s-rust-v-yadre-linux-oficialno-zaverwen--chto-budet-dalwe">Эксперимент с Rust в ядре Linux официально завершен. Что будет дальше</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Dec 2025 05:25:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Поддержка языка программирования Rust спустя несколько лет окончательно перестала считаться экспериментальной функцией ядра Linux.</p><p>Решение было <a href="https://lwn.net/Articles/1049831/">принято</a> на конференции Kernel Maintainers Summit, где мейнтейнеры обсудили итоги внедрения языка. Там же они пришли к выводу, что Rust доказал свою практическую пригодность.</p><p>Изначально язык рассматривался как осторожный эксперимент: его допускали только для отдельных модулей и драйверов, без попыток глубокой интеграции.</p><p>Теперь же разработка компонентов ядра на Rust официально считается поддерживаемым направлением, наравне с кодом на Cи.</p><h2>Три года активного внедрения</h2><p>Наиболее активная фаза внедрения Rust началась в 2022 году, когда в ядре Linux версии 6.1 появилась возможность писать драйверы и модули на этом языке.</p><p>За последующие три года количество Rust-кода в ядре заметно выросло. За это время были реализованы:</p><ul><li>абстракции для написания драйверов видеокарт, сетевых и USB-устройств;</li><li>экспериментальные драйверы Nova для видеокарт NVIDIA и Tyr для ARM Mali;</li><li>драйвер rust_ext2 для поддержки файловой системы Ext2.</li></ul><p>Rust пока не используется для критических подсистем ядра, но занял устойчивую нишу в разработке драйверов. Именно там вопросы безопасности особенно чувствительны.</p><h2>Сопротивление и смена позиции Торвальдса</h2><p>Продвижение Rust сопровождалось жесткими спорами внутри сообщества.</p><p>Часть разработчиков, работающих с Cи и C++, выступала против использования второго языка в ядре. Они мотивировали свой отказ усложнением архитектуры и повышением порога входа.</p><p>Создатель Linux Линус Торвальдс долгое время публично поддерживал скептиков и резко критиковал сторонников Rust.</p><p>Конфликты доходили до блокировок и ухода отдельных разработчиков из проекта. Однако со временем позиция Торвальдса смягчилась: он признал, что у Rust есть объективные преимущества и что язык может сосуществовать с Cи в рамках ядра.</p><h2>Почему выбор пал на Rust</h2><p>Главное преимущество Rust — безопасная работа с памятью. В отличие от Cи и C++, язык предотвращает целые классы ошибок на этапе компиляции, снижая риск уязвимостей. По оценкам экспертов, это также сокращает время на отладку и сопровождение кода.</p><p>При этом Rust остается нишевым языком: в рейтинге TIOBE за декабрь 2025 года он занимает 17-е место, тогда как Cи и C++ по-прежнему входят в мировую тройку лидеров.</p><h2>Что это значит для будущего ядра</h2><p>Rust не заменит Cи в Linux и не станет «языком ядра».</p><p>Однако он закрепился как полноценный инструмент для разработки отдельных компонентов, прежде всего драйверов. Эксперимент завершен — и теперь Rust стал частью долгосрочной эволюции ядра Linux.</p>]]></content:encoded>
    </item>
    <item>
      <title>Инженер реализовал завирусившийся XKCD-комикс про зависимости ПО</title>
      <link>https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po</link>
      <comments>https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po</guid>
      <description><![CDATA[<p>Инженер создал Stacktower — интерактивную версию культового XKCD-комикса, показывающую, как одна зависимость может «обрушить» все приложение</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/inzhener-realizoval-zavirusivwijsya-xkcd-komiks-pro-zavisimosti-po">Инженер реализовал завирусившийся XKCD-комикс про зависимости ПО</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 Dec 2025 09:04:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Веб-инженер <i>Маттиас Хюэль</i> <a href="https://stacktower.io/">создал</a> <b>интерактивную версию культового комикса XKCD №2347</b>, в котором автор высмеивает хрупкость современного ПО.</p><p>Это тот самый рисунок, который в последние месяцы превратился в популярный мем: огромные цифровые системы стоят на одном крошечном модуле, поддерживаемом энтузиастом из Небраски.</p><p>Но теперь эта «шутка» стала наглядной — <b>проект Stacktower превращает рисунок в настоящую визуализацию зависимостей</b>.</p><p>На заглавной схеме, полностью повторяющей комикс, можно нажать на любой блок — и увидеть реальные пакеты, библиотеки и цепочки зависимостей.</p><p>Проект динамически строит дерево зависимостей, позволяя проследить, как небольшие модули опираются на еще меньшее количество фундаментальных компонентов.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-12-05/1b29d25e-fccc-45ef-ade8-a7c35ad092ba.jpeg" alt="" /></figure><h2>Как работает Stacktower</h2><p>Сайт предлагает две модели: <i>«стабильную башню»</i> и <i>«неустойчивую башню»</i>, где уровни подстраиваются под выбранные библиотеки.</p><p>Пользователь может загрузить зависимости своих приложений — например, на <b>Python</b> или <b>JavaScript</b> — и увидеть, что будет, если убрать даже один элемент.</p><p>На странице приводится пример для <b>Node.js</b>:</p><p>приложение зависит от Express → Express зависит от body-parser → body-parser зависит от qs → и так далее</p><p>Stacktower иллюстрирует, что даже простое приложение тянет десятки модулей, часто неподконтрольных разработчику.</p><p>Есть и <b>Python-вариант</b>:</p><p>импорт Flask тянет Werkzeug, Jinja2, MarkupSafe, Click и еще несколько пакетов. А те, в свою очередь, имеют собственные зависимости.</p><h2>Зачем это нужно</h2><p>Автор подчеркивает: <b>цель проекта — не критиковать экосистемы, а показать их реальное устройство</b>.</p><p>Стек современных приложений неизбежно сложен и даже крошечный модуль может стать критически важным. Именно так в 2022 году случайное удаление библиотеки left-pad временно «сломало» огромный кусок JavaScript-мира.</p><p>Stacktower превращает эту абстрактную проблему в понятный визуальный эффект: убираешь одну зависимость — рушится вся конструкция.</p><h2>Комьюнити уже подхватило идею</h2><p>Проект быстро разошелся по Reddit, Hacker News и X: разработчики делятся скриншотами своих «башен», спорят о хрупкости экосистем и обсуждают, стоит ли пересматривать подход к зависимости.</p><p>Кто-то предлагает добавить поддержку Rust и Go, другие мечтают о корпоративной версии инструмента для визуального аудита безопасности.</p><p>Изучить проект подробнее можно на его <a href="https://github.com/matzehuels/stacktower">странице</a> на GitHub.</p>]]></content:encoded>
    </item>
    <item>
      <title>Авторы Tor признали свое шифрование небезопасным. Браузер переходит на CGO вместо tor1</title>
      <link>https://tproger.ru/news/avtory-tor-priznali-svoe-wifrovanie-nebezopasnym--brauzer-perehodit-na-cgo-vmesto-tor1</link>
      <comments>https://tproger.ru/news/avtory-tor-priznali-svoe-wifrovanie-nebezopasnym--brauzer-perehodit-na-cgo-vmesto-tor1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/avtory-tor-priznali-svoe-wifrovanie-nebezopasnym--brauzer-perehodit-na-cgo-vmesto-tor1</guid>
      <description><![CDATA[<p>Tor отказался от устаревшего шифрования tor1 и переходит на новый алгоритм CGO, повышающий анонимность за счет сильнеей защиты и обновления ключей</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/avtory-tor-priznali-svoe-wifrovanie-nebezopasnym--brauzer-perehodit-na-cgo-vmesto-tor1">Авторы Tor признали свое шифрование небезопасным. Браузер переходит на CGO вместо tor1</a>»</p>]]></description>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Nov 2025 04:10:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда <b>Tor</b> официально <a href="https://www.neowin.net/news/tor-network-beefs-up-weak-relay-encryption-method-reducing-attack-vector/">признала</a>: старый метод шифрования трафика <b>tor1</b> больше не обеспечивает достаточную защиту.</p><p>Из-за накопившихся уязвимостей проект переходит на новый алгоритм — <b>Counter Galois Onion </b>(<b>CGO</b>). Он уже <b>внедрен в Arti (реализацию Tor на Rust)</b> и <b>в классическую C-реализацию</b>.</p><h2>Почему tor1 небезопасен</h2><p>Tor1 использует режим AES-CTR. Он достаточно быстрый, но одновременно с этим и уязвимый к ряду атак. Авторы выделяют <b>три ключевые проблемы</b>:</p><ul><li><b>Тегирование трафика (tagging attacks).</b> Отсутствие hop-by-hop аутентификации делает поток ячеек изменяемым. Вмешавшись, атакующий может деанонимизировать пользователя.</li><li><b>Нет мгновенной прямой секретности.</b> Одни и те же ключи живут весь срок цепочки. Получив ключ, злоумышленник способен расшифровать все предыдущие данные.</li><li><b>Слабая аутентификация.</b> Подпись была всего 4 байта на SHA-1 — это 1 шанс из 4 млрд пройти незамеченным. Для криптографии — ничтожно мало.</li></ul><h2>Что меняет новый CGO</h2><p>CGO решает проблемы комплексно. Алгоритм вводит две ключевых идеи:</p><ol><li><b>Irreversible Update.</b> Ключи обновляются при каждом новом сообщении и старые версии невозможно восстановить. Это дает мгновенную «совершенную прямую секретность».</li><li><b>Wide-block шифрование.</b> Любая попытка изменить хотя бы байт приводит к полной порче расшифровки — атаки тегирования становятся бессмысленны.</li></ol><p>Также <b>MD4</b> заменен на полноценный <b>16-байтный аутентификатор</b>.</p><h2>Когда изменения доберутся до пользователей</h2><p>Tor уже применил CGO в Arti и в реализации на C. Tor Browser, Tails и Orbot постепенно перейдут на новый метод автоматически — пользователю не надо ничего настраивать вручную.</p><p>Для большинства это будет <b>тихое</b>, но <b>крайне важное обновление</b>: впервые за долгие годы Tor получает серьезное усиление защиты на уровне базовой криптографии.</p>]]></content:encoded>
    </item>
    <item>
      <title>Создатель Linux поддержал вайб-кодинг, назвав его «отличным способом войти в IT»</title>
      <link>https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-</link>
      <comments>https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-</guid>
      <description><![CDATA[<p>Линус Торвальдс поддержал вайб-кодинг как легкий вход в IT, но предупредил: для реальных проектов это плохо подходит и усложняет поддержку</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/sozdatel-linux-podderzhal-vajb-koding--nazvav-ego--otlichnym-sposobom-vojti-v-it-">Создатель Linux поддержал вайб-кодинг, назвав его «отличным способом войти в IT»</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Компиляторы]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Nov 2025 06:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Линус Торвальдс</b> неожиданно <a href="https://www.theregister.com/2025/11/18/linus_torvalds_vibe_coding/">высказался</a> <b>в поддержку вайб-кодинга</b>. Но только как способа входа в профессию, а не как подхода к разработке реального продукта.</p><p>Об этом он рассказал в интервью на <b>Open Source Summit</b> в Сеуле.</p><h2>«Я уже 20 лет не программист»</h2><p>Торвальдс признался, что своей основной задачей <b>давно</b> <b>не считает написание кода</b>:</p><blockquote>«Около 20 последних лет я не программист. Я смотрю на Git со стороны, а в ядре моя роль — соглашаться или отказывать».</blockquote><p>Он отметил, что все чаще приходится «говорить да» новым идеям, несмотря на сопротивление старых мейнтейнеров. Это можно заметить, например, в вопросе <b>интеграции Rust в ядро Linux</b>.</p><h2>Что он думает об ИИ и разработке</h2><p>Несмотря на то, что сам <b>Линус не пользуется ИИ-ассистентами</b>, он не исключает, что такие инструменты могут пригодиться в ядре. Основная проблема ИИ сейчас, по его словам — не код, а инфраструктура:</p><blockquote>«ИИ-краулеры сильно захламляют наши ресурсы, притаскивают баги и репорты, которых не существует».</blockquote><p>При этом <b>Торвальдс позитивно оценивает влияние ИИ-бума на индустрию</b>: из-за него NVIDIA стала «значительно более хорошим игроком» в Linux-сообществе.</p><h2>А что с вайб-кодингом?</h2><p>Именно здесь Линус удивил больше всего. Он сказал, что относится к вайб-кодингу <b>«довольно позитивно»</b>, потому что он:</p><ul><li>облегчает вход в программирование для новичков;</li><li>позволяет увидеть быстрый результат;</li><li>снижает технический порог для тех, кто раньше не мог «заставить компьютер что-то делать».</li></ul><p>Но использовать это в реальных проектах — гиблая идея:</p><blockquote>«Это может быть ужасным решением с точки зрения поддержки».</blockquote><p>По мнению Торвальдса, <b>вайб-кодинг — отличная «точка входа»</b>, но <b>плохой фундамент</b> для сложных систем вроде ядра Linux.</p><h2>Вердикт Линуса</h2><p>Он видит ИИ как обычный инструмент — как когда-то компиляторы, которые избавили разработчиков от необходимости писать код ассемблера вручную:</p><blockquote>«ИИ не убьет профессию. Как и компиляторы, он просто повысит продуктивность».</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>В Python 3.17 предложили сделать Rust обязательным. CPython ждет крупнейшая реформа за 10 лет</title>
      <link>https://tproger.ru/news/v-python-3-17-predlozhili-sdelat-rust-obyazatelnym--cpython-zhdet-krupnejwaya-reforma-za-10-let</link>
      <comments>https://tproger.ru/news/v-python-3-17-predlozhili-sdelat-rust-obyazatelnym--cpython-zhdet-krupnejwaya-reforma-za-10-let?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-python-3-17-predlozhili-sdelat-rust-obyazatelnym--cpython-zhdet-krupnejwaya-reforma-za-10-let</guid>
      <description><![CDATA[<p>Python 3.17 может сделать Rust обязательным: CPython готовят к крупнейшей реформе за десятилетие — ради безопасности, скорости и будущего без GIL</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-python-3-17-predlozhili-sdelat-rust-obyazatelnym--cpython-zhdet-krupnejwaya-reforma-za-10-let">В Python 3.17 предложили сделать Rust обязательным. CPython ждет крупнейшая реформа за 10 лет</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Firefox]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 18 Nov 2025 09:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда CPython <a href="https://discuss.python.org/t/pre-pep-rust-for-cpython/104906">обсуждает</a> предложение (pre-PEP), которое может радикально изменить процесс сборки интерпретатора: <b>Rust предлагают сделать обязательной зависимостью уже в Python 3.17</b>.</p><p>Если PEP примут, Python впервые за историю станет «двуязычным» проектом — частично на C, частично на Rust.</p><h2>Зачем Python нужен Rust</h2><p>Разработчики приводят несколько причин:</p><ul><li><b>Безопасность памяти.</b> Rust устраняет категории ошибок, привычные для C: use-after-free, гонки, переполнения.</li><li><b>Подготовка к free-threaded Python.</b> Переход к работе без GIL требует безопасных примитивов — Rust подходит идеально.</li><li><b>Производительность.</b> Rust позволяет создавать быстрые структуры данных без ручного менеджмента памяти.</li><li><b>Современный стек.</b> Linux, Android и Firefox уже используют Rust в системных компонентах — Python догоняет тренд.</li><li><b>Поддержка долгосрочного развития CPython.</b> Сложность кода растет, а Rust упрощает сопровождение.</li></ul><h2>Что именно планируют делать</h2><p>Стоит отметить, что Rust не планируют использовать в качестве полной замены C — появится возможность использовать оба языка. В идеале, должен получиться симбиоз:</p><ul><li><b>Crate</b> cpython-sys. Это набор автоматически сгенерированных привязок (FFI-слоя), которые позволяют Rust-коду безопасно «общаться» с внутренним API CPython.</li><li><b>Поддержка модулей на Rust.</b> Некоторые части стандартной библиотеки можно будет писать и подключать так же, как C-модули — только на Rust.</li><li><b>Прозрачное разделение зон безопасности.</b> «Безопасный» Rust будет использоваться по максимуму, а unsafe — только там, где нужно напрямую взаимодействовать с C-частями интерпретатора.</li></ul><p>Уже есть рабочий пример — модуль _base64 на Rust, который оказался быстрее варианта на C.</p><h2>Переходный план</h2><p>Если PEP утвердят, переход займет <b>три релиза</b>:</p><ul><li><b>Python 3.15</b> — предупреждение при сборке без Rust.</li><li><b>Python 3.16</b> — Rust остается опциональным, но его отключение потребует отдельного флага.</li><li><b>Python 3.17</b> — Rust становится <b>обязательной частью сборки </b>CPython.</li></ul><p>То есть через два релиза Python не соберется там, где нет Rust.</p><h2>Какие есть проблемы</h2><p>В обсуждении упоминают несколько рисков. Например, <b>циклическая зависимость при сборке</b> — Rust требует Python, Python требует Rust.</p><p>Вместе с тем, внедрение нового языка приведет и к <b>повышению порога входа</b> для новых участников разработки CPython. Как минимум потому, что им придется изучить Rust.</p><p><b>Появятся и сложности со сборкой в ограниченных средах</b>, например embedded-системах. При этом остается <b>неясной судьба Rust-API для сторонних расширений</b> — скорее всего, его не откроют.</p><h2>Что это значит для сообщества</h2><p>Для пользователей Python почти ничего не изменится. А вот для разработчиков интерпретатора это станет одним из самых крупных сдвигов в истории проекта.</p><p>Так, Python наконец-то станет сильно безопаснее. При этом CPython получит более надежный фундамент для будущих фич вроде полного отказа от GIL.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust снова подвел: в sudo-rs на Ubuntu 25.10 нашли баг, сливавший sudo-пароль пользователей</title>
      <link>https://tproger.ru/news/eshhe-odna-problema-ubuntu-25-10--v-sudo-rs-na-nawli-bag--slivavwij-sudo-parol-polzovatelej</link>
      <comments>https://tproger.ru/news/eshhe-odna-problema-ubuntu-25-10--v-sudo-rs-na-nawli-bag--slivavwij-sudo-parol-polzovatelej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/eshhe-odna-problema-ubuntu-25-10--v-sudo-rs-na-nawli-bag--slivavwij-sudo-parol-polzovatelej</guid>
      <description><![CDATA[<p>В Ubuntu 25.10 нашли баг в sudo-rs: при сбое или тайм-ауте утекал sudo-пароль. Ошибку уже исправили в версии 0.2.10 пакета</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/eshhe-odna-problema-ubuntu-25-10--v-sudo-rs-na-nawli-bag--slivavwij-sudo-parol-polzovatelej">Rust снова подвел: в sudo-rs на Ubuntu 25.10 нашли баг, сливавший sudo-пароль пользователей</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 13 Nov 2025 04:33:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>В <b>Ubuntu 25.10</b> <a href="https://www.phoronix.com/news/sudo-rs-security-ubuntu-25.10">обнаружили</a> уязвимость в <b>sudo-rs</b> — новой Rust-версии утилиты sudo. Она используется в дистрибутиве вместо классической реализации на Cи.</p><p>Ошибка приводила к тому, что <b>в некоторых случаях пароль пользователя мог утекать из памяти</b> — например, если процесс sudo прерывался или завершался по тайм-ауту.</p><h2>Что произошло</h2><p>По данным Phoronix, баг впервые был зафиксирован в приватном отчете разработчиков Ubuntu и получил идентификатор <b>CVE-2025-64170</b>. Позже отчет стал публичным — вместе с фиксом от авторов проекта sudo-rs.</p><p>Основная проблема заключалась в том, что при истечении тайм-аута или принудительном завершении процесса, <b>в буфере оставались незатираемые следы введенного sudo-пароля</b>.</p><p>Это позволяло потенциальному злоумышленнику, имеющему доступ к памяти процесса, извлечь данные, если sudo не успел корректно завершить работу.</p><h2>Как исправили</h2><p>В обновлении <b>sudo-rs 0.2.10</b>, которое уже доступно пользователям Ubuntu 25.10, исправлено несколько ошибок:</p><ul><li>добавлено <b>очищение памяти</b> с паролем при выходе или тайм-ауте;</li><li>переработан <b>механизм обратной связи</b> с пользователем (feedback) — теперь он реализован через enum;</li><li>исправлено поведение клавиши <b>Backspace</b> при пустом вводе;</li><li>улучшено <b>удаление содержимого буфера</b> перед завершением чтения.</li></ul><h2>Почему это важно</h2><p>Хотя уязвимость классифицируется как <b>умеренной степени опасности</b>, она затрагивает одну из базовых системных утилит Linux. Которая к тому же отвечает за выполнение команд с правами администратора.</p><p>Проблема стала очередным эпизодом в череде трудностей Ubuntu 25.10, связанных с переходом системных инструментов на Rust. Ранее пользователи сталкивались с <b>ошибками в rust-coreutils</b>, которые ломали автообновления и некоторые базовые команды.</p><h2>Что делать пользователям</h2><p>Ubuntu уже распространила <b>обновление безопасности (SRU)</b>, которое устраняет уязвимость.</p><p>Пользователям рекомендуется как можно скорее выполнить обновление пакета sudo-rs до версии <b>0.2.10</b>:</p><p>Переход на Rust-инструменты должен повысить безопасность и устойчивость системы, но инцидент с sudo-rs показывает, что <b>новая архитектура еще проходит этап «обкатки»</b>. Как итог — ошибки все еще возможны.</p>]]></content:encoded>
    </item>
    <item>
      <title>Математика или программирование? Какие знания нужны ML‑специалисту</title>
      <link>https://tproger.ru/articles/matematik-ili-programmist--chto-nuzhno-znat-ml-specialistu</link>
      <comments>https://tproger.ru/articles/matematik-ili-programmist--chto-nuzhno-znat-ml-specialistu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/matematik-ili-programmist--chto-nuzhno-znat-ml-specialistu</guid>
      <description><![CDATA[<p>Интервью про ML: бустинг против нейросетей, работа с LLM, валидация и культура кода в команде</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/matematik-ili-programmist--chto-nuzhno-znat-ml-specialistu">Математика или программирование? Какие знания нужны ML‑специалисту</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Инфраструктура]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Nov 2025 14:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Для Tproger поговорили с Александром Сербулом, руководителем ML‑направления в Битрикс24. Он рассказал, как не застрять на старте и почему в ML инженерная культура важнее модных нейросетей. Внутри — о том, когда градиентный бустинг лучше LLM, почему код нужно покрывать тестами, как работать с нехваткой данных и на что смотреть при выборе команды.</i></p><p>Если вы пишете код и начинаете разбираться с большими данными, здесь много идей, которые можно применить прямо сейчас.</p><p>Главный месседж — зрелый ML‑инженер это не коллекционер нейронок, а разработчик, умеющий проверять гипотезы, валидировать результаты и писать поддерживаемый код.</p><h2>Кем должен быть ML‑специалист — математиком или программистом</h2><p>Без математики в ML далеко не уйдёшь, но и без хорошего кода модели не взлетят. Ошибка в формуле или пробел в логике тестов может стоить недели отладки. Поэтому подход должен быть инженерным: писать чисто, добавлять аннотации типов, покрывать код тестами, следить за читаемостью.</p><h2>Сколько математики нужно в ML</h2><p>Без линейной алгебры, матриц, теории вероятностей и дифференцирования не получится даже понимать, что именно делает модель. Эти базовые знания можно освоить за полгода‑год, но важно не просто формулы выучить, а развить интуицию.</p><p>Инженеру нужно чувствовать, как данные проходят через слои сети, что происходит с тензорами и почему параметры меняются именно так. Это не про сложную теорию — скорее про понимание механики. Когда видишь матрицы не как набор чисел, а как систему преобразований, всё становится проще, и дебаг модели перестаёт быть сложной задачей.</p><h2>Как развиваться в ML и не застрять на старте</h2><p>По мнению Александра, главный способ расти в машинном обучении — постоянно разбирать чужие работы. Читать статьи, пробовать воспроизводить их, собирать сети, смотреть, как устроены архитектуры. Не стоит относиться к программированию как к самоцели. Код — инструмент, но смысл в том, чтобы понимать, что делает модель внутри.</p><blockquote>У многих разработчиков подход поверхностный: берут готовое решение, подают данные и ждут результата, но так не появляется понимания.</blockquote><p>Развитие начинается, когда ты сам задаёшь вопросы вроде «почему слой ведёт себя так», «как меняются веса», «что даёт нормализация». Именно через эти вопросы начинается путь к инженеру, а не к пользователю фреймворков и вайбкодингу.</p><h2>Что с большими языковыми моделями</h2><p>Хайп вокруг больших языковых моделей уже выдохся: корпорации гонятся за размерами, а остальные используют их как библиотеку. Это не плохо — эмбеддинги и промты действительно решают прикладные задачи, от резюмирования встреч до автозаполнения CRM.</p><p>Но инженеру важно понимать, что промт не заменяет модель, это просто способ задать контекст, как преднастройка перед задачей. За ней всё тот же набор весов и вероятностных расчётов. Ошибка — считать промты заменой инженерной работы.</p><p>LLM полезны там, где есть конкретный сценарий и метрики: если видно, что саммари экономит время менеджера или классификатор улучшает отклик в CRM, тогда инструмент оправдан.</p><blockquote>В остальных случаях стоит смотреть на ресурсы и задавать вопрос — нужна ли тяжёлая модель, если задачу решает бустинг или простая логистическая регрессия.</blockquote><h2>Какие методы сейчас реально работают</h2><p>По данным Александра, для бизнес‑задач нет универсального решения, но есть набор проверенных инструментов. <b>Если данные категориальные — лучше использовать градиентный бустинг</b>, например CatBoost или XGBoost. Эти методы часто точнее нейросетей и требуют меньше подгонки.</p><p>Хороший результат даёт <b>комбинация моделей.</b> Например, можно взять LLM для генерации эмбеддингов, а дальше подать их в логистическую регрессию или тот же бустинг. Такой гибрид работает быстрее и требует меньше ресурсов, но при этом сохраняет качество.</p><p>Если данных мало или вычислительных мощностей не хватает, помогает <b>байесовский подход.</b> Он хорошо ведёт себя на шумных и несбалансированных выборках, где другие методы не подходят или не работают. Отдельное направление — <b>оптимизация моделей.</b> Уменьшение моделей через compression позволяет запускать их на обычных серверах без потери точности — актуально для компаний без GPU‑кластеров.</p><h2>Когда ML действительно нужен</h2><p>Не любую задачу стоит решать через машинное обучение. Александр объясняет: если алгоритм можно описать правилами, лучше начинать с классики. Но когда формулы не работают — например, при обработке изображений или машинном переводе — подходит ML. Главное, чтобы были данные: сотни или тысячи пар примеров «правильно» и «неправильно». Без них обучение просто не из чего строить.</p><p>Если данных мало, лучше брать байесовские методы или простые классификаторы — они устойчивее и не требуют много ресурсов. То же самое касается бизнес‑кейсов, где результат критичен, а точность нужно проверять.</p><blockquote>Решение в пользу ML — это не вопрос нового стека, а вопрос наличия данных и понимания задачи. Если подход классических алгоритмов решает проблему быстрее и дешевле, значит, выбираем его.</blockquote><h2>Что делать, если данных мало</h2><p>Недостаток данных — это нормальное состояние, полных и сбалансированных выборок почти не бывает. Поэтому разработчику приходится проявлять креатив. Один из способов — генерировать синтетические данные. Например, создавать дополнительные примеры с небольшими изменениями, чтобы модель видела больше разнообразия.</p><blockquote>Полезно искать и дополнительные источники сигналов. Если пользователь бросил корзину в интернет‑магазине, это может быть прокси‑признак будущей покупки. Такие косвенные данные часто помогают вытащить модель на нужный уровень точности.</blockquote><h2>Где ML приносит реальную пользу бизнесу</h2><p>Александр приводит примеры из практики Bitrix24. <b>Один из самых ощутимых по эффекту — скоринг лидов и сделок.</b> Там используется логистическая регрессия и градиентный бустинг. Метод простой, но позволяет заметно повысить точность прогнозов и напрямую влияет на выручку.</p><p><b>Вторая история — классификация запросов техподдержки.</b> Решение построено на основе алгоритма шинглов и простой модели, оно работает стабильно и подходит для разных языков.</p><p>Алгоритм шинглов — это простой способ представить текст для последующей обработки или сравнения без участия сложных моделей. <br /><br /><i>Пример: текст "машина" при длине шингла 3 даёт набор шинглов: "маш", "аши", "шин", "ина". <br /></i><br />Дальше можно сравнивать эти множества и вычислять похожесть, например через коэффициент Жаккара. <br /></p><p>В Bitrix24 метод шинглов помогает системе одинаково понимать обращения пользователей на разных языках или с разными формулировками.</p><h2>Как проверить, что модель действительно работает</h2><p>Без тестирования и валидации никакая модель не считается готовой. <b>Первое, с чего нужно начинать, — сравнение с базовой линией.</b> Самый простой пример — случайный классификатор. Если ваша модель даёт результат не лучше рандома, значит, смысла в ней нет.</p><p><b>Дальше важно понимать метрики: precision, recall, F1 и другие.</b> Они показывают, на сколько точно модель попадает в нужные ответы и сколько ложных срабатываний допускает. Не стоит воспринимать метрики как формальности — от них зависит, будет ли решение полезно для бизнеса.</p><p><b>Ещё один критерий — устойчивость модели. </b>Александр советует проверять, насколько решение лучше простых эвристик, которые уже используются в компании.</p><blockquote>Если ML‑модель не выигрывает по скорости или точности, её не стоит внедрять. Тестировать нужно на реальных данных и регулярно пересматривать результаты, особенно если бизнес‑процессы меняются.</blockquote><h2>Какие инструменты и ресурсы использовать</h2><p>Основная экосистема машинного обучения сегодня крутится вокруг Python, и начинать логично с него. Хороший старт — <a href="https://realpython.com/">realpython.com</a>, где подробно объясняются основы языка и приёмы написания читаемого кода.</p><p>Но нужно развивать инженерные привычки. Александр рекомендует читать книги вроде <b>Effective Java Джошуа Блоха</b>, чтобы прокачивать культуру разработки и понимать многопоточность. Даже если вы работаете с Python, знания из других языков помогают писать лучше и думать о производительности.</p><p>Из библиотек стоит освоить <b>PyTorch или TensorFlow</b> для нейросетей и <b>scikit‑learn для классического ML</b>. При росте нагрузки полезно переписывать критичные части на <b>Java или Rust</b> — это уменьшает задержки и делает систему устойчивее.</p><h2>Как набраться практики и выбрать правильную команду</h2><p>Лучший способ вырасти в ML — попасть туда, где есть реальные данные и сильная инженерная культура.</p><blockquote>Идите в крупные компании вроде Яндекса, ВК, Сбера или X5 — там есть инфраструктура, процессы и опытные коллеги. Просто читать статьи и собирать pet‑проекты недостаточно, если не сталкиваешься с настоящими продуктами и их ограничениями.</blockquote><p><b>Главный признак хорошей команды — наличие тестов, QA и понятного кода.</b> Если в отделе этого нет, нужно уходить, иначе быстро потеряешь профессиональный уровень. ML уже давно не чудо‑технология, а инструмент. И успех зависит не от того, кто первым применил нейросеть, а от того, чья команда умеет держать систему в рабочем состоянии и проверять результаты каждый день.</p><p>В конце хочется спросить: как вы сами учились или учитесь ML — через курсы, проекты или книги? Делитесь своим опытом и мыслями в комментариях — обсудим, какие подходы к обучению и работе в ML работают сегодня.</p>]]></content:encoded>
    </item>
    <item>
      <title>ZDNET назвал 5 самых красивых Linux-дистрибутивов на данный момент</title>
      <link>https://tproger.ru/news/zdnet-nazval-5-samyh-krasivyh-linux-distributivov-na-dannyj-moment</link>
      <comments>https://tproger.ru/news/zdnet-nazval-5-samyh-krasivyh-linux-distributivov-na-dannyj-moment?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/zdnet-nazval-5-samyh-krasivyh-linux-distributivov-na-dannyj-moment</guid>
      <description><![CDATA[<p>ZDNET назвал 5 самых красивых Linux-дистрибутивов: KDE Neon, EndeavourOS, Pop!_OS, ElysiaOS и BigLinux. Plasma правит бал в Linux</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/zdnet-nazval-5-samyh-krasivyh-linux-distributivov-na-dannyj-moment">ZDNET назвал 5 самых красивых Linux-дистрибутивов на данный момент</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Дизайн]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Nov 2025 14:35:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Несмотря на популярный миф, Linux может быть не только гибким, безопасным и свободным на кастомизацию, но и эстетически привлекательным.</p><p>ZDNET <a href="https://www.zdnet.com/article/the-most-beautiful-linux-distributions-for-2025/">выбрал</a> <b>пять самых красивых дистрибутивов</b>, которые и без «допиливания» выглядят впечатляюще.</p><h2>KDE Neon</h2><p>Флагман для поклонников Plasma. Никаких излишеств — только чистый, минималистичный интерфейс KDE, таким, каким его задумали.</p><p>Neon показывает, что <b>иногда красота — в сдержанности</b>.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-11-05/13b6a0dc-6848-4913-af46-0df04f7617e1.png" alt="" /></figure><h2>EndeavourOS</h2><p>Arch-база и слегка «космическая» тема оформления. Темная цветовая схема, аккуратные акценты, лаконичные панели.</p><p>По мнению автора, это один из немногих дистрибутивов, где <b>«Темную тему» не хочется менять сразу после установки</b>.</p><h2>Pop!_OS с окружением COSMIC</h2><p>System76 переписала интерфейс на Rust и добавила гибкости. В итоге новый <b>COSMIC</b> — это GNOME-подобная оболочка, которую легко подстроить под себя.</p><p>Но что важнее — ее можно можно и не менять. <b>По умолчанию Pop!_OS уже выглядит стильно и современно</b>.</p><h2>ElysiaOS</h2><p>Arch + Hyperland + аниме. Да, именно так: дистрибутив с <b>милым</b>, <b>ярким</b>, <b>кавайным</b> дизайном.</p><p>По словам автора, хоть в дистрибутиве и куча визуальных деталей, это не минус, а скорее даже плюс. Экзотика? Да. Зато запоминается.</p><h2>BigLinux</h2><p>Базируется на Manjaro и использует KDE Plasma. Простая, сбалансированная эстетика без визуальной перегрузки.</p><p>Во время установки можно выбрать оформление под macOS, GNOME или Ubuntu. <b>Красивый, удобный и дружелюбный дистрибутив</b>.</p><p><b>Интересный факт.</b> Почти все дистрибутивы в списке — с KDE Plasma. Похоже, именно Plasma сегодня задает стандарт красоты в Linux-мире.</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>В Ubuntu 25.10 сломались автообновления — виноват баг в Rust-утилите date</title>
      <link>https://tproger.ru/news/v-ubuntu-25-10-slomalis-avtoobnovleniya---vinovat-bag-v-rust-utilite-date</link>
      <comments>https://tproger.ru/news/v-ubuntu-25-10-slomalis-avtoobnovleniya---vinovat-bag-v-rust-utilite-date?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-ubuntu-25-10-slomalis-avtoobnovleniya---vinovat-bag-v-rust-utilite-date</guid>
      <description><![CDATA[<p>В Ubuntu 25.10 перестали работать автообновления из-за бага в Rust-утилите date из rust-coreutils. Canonical уже выпустила фикс</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-ubuntu-25-10-slomalis-avtoobnovleniya---vinovat-bag-v-rust-utilite-date">В Ubuntu 25.10 сломались автообновления — виноват баг в Rust-утилите date</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Инструменты терминала Linux]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 24 Oct 2025 04:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пользователи <b>Ubuntu 25.10 </b><a href="https://lwn.net/Articles/1043103/">столкнулись</a> с проблемой: система перестала автоматически проверять наличие обновлений.</p><p>Как сообщили разработчики, причиной стал <b>баг в Rust-версии утилиты</b> date, входящей в состав пакета <b>rust-coreutils</b>.</p><p>Ошибка затронула <b>все варианты дистрибутива</b> — от облачных инстансов и контейнерных образов до настольных и серверных установок.</p><h2>Подробности инцидента</h2><p>В Ubuntu 25.10 разработчики Canonical начали эксперимент по «оксидированию» системы — постепенному замещению классических инструментов GNU Coreutils на <b>переписанные на Rust версии</b> из проекта <b>uutils</b>.</p><p>Среди них оказалась и утилита date, которая используется в механизме проверки обновлений.</p><p>В релизе rust-coreutils <b>0.2.2-0ubuntu2</b> в date закралась ошибка, нарушающая корректную обработку времени при выполнении системных скриптов, отвечающих за автообновления. В результате <b>службы обновления не могли определить дату последней проверки</b> и прекращали работу.</p><p>Баг не влияет на <b>ручные обновления через</b> apt или другие менеджеры пакетов — только на автоматические проверки.</p><h2>Как исправить</h2><p>Canonical уже выпустила исправление в пакете <b>rust-coreutils 0.2.2-0ubuntu2.1</b>. Проверить, затронута ли система, можно командой:</p><p>Если версия ≤ 0.2.2-0ubuntu2, нужно вручную обновить пакет:</p><p>Системы, обновлявшиеся вручную или через apt upgrade, скорее всего, <b>не пострадали</b>.</p><h2>Контекст</h2><p>Переход Ubuntu на Rust-инструменты — часть более масштабного проекта Canonical по <b>повышению безопасности и надежности базовых утилит</b>. Помимо coreutils, компания тестирует и sudo-rs — переписанную на Rust версию sudo.</p><p>Однако текущий инцидент показывает, что полная замена проверенных C-реализаций на новые Rust-проекты пока сопряжена с рисками.</p><p>Canonical заявляет, что перед выходом LTS-версии в апреле 2026 года проведет <b>дополнительное тестирование Rust-утилит</b>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Со-основатель OpenAI Карпати опубликовал open-source клон ChatGPT</title>
      <link>https://tproger.ru/news/so-osnovatel-openai-karpati-opublikoval-open-source-klon-chatgpt--skachat-mozhet-lyuboj-zhelayushhij</link>
      <comments>https://tproger.ru/news/so-osnovatel-openai-karpati-opublikoval-open-source-klon-chatgpt--skachat-mozhet-lyuboj-zhelayushhij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/so-osnovatel-openai-karpati-opublikoval-open-source-klon-chatgpt--skachat-mozhet-lyuboj-zhelayushhij</guid>
      <description><![CDATA[<p>Сооснователь OpenAI Андрей Карпати выложил NanoChat — open-source клон ChatGPT, который можно обучить и запустить всего за $100</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/so-osnovatel-openai-karpati-opublikoval-open-source-klon-chatgpt--skachat-mozhet-lyuboj-zhelayushhij">Со-основатель OpenAI Карпати опубликовал open-source клон ChatGPT</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Oct 2025 03:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Экс-директор по ИИ в Tesla и со-основатель OpenAI <b>Андрей Карпати</b> <a href="https://github.com/karpathy/nanochat">выложил</a> в открытый доступ проект <b>NanoChat</b>. По его словам, это «лучший ChatGPT, который можно построить за $100». Репозиторий уже набрал более <b>5000 звезд на GitHub</b>.</p><p>По словам Карпати, NanoChat — это <b>полный стек LLM-платформы</b>, включающий токенизацию, обучение, дообучение, оценку, инференс и веб-интерфейс, позволяющий общаться с моделью прямо из браузера. Все работает на<b> одном узле с 8 GPU H100</b> и запускается одной командой:</p><p>Обучение занимает около четырех часов и стоит примерно <b>$100</b> при аренде облачного сервера Lambda Labs. После этого можно открыть локальный веб-интерфейс и «болтать» с собственной моделью как с ChatGPT.</p><h2>Собери сам</h2><p>Карпати описывает NanoChat как <b>«чистый, минималистичный и хакабельный код»</b>, который подойдет тем, кто хочет понять, как устроен ChatGPT изнутри.</p><p>Репозиторий включает всего <b>около 8000 строк кода</b> и написан в основном на <b>Python</b> (89%), с минимальными вставками на <b>Rust</b> и <b>HTML</b>.</p><blockquote><i>NanoChat — это не гигантская инфраструктура, а сильная и прозрачная база, на которой можно построить свой LLM с нуля.</i></blockquote><p>Он также подтвердил, что проект станет <b>частью нового курса LLM101n</b>, который готовит его команда Eureka Labs.</p><h2>Что под капотом</h2><p>NanoChat использует простую пайплайн-архитектуру с поддержкой этапов <b>pretraining</b>, <b>fine-tuning</b>, <b>evaluation</b> и <b>serving</b>, а также встроенный сервер чата на Python (python -m scripts.chat_web).</p><p>Результаты обучения сохраняются в виде «отчетной таблицы» с ключевыми метриками (ARC, GSM8K, MMLU).</p><h2>Open source и вдохновение</h2><p>NanoChat распространяется под <b>лицензией MIT</b> и вдохновлен предыдущими проектами Карпати — nanoGPT и сообществом разработчиков на Hugging Face.</p><p>Как подчеркивает автор, цель NanoChat — <b>демократизировать ИИ</b>, сделав разработку больших языковых моделей понятной и доступной «для всех, у кого есть $100 и немного любопытства».</p>]]></content:encoded>
    </item>
    <item>
      <title>Как написать Телеграм-бота на Rust за вечер</title>
      <link>https://tproger.ru/articles/kak-napisat-telegram-bota-na-rust-za-vecher</link>
      <comments>https://tproger.ru/articles/kak-napisat-telegram-bota-na-rust-za-vecher?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-napisat-telegram-bota-na-rust-za-vecher</guid>
      <description><![CDATA[<p>Руководство по разработке Телеграм-бота на Rust: регистрация в BotFather, настройка библиотеки teloxide, обработка входящих данных. Развёртывание на VPS, защита от перегрузок и сравнение библиотек для работы с Telegram Bot API.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-napisat-telegram-bota-na-rust-za-vecher">Как написать Телеграм-бота на Rust за вечер</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Oct 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За 10 минут создадим чат-бота, научим его читать сообщения от пользователей и слать ответы. Ещё добавим кнопки и расскажем, как разместить бота на хостинге, чтобы он работал 24/7. Код пишем на Rust, используем библиотеку <a href="https://docs.rs/teloxide/latest/teloxide/">teloxide</a>.</p><p>🔥 Помогал с публикацией <b>Игорь Панасюк</b> — Software Engineer и автор канала <a href="https://t.me/igoroutine">Igor Panasyuk | IGORoutine Programming</a>.</p><h2>Регистрация бота в Телеграм</h2><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-08/fa9f6087-e0ba-4ad5-a1f5-857ab30f54d7.jpg" alt="" /></figure><p>Откройте Телеграм и найдите <a href="https://telegram.me/BotFather">@BotFather</a> — это официальный бот, он создаёт других ботов. Отправьте ему команду /newbot.</p><p>BotFather сначала спросит имя бота, оно может быть любым. Далее придумайте username, чтобы он заканчивался на «bot», например <i>hello_chat_bot</i>. Если юзернейм свободен, BotFather пришлёт токен для управления. Выглядит токен как длинная строка: <i>8201115114:AAGNII8UA3kjcz9qvV8znl77pK-YldkWMmQ</i>.</p><p>В BotFather есть несколько команд для настройки оформления:</p><ul><li>/setname — меняет имя бота (то, что видят пользователи);</li><li>/setdescription — добавляет описание, которое отображается при первом запуске;</li><li>/setabouttext — добавляет короткий текст для страницы бота;</li><li>/setuserpic — загружает аватарку (квадратное изображение от 512×512 px).</li></ul><p>Имя можно менять сколько угодно раз. Username (тот, что заканчивается на _bot) изменить нельзя.</p><h2>Создаём Телеграм-бота на Rust</h2><p>В качестве примера напишем эхо-бота. Он будет получать строку текста и её же присылать в ответ.</p><p>Создайте новый проект:</p><p>Откройте Cargo.toml и добавьте зависимости:</p><p>Создайте файл .env в корне проекта:</p><p>Откройте src/main.rs и вставьте код:</p><p>teloxide::repl() запускает цикл обработки сообщений. Функция внутри получает сообщение и отправляет текст обратно пользователю.</p><p>msg.text() извлекает текст из сообщения. Если пользователь отправил стикер или фото, бот их проигнорирует. Как читать разные типы сообщений — разберём далее.</p><p>bot.send_message()  отправляет ответ. Первый параметр — ID чата, второй — текст. Методы отправки с форматированием, кнопками и файлами рассмотрим в следующих разделах.</p><p>Скомпилируйте проект:</p><p>Откройте мессенджер, найдите своего бота по юзернейму и напишите ему любое сообщение. Если бот ответил, значит всё сделали правильно.</p><h2>Перенос бота на хостинг</h2><p>Сейчас бот работает локально на вашем компьютере. Чтобы он отвечал круглосуточно, нужен сервер. Есть три варианта:</p><ul><li>Виртуальный сервер (VPS).</li><li>Облачные платформы.</li><li>Домашний сервер.</li></ul><p>Проще и дешевле взять VPS, подойдёт любой Linux-сервер за 200-300 рублей/месяц.</p><p>После оплаты хостинга вы получите IP-адрес сервера, логин и пароль. Откройте терминал и подключитесь: ssh root@123.45.67.89, введите пароль.</p><p>Установите Rust:</p><p>Клонируйте проект с GitHub или создайте новый:</p><p>Создайте на сервере файл .env с токеном:</p><p>Соберите релизную версию:</p><p>Если закроете терминал, бот остановится. Чтобы он работал постоянно, используйте утилиту screen:</p><p>Теперь бот работает круглосуточно. Дальше научим его читать сообщения пользователей, отвечать на команды и добавим интерактивные кнопки с меню.</p><h2>Чтение сообщений</h2><p>Телеграм отправляет боту данные через API. Каждое сообщение приходит в виде объекта:</p><ul><li>текст,</li><li>ID чата,</li><li>информация о пользователе,</li><li>время отправки.</li></ul><p>Библиотека teloxide распарсила JSON от Телеграм и превратила его в удобные структуры. Нужен лишь обработчик, который срабатывает на новое сообщение:</p><p>Бот как-то должен узнавать о новых сообщениях от пользователей. Самый простой способ — <b>метод </b><b>getUpdates</b>. Бот каждые несколько секунд спрашивает: «Есть что-то новое?». Получает ответ, обрабатывает сообщения и снова спрашивает.</p><p>Под капотом teloxide делает примерно следующее:</p><p>Есть другой вариант — <b>вебхуки</b>. Вы один раз говорите Телеграму: «Вот адрес моего сервера, присылай сюда все обновления».</p><blockquote>Telegram сам шлёт обновления на ваш HTTPS-эндпоинт, вместо того чтобы бот опрашивал API (getUpdates). Преимущества в меньшей нагрузке и задержке, можно масштабировать через балансировщик и легко интегрировать в микросервисную архитектуру.</blockquote><p>С getUpdates сами решаете, когда проверять новые сообщения. С вебхуками Телеграм решает за вас — он шлёт данные сразу, как только что-то происходит. Если вы пишете бота для себя или учитесь, начните с getUpdates.</p><h2>Отправка сообщений</h2><p>Базовая отправка текста выглядит так:</p><p>chat_id — это идентификатор чата, откуда пришло сообщение. Бот отправит ответ туда же.</p><p>Телеграм ограничивает длину одного сообщения 4096 символами. Если попытаетесь отправить больше, API вернёт ошибку. Проблему решает функция, которая разбивает текст на части:</p><p>Бот может отправлять не только текст. Методы send_photo, send_document, send_video работают с файлами до 50 МБ. Передавайте либо URL, либо загружайте файл с диска:</p><p>Форматирование текста делайте через Markdown или HTML. Чтобы применить стили, укажите режим парсинга:</p><p>Иногда нужно отправить сообщение с задержкой. В Rust нет встроенного планировщика задач, но есть tokio::time::sleep:</p><p>Ещё бот умеет редактировать уже отправленные сообщения. Сохраните объект сообщения из ответа и используйте его id, чтобы обновлять информацию в чате без спама:</p><h2>Добавление меню и кнопок</h2><p>Бот, который только читает и отвечает текстом, — это скучно. Пользователи хотят тыкать на кнопки, листать меню.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-10-08/50cd4951-e100-4b8a-9cc9-41758f3d0b31.jpg" alt="" /></figure><p>В Телеграме есть два типа кнопок:</p><ul><li><b>Reply </b>— появляются вместо обычной клавиатуры для ввода текста.</li><li><b>Inline </b>— прикрепляются прямо к сообщению.</li></ul><p>Выбирайте Reply для основного меню, Inline — для быстрых действий внутри конкретного сообщения. Кнопки можно располагать в несколько рядов, добавлять эмодзи, делать их адаптивными.</p><p>Создадим простое меню с двумя кнопками:</p><p>Кнопки отправляют обычный текст в чат. Ваш бот получит сообщение «Показать погоду» и обработает его как команду.</p><p>Inline-кнопки отправляют callback-запросы:</p><p>«Да» — это текст на кнопке, «answer_yes» — данные, которые получит бот. Чтобы поймать нажатие, нужен обработчик callback-запросов.</p><h2>Ограничения ботов и ddos-атаки</h2><p>Telegram API ограничивает количество сообщений, которые бот отправляет одному пользователю или в группу. Если превысите лимит, получите ошибку 429:</p><ul><li>30 сообщений в секунду.</li><li>20 сообщений в минуту в один чат.</li></ul><p>Пользователи могут слать боту сколько угодно сообщений, и ваш сервер должен их как-то обрабатывать. Если используются getUpdates, каждый запрос к API тянет все новые сообщения разом — это плохо.</p><blockquote>Основное правило — не держать бота напрямую за getUpdates, а использовать вебхуки с ограничением соединений и прокси. Telegram уже фильтрует большую часть мусорного трафика, но важно добавить rate limit (например, через nginx) и иметь таймауты.</blockquote><p>Добавьте простую защиту: храните HashMap с user_id и временем последнего сообщения. Если пользователь пишет чаще раза в секунду — игнорируйте его запросы. Ещё один вариант — подключить <a href="https://tproger.ru/articles/kak-ispolzovat-redis-dlya-kewirovaniya-i-ocheredej-v-veb-prilozheniyah">Redis</a> и вести счётчики запросов там.</p><h2>Библиотеки для создания ботов на Rust</h2><p>В экосистеме Rust для тг-ботов есть три основные библиотеки.</p><p><b>teloxide</b></p><p>Вы пишете bot.answer("Привет") — библиотека сама формирует HTTP-запрос, отправляет его в Телеграм API, обрабатывает ответ и возвращает результат.</p><p>У teloxide есть встроенная система диалогов. Например, бот спрашивает имя, пользователь отвечает, бот запоминает ответ и спрашивает возраст. Библиотека следит за тем, на каком шаге находится каждый пользователь.</p><p>Ещё в teloxide есть диспетчер команд. Вы пишете функцию start(), помечаете её атрибутом #[command], и библиотека автоматически вызывает эту функцию, когда пользователь отправляет /start. Не нужно вручную парсить текст сообщения и проверять, что там написано.</p><p>Минус — teloxide тянет за собой много зависимостей. Поэтому увеличивается время компиляции, размер бинарника тоже.</p><blockquote>Размер бинарного файла напрямую на производительность не влияет — Rust-компилятор делает статическую линковку, так что даже 20 МБ бинарник работает с той же скоростью. Если размер критичен при деплое, можно попробовать собирать с флагами, которые удаляют служебную информацию из бинарника.</blockquote><h2>frankenstein</h2><p>Генерирует структуры данных из официальной спецификации <a href="https://core.telegram.org/bots">Telegram Bot API</a>. Вы получаете типы SendMessage, Message, User — они точно соответствуют тому, что описано в документации Telegram.</p><p>Библиотека не добавляет абстракций. Хотите отправить сообщение — создаёте структуру SendMessageParams, заполняете chat_id и text, вызываете метод api.send_message(). Хотите обработать команду — сами проверяете, начинается ли текст сообщения со /start.</p><p>frankenstein компилируется быстрее teloxide и создаёт меньший бинарник.</p><h2>teloxide-core</h2><p>Основа teloxide без диспетчера команд и системы диалогов. Вы работаете напрямую с методами API, но библиотека всё ещё помогает с типами и обработкой ошибок.</p><p>Используйте teloxide-core, если архитектура вашего бота не вписывается в teloxide и вы не хотите писать всю логику с нуля в frankenstein.</p><h2>Подведём итоги</h2><p>Вы создали бота, который читает сообщения, отвечает на команды, показывает кнопки и работает на сервере. База готова — добавляйте логику под свои задачи:</p><ul><li>Подключите базу данных (<a href="https://tproger.ru/articles/osnovy-postgresql-dlya-nachinayushhih--ot-ustanovki-do-pervyh-zaprosov-250851">PostgreSQL</a> через tokio-postgres или SQLite через rusqlite).</li><li>Добавьте HTTP-запросы к внешним API (reqwest).</li><li>Настройте логирование в файл (log4rs).</li></ul><p>Код из статьи — это каркас. Теперь у вас есть работающая основа, которую можно развивать в любом направлении.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Python 3.14. Что нового и насколько он стал быстрее?</title>
      <link>https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-</link>
      <comments>https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-</guid>
      <description><![CDATA[<p>Python 3.14 стал быстрее на 27%, получил free-threading без GIL и впервые полноценно раскрывает многопоточность для современных процессоров</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-python-3-14---naskolko-on-bystree-">Вышел Python 3.14. Что нового и насколько он стал быстрее?</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Многопоточность]]></category>
      <category><![CDATA[Процессор]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Oct 2025 09:17:31 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>Python 3.14</b> вышел совсем недавно — 7 октября. А уже на следующий день разработчик Мигель Гринберг опубликовал результаты независимых тестов.</p><p>Главный итог — новая версия работает <b>примерно на 27% быстрее</b>, чем Python 3.13. Ключевое новшество — полноценная поддержка <b>free-threading</b> (многопоточности без глобальной блокировки GIL).</p><h2>Как тестировали</h2><p>В тестах участвовали версии CPython 3.9–3.14, а также PyPy 3.11, Node.js 24 и Rust 1.9.</p><p>Проверяли производительность на двух алгоритмах: рекурсивном вычислении чисел Фибоначчи и сортировке пузырьком. В однопоточном режиме Python 3.14 показал стабильный прогресс:</p><ul><li>В тесте Фибоначчи ускорение на <b>27%</b> — 6,4 секунды против 8,2 секунд у версии 3.13.</li><li>В сортировке пузырьком время сократилось <b>до 2,05 секунды</b> против <b>2,8 секунд</b>.</li></ul><h2>Революция free-threading</h2><p>Главный прорыв — <b>free-threading</b>, который наконец снимает системное ограничение GIL и раскрывает потенциал многоядерных процессоров.</p><p>В четырехпоточном тесте Фибоначчи скорость выросла <b>в три раза</b>, а в сортировке — <b>в два раза</b> относительно стандартной сборки.</p><h2>Сравнение с другими</h2><p>Стоит отметить, что PyPy 3.11 остается недосягаемым лидером — он быстрее CPython 3.14 почти в пять раз в рекурсии и в 18 раз при сортировке.</p><p>Node.js приблизился к PyPy в одном тесте, а Rust ожидаемо вырвался вперед — до 70 раз быстрее Python.</p><h2>Что это значит</h2><p>Python 3.14 — самая быстрая версия CPython на сегодня. Для проектов с интенсивными вычислениями free-threading дает ощутимый прирост. А вот JIT-режим пока остается экспериментальным — ускорения почти нет.</p><p>Если ваша команда может обновиться — <b>это стоит сделать</b>. Python 3.14 не просто быстрее: он впервые по-настоящему раскрывает многопоточность.</p>]]></content:encoded>
    </item>
    <item>
      <title>«SQL хорош для данных, но плох для логики» — почему все больше разработчиков выносят бизнес-логику из базы</title>
      <link>https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy</link>
      <comments>https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy</guid>
      <description><![CDATA[<p>SQL отлично справляется с данными, но неудобен для бизнес-логики: разработчики выносят её в код ради гибкости, скорости и независимости</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/-sql-horow-dlya-dannyh--no-ploh-dlya-logiki----pochemu-vse-bolwe-razrabotchikov-vynosyat-biznes-logiku-iz-bazy">«SQL хорош для данных, но плох для логики» — почему все больше разработчиков выносят бизнес-логику из базы</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Oracle]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 24 Sep 2025 11:06:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Современные приложения все чаще используют базы данных исключительно как «хранилище», а не как движок для бизнес-логики. <i>Почему? </i></p><p>Потому что SQL, несмотря на свое превосходство в работе с данными, неудобен, ограничен и рискован в роли полноценного языка программирования.</p><h2>Логика не по адресу</h2><p>Как <a href="https://ewaldbenes.com/en/blog/why-i-keep-business-logic-out-of-sql">отмечает</a> Эвальд Бенс, фуллстек разработчик и авторов популярного блога об IT, он <b>предпочитает держать как можно больше логики в приложении</b>, а не в SQL-хранилищах, представлениях и процедурах:</p><blockquote>Я отношусь к базе как к тупому хранилищу данных. Вся логика — в коде. SQL просто не предназначен для сложных сценариев.</blockquote><p>И дело не в том, что SQL чего-то «не умеет». Умеет — особенно с расширениями вроде PL/pgSQL или Oracle PL/SQL.</p><p><b>Но выразительность этих языков — далека от Python, TypeScript, Rust или C#</b>, особенно когда речь идет о бизнес-логике, объектной модели или сложных расчетах.</p><h2>Зачем выносить логику из базы?</h2><h2>1. SQL невыразителен</h2><p>Для манипуляций с табличками и JOIN — он король. Но как только начинается рекурсия, классы, вложенные состояния или обработка ошибок — SQL превращается в монстра с BEGIN, IF, LOOP, EXCEPTION, RAISE, CURSOR, FETCH, WHILE и т.д...</p><h2>2. Развертывание — боль</h2><p>Обновить приложение можно за минуту, откатить — за две. А вот миграции на проде — это:</p><ul><li>повышенные права доступа;</li><li>согласование с DBA;</li><li>боязнь сломать что-то «наживую»;</li><li>ручной откат схем.</li></ul><h2>3. Лочит на вендора</h2><p>Логика, написанная на PL/SQL — это билет в один конец к Oracle. Переезд на PostgreSQL или SQL Server становится в 5 раз сложнее.</p><h2>4. Меньше инструментов</h2><p>Вокруг SQL есть утилиты, но полноценной среды с юнит-тестами, статическим анализом, форматтерами, профайлерами, линтерами и отладчиками — почти нет.</p><h2>А что с производительностью?</h2><p>Да, есть нюанс: <b>иногда лучше обработать данные прямо в базе</b>, чтобы не гонять десятки тысяч строк по сети. Это особенно актуально, если не хочется получить классическую проблему N+1-запросов.</p><p>Но даже в этом случае большинство специалистов советует <b>сначала делать «просто и понятно», а не «оптимально заранее»</b>. До тех пор, пока не уперлись в реальные метрики, выносить логику в базу — преждевременная оптимизация.</p><h2>Что делать?</h2><p>Подход <i>«база — хранилище, логика — в коде»</i> стал де-факто стандартом во многих командах. Но это не догма:</p><ul><li>Для отчетности или простых ETL сценариев логика в SQL может быть уместной.</li><li>Для монолитных решений без CI/CD и DevOps — процедурный SQL вполне оправдан.</li><li>Но в современной разработке с частыми релизами, микросервисами и отказоустойчивостью <b>бизнес-логика в приложении — просто удобнее и безопаснее</b>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Rust может стать обязательной зависимостью в Git 3.0</title>
      <link>https://tproger.ru/news/rust-mozhet-stat-obyazatelnoj-zavisimostyu-v-git-3-0</link>
      <comments>https://tproger.ru/news/rust-mozhet-stat-obyazatelnoj-zavisimostyu-v-git-3-0?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rust-mozhet-stat-obyazatelnoj-zavisimostyu-v-git-3-0</guid>
      <description><![CDATA[<p>Разработчики обсуждают Git 3.0: Rust может стать обязательной зависимостью, улучшая безопасность и скорость, но усложняя сборку</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rust-mozhet-stat-obyazatelnoj-zavisimostyu-v-git-3-0">Rust может стать обязательной зависимостью в Git 3.0</a>»</p>]]></description>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Sep 2025 03:42:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики Git обсуждают возможность сделать <b>язык Rust обязательной зависимостью</b> в грядущем обновлении Git 3.0.</p><p>Это означает, что для сборки системы контроля версий потребуется установленный компилятор Rust — как неотъемлемая часть инфраструктуры.</p><h2>Что происходит</h2><p>Предложение активно <a href="https://lore.kernel.org/git/20250904-b4-pks-rust-breaking-change-v1-0-3af1d25e0be9@pks.im/">обсуждается</a> в списке рассылки разработчиков Git. Идея заключается в <b>поэтапной интеграции Rust</b>, аналогично тому, как ранее был внедрен стандарт C99:</p><ul><li>На <b>тестовом этапе</b> Rust останется необязательным, но его использование будет поощряться.</li><li>Начиная с <b>Git 3.0</b>, Rust может стать <b>жесткой зависимостью</b>, необходимой для сборки проекта.</li></ul><h2>Почему Rust?</h2><p>Интеграция Rust началась в <b>Git 2.49</b> (март 2025 года), где появились первые экспериментальные компоненты:</p><ul><li>libgit-sys — низкоуровневая обвязка над внутренними C-библиотеками Git.</li><li>libgit — высокоуровневая библиотека для написания компонентов на Rust.</li></ul><p>В июле 2025 года в проект был предложен Rust-патч для утилиты <b>xdiff</b>, который, по замерам, улучшает производительность на <b>5–19%</b>. Именно тогда впервые прозвучала идея сделать Rust обязательным.</p><h2>Но не все так просто</h2><p>Мнения разработчиков Git разделились. Среди <b>основных аргументов «против»</b>:</p><ul><li><b>Ограниченная кросс-платформенность Rust</b> — не все целевые платформы Git в полной мере поддерживаются компилятором rustc.</li><li><b>Увеличение сложности сборки</b> для пользователей и дистрибутивов.</li><li>Опасения, что переход может <b>исключить «редкие» платформы</b> из числа официально поддерживаемых.</li></ul><p>Сторонники же отмечают:</p><ul><li><b>Рост производительности</b>.</li><li>Безопасность и современный инструментарий, которые дает Rust.</li><li>Возможность постепенного переписывания уязвимых и сложных компонентов Git с более надежным управлением памятью.</li></ul><h2>Что дальше</h2><p>Пока решение не принято. Но <b>вопрос об обязательной зависимости Rust будет решаться до релиза Git 3.0</b>, который может состояться в 2026 году.</p><p>Ожидается, что сначала язык будет использоваться в опциональных частях, а затем его статус пересмотрят с учетом зрелости экосистемы и совместимости.</p><p><b>Обязательная поддержка Rust в Git</b> станет важной вехой: Git всегда был проектом, ориентированным на C и минимальные внешние зависимости. Переход к Rust — это потенциальное изменение философии.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</title>
      <link>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</link>
      <comments>https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Диана Тажетдинова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu</guid>
      <description><![CDATA[<p>Поговорили с экспертом и узнали, где Web3 даёт практическую пользу разработчикам: сравниваем подходы, исследуем рынок вакансий и особенности новой реальности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-web3-menyaet-razrabotku-veb-prilozhenij--ot-serverov-k-blokchejnu">Как Web3 меняет разработку веб-приложений: от серверов к блокчейну</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[смарт-контракты]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 22 Sep 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Раньше, чтобы запустить приложение, приходилось настраивать сервер и базу данных. В Web3 всё по-другому: вместо серверов — смарт-контракты, вместо базы — блокчейн. <a href="https://www.esparkinfo.com/web3/statistics">По прогнозам</a>, объём рынка Web3‑разработки вырастет с $4,43 млрд в 2024 году до $6,15 млрд в 2025. Кейсы<a href="https://ru.wikipedia.org/wiki/Plume_Network_%E2%80%93_The_Future_of_Real-World_Assets_on_Web3_%F0%9F%8C%90?utm_source=chatgpt.com"> Plume Network</a> и<a href="https://en.wikipedia.org/wiki/The_Graph?utm_source=chatgpt.com"> The Graph</a> показывают, что Web3 уже работает в реальных продуктах. Что, если нас уже сегодня ждет backend в виде блокчейна? Давайте разберём, как меняются инструменты, архитектуры и карьерные треки.</p><h2>Главные отличия Web3 от Web2</h2><p>Перед тем как углубиться в код и практику, полезно увидеть основные различия между привычной Web2-разработкой и новой логикой Web3.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-09-22/3fa1cc2a-0755-4b71-af24-9b8a6f9d22ea.png" alt="" /></figure><p>Представим себе простой сервис для задач. В классическом Web2 его работа привычна: сервер обрабатывает запросы, база данных хранит задачи, а пользователь авторизуется через почту и пароль. Всё централизовано и зависит от владельца сервера.</p><p>В Web3 логика сильно меняется. Пользователь входит в систему с помощью криптокошелька, например, MetaMask. Каждая задача создаётся транзакцией и записывается в смарт‑контракт, а значит становится частью блокчейна. Удалить её уже нельзя — только отметить статус выполнения. Такой подход даёт прозрачность: любой участник сети может проверить, что задача действительно существует, и её статус изменён честно.</p><h2>Стек Web3: что понадобится на практике</h2><p>Чтобы построить работающий DApp, важно понимать, чем он отличается от обычного приложения. DApp — это децентрализованное приложение, в котором логика хранится в смарт-контрактах на блокчейне, а данные — в распределённых хранилищах, а не на сервере компании. Поэтому одного знания блокчейна мало: нужен полный набор инструментов — от языков и фреймворков до кошельков и сервисов подключения.</p><ul><li>Блокчейн: Ethereum, Layer‑2 (Arbitrum, Optimism, Base, Polygon), Solana.</li><li>Языки: Solidity (EVM), Rust (Solana), Go (инфраструктура и сервисы).</li><li>Библиотеки: ethers.js, wagmi.</li><li>Фреймворки: Hardhat, Foundry, Truffle.</li><li>Хранилища: IPFS/Arweave для файлов и метаданных.</li><li>Кошельки/подключение: MetaMask, WalletConnect (v2/WalletConnect Network), Web3Auth.</li></ul><blockquote>Точка входа для новичка — Alchemy, а также ethers.js.</blockquote><p><b>Пример.</b> Быстрое подключение кошелька (ethers.js).</p><h2>Архитектура DApp: из чего состоит современное Web3‑приложение</h2><p>Любое Web3‑приложение строится из нескольких слоёв, каждый со своей ролью. Фронтенд остаётся привычным SPA, но работает не с сервером, а напрямую с кошельком и смарт-контрактами. Контракты содержат бизнес‑логику и хранят ссылки на данные в децентрализованных хранилищах. Оракулы обеспечивают связь с внешним миром, например, передают цены или сообщения между разными блокчейнами. Важную часть играет off‑chain слой — сервисы вне блокчейна (индексаторы, аналитика), которые помогают быстрее искать и обрабатывать данные, при этом не перегружать сеть.</p><p><b>Пример.</b> Возьмём DeFi‑приложение. Пользователь открывает фронтенд и инициирует операцию swap(). В ответ фронтенд обращается к смарт‑контракту, который выполняет обмен токенов. Чтобы определить курс, контракт тянет актуальные данные через оракул. При этом тяжёлые артефакты, изображения или отчёты не хранятся в блокчейне напрямую — они лежат в IPFS. Сам контракт содержит только контент‑идентификаторы CID. Таким образом, получаем баланс: блокчейн отвечает за логику и безопасность, а децентрализованное хранилище — за данные.</p><h2>Практика: ваш первый DApp за вечер</h2><p>Давайте попробуем собрать простейшее приложение своими руками.</p><p><b>Шаг 0. Подготовка</b></p><p>Сначала убедитесь, что у вас стоит Node.js LTS и Git. Также нужен браузер с установленным MetaMask, где можно создать тестовый аккаунт. Чтобы оплачивать транзакции в тестовой сети, заранее возьмите немного тестовых монет через faucet — например, для Sepolia или Polygon Amoy.</p><p><b>Шаг 1. Проект</b></p><p>Создадим новый проект и установим Hardhat вместе с тулзами. Эта среда нужна для компиляции и деплоя контрактов.</p><p><b>Шаг 2. Контракт</b></p><p>В папке contracts/ создаём файл TaskTracker.sol и копируем туда код смарт-контракта из первого раздела. Это и будет бизнес-логика нашего приложения.</p><p><b>Шаг 3. Сценарий деплоя</b></p><p>Пишем скрипт, который разворачивает контракт в сети. Это простой скрипт на JavaScript, который вызывает методы Hardhat.</p><p><b>Шаг 4. Конфиг сети</b></p><p>В файле hardhat.config.js добавляем настройки для подключения к тестовой сети. Используем RPC-URL от Alchemy или Infura и приватный ключ от тестового аккаунта — его можно экспортировать из MetaMask, но использовать только для тестовой сети.</p><p><b>Шаг 5. Деплой в тестнет</b></p><p>Теперь запускаем скрипт деплоя. После выполнения увидите адрес контракта — он понадобится для фронтенда.</p><p><b>Шаг 6. Фронтенд (React + ethers.js + wagmi)</b></p><p>Собираем простое SPA: форма, чтобы добавить задачи, и кнопка «complete». Здесь мы используем ethers.js для обращения к контракту. Сделайте вызовы addTask и completeTask.</p><h2>Подводные камни Web3-разработки и что с ними делать</h2><p><b>Комиссии (gas): </b>любая запись в блокчейн стоит денег и иногда комиссия выше ценности операции — например, $10 за простую задачу.</p><ul><li>Что делать: использовать Layer-2 (Arbitrum/Optimism/Base/Polygon), выбирать сети с низкими комиссиями (Solana, Avalanche), оптимизировать контракты и батчи транзакций.</li></ul><p><b>Скорость: </b>подтверждение транзакции занимает секунды или десятки секунд, что заметно медленнее обычного сервера.</p><ul><li>Что делать: показывать «оптимистичный UI», кешировать данные, переносить часть логики off-chain, использовать быстрые сети (Solana, Near, Aptos).</li></ul><p><b>Безопасность:</b> код контракта неизменяем, и одна ошибка может стоить миллионов.</p><ul><li>Что делать: проходить аудит (CertiK, Trail of Bits), использовать проверенные библиотеки (OpenZeppelin), писать тесты в тестовых сетях (Goerli, Sepolia), внедрять баг-баунти и ролевую модель доступа.</li><li>Ресурс:<a href="https://consensys.io/diligence/smart-contract-security-best-practices/"> ConsenSys Diligence — Smart Contract Security Best Practices</a>.</li></ul><p><b>UX:</b> вход через кошелёк сложнее привычного логина/пароля. Нужно ставить расширение, пополнять баланс и подтверждать каждую транзакцию.</p><ul><li>Что делать: использовать аккаунт-абстракцию (ERC-4337), социальный логин, gasless транзакции через Paymaster, улучшать UI (подсказки, авто-фокус на MetaMask).</li></ul><p><b>Регуляция: </b>законы о Web3 пока разные в каждой стране. Легальное в одной юрисдикции может быть запрещено в другой (например, токенизация акций без лицензии).</p><ul><li>Что делать: консультироваться с юристами, следить за изменениями. Например, MiCA в ЕС — “Markets in Crypto-Assets Regulation” —  это единый регламент по криптоактивам в Евросоюзе.</li></ul><blockquote>Безопасность всегда должна быть на первом месте, потому что в Web3 есть риск потерять реальные деньги пользователей.</blockquote><h2>Карьерные возможности и перспективы</h2><p>Web3‑разработчиков уже активно ищут: <a href="https://web3.career/learn-web3/web3-intelligence-report">зарплаты в среднем предлагают выше</a>, чем у Web2‑коллег. Кроме программистов, востребованы смежные роли: аудиторы смарт‑контрактов, специалисты по безопасности, а также продакт‑менеджеры и аналитики, которые понимают специфику блокчейна.</p><p>Чтобы войти в профессию, начните с изучения Solidity и базовых паттернов смарт‑контрактов. Сделайте пару пет‑проектов и выложите код в GitHub. Отличный вариант прокачки — участвовать в хакатонах и грантовых программах от Ethereum Foundation или Solana Grants. Это даёт и опыт, и контакты, и иногда финансирование.</p><blockquote>Пара пет‑проектов + понимание блокчейна — хороший старт в Web3‑команду.</blockquote><h2>Будущее Web3</h2><p>Web3 не вытеснит Web2 полностью, но поменяет привычный подход к разработке. Разработчику это открывает новые вызовы: комиссии, безопасность и UX, но одновременно и новые возможности — прозрачные данные, токенизация, децентрализованные бизнес‑модели.</p><p>Для тех, кто только входит в сферу, это шанс попасть в индустрию на раннем этапе и быстро нарастить экспертизу. Простые пет‑проекты, хакатоны и знакомство с инструментами дают ощутимый старт.</p><p>Web3 будет развиваться параллельно с Web2, усиливая те области, где важны децентрализация, доверие и контроль за данными. Попробуйте задеплоить первый контракт — и вы сами почувствуете, что это не просто мода, а новый уровень возможностей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust как потенциальная замена Go — хайп или реальность?</title>
      <link>https://tproger.ru/articles/rust-kak-potencialnaya-zamena-go---hajp-ili-realnost-</link>
      <comments>https://tproger.ru/articles/rust-kak-potencialnaya-zamena-go---hajp-ili-realnost-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rust-kak-potencialnaya-zamena-go---hajp-ili-realnost-</guid>
      <description><![CDATA[<p>Сравнение Go и Rust в 2025 году: области применения, анализ производительности. Простота Go против надёжности Rust.  Скорость разработки, обучения программистов, развёртывание приложений.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rust-kak-potencialnaya-zamena-go---hajp-ili-realnost-">Rust как потенциальная замена Go — хайп или реальность?</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ядро Linux <a href="https://www.securitylab.ru/news/562025.php">переписывают</a> на Rust, новый драйвер NVIDIA NOVA разрабатывают на «ржавом» языке, во фронтенде появился фулстек-фреймворк <a href="https://leptos.dev/">Leptos</a>. Rust становится универсальным решением, и кажется, что заменит Golang.</p><p>Давайте разберёмся, корректно ли сравнивать эти языки, посмотрим на плюсы, минусы технологий и выясним, в каких сценариях раскрываются их сильные стороны.</p><p>Комментарии по теме предоставили: разработчики Василий Зорин, Эдуард Дыкман; автор курсов в Яндекс Практикуме Кирилл Федченко; участники сообщества <a href="https://t.me/golangl">Golang Go</a> и <a href="https://t.me/rust_chats">Rust</a>.</p><p>⚠️ <i>Мы не ищем язык-убийцу. В публикации собрали популярные мнения, чтобы помочь в принятии взвешенного решения для ваших проектов.</i></p><h2>Почему Go и Rust считают конкурентами, если они такие разные?</h2><p>Первый со сборщиком мусора больше похож на Java. Второй без сборки мусора, и напоминает продвинутый C++. Но постойте!</p><p><b>Во-первых</b>, языки появились практически одновременно. Go заявил о себе в 2009 году, Rust показали в 2010-м. «Современный язык для разработки быстрых и безопасных приложений», — так говорили про Go, так говорили про Rust.</p><p><b>Во-вторых</b>, несмотря на разные подходы к управлению памятью, оба языка метят в одну и ту же аудиторию. К ним приходят разработчики, которым нужно быстрее Python, но безопаснее C++.</p><p><b>В-третьих</b>, на этих языках пишут схожие типы приложений: веб-серверы, микросервисы, CLI-инструменты и системное ПО. Например, на Go написаны Docker и Kubernetes, а на Rust — Firecracker (AWS), движок Servo, <a href="https://github.com/vectordotdev/vector/">Vector</a>.</p><blockquote>Оба языка конкурируют в backend-разработке, облачных вычислениях и инструментах DevOps, где ключевыми являются масштабируемость и параллелизм. Например, в области:<br /><br />— микросервисов: оба языка используются для создания распределенных систем, при этом функции безопасности Rust могут быть предпочтительнее для критически важных компонентов; <br />— сетевого взаимодействия: такие инструменты, как gRPC или HTTP-серверы, реализованы в обоих языках;<br />— облачной инфраструктуры: компании используют Go из-за его простоты, а Rust для компонентов, критически важных для производительности.<br /><br />Rust лучше подходит для системного программирования (компиляторы, драйверы, ОС), в то время как Go более распространен в крупномасштабных сервисах высокой доступности, где приоритетна быстрая разработка.</blockquote><h2>Простота сейчас или надёжность потом?</h2><p>Go следует принципу «<b>простота превыше всего</b>»: минимум синтаксического сахара, встроенная поддержка горутин, автоматическая сборка мусора.</p><blockquote>Наши программисты — гуглеры, а не исследователи. Они не способны понять гениальный язык, но мы хотим, чтобы они создавали хорошее ПО. Поэтому язык, который мы им даём, должен быть простым для понимания и лёгким для освоения.</blockquote><blockquote>Иногда Golang называют дубовым языком, и считают это преимуществом. Вообще вопросов к нему много: можно рассуждать о проблемах обработки ошибок, об отсутствии тернарников, энумов и т. д.</blockquote><p>У Rust другая философия — «<b>лучше потратить время на борьбу с компилятором сейчас, чем часы на отладку багов потом</b>».</p><p>Система типов и borrow checker заставляют контролировать жизненный цикл данных, помнить про безопасность потоков и обработку ошибок ещё до запуска программы. Компилятор не позволит собрать код с потенциальными проблемами.</p><blockquote>Я ценю Rust за баланс производительности и низкоуровневого контроля с гарантиями безопасности языков высокого уровня. Модель владения исключает ошибки, такие как гонки данных и разыменование нулевых указателей, что повышает надежность сложных систем и сокращает время отладки. Бесплатные абстракции языка позволяют писать высокоуровневый код, который компилируется в эффективный машинный, без потерь в выразительности. Инструментарий Cargo значительно упрощает управление зависимостями, тестирование и сборку. А растущая экосистема и поддержка сообщества означают, что для большинства задач уже есть проверенные библиотеки и фреймворки.</blockquote><blockquote>Что привлекает в Rust — это инструментарий и экосистема. Язык развивается предсказуемо: стабильные обновления выходят по календарю, есть понятная схема nightly → beta → stable.<br /><br />Из минусов — интеграция с другими языками требует дополнительных усилий по настройке FFI, но решения для этого есть (#[repr(C)]). Возникают вопросы к архитектуре: например, async/await добавили раньше, чем проработали корутины, и теперь приходится подгонять одно под другое не самыми элегантными методами. Ещё Rust компилируется заметно дольше других языков.<br /></blockquote><h2>Сколько нужно времени на обучение Rust и Go?</h2><p>Golang с нуля можно освоить за 2-4 недели. <a href="https://go.dev/doc/">Документация Go</a> содержит исчерпывающую информацию о синтаксисе, стандартной библиотеке и концепциях программирования. Больше всего времени потребуется на изучение горутин, каналов, системы интерфейсов.</p><p><a href="https://doc.rust-lang.ru/book/title-page.html">Документация Rust</a> не менее подробная. Синтаксис языка сложнее. Обучение затягивается из-за уникальной системы владения памятью (ownership) и концепции времени жизни (lifetimes). Ещё нужно время на принятие borrow checker, когда кажется, что компилятор специально мешает писать код.<a href="https://doc.rust-lang.ru/book/title-page.html"></a></p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-08-29/0f30d904-b26c-4d80-96d4-3f71ad85e109.jpg" alt="Borrow checker" /></figure><blockquote>Borrow checker — лучший друг программиста, он следит за соблюдением модели владения. Основное правило гласит, что в любой момент времени на переменную может ссылаться либо одна мутабельная ссылка (с правом записи), либо сколько угодно иммутабельных (только чтение). Это нужно соблюдать в любом языке, который поддерживает многопоточность. В Golang, например, с data races приходится бороться своими силами. Также borrow checker убеждается в отсутствии «висячих» указателей (когда ссылка живёт дольше, чем данные).</blockquote><blockquote>Входной порог может быть высоким: освоить владение и заимствование, особенности синтаксиса и обработки ошибок бывает непросто не только новичкам, но и опытным разработчикам. Существуют курсы, помогающие плавно перенастроить профессиональный стек под другой язык, например, «Rust для действующих разработчиков» в Яндекс Практикуме помогает быстро перейти к практике.</blockquote><h3>Вы знали, что код на Rust в 2,6 раза проще кода на Go?</h3><p>В июне 2025 года TIOBE <a href="https://www.tiobe.com/knowledge/article/which-programming-language-produces-the-most-complex-code/">проанализировало</a> 1,5 миллиарда строк кода, измеряли сложность программ на разных ЯП. Считали количество путей выполнения в функциях — чем меньше число, тем проще код для понимания и поддержки.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2025-08-29/c595d6d4-5076-42bd-ad01-4c0eff204f6e.jpg" alt="Исследование TIOBE" /><figcaption>Rust показал лучший результат — 1.32 балла. Go набрал больше — 3.39.</figcaption></figure><p>Как получилось, что Golang в 2,6 раза сложнее Rust?</p><p>Простота синтаксиса не всегда означает простоту итогового кода. В Go обрабатывают ошибки через if-конструкции, из-за этого в гошной программе больше дополнительных веток — это и повлияло на результаты исследования.</p><p>Синтаксис Go минималистичнее и проще для новичков, но код получается более разветвлённым. На Rust пишут программы с меньшим количеством путей выполнения, поэтому кажется, что код проще для понимания и поддержки.</p><blockquote>Большое преимущество Go — это низкий порог входа (25 ключевых слов против 70 в Rust). Стандартная библиотека довольно небольшая, но в ней есть практически всё. По моему опыту, в средней кодовой базе на Golang разобраться больше шансов, чем в Rust.</blockquote><h2>Когда Rust работает быстрее Go, и где это используют?</h2><p>Представим интернет-магазин: пользователь заходит на страницу товара, сервер идёт в базу данных и отдаёт JSON. В таких случаях Go и Rust работают примерно одинаково быстро — узкое место в скорости ответов БД.</p><p>Теперь вы обрабатываете видео в реальном времени или анализируете миллионы финансовых транзакций. В этом случае предпочтительнее Rust, и вот почему.</p><p>В Go сборщик мусора может внезапно остановить программу на несколько миллисекунд — «подожди, я тут память чищу». В видеостриме это означает подвисание картинки, в торговых алгоритмах — потерю денег. <b>Rust работает без неожиданных пауз, потому что вы сами управляете памятью</b>.</p><blockquote>В Golang накапливается «мусор», который в какой-то момент будет обработан сборщиком, что по времени может совпасть с внешней полезной нагрузкой и ухудшить время отклика сервера.<br /><br />В Rust память удаляется автоматически, как только её владелец выходит из области видимости. Так что любые приложения, в которых важным аспектом производительности является управление памятью, могут выиграть за счёт использования Rust (БД, ОС, браузеры, видеоигры).<br /></blockquote><blockquote>Rust приносит реальную пользу в продакшене там, где простои и уязвимости стоят дорого:<br /><br />— встроенные системы (устройства IoT, ПО для автомобилей) — безопасность и эффективность Rust снижают вероятность сбоев оборудования, от которого зависят жизни людей.<br />— финансовые услуги — высокочастотные торговые платформы, использующие Rust, могут обрабатывать транзакции быстрее и с меньшим количеством ошибок, что повышает конкурентоспособность.<br />— облачная инфраструктура — высокая производительность и минимализм Rust в области сетевого взаимодействия и параллелизма (например, в Tokio) позволяют снизить затраты на сервер, что напрямую влияет на размер прибыли</blockquote><h3>Параллельная обработка</h3><p>Допустим, вам нужно скачать 3000 файлов. В Go можно написать цикл с горутинами — синтаксис интуитивно понятный, и базовый вариант заработает без глубокого изучения теории.</p><p>В случае с Rust придётся почитать про async/await, разобраться с библиотекой Tokio, понять разницу между async fn и обычными функциями. Зато получите полный контроль над тем, как именно выполняется код.</p><h3>Потребление ресурсов</h3><p>Go жирнее по памяти. Каждая горутина занимает от 2 КБ, плюс сборщик мусора держит в памяти объекты про запас. Для веб-сервиса не критично, для встраиваемых систем может стать проблемой.</p><p>Rust экономнее — вы платите только за то, что реально используете. Программу на Rust можно запустить на микроконтроллере с 32 КБ памяти. Go туда не поместится.</p><h2>В чём разница между развертыванием Go и Rust приложений?</h2><p>Оба языка компилируются в один исполняемый файл — просто скопировали на сервер и запустили. Docker-образы получаются крошечными, особенно у Rust (можно упаковать в scratch-образ размером несколько мегабайт). Go чуть проще интегрируется с существующей инфраструктурой.</p><blockquote>На мой взгляд, разница минимальна. Оба языка отлично собираются в машинный код для любых платформ. В Go это проще, можно просто указать компилятору нужную платформу. В Rust есть тулзы для кроссплатформенной сборки. Также в Rust сложнее собирать код, который использует FFI.</blockquote><h2>В каких сферах Go и Rust делят рынок программирования?</h2><h3>Go</h3><ul><li>Идеален для микросервисов и REST API. Фреймворки Gin и Echo помогают быстро собрать рабочий сервис — например, для регистрации пользователей или каталога товаров.</li><li>Docker, Kubernetes, Terraform — все написаны на Go. Язык используют для консольных приложений: получается один файл, который запускается везде без дополнительных зависимостей.</li><li>В больших командах с частой сменой разработчиков Go встречается чаще. Простой синтаксис означает, что новые разработчики быстрее разбираются в коде проекта.</li></ul><h3>Rust</h3><ul><li>Операционные системы, драйверы — области, где Rust конкурирует с C++. Язык предлагает сопоставимую производительность, но защищает от ошибок с памятью.</li><li>Rust компилируется в эффективный <a href="https://tproger.ru/articles/pochemu-webassembly-vsyo-eshhyo-ne-pereplyunul-js-i-ts">WebAssembly</a> для запуска вычислений в браузере. Используется в играх, обработке изображений, криптографии.</li><li>Ripgrep (аналог grep) и exa (аналог ls) демонстрируют возможности Rust — они работают быстрее классических Unix-утилит.<br /></li></ul><blockquote>Rust лучше подходит для системного программирования (компиляторы, драйверы, ОС), в то время как Go более распространен в крупномасштабных сервисах высокой доступности, где приоритетна быстрая разработка</blockquote><h2>Стоит ли изучать Rust, если более простой Go справляется с большинством задач?</h2><p>Всё зависит от ваших целей. Кирилл Федченко отмечает:</p><p>— Go подходит для быстрой разработки микросервисов, API, облачных инструментов благодаря простоте, масштабируемости и легковесному параллелизму.</p><p>— Rust стоит изучить, если вам нужен максимальный контроль над производительностью, безопасностью или низкоуровневыми сущностями (операционные системы, встраиваемые системы). Если ваша цель — создание высокопроизводительных, критически важных систем, то инвестиция времени в изучение Rust один из эффективных способов.</p><p>Go часто достаточно для решения задач, но более широкое применение и растущий спрос на Rust делают его ценным навыком для карьеры. Уже восемь лет подряд язык <a href="https://insights.stackoverflow.com/survey/">признается</a> лучшим в опросе Stack Overflow, а его сообщество <a href="https://www.slashdata.co/post/state-of-the-developer-nation-23rd-edition-the-fall-of-web-frameworks-coding-languages-blockchain">растет</a> быстрее, чем у других языков. Именно поэтому многие переучиваются на Rust с Go, C++ или Python, особенно при переходе в системное программирование или области, где безопасность имеет ключевое значение.</p><h2>Почему Rust не вытеснит Go, несмотря на все преимущества?</h2><p>Rust не заменит язык Go, потому что последний хорошо решает свои задачи.</p><blockquote>Golang и Rust используют для разных целей. Сценариев применения Rust меньше, чем для Go. Поэтому Golang популярнее, но это не замена Rust.</blockquote><blockquote>Оба языка далеки от идеала для написания бизнес-логики, она теряется за синтаксическими конструкциями. В зависимости от области, для бизнес-логики я бы предложил рассмотреть typescript, java/kotlin, elixir, clojure.</blockquote><p><i>Комментарии открыты: в каких проектах вы наблюдали, как неправильный выбор языка негативно отразился на продукте?</i></p>]]></content:encoded>
    </item>
    <item>
      <title>На GitHub выложили исходный код алгоритма рекомендаций X. Разобрались, что там внутри</title>
      <link>https://tproger.ru/news/--na-github-vylozhili-ishodnyj-kod-algoritma-rekomendacij-x--razobralis--chto-tam-vnutri</link>
      <comments>https://tproger.ru/news/--na-github-vylozhili-ishodnyj-kod-algoritma-rekomendacij-x--razobralis--chto-tam-vnutri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--na-github-vylozhili-ishodnyj-kod-algoritma-rekomendacij-x--razobralis--chto-tam-vnutri</guid>
      <description><![CDATA[<p>X выложила на GitHub исходный код алгоритма рекомендаций. Внутри — Scala, Java, Rust и ML-модели для ранжирования твитов, поиска и уведомлений</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--na-github-vylozhili-ishodnyj-kod-algoritma-rekomendacij-x--razobralis--chto-tam-vnutri">На GitHub выложили исходный код алгоритма рекомендаций X. Разобрались, что там внутри</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Sep 2025 08:38:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания X (экс-Twitter) опубликовала исходники алгоритма, отвечающего за рекомендации в ленте «Для вас», поиске и уведомлениях.</p><p>Репозиторий уже <a href="https://github.com/twitter/the-algorithm">собрал</a> почти 65 000 звезд на GitHub. Разбираемся, как он устроен и какие интересные модули лежат внутри.</p><h2>Что делает этот алгоритм</h2><p>Алгоритм отвечает за то, какие посты и аккаунты вы видите на всех основных страницах в X: от рекомендаций и трендов до пушей. Внутри — десятки сервисов и моделей, взаимодействующих между собой.</p><p>Например, компонент home-mixer собирает кандидатные твиты из разных источников (например, через search-index, tweet-mixer, user-tweet-entity-graph) и ранжирует их при помощи легкой и тяжелой нейросети (light-ranker, heavy-ranker).</p><p>После этого подключаются фильтры (например, visibility-filters), которые убирают нежелательный контент и скрытые посты.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-09-10/ccd962a9-c580-4418-990f-737091a615d3.jpeg" alt="" /></figure><h2>Из чего это все собрано</h2><p>Проект построен на Scala (66%), Java (20%) и Rust. Некоторые модули используют Python и даже TensorFlow v1 (например, twml). Базовые компоненты включают:</p><ul><li>Данные — tweepypie, unified-user-actions, user-signal-service</li><li>Модели — SimClusters, TwHIN, real-graph, tweepcred, trust-and-safety-models</li><li>Фреймворки — navi (на Rust), product-mixer, representation-scorer, representation-manager</li></ul><p>Также присутствуют специфические компоненты для пушей — сервис pushservice, ранжирующие модели pushservice-light-ranker и pushservice-heavy-ranker, предсказывающие, откроет ли пользователь уведомление.</p><h2>Почему это важно</h2><p>Во-первых, X остается одной из крупнейших социальных платформ в мире, и понимание ее алгоритмов дает представление о принципах ранжирования и фильтрации контента.</p><p>Во-вторых, открытый код — это редкость в мире коммерческих рекомендаций, особенно на таком масштабе.</p><p>Разработчики предлагают сообществу вносить улучшения через пул-реквесты, участвовать в программах по поиску уязвимостей и разрабатывать на базе кода собственные сервисы.</p><h2>Что это значит для разработчиков</h2><p>Этот проект — хорошее поле для изучения реального промышленного машинного обучения. Особенно интересны:</p><ul><li>плотные графовые эмбеддинги в TwHIN</li><li>модели репутации и социальной близости в real-graph и tweepcred</li><li>многозадачные модели в pushservice-heavy-ranker</li></ul><p>Проект можно собрать с помощью Bazel, хотя полноценной инфраструктуры для тестов пока нет.</p>]]></content:encoded>
    </item>
    <item>
      <title>xAI представила grok-code-fast-1 — свою первую ИИ-модель для кодинга и агентных задач</title>
      <link>https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach</link>
      <comments>https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach</guid>
      <description><![CDATA[<p>xAI выпустила grok-code-fast-1 — первую модель для кодинга и агентных задач. Она поддерживает TypeScript, Python, Java, Rust, C++ и Go, интегрирована в IDE и CLI, работает быстро (до 160 ток/с) и стоит дешевле конкурентов</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--xai-predstavila-grok-code-fast-1---svoyu-pervuyu-ii-model-dlya-kodinga-i-agentnyh-zadach">xAI представила grok-code-fast-1 — свою первую ИИ-модель для кодинга и агентных задач</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Aug 2025 11:10:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания xAI <a href="https://x.ai/news/grok-code-fast-1">анонсировала</a> <b>grok-code-fast-1</b>. Это первая модель компании, ориентированная на программирование и агентные сценарии.</p><p>Модель создана с нуля, обучена на реальных пулл-реквестах и задачах из практики. Она уже доступна в IDE.</p><h2>Новая глава в «вайб-кодинге»</h2><p>Модель grok-code-fast-1 от xAI позиционируется как конкурент решениям от OpenAI, Google и Anthropic. Она оптимизирована для разработки на <b>TypeScript</b>, <b>Python</b>, <b>Java</b>, <b>Rust</b>, <b>C++</b> и <b>Go</b>, а значит покрывает большинство реальных кейсов в современной разработке.</p><p>Модель уже интегрирована в <i>IDE</i> и <i>CLI</i> вроде <b>GitHub Copilot</b>, <b>Cursor</b>, <b>Cline</b>, <b>Roo Code</b>, <b>Kilo Code</b>, <b>OpenCode</b> и <b>Windsurf</b>. В ближайшее (но ограниченное) время она будет доступна бесплатно.</p><h2>Быстрая, дешевая и довольно-таки умная</h2><p>xAI делает ставку на цену, скорость и удобство. Стоимость использования grok-code-fast-1:</p><ul><li><b>$0,20</b> за 1 млн входных токенов</li><li><b>$1,50</b> за 1 млн выходных токенов</li><li><b>$0,02</b> за 1 млн кэшированных входных токенов</li></ul><p>Во внутреннем бенчмарке <b>SWE-Bench-Verified,</b> модель показала результат <b>70,8%</b>, но независимых тестов пока нет — их ждут в ближайшие недели.</p><p>В xAI утверждают, что при создании модели основное внимание уделялось <b>практическому использованию и удобству в реальных задачах</b>. Якобы разработчики оценили grok-code-fast-1 как «быструю и надежную» при повседневной работе с кодом.</p><figure><img src="https://media.tproger.ru/user-uploads/111041/2025-08-29/0ff28520-4f6d-495d-bb2e-78175b8e78f2.jpeg" alt="" /></figure><h2>До 160 токенов в секунду и 90% кэш-хитов</h2><p>Команды xAI по инференсу и суперкомпьютингу применили ряд новых приемов, чтобы <b>ускорить генерацию до 160 токенов в секунду</b>. Особенно это ощущается в IDE, где задержка — критический параметр.</p><p>Кроме того, реализовано <b>кэширование подсказок</b>, которое обеспечивает <b>до 90% попаданий</b> при работе с GitHub Copilot и другими интеграциями. Это позволяет существенно сократить задержки и стоимость использования.</p>]]></content:encoded>
    </item>
    <item>
      <title>Классический sudo уходит в прошлое — Ubuntu переходит на sudo-rs, написанный на Rust</title>
      <link>https://tproger.ru/news/klassicheskij-sudo-uhodit-v-prowloe---ubuntu-perehodit-na-sudo-rs--napisannyj-na-rust</link>
      <comments>https://tproger.ru/news/klassicheskij-sudo-uhodit-v-prowloe---ubuntu-perehodit-na-sudo-rs--napisannyj-na-rust?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/klassicheskij-sudo-uhodit-v-prowloe---ubuntu-perehodit-na-sudo-rs--napisannyj-na-rust</guid>
      <description><![CDATA[<p>Ubuntu заменяет классическое sudo на sudo-rs, переписанный на Rust: больше безопасности, меньше уязвимостей и шаг к будущим LTS-релизам</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/klassicheskij-sudo-uhodit-v-prowloe---ubuntu-perehodit-na-sudo-rs--napisannyj-na-rust">Классический sudo уходит в прошлое — Ubuntu переходит на sudo-rs, написанный на Rust</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Системное администрирование]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Aug 2025 03:13:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ubuntu продолжает курс на системную безопасность и запустила замену одного из ключевых компонентов. Так, в экспериментальных сборках будущей <b>Ubuntu 25.10</b> по умолчанию <a href="https://discourse.ubuntu.com/t/sudo-rs-is-now-default-for-questing-quokka/66912">используется</a> sudo-rs — переписанный на Rust аналог классической утилиты sudo.</p><p>Это решение стало частью инициативы по переходу на более безопасные и надежные реализации базовых утилит, избавленных от типичных ошибок C-кода: выходов за границы буфера, обращения к освобожденной памяти и других уязвимостей.</p><h2>Что такое sudo-rs и зачем он нужен</h2><p>Проект<a href="https://github.com/sudo-rs/sudo-rs"> sudo-rs</a> развивается с прицелом на полную совместимость с оригинальной sudo, но при этом написан на языке <b>Rust</b>, который предлагает строгую модель управления памятью и безопасную систему типов.</p><p>Canonical (разработчик Ubuntu) официально утвердила переход на sudo-rs еще в мае 2025 года, однако полноценная замена началась только сейчас — с появлением всех необходимых функций:</p><ul><li>поддержка старых версий <b>ядра Linux (до 5.9)</b>;</li><li>поддержка <b>NOEXEC</b> и <b>AppArmor</b>;</li><li>исправления ошибок стабильности;</li><li>переход sudo-rs в основной репозиторий (main) после аудита.</li></ul><h2>Что с обычным sudo?</h2><p>Классическое sudo все еще доступно в системе. При желании его можно вернуть командой:</p><p>Однако в <b>Ubuntu 26.10</b> разработчики планируют полностью убрать классическую версию из основного репозитория и оставить только sudo-rs.</p><h2>Что дальше?</h2><p>Также обсуждается замена команды su на аналогичную реализацию на Rust — su-rs. Пока что /usr/bin/su остается классическим, но эксперименты с альтернативой уже запланированы.</p><p>Ubuntu — не первая система, переходящая на Rust-реализации базовых компонентов. Ранее аналогичный тренд задали:</p><ul><li><b>Fedora</b>, где тестируется systemd-модуль на Rust;</li><li><b>System76 Pop!_OS</b>, где часть пользовательских инструментов уже пишется на Rust;</li><li><b>Redox OS</b>, операционная система на Rust с нуля.</li></ul><h2>Почему это важно</h2><p>Реализация sudo на Rust — не просто «модное» переписывание. Это шаг к устранению целого класса уязвимостей, которые десятилетиями преследуют Linux-инфраструктуру.</p><p>Утилиты вроде sudo, su и passwd обрабатывают привилегии и пользовательский ввод, а значит — являются первоочередными целями для атак.</p><p>Использование Rust в таких утилитах позволяет:</p><ul><li>Исключить целые классы уязвимостей на этапе компиляции.</li><li>Повысить надежность и читаемость системного кода.</li><li>Упростить последующий аудит и сопровождение.</li></ul><p>Если не случится критических багов, sudo-rs появится в <b>LTS-релизе Ubuntu 26.04</b> по умолчанию и навсегда.</p>]]></content:encoded>
    </item>
    <item>
      <title>В ИИ-редакторе кода Zed от создателей Atom появится собственная замена Git</title>
      <link>https://tproger.ru/news/ii-redaktor-koda-zed-ot-sozdatelej-atom-poluchil--35-mln-investicij</link>
      <comments>https://tproger.ru/news/ii-redaktor-koda-zed-ot-sozdatelej-atom-poluchil--35-mln-investicij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ii-redaktor-koda-zed-ot-sozdatelej-atom-poluchil--35-mln-investicij</guid>
      <description><![CDATA[<p>Создатели Atom и Electron привлекли $35 млн для развития Zed — ИИ-редактора кода с реальным временем и новой системой версионности DeltaDB</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ii-redaktor-koda-zed-ot-sozdatelej-atom-poluchil--35-mln-investicij">В ИИ-редакторе кода Zed от создателей Atom появится собственная замена Git</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 22 Aug 2025 04:16:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда бывших разработчиков Atom, Electron и Tree-sitter получила $35 млн инвестиций на развитие Zed — нового открытого редактора кода с фокусом на ИИ и совместной работе в реальном времени.</p><p>Раунд возглавил венчурный фонд Sequoia Capital. С учетом предыдущих вложений, общая сумма финансирования проекта превысила $42 млн.</p><p>Проект возглавляет Натан Собо — создатель Atom, который в свое время стал архитектурной основой для VS Code.</p><p>Новые инвестиции позволят команде выйти за рамки построения UI и приступить к реализации глубокой интеграции ИИ в рабочий процесс разработки, а также представить собственную систему управления версионностью под названием DeltaDB.</p><h2>Что такое DeltaDB</h2><p>DeltaDB — это система, которая позволяет отслеживать изменения в коде с точностью до каждой операции редактирования.</p><p>В отличие от Git, который фиксирует состояние проекта по коммитам, DeltaDB формирует непрерывную временную шкалу изменений, в которую можно «вклиниваться» в любой момент — для обсуждения, анализа или интеграции.</p><p>Ключевое отличие — обсуждение изменений в реальном времени. Комментарии можно оставлять не к коммитам или diff’ам, а к конкретным правкам, строчкам, перемещениям или удалению кода. Это создает новое пространство для командной работы: обсуждение становится постоянным фоном, а не разрозненными ветками ревью.</p><p>DeltaDB спроектирована как надстройка над Git — она не отменяет git-репозиториев, а расширяет их возможностями детального отслеживания и сотрудничества в реальном времени.</p><h2>Работа с ИИ — в том же контексте</h2><p>Разработчики делают акцент на том, что обсуждения в Zed охватывают не только взаимодействие между людьми, но и с ИИ-моделями. Это означает, что подсказки от ИИ можно будет сохранять, обсуждать и возвращаться к ним в контексте правок, а не просто как ответы на запросы в отдельном чате.</p><h2>Что еще важно</h2><ul><li>Zed написан на Rust.</li><li>Редактор доступен с открытым исходным кодом. Сам редактор — под GPLv3, серверная часть для многопользовательского редактирования — под AGPLv3, интерфейсная библиотека GPUI — под Apache 2.0.</li><li>GPUI использует GPU для отрисовки интерфейса, что обеспечивает высокую отзывчивость и плавную работу редактора.</li></ul><h2>Zedless: альтернатива для тех, кто хочет полной автономности</h2><p>На базе Zed развивается форк Zedless, ориентированный на пользователей, которым критична конфиденциальность.</p><p>Удалены компоненты, отправляющие телеметрию, отключены внешние сервисы, все сетевые функции можно полностью контролировать. Участие в разработке возможно без подписания CLA и передачи имущественных прав на код.</p>]]></content:encoded>
    </item>
    <item>
      <title>В NGINX появилась встроенная поддержка ACME — теперь HTTPS настраивается без Certbot и лишних утилит</title>
      <link>https://tproger.ru/news/v-nginx-poyavilas-vstroennaya-podderzhka-acme---teper-https-nastraivaetsya-bez-certbot-i-liwnih-utilit</link>
      <comments>https://tproger.ru/news/v-nginx-poyavilas-vstroennaya-podderzhka-acme---teper-https-nastraivaetsya-bez-certbot-i-liwnih-utilit?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-nginx-poyavilas-vstroennaya-podderzhka-acme---teper-https-nastraivaetsya-bez-certbot-i-liwnih-utilit</guid>
      <description><![CDATA[<p>NGINX получил встроенную поддержку ACME, позволяющую автоматически выпускать и обновлять HTTPS-сертификаты без сторонних утилит</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-nginx-poyavilas-vstroennaya-podderzhka-acme---teper-https-nastraivaetsya-bez-certbot-i-liwnih-utilit">В NGINX появилась встроенная поддержка ACME — теперь HTTPS настраивается без Certbot и лишних утилит</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 15 Aug 2025 10:56:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда NGINX <a href="https://blog.nginx.org/blog/native-support-for-acme-protocol">представила</a> превью-версию встроенной поддержки протокола ACME через новый модуль <b>ngx_http_acme_module</b>.</p><p>Теперь SSL/TLS-сертификаты можно запрашивать, устанавливать и обновлять напрямую в конфигурации NGINX — без внешних инструментов вроде Certbot.</p><p>Модуль реализован на Rust с использованием NGINX-Rust SDK и доступен как для пользователей NGINX Open Source, так и для клиентов NGINX Plus через F5.</p><h2>Что такое ACME и зачем он нужен</h2><p>ACME (Automated Certificate Management Environment) — протокол, изначально созданный ISRG в рамках Let’s Encrypt для автоматизации получения и продления SSL/TLS-сертификатов.</p><p>Он избавляет от ручных операций, сокращает риск ошибок и снижает затраты на поддержку HTTPS.</p><p>Версия <b>ACMEv2</b> поддерживает дополнительные методы проверки, включая wildcard-сертификаты.</p><h2>Как это работает в NGINX</h2><p>Встроенный ACME в NGINX позволяет:</p><ol><li><b>Настроить ACME-issuer</b> (например, Let’s Encrypt) через директиву acme_issuer.</li><li><b>Выделить общую память</b> (acme_shared_zone) для хранения ключей, сертификатов и данных challenge.</li><li><b>Обрабатывать HTTP-01 challenge</b> — требуется <i>listener</i> на порту <i>:80</i> для подтверждения владения доменом.</li><li><b>Автоматически выпускать и продлевать сертификаты</b> с помощью директивы acme_certificate в блоке server, используя переменные $acme_certificate и $acme_certificate_key для подключения в ssl_certificate и ssl_certificate_key.</li></ol><p>На старте поддерживается только HTTP-01, в будущем обещаны TLS-ALPN и DNS-01. Wildcard-домены и regex в server_name пока недоступны.</p><h2>В чем важность нововведения</h2><p>Интеграция ACME напрямую в NGINX:</p><ul><li>Убирает зависимость от внешних CLI-утилит, повышая безопасность и уменьшая поверхность атаки.</li><li>Исключает платформенные ограничения сторонних инструментов.</li><li>Упрощает DevOps-процессы, снижает количество ручных операций и риск ошибок.</li></ul><p>С ростом HTTPS и IoT-устройств, автоматизация управления сертификатами становится базовым требованием и нативная поддержка ACME в NGINX делает этот процесс проще и надёжнее.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как 5-минутная привычка спасает разработчиков от выгорания</title>
      <link>https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya</link>
      <comments>https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya</guid>
      <description><![CDATA[<p>Что делать, если хочется бросить программирование? Разбираем, как выгорание подкрадывается к разработчикам, почему одна 5-минутная привычка может вернуть интерес к коду и почему не надо гнаться за продуктивностью, чтобы остаться в профессии.
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-5-minutnaya-privychka-spasaet-razrabotchikov-ot-vygoraniya">Как 5-минутная привычка спасает разработчиков от выгорания</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Пет-проект]]></category>
      <category><![CDATA[Notion]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Aug 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Выгорание в ИТ — не редкость. Оно подкрадывается незаметно: пет-проекты забрасываются, открывать редактор кода по выходным становится тяжело, даже чтение о новых технологиях вызывает усталость. В какой-то момент программирование, которое когда-то приносило радость, превращается в рутину. Для многих разработчиков это становится точкой, где проще уйти, чем продолжать.</p><p>Но что, если вместо ухода попробовать минимальное действие? Пятиминутная ежедневная привычка может стать спасением, вернув интерес к профессии без радикальных перемен. Поговорим о том, как выгорание захватывает разработчиков, почему бросить кажется легче, чем исправить, и как одна простая практика помогает восстановить связь с программированием.</p><p><i>P.s. Это <a href="https://medium.com/devlink-tips/burned-out-done-ready-to-quit-coding-but-a-5-minute-habit-changed-everything-a9fc77ab1a7b">перевод</a> зарубежной статьи. Предлагаем подискутировать о вопросе в комментариях.</i></p><h2>Как выгорание подкрадывается к разработчикам</h2><p>Через несколько месяцев после того, как вы почувствуете усталость, console.log() начнет казаться непосильной задачей, а баг, который обычно исправлялся за час, ломает изнутри.</p><p>Так выгорание медленно вытесняет любопытство апатией. Разработчик уже не испытывает злости, он просто устает. Становится проще уйти, чем продолжать.</p><p>И статистика это подтверждает: по данным Stack Overflow, 32% разработчиков несчастны на работе, а еще 47% выживают на автомате, не чувствуя вовлеченности. Это значит, что почти 80% специалистов находятся в зоне риска эмоционального выгорания, хотя снаружи всё выглядит стабильно.</p><p>Даже автоматическая генерация кода с помощью ИИ не помогает вернуть интерес: код продолжает работать, но человек — нет. В какой-то момент уход из профессии начинает казаться логичным выходом.</p><p>Но есть и другой путь. Иногда достаточно вернуть в день всего пять минут программирования без давления и ожиданий, чтобы постепенно вернуть ритм и интерес к работе. Маленькая привычка становится якорем, который помогает вспомнить, зачем всё это начиналось, и даёт пространство для восстановления.</p><h2>Пятиминутная привычка, которая меняет всё</h2><p>Чтобы преодолеть выгорание, не нужно переворачивать жизнь с ног на голову. Достаточно одной маленькой привычки — пяти минут в день, посвященных программированию без давления и ожиданий. Это может быть что угодно: написание нескольких строк кода, разбор простого алгоритма или чтение документации. Главное — последовательность.</p><p>Формула успеха звучит так: <b>Минимальные усилия → Последовательность → Идентичность → Восстановление связи</b>. Начав с малого, можно постепенно вернуть уверенность и интерес к профессии.</p><p><b>Как работает эта практика:</b></p><ol><li>Выберите простое действие: например, написать одну функцию или изучить один метод в документации.</li><li>Установите таймер на 5 минут: это снижает порог входа и делает задачу необременительной.</li><li>Делайте это каждый день: даже если результат минимален, регулярность формирует привычку.</li><li>Не ждите вдохновения: действие само по себе создает мотивацию.</li></ol><p>Микро-привычки эффективны, потому что опираются на принцип «атомарных изменений», описанный Джеймсом Клиром в книге «Атомные привычки». Маленькие действия требуют минимальной энергии, но со временем накапливаются, формируя новую идентичность. Для разработчика это означает переход от «я устал от кода» к «я человек, который каждый день делает шаг в программировании».</p><p>Исследования показывают, что регулярные небольшие усилия укрепляют нейронные связи, связанные с выполнением задачи, и снижают сопротивление к действию. Это особенно важно при выгорании, когда даже открытие редактора кода кажется неподъемным.</p><h2>Как вернуться к программированию и не выгореть снова</h2><p>Если хочется вернуться к программированию без риска снова выгореть, помогут простые принципы:</p><p><b>Опустите планку — и опустите её ещё раз. </b>Если на старт уходит больше минуты, задача слишком сложная.</p><p><b>Не отслеживайте результат.</b> Никаких счётчиков строк, коммитов и диаграмм продуктивности. Задача — восстановить доверие к себе, а не нарастить темп.</p><p><b>Избавьтесь от чувства вины</b>. Пропустили день? Не страшно. Один пропуск не должен превращаться в цикл стыда. Выход из выгорания — не марафон продуктивности.</p><p><b>Не ставьте цели слишком рано.</b> Позвольте любопытству проявиться. Работайте над чем-то странным или бесполезным. Там чаще всего и прячется вся соль.</p><p><b>Празднуйте даже маленький прогресс.</b> Открыли редактор — уже успех. Написали одну строку — отлично. Задача не в том, чтобы действовать как машина, а в том, чтобы снова почувствовать себя разработчиком.</p><h3>Инструменты и ресурсы для тех, кто выгорел и не знает, что с этим делать</h3><ul><li>Книги: «Атомные привычки» Джеймса Клира для понимания силы маленьких шагов.</li><li>Курсы: платформы вроде Codecademy или freeCodeCamp для легкого возвращения к основам.</li><li>Сообщества: нишевые Discord-серверы (например, по Python или Rust) или Reddit (r/learnprogramming).</li><li>Трекеры привычек: приложения вроде Habitica для отслеживания прогресса.</li></ul><h2>Вместо итогов</h2><p>Если однажды показалось, что с программированием покончено, и появилось желание уйти, важно помнить: вы не одиноки.</p><p>Многие разработчики знают, каково это — смотреть на редактор и не чувствовать ничего. И знают, сколько смелости требует простой шаг: попробовать снова.</p><p>Если вы уже прошли через это или проходите сейчас, расскажите, что помогло вернуться к работе. Какая привычка или маленькое изменение сыграли решающую роль? Если ответа пока нет — это тоже нормально.</p><p>Иногда именно пять минут дают больше, чем любой лайфхак продуктивности.</p><h2>Бонус от экспертов: как пережить выгорание и вернуться к работе</h2><p>Если вы узнаёте себя в описании из статьи — не переживайте, вы не одиноки. Мы попросили двух экспертов из индустрии поделиться личным опытом: как они справлялись с выгоранием, что для них сработало и какие вопросы помогают себе задать в непростые периоды.</p><p><i>Елизавета Якушева, тестировщик, автор тг-канала</i> <a href="https://t.me/izzalypu">Press F to Debug</a>:</p><blockquote>Для меня выгорание — самая большая и страшная проблема в карьере. Абсолютно всё зависит от неправильно выстроенных ожиданий</blockquote><p>Елизавета выделяет два разных типа выгорания:</p><ol><li>От самой работы — стресс, рутина, груз ответственности.</li><li>От постоянной учёбы и самосовершенствования — давление трендов, ощущение собственной «недостаточности», переизбыток бесполезной информации.</li></ol><p>На её взгляд, большинство советов работают только в рамках «программирования для себя», но они не решают главного — внутренней мотивации.</p><p>Чтобы справиться, она предлагает задать себе простой, но важный вопрос:</p><p>«<i>Зачем я это делаю? Что будет, если я перестану?</i>»</p><blockquote>Мы ходим на работу, чтобы получать деньги. Без этого мы не можем оплатить свои счета за ипотеку или продукты.<br /><br />Стресс от груза ответственности решается простой мыслью:
"Я здесь, чтобы выполнять работу так, как могу. Если я не успеваю что-то сделать вовремя, я умираю, у меня температура под 40, у меня отвалилась нога — вселенная не остановится, если ты возьмёшь тайм-аут в виде отпуска или day-off. Ракета не полетит в космос, и никто глобально не умрёт."</blockquote><p>Для пет-проектов помогает осознанность: понимание, зачем ты вообще этим занимаешься.</p><blockquote>Я веду образовательный ютуб-канал, чтобы люди могли узнать что-то новое и разобраться в сложной теме. Мне важно, чтобы человек нашёл своё комьюнити и мог прийти куда-то за советом. Мысль о глобальной помощи другим вдохновляет меня даже в самые тёмные моменты</blockquote><p><i>Анастасия Егорова, фронтенд-разработчик, автор канала «</i><a href="https://t.me/CosyFrontendNastia">Код и кофе</a><i>»:</i></p><p>Анастасия комментирует технику «5-минутных привычек», описанную в оригинальной статье, и делится, как адаптировала её под свой сложный ритм:</p><blockquote>У меня был период жизни, когда я полтора года работала на двух фуллтайм-работах… Иногда, просыпаясь зимним утром в 6:45, чтобы выйти на удалённый созвон в 7:00, я думала, что больше всего хочу уволиться со второй работы. Но нужно было работать.</blockquote><p>В такие моменты она договаривалась с собой: поработать всего 5 минут, а потом дать себе что-то приятное — сериал, эклер, отдых.</p><blockquote>Где-то на второй–третьей пятиминутке меня затягивало, и 5 минут превращались в полноценный час-два работы без переключения. Несколько таких подходов в течение дня — и к вечеру работа была сделана, а иногда ещё и сварен борщ, и приготовлены котлетки.</blockquote><p>Да, бывают и провальные дни — но даже тогда, по её словам, важно просто не бросить всё совсем.</p><blockquote>Я реально работала 5 минут, а потом 10 минут отдыхала… и к концу дня с помощью этих пятиминуток было сделано не так много. В такие дни я просто от себя отставала, радовалась, что я сделала хотя бы эти пятиминутные задачи, а не прокрастинировала весь день.</blockquote><p>Возможно, этот подход поможет и вам — особенно в моменты, когда ощущение выгорания слишком близко.</p>]]></content:encoded>
    </item>
  </channel>
</rss>