<?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>ICO</title>
    <description>Initial Coin Offering — предварительная эмиссия и распределение криптовалюты без майнинга или форжинга.</description>
    <link>https://tproger.ru/tag/ico</link>
    <atom:link href="https://tproger.ru/tag/ico/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Tue, 06 Oct 2026 14:46:24 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>ICO</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Как приручить legacy-код: безопасная модернизация без заморозки фич</title>
      <link>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</link>
      <comments>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[KODE]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</guid>
      <description><![CDATA[<p>Как модернизировать legacy-код без остановки продукта: Strangler Fig Pattern, feature flags, shadow testing и безопасная миграция данных. Практика и антипаттерны.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki">Как приручить legacy-код: безопасная модернизация без заморозки фич</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Legacy]]></category>
      <category><![CDATA[Техника]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Jun 2026 06:16:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Legacy-код — одна из самых болезненных тем в инженерных командах. Обычно все понимают, что система устарела: архитектура мешает быстро выпускать изменения, новые фичи приходится встраивать через обходные пути, тесты либо неполные, либо отсутствуют, а любое изменение в одном модуле неожиданно ломает другой.</p><p>Но при этом к такому коду часто боятся прикасаться. И не без причины. В старых системах редко бывает понятная карта зависимостей. Документация устарела, часть знаний живет только в головах нескольких разработчиков, а бизнес при этом продолжает ждать новых релизов, интеграций и продуктовых экспериментов.</p><p>Так появляется классическая ловушка legacy: систему надо модернизировать, но остановить развитие нельзя. Переписать всё с нуля страшно, поддерживать как есть — всё дороже. В результате продукт обрастает временными решениями, скорость разработки падает, а стоимость каждого следующего изменения растет.</p><p>Хорошая новость в том, что модернизация legacy-кода не обязана быть большим взрывом. Старую систему можно менять постепенно, сохраняя рабочий продукт, не замораживая фичи и не устраивая один критический релиз, от которого зависит всё.</p><h2>Почему Big Bang-переписывание чаще всего заканчивается плохо</h2><p>Когда команда долго живет с устаревшей системой, идея переписать всё с нуля выглядит очень соблазнительно. Кажется, что можно наконец избавиться от технического долга, выбрать нормальную архитектуру, перепроектировать модули, покрыть всё тестами и начать «правильно».</p><p>На старте такой план часто звучит логично. Особенно если текущая система действительно мешает развитию. Например, мобильное приложение растет, у него уже миллионы пользователей, бэкенд написан несколько лет назад как монолит, а каждая новая фича требует изменений в десятке мест. Команда устала чинить регрессии, бизнес устал ждать, и всем хочется «один раз нормально переписать».</p><p>Проблема не в самой идее переписывания, а в условиях, при которых оно проваливается. Большой риск возникает, когда совпадают четыре фактора: переписывание занимает много месяцев, в это время бизнес продолжает развивать старую систему, новая версия покрывает сразу большую часть функциональности, а откат связан с миграцией данных. Если все четыре пункта присутствуют, Big Bang почти гарантированно превратится в долгий и дорогой проект.</p><p>Допустим, команда решила переписать модуль заказов в e-commerce-продукте. В старой версии есть корзина, промокоды, доставка и оплата. Команда планирует за полгода сделать новый сервис заказов. Но за эти полгода бизнес добавляет подписки, подарочные сертификаты, частичную оплату бонусами и новую логику возвратов. В итоге новая система, которую проектировали под старые требования, к моменту релиза уже нуждается в доработке.</p><p>Есть и другая проблема: большой релиз почти всегда несет максимальный риск. Если вы заменяете крупный кусок системы целиком, ошибка влияет сразу на большую часть пользователей. Откат тоже становится сложным, потому что новая логика уже связана с новыми данными, контрактами и интеграциями.</p><p>Big Bang всё-таки бывает оправдан — но в узких условиях. Если кодовая база молодая (год-два), пользователей мало, у системы нет критичного состояния в БД и продукт можно временно заморозить или вести в обоих контурах параллельно, полное переписывание может оказаться дешевле постепенной миграции. Это редкая ситуация, и она быстро исчезает по мере роста продукта. В зрелых системах безопаснее работает другой подход — постепенная архитектурная эволюция.</p><h2>Пример: как команда переписала сервис документов и потеряла полгода</h2><p>Команда сопровождала сервис — старый модуль на aiohttp с Pydantic v1, через который проходила вся обработка путевых листов и актов осмотра транспорта. Сервис существовал шесть лет, был покрыт тестами фрагментарно, а его API использовали мобильное приложение водителей, диспетчерская веб-панель и пакетный импорт.</p><p>Команда решила переписать сервис целиком: перейти на FastAPI, обновить Pydantic до v2, заодно почистить контракты и заменить внутреннее хранилище документов с MongoDB на PostgreSQL. План был рассчитан на четыре месяца.</p><p>Через восемь месяцев проект всё ещё не был готов к выкатке, а к десятому месяцу команда откатила миграцию полностью. Причин было несколько.</p><p>Во-первых, переписывание шло параллельно с продуктовой разработкой. За время миграции бизнес добавил два новых типа документов и изменил правила подписи актов. Новая система проектировалась под старые требования и к моменту готовности уже не соответствовала продукту.</p><p>Во-вторых, команда не написала характеристических тестов. Поведение «как есть» нигде не было зафиксировано, и расхождения находились только в продакшене после переключения.</p><p>В-третьих, у старого сервиса были скрытые побочные эффекты, о которых никто не помнил. При смене статуса документа публиковал событие в Kafka, которое читал биллинг и сервис аналитики. В новой реализации это поведение не было воспроизведено, потому что в коде оно выглядело как «лишний» вызов. После переключения биллинг перестал получать события, и расхождение обнаружили только через две недели — по жалобе финансового отдела.</p><p>В-четвёртых, переключение было сделано «в лоб»: маршрут в API Gateway просто перенаправили на новый сервис. Фича-флага не было, теневого запуска не было, плана отката не было. Когда выяснилось, что новый сервис строже валидирует исторические форматы документов и отклоняет часть старых записей, быстро вернуться на старую реализацию не получилось — её к тому моменту уже отключили на стенде, а в БД успели уйти записи в новом формате.</p><p>В итоге миграцию свернули, потратив около десяти человеко-месяцев и потеряв доверие бизнеса. Сервис до сих пор работает в исходной реализации, а команда переходит к плану, описанному ниже.</p><h2>Strangler Fig Pattern: как заменить систему по частям</h2><p>Один из самых практичных подходов к модернизации legacy-кода — Strangler Fig Pattern. В софтверном виде паттерн был сформулирован Мартином Фаулером в 2004 году под названием StranglerFigApplication. Идея проста: не переписывать систему целиком, а постепенно выносить отдельные части в новую реализацию.</p><p>Название пришло из биологии. Фикус-душитель растет вокруг дерева-хозяина и постепенно вытесняет его. В архитектуре принцип похожий: старая система продолжает работать, новая функциональность появляется рядом, а затем отдельные потоки постепенно переводятся на новую реализацию.</p><p>Представим старый монолит интернет-магазина. Внутри него есть каталог, корзина, заказы, платежи, скидки, личный кабинет и уведомления. Переписать всё сразу — рискованно. Но можно начать с относительно изолированного участка, например с уведомлений.</p><p>Сначала команда описывает текущий контракт: какие события приходят в модуль уведомлений, какие каналы используются, какие шаблоны отправляются, какие ошибки считаются допустимыми. Затем рядом создается новый сервис уведомлений, который реализует тот же контракт. На первом этапе он может даже не отправлять реальные сообщения, а только принимать события и логировать результат. После проверки часть трафика переводится на новую реализацию. Когда сервис стабилизируется, старый код уведомлений удаляется из монолита.</p><p>Strangler Fig хорошо работает там, где между старым и новым кодом есть сетевая граница: HTTP, message bus, RPC. Если такой границы нет — например, нужно постепенно заменить функцию или класс внутри одного процесса — используется родственный паттерн Branch by Abstraction: над старой реализацией создается абстракция, рядом пишется новая реализация, переключение происходит через конфигурацию или фича-флаг, после стабилизации старая ветка удаляется. Снаружи это выглядит как Strangler Fig, но без сетевого прокси.</p><p>Такой подход снижает риск. В системе нет одного большого релиза, где всё меняется сразу. Есть серия небольших контролируемых изменений. Каждое можно протестировать, измерить и откатить.</p><h2>Главное правило: сначала повторить поведение, потом улучшать</h2><p>Одна из частых ошибок при модернизации legacy-кода — попытка одновременно переписать систему и улучшить бизнес-логику. Команда смотрит на старый модуль и думает: «Раз уж мы его трогаем, давайте сразу сделаем нормальную архитектуру, изменим контракты, уберем странные кейсы и перепишем поведение».</p><p>Это опасный путь. В legacy-системах странное поведение часто существует не случайно. За ним может стоять неочевидное бизнес-правило, старый клиент, интеграция с внешней системой или исторический баг, на который уже кто-то завязался.</p><p>Например, в системе расчета налогов может быть правило: для контрактов, заключенных до 2018 года, НДС округляется в меньшую сторону до целого рубля, а для всех остальных — по математическим правилам. Новый разработчик может решить, что это ошибка, и «исправить» округление. Но потом выяснится, что часть крупных клиентов держит это поведение в своих сверках, а смена правила приведет к расхождениям в актах и претензиям.</p><p>Прежде чем менять поведение, его нужно зафиксировать. Для этого пишут характеристические тесты (characterization tests, иногда называемые golden master или approval tests). Идея простая: на реальных данных или их обезличенных копиях прогоняется старая реализация, её ответы сохраняются как эталон, и любые будущие изменения, отклоняющиеся от эталона, отлавливаются автоматически. Тесты пишутся не для красоты, а для того, чтобы зафиксировать существующее поведение — даже странное — перед тем, как его трогать. Подробно эта техника описана у Майкла Физерса в книге Working Effectively with Legacy Code; на практике её удобно реализовать через библиотеки семейства approval-tests (approvaltests-python, approvaltests-java и аналоги).</p><p>Поэтому первый этап модернизации — не улучшение, а воспроизведение текущего поведения. Новая реализация должна вести себя так же, как старая. Даже если старое поведение кажется странным. Только после стабилизации можно отдельно обсуждать, что именно стоит менять.</p><h2>Feature toggles: как включать новую логику без риска</h2><p>Feature toggles, или фича-флаги, — один из главных инструментов безопасной миграции. Они позволяют включать и выключать новую логику без деплоя.</p><p>В обычной разработке релиз часто выглядит бинарно: код либо выкатили, либо нет. При миграции legacy это неудобно. Гораздо безопаснее иметь возможность включить новую реализацию для 1% пользователей, затем для 10%, потом для половины аудитории и только после этого для всех.</p><p>Например, команда переносит расчет стоимости доставки из монолита в новый сервис. С помощью фича-флага это выглядит так:</p><p>user_id передается явно, чтобы решение «попал ли пользователь в новый сегмент» было стабильным от запроса к запросу. Иначе один и тот же клиент будет получать разные ответы при обновлении страницы, и поведение системы станет непредсказуемым.</p><p>На первом этапе флаг включают только для внутренней команды. Потом для тестового сегмента пользователей. Затем для небольшой доли реального трафика. Если метрики стабильны, долю увеличивают. Если появляются ошибки, флаг выключают, и пользователи снова идут в старую реализацию.</p><p>Важно различать два разных типа флагов. Флаг постепенной выкатки (rollout flag) меняется редко и контролирует, какой процент пользователей видит новую логику. Kill switch — отдельный флаг, единственная задача которого — мгновенно выключить новую реализацию при инциденте. Kill switch должен опрашиваться на каждом запросе, его кэширование должно жить секунды, а не минуты, и он принципиально не должен зависеть от той системы, которую он выключает. Иначе в момент аварии может оказаться, что выключатель сам недоступен.</p><p>В качестве инфраструктуры для флагов команды обычно берут одну из платформ: LaunchDarkly, Unleash, Flagsmith, GrowthBook, либо собирают собственную поверх Redis или конфигурационного сервиса. Для миграции важны три свойства: быстрое распространение изменений (секунды, а не минуты), поддержка таргетинга по пользователю/сегменту и аудит — кто и когда менял флаг.</p><p>Важно, что фича-флаг — это не просто if в коде. Для серьезной миграции нужны правила: кто может включать флаг, как быстро его можно отключить, какие метрики отслеживаются, когда флаг должен быть удален.</p><p>Последний пункт особенно важен. Если флаги не удалять, система быстро превращается в набор ветвлений, где никто уже не понимает, какая логика актуальна.</p><h2>Shadow testing: как проверить новую систему на реальном трафике</h2><p>Feature toggles помогают безопасно переключать пользователей. Но перед этим хорошо бы понять, совпадает ли новая логика со старой. Для этого используют shadow testing.</p><p>Shadow testing — это запуск новой реализации параллельно старой, но без влияния на пользователя. Пользовательский запрос по-прежнему обрабатывает старая система, а новая получает копию запроса и считает результат «в тени». Пользователю этот результат не показывается. Команда только сравнивает ответы.</p><p>Например, есть старый модуль расчета скидок. Он учитывает промокоды, сегмент пользователя, историю покупок, регион и партнерские условия. Команда пишет новый сервис скидок. Чтобы не переключать пользователей сразу, можно запустить теневой режим:</p><p>Два момента, на которые стоит обратить внимание в этом коде. Теневой вызов запускается через asyncio.create_task — корутина сразу планируется в event loop и начнёт выполняться, как только функция вернёт управление. И весь блок завернут в try/except: исключение в новой логике не должно ронять основной запрос. Без этих двух свойств shadow testing рискует ухудшить продакшен вместо того, чтобы безопасно его проверить.</p><p>Небольшая оговорка для продакшена: event loop держит на task только слабую ссылку, и без сохранённой ссылки задача может быть собрана сборщиком мусора прямо во время выполнения. В реальном коде Task имеет смысл класть в set фоновых задач и удалять оттуда через add_done_callback. В примере выше эта обвязка опущена для читаемости.</p><p>Для критичной доменной логики — платежей, биллинга, расчета тарифов — допустимый уровень расхождения должен быть около нуля: цель в shadow-режиме не «как можно меньше различий», а «понимаем каждое расхождение». Для менее чувствительных доменов (рекомендации, ранжирование результатов поиска) можно жить с расхождением в долях процента, но и там расхождения нужно классифицировать, а не игнорировать. Возможно, это баги новой реализации. А возможно, старая система содержит устаревшую логику, которую нужно отдельно обсудить с бизнесом.</p><p>Shadow testing особенно полезен для критичных доменных частей: платежей, биллинга, расчета тарифов, персональных предложений, транзакций. Там нельзя просто «попробовать на пользователях» и посмотреть, что будет.</p><p>При этом важно отличать теневую проверку чтения от теневой проверки записи. Чтение проверить относительно дёшево: запрос идёт в обе системы, ответы сравниваются, никаких внешних эффектов нет. С записью всё сложнее. Если новая реализация в shadow-режиме действительно создаст заказ, спишет деньги или отправит письмо, у пользователя возникнут двойные эффекты. Поэтому для writes либо вводят идемпотентные ключи и shadow-режим без реальных побочных действий (внешние вызовы заменены no-op-стабами, БД — отдельной shadow-копией), либо вообще отказываются от теневой проверки записи в пользу постепенной выкатки за фича-флагом.</p><p>Сравнение ответов в реальной системе тоже не сводится к одной функции compare. Нужно отдельно решать, как игнорировать «нормальный» шум (метки времени, идентификаторы, порядок коллекций), как сэмплировать трафик, чтобы не утопить хранилище расхождений, и как организовать триаж — кто и в каком ритме разбирает накопившиеся диффы. Готовые решения этого класса — GitHub Scientist (Ruby и его порты в другие языки), Twitter Diffy, либо собственный лёгкий регистратор поверх Kafka и таблицы расхождений.</p><h2>С чего начинать модернизацию</h2><p>Начинать лучше не с самого больного и не с самого центрального модуля. Это звучит контринтуитивно, потому что обычно хочется сразу взяться за главный источник проблем. Но если начать с ядра системы, команда быстро упрется в максимальное количество зависимостей и рисков.</p><p>Удобный способ выбрать первый кусок — оценить кандидатов по двум осям: насколько модуль критичен для бизнеса (low / high) и насколько сильно он связан с остальной системой (low / high). Начинать стоит с квадранта low-criticality + low-coupling: ошибки в нем не уронят бизнес-показатели, а малое количество зависимостей позволит провести миграцию полностью, не утянув за собой смежные модули. Высоко-критичные и сильно связанные части (платежи, ядро авторизации) трогают в последнюю очередь — на этот момент команда уже наберёт опыт безопасной миграции.</p><p>Хорошие точки входа обычно: уведомления, генерация отчетов, поиск, история операций, профиль пользователя, отдельная часть каталога. Важно, чтобы у команды была возможность описать контракт: какие данные входят, какие выходят, какие ошибки возможны, какие внешние системы участвуют.</p><p>Допустим, в банковском приложении есть старый модуль истории операций. Он медленный, сложно расширяется, но при этом не выполняет сами транзакции. Это хороший кандидат для первой миграции. Ошибка в истории операций неприятна, но обычно менее критична, чем ошибка в списании денег.</p><p>Команда может вынести чтение истории в отдельный сервис, сначала запустить его в shadow-режиме, потом включить для части пользователей, затем полностью перевести чтение на новую реализацию. При этом критичная транзакционная логика останется в старой системе до тех пор, пока команда не наберет опыт безопасной миграции.</p><h2>Миграция данных: самая сложная часть</h2><p>Большая часть статьи говорит о маршрутизации запросов и переключении трафика. Но в реальных проектах основная сложность лежит ниже — в данных. Старая и новая реализации почти всегда работают с общим состоянием: одной БД, одним хранилищем документов, одним набором очередей. Переехать туда «одним коммитом» нельзя.</p><p>Базовый рабочий приём — Expand-Contract (он же Parallel Change). Изменение схемы делается в три такта. На этапе expand в БД добавляются новые поля, таблицы или индексы, при этом старое поведение полностью сохраняется. Затем — migrate: обе реализации начинают писать и в старое, и в новое место (dual writes), а отдельный фоновый процесс делает backfill — заполняет новые поля историческими данными. После этого читатели по одному переключаются на новую схему. Только когда никто из читателей не использует старую структуру, наступает contract — удаление лишних колонок и таблиц.</p><p>Несколько практических деталей, которые часто упускают:</p><p>·         Dual writes — это не бесплатная операция. Две записи означают две точки отказа. Если одна из них упала, нужно решать, что делать: продолжать ли работу, ставить ли событие в очередь на повтор, помечать ли запись как несогласованную. Простое «сначала пишем туда, потом сюда» в продакшене на нагрузке приводит к расхождениям.</p><p>·         Backfill часто длиннее, чем кажется. На большой таблице миграция в одном UPDATE блокирует продакшен. Поэтому backfill делают батчами по N тысяч строк с паузами, отслеживают прогресс и предусматривают возможность остановить и продолжить.</p><p>·         Онлайн-изменения схемы на крупных таблицах делаются не штатным ALTER TABLE, а специализированными инструментами: gh-ost или pt-online-schema-change для MySQL, встроенные онлайн-механизмы PostgreSQL для индексов и колонок, Liquibase/Flyway — для управления версионированием изменений в репозитории.</p><p>·         Shadow testing данные не покрывает. Можно сравнить, что новая реализация возвращает то же, что и старая, но если за этим стоит другая схема в БД, проверка корректности самой миграции данных — это отдельная работа: сверки, контрольные суммы, выборочный аудит исторических записей.</p><p>Без этих шагов любая красивая фасадная архитектура наталкивается на разъезжающиеся данные — и тогда даже идеальный Strangler Fig снаружи не спасает.</p><h2>Прокси-слой как точка контроля</h2><p>Чтобы постепенно заменять legacy-код, нужно управлять маршрутизацией запросов. Для этого часто создают прокси-слой, API Gateway или фасад, через который проходит обращение к старой и новой логике. В терминах Domain-Driven Design такой слой часто называют Anti-Corruption Layer: он защищает новую реализацию от старых контрактов и наоборот, позволяя двум моделям сосуществовать без взаимного «загрязнения».</p><p>Без такой точки контроля миграция становится хаотичной. Часть клиентов ходит напрямую в старый модуль, часть — в новый, часть использует обходные пути, а команда теряет возможность централизованно переключать трафик.</p><p>Прокси-слой решает несколько задач. Он скрывает детали реализации от клиентов, позволяет направлять часть запросов в новую систему, поддерживает фича-флаги, собирает метрики и упрощает откат.</p><p>В качестве технической основы команды обычно берут один из трех вариантов: классический API gateway (Kong, AWS API Gateway), service mesh (Envoy, Istio) или более простой reverse proxy (NGINX, HAProxy). Service mesh особенно удобен, когда трафик уже идёт внутри Kubernetes-кластера: маршрутизацию можно менять конфигурацией, без правок кода клиентов и сервисов.</p><p>Например, мобильное приложение обращается к endpoint /orders/history. Раньше этот endpoint напрямую обслуживал монолит. После введения API Gateway приложение продолжает ходить по тому же контракту, но внутри gateway может решать, куда направить запрос: в legacy-модуль или новый сервис истории заказов.</p><p>Управление маршрутизацией обычно делается не «всё или ничего», а на основании атрибутов запроса: значения заголовка (X-Migration-Cohort: new), куки, хэша от user-id (стабильное разбиение пользователей на сегменты) или географического региона. Это позволяет выкатывать новую реализацию сначала на одну страну, на сотрудников самой компании или на тестовый сегмент — и только потом расширять охват.</p><p>Для клиента ничего не меняется. Для команды появляется управляемость.</p><h2>Наблюдаемость: без метрик миграция превращается в гадание</h2><p>Постепенная модернизация невозможна без нормальной наблюдаемости. Если команда не видит, что происходит внутри системы, она не сможет безопасно переключать трафик.</p><p>Минимальный набор — это логи, метрики и распределенная трассировка (distributed tracing). Нужно понимать, сколько запросов идет в старую и новую реализацию, сколько ошибок возникает, как меняется latency, где появляются таймауты, какие статусы возвращаются, какие бизнес-метрики проседают.</p><p>Технические метрики стоит формулировать не как «средний ответ» и «процент ошибок», а в терминах SLI и SLO: целевые показатели вида «99.9% запросов на /orders/history отвечают быстрее 300 ms за 30 дней» с явным error budget. Latency измеряется по перцентилям (p50, p95, p99) — среднее значение почти всегда обманчиво, а хвосты распределения говорят о реальном опыте пользователя. На время миграции имеет смысл выставить отдельные SLO для нового и старого пути и сравнивать их.</p><p>В качестве инструментов де-факто стандартом стал OpenTelemetry для трассировок, метрик и логов — единый протокол, который пишет в практически любое хранилище. Дальше — Prometheus и Grafana для метрик, Jaeger или Tempo для traces, Sentry или аналог для ошибок. Для миграции важна возможность фильтровать метрики по «варианту» — отдельно по старому и новому пути — иначе все цифры смешаются и реальную динамику будет не видно.</p><p>Технических метрик недостаточно. Если команда переносит оформление заказа, важно смотреть не только на 500 ошибки и время ответа, но и на конверсию в оплату, количество брошенных корзин, повторы запросов, обращения в поддержку.</p><p>Пример: новая система формально отвечает быстрее старой и не дает ошибок. Но после включения на 10% пользователей падает конверсия в оплату. Причина может быть не в серверной ошибке, а в изменении порядка полей, другом тексте сообщения или потере какого-то edge-case. Без бизнес-метрик команда может решить, что миграция успешна, хотя для продукта она уже создает проблему.</p><h2>Практическая последовательность миграции</h2><p>Рабочая последовательность обычно выглядит так.</p><p>Сначала команда выбирает ограниченный участок системы. На этом этапе важно не просто назвать модуль, а описать его границы. Какие сценарии он закрывает? Кто его вызывает? Какие данные он читает и пишет? Какие внешние интеграции использует? Какие неочевидные бизнес-правила в нем есть?</p><p>Затем поверх legacy-логики создается стабильный контракт. Это может быть API, фасад, gateway или отдельный слой внутри приложения. Главная задача — сделать так, чтобы клиенты зависели не от внутренней реализации, а от понятного интерфейса. На этом этапе полезно вспомнить про contract testing (Pact, Spring Cloud Contract): автотесты со стороны потребителей фиксируют, что именно они ожидают от API, и предупреждают о ломающих изменениях до того, как они доедут до продакшена.</p><p>После этого рядом пишется новая реализация. Она должна повторять текущее поведение, а не сразу становиться «идеальной версией будущего». На этом этапе полезно фиксировать все расхождения: где старая система работает странно, где требования не описаны, где бизнес-правила требуют уточнения.</p><p>Следующий этап — shadow testing. Новая система получает копии реальных запросов, считает результат, но пользователю по-прежнему возвращается ответ legacy. Команда сравнивает результаты и устраняет расхождения.</p><p>Когда новая реализация достаточно стабильна, начинается постепенное переключение через feature toggles. Сначала внутренние пользователи, потом 1% реального трафика, затем 5–10%, затем 50% и только после этого 100%.</p><p>На каждом этапе команда смотрит на метрики. Если всё стабильно, движение продолжается. Если появляются проблемы, флаг выключается, трафик возвращается в legacy, а команда разбирает причины.</p><p>Последний этап — удаление старого кода. Это не формальность, а обязательная часть миграции. И «удалить старый код» — это не один коммит, а явный Definition of Done: вырезана старая ветка кода, удалён фича-флаг, обновлена документация и схемы архитектуры, переименованы или удалены устаревшие дашборды и алерты, обновлены runbook’и для on-call и проведено короткое внутреннее обучение. Если этого не сделать, через полгода никто уже не вспомнит, какой путь актуален, и легаси-ветвление останется в коде навсегда.</p><h2>Откат миграций: дешёвый только пока не пошли записи</h2><p>Откатить миграцию, в которой ещё не было записи в БД, легко: достаточно переключить фича-флаг, и трафик снова идёт через старую реализацию. Откатить миграцию, в которой новая система уже неделю писала данные в новые таблицы, — отдельный, гораздо более тяжёлый разговор.</p><p>Поэтому ещё на этапе проектирования каждое изменение должно сопровождаться явным планом отката. Удобно различать три типа шагов.</p><p>Полностью обратимые шаги. Чтение через новый сервис, расчёт «в тени», новые метрики. Откат — выключить флаг. Это самый комфортный режим, и в нём стоит держать миграцию как можно дольше.</p><p>Обратимые с компенсацией. Новая реализация пишет дополнительные данные (например, дублирует операции в новую таблицу), но старый источник тоже обновляется. Откат возможен, но требует решить, что делать с уже записанными данными: оставить, очистить, синхронизировать. План этих действий должен быть написан до выкатки, не во время инцидента.</p><p>Forward-only. После некоторой точки откат становится невозможен — например, после того, как старая схема удалена или внешние интеграции перенастроены на новый сервис. Такие шаги допустимы, но к ним нужно приходить отдельно, осознанно, с особенно строгими SLO в предыдущем этапе. До forward-only-перехода имеет смысл подержать систему в режиме параллельной работы дольше, чем по графику.</p><p>Базовое правило: ни один шаг миграции не должен уходить в продакшен, если у команды нет письменного ответа на вопрос «как мы откатываемся в случае проблемы». Иначе при инциденте откатываться будут на ходу — и не факт, что успешно.</p><h2>Пример: как тот же сервис мигрировали со второй попытки</h2><p>После неудачного опыта команда взялась за тот же сервис заново, но изменила подход.</p><p>На первом шаге они зафиксировали поведение существующего сервиса. На самые часто используемые сценарии (создание путевого листа, подпись акта осмотра, выгрузка пакета документов за период) написали характеристические тесты на реальных продакшен-данных, обезличенных и сохранённых как фикстуры. Любое будущее изменение поведения теперь падало в CI как явное расхождение.</p><p>Параллельно команда провела инвентаризацию побочных эффектов. Из исходного кода и логов выяснилось, что сервис не только хранит документы, но и: публикует событие в Kafka при смене статуса, инкрементирует счётчик в Redis для рейтинга водителей, отправляет webhook во внешнюю систему партнёра, пишет в таблицу аудита. Каждый из этих эффектов попал в отдельный пункт чек-листа «что должно остаться» в новой реализации.</p><p>Затем команда выбрала первый кусок для выноса — не весь сервис, а только чтение документов (GET /documents/{id} и GET /documents/by-driver/{driver_id}). Это была наименее рискованная часть: ошибки в чтении неприятны, но не ломают финансовые потоки.</p><p>Новый сервис написали на FastAPI рядом со старым. На уровне API Gateway появилось правило маршрутизации: запросы на чтение шли в старый сервис, но в фоне дублировались в новый. Ответ пользователю всегда возвращал legacy, а ответ нового сервиса сравнивался с эталоном и записывался в отдельную таблицу для разбора. Использовали обёртку поверх asyncio.create_task — на ответ пользователя теневой вызов не влиял.</p><p>За три недели shadow-режима команда нашла четыре расхождения. Два оказались багами новой реализации (округление времени, неправильная сортировка вложений). Два — давно забытыми особенностями старого сервиса (одно поле возвращалось в UTC, другое — в локальной зоне; так было исторически, бизнес не возражал, но в новой реализации захотели единый формат). Все четыре зафиксировали явно: баги — починили, особенности — согласовали с продуктовой командой как осознанное изменение.</p><p>Когда расхождений не осталось, включили фича-флаг на сотрудников самой компании. Через неделю — на 1% реальных водителей. Дальше шаг по 5%, 25%, 50%, 100% с паузой в несколько дней между этапами. На каждом шаге следили не только за HTTP-ошибками и latency, но и за продуктовыми метриками: количество подписанных актов, время от открытия документа до подписи, доля повторных запросов. Один раз пришлось откатиться с 25% на 5% — в одном из регионов выросло время отклика из-за неэффективного запроса. Исправили, выкатили снова.</p><p>Через два месяца чтение полностью перешло в новый сервис. Старый код чтения и фича-флаг удалили в том же релизе. После этого по той же схеме мигрировали запись документов, потом публикацию событий, потом импорт из внешних систем. Полная миграция заняла девять месяцев — почти столько же, сколько провалившийся Big Bang, — но продукт всё это время продолжал развиваться, инцидентов не было, и в конце команда осталась с системой, которую понимает.</p><h2>Типичные ошибки при работе с legacy</h2><p>Первая ошибка — пытаться улучшить всё сразу. Команда одновременно меняет архитектуру, бизнес-логику, контракты и инфраструктуру. В результате становится невозможно понять, какая именно часть вызвала проблему. Правильнее сначала воспроизвести поведение, стабилизировать новую реализацию и только потом улучшать.</p><p>Вторая ошибка — недооценивать скрытые зависимости и побочные эффекты. Legacy-код часто делает больше, чем кажется. На один и тот же вызов могут быть навешаны: запись в таблицу аудита, инкремент счётчика в кэше, публикация события в очередь, обновление статуса связанной сущности, инвалидация кэша, дёрганье webhook’а во внешнюю систему. Если в новой реализации воспроизвести только явный путь, скрытые потребители молча перестанут получать данные — и узнают об этом через жалобу бизнеса, а не через ошибку в логах. Поэтому перед выносом любого модуля имеет смысл составить инвентаризацию побочных эффектов: пройтись по коду и логам и выписать каждое нелогичное действие отдельным пунктом чек-листа.</p><p>Третья ошибка — отсутствие наблюдаемости. Без логов, метрик и трассировки команда не управляет миграцией, а угадывает. Особенно опасно смотреть только на технические ошибки и игнорировать бизнес-показатели.</p><p>Четвертая ошибка — не договариваться с бизнесом. Модернизация не должна быть невидимой «инженерной активностью в стол». Её нужно встраивать в roadmap, объяснять эффект и договариваться о приоритетах. Если бизнес не понимает, зачем команда тратит время на миграцию, работа будет постоянно проигрывать новым фичам.</p><p>Пятая ошибка — не удалять старый код. Временное сосуществование старой и новой логики нормально. Вечное сосуществование — нет. Если legacy не удаляется, технический долг не уменьшается, а просто меняет форму.</p><p>Шестая ошибка — не удалять фича-флаги после миграции. Флаг, который сыграл свою роль и больше никогда не выключается, превращается в постоянное ветвление в коде. Через год команда не помнит, можно ли удалить такую ветку или там сидит важный edge-case. Через два — кода с такими «мёртвыми» флагами становится больше, чем основной логики. Поэтому каждый флаг должен заводиться с условием удаления («после полной выкатки и двух недель стабильной работы») и иметь ответственного, кто этим удалением займётся.</p><p>Отдельно стоит упомянуть организационную сторону. Закон Конвея работает и в обратную сторону: если новый и старый код владеются разными командами с разными приоритетами, миграция будет тормозиться независимо от выбранного паттерна. На время миграции имеет смысл явно проговорить, кто отвечает за переход, и не разделять старую и новую реализации между несовместимыми roadmap’ами.</p><h2>Компромиссы, к которым нужно быть готовыми</h2><p>Постепенная модернизация безопаснее Big Bang-переписывания, но она не бесплатна. Некоторое время система будет сложнее, чем раньше. В ней появятся старый и новый код, прокси-слой, фича-флаги, дублирование логики, дополнительные метрики.</p><p>Shadow testing увеличит нагрузку на инфраструктуру, потому что часть запросов будет обрабатываться дважды. Команде придется поддерживать дисциплину: документировать контракты, отслеживать флаги, удалять старую реализацию после миграции, поддерживать contract-тесты в актуальном состоянии.</p><p>Но это контролируемая сложность. Она распределена во времени и управляется инженерными практиками. В отличие от Big Bang-риска, где команда долго работает с минимальной обратной связью, а потом выкатывает один большой релиз с максимальной неопределенностью.</p><h2>Когда Strangler Fig особенно оправдан</h2><p>Постепенная миграция особенно хорошо подходит для систем, где downtime невозможен или слишком дорог. Это финтех, e-commerce, биллинг, мобильные бэкенды с большой аудиторией, высоконагруженные продукты, старые монолиты и системы с большим количеством интеграций.</p><p>Если продуктом ежедневно пользуются сотни тысяч или миллионы людей, нельзя позволить себе «переписать и посмотреть, что будет». Нужно менять архитектуру так, чтобы пользователь не замечал процесса миграции.</p><p>Этот подход также полезен там, где бизнес продолжает активно развивать продукт. Если фичи нельзя заморозить на полгода, модернизация должна идти параллельно с продуктовой разработкой.</p><h2>Когда модернизацию лучше не делать</h2><p>Постепенная миграция — мощный инструмент, но у неё тоже есть стоимость, и иногда правильный ответ — оставить систему как есть. Несколько сценариев, в которых модернизация плохо окупается.</p><p>Продукт, который уходит из эксплуатации. Если через год сервис будет выключен или заменён на покупное решение, тратить квартал на его рефакторинг бессмысленно. Достаточно стабилизировать то, что есть.</p><p>Модуль, который никто не трогает. Если код десятилетней давности продолжает работать, не падает, не требует изменений и не вызывает инцидентов, его «уродливость» — не повод его переписывать. Цель модернизации — упростить будущие изменения; если будущих изменений нет, цели тоже нет.</p><p>Регулируемые системы с тяжёлой ресертификацией. В банковских, медицинских и государственных контурах любое изменение в критичной системе может потребовать повторной сертификации, перепрохождения аудитов, обновления договорной обвязки. В таких условиях стоимость модернизации может на порядок превышать стоимость поддержки текущей реализации, и решение нужно принимать вместе с владельцем продукта и юристами, а не только инженерным составом.</p><p>Простой тест: если на вопрос «какой бизнес-сценарий мы откроем после миграции» нет внятного ответа — модернизацию имеет смысл отложить и заняться чем-то другим.</p><h2>Что получает команда</h2><p>Главный результат постепенной модернизации — управляемость. Команда начинает лучше понимать систему, контролировать изменения и снижать риск инцидентов.</p><p>Появляются понятные контракты, наблюдаемость, практика безопасных релизов, культура удаления старого кода. Разработчики перестают бояться legacy, потому что у них появляется метод, а не только желание «когда-нибудь всё переписать».</p><p>Для бизнеса это тоже выгодно. Продукт продолжает развиваться, сроки становятся более прогнозируемыми, риски крупных сбоев снижаются, а технический долг постепенно уменьшается.</p><h2>Модернизация — это процесс, а не проект</h2><p>Legacy нельзя «починить за квартал». Если система развивалась годами, она не станет простой после одного рефакторинга. Но её можно системно улучшать.</p><p>Strangler Fig Pattern, Branch by Abstraction, feature toggles, shadow testing и аккуратная миграция данных дают рабочую модель: выбрать ограниченный участок, описать контракт, реализовать новую версию, проверить её на реальном трафике, постепенно переключить пользователей и удалить старый код.</p><p>Это не самый быстрый путь. Зато он управляемый. А в зрелых продуктах управляемость важнее скорости.</p><p>Потому что цель модернизации — не написать красивую новую систему. Цель — сделать так, чтобы продукт продолжал развиваться, команда могла безопасно вносить изменения, а пользователи не становились участниками инженерного эксперимента.</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>10 VSCode расширений, которые реально повышают продуктивность</title>
      <link>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</link>
      <comments>https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost</guid>
      <description><![CDATA[<p>Топ-10 расширений VSCode для повышения продуктивности: форматирование, тестирование API, управление проектами и многое другое. Ускорьте свою разработку с лучшими инструментами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-vscode-raswirenij--kotorye-realno-povywayut-produktivnost">10 VSCode расширений, которые реально повышают продуктивность</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Английский]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Visual Studio Code — мощный редактор, который становится ещё лучше с правильными расширениями. В этой подборке мы собрали 10 инструментов, реально ускоряющих разработку: они избавляют от рутины и помогают сосредоточиться на главном — качественном коде.</p><h2>1. TabNine</h2><p>Если вам важна скорость — <a href="https://www.tabnine.com/">TabNine</a> стоит попробовать хотя бы ради этого. Расширение —  лёгкий AI-ассистент, который работает как умный автодополнитель кода, непохожий на аналоги вроде Codeium или Copilot.</p><p>TabNine обучен на миллионах строк открытого кода и умеет предсказывать, что вы напишете дальше, с учётом контекста проекта и языка. Отлично справляется с рутинными вещами: автозавершает функции, переменные, конструкции — всё быстро и чаще всего в тему.</p><p><b>Кому подойдёт</b>: тем, кто хочет ускорить набор кода, но не готов передавать весь проект в облако или открывать чат с Copilot. Поддерживает офлайн-режим и локальное обучение модели.</p><p>Плюсы:</p><ul><li>Работает из коробки, не требует тонкой настройки;</li><li>Есть локальная версия — удобно для закрытых проектов;</li><li>Поддерживает большинство языков и фреймворков.</li></ul><p><b>Чем полезен:</b> экономит время на повседневной разработке — особенно когда вы не хотите отвлекаться на документацию или поиск нужной переменной в другом файле.</p><h2>2. GitLens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens">GitLens</a> встраивает историю изменений прямо в VSCode — и делает это максимально удобно. Показывает, кто и когда изменил строку, коммит-месседж, хэш, ветку и другие детали. Можно не уходить в консоль или отдельный Git-клиент для поиска информации.</p><p>Особенно полезен, когда работаете с чужим кодом или хотите быстро вспомнить, зачем вы сами что-то написали месяц назад.</p><p><b>Кому подойдёт</b>: тем, кто работает в команде, часто читает историю изменений или ревьюит чужие коммиты. Также пригодится в проектах с долгой историей или нестабильным кодом.</p><p>Плюсы:</p><ul><li>Информация о коммитах отображается прямо в редакторе под строкой;</li><li>Есть таймлайн изменений файла;</li><li>Удобный diff по коммитам, авторам, веткам и даже фрагментам кода.</li></ul><p><b>Чем полезен:</b> помогает быстрее разбираться в чужом коде, искать причины бага или откатывать ошибки. Особенно ценится за то, что делает Git прозрачным и доступным прямо в процессе разработки.</p><h2>3. Error Lens</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens">Error Lens</a> выводит диагностику ошибок и предупреждений прямо в строке кода. Это расширение превращает сообщения линтеров и компиляторов в наглядные подсказки, позволяя сразу видеть, что пошло не так.</p><p>Можно настроить отображение: выделять ошибки цветом, добавлять иконки или даже показывать краткие подсказки с предложениями по исправлению. Поддерживает большинство языков и линтеров, включая ESLint, TypeScript и других.</p><p><b>Кому подойдёт:</b> разработчикам, которые хотят моментально видеть ошибки в коде, и тем, кто ценит визуальную чистоту и скорость отладки.</p><p>Плюсы:</p><ul><li>Ошибки и предупреждения отображаются прямо в редакторе, рядом со строкой кода;</li><li>Гибкая настройка стилей и уровня детализации сообщений;</li><li>Ускоряет процесс отладки, особенно при работе с большими файлами.</li></ul><p><b>Чем полезен:</b> минимизирует время на поиск и анализ ошибок, позволяя сразу фокусироваться на их исправлении. Это особенно ценно, когда вы пишете код в реальном времени или работаете с новыми библиотеками, где легко допустить мелкие недочёты.</p><h2>4. Path Intellisense</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense">Path Intellisense</a> — одно из тех расширений, которое просто работает и экономит кучу времени. Оно автоматически подсказывает пути к файлам, папкам и модулям в вашем проекте, как только вы начинаете их набирать. Поддерживает абсолютные и относительные пути, учитывает структуру проекта и форматирует предложения так, как это принято в выбранном языке.</p><p>Работает особенно хорошо в проектах с вложенной структурой, когда нужно быстро сослаться на компоненты, конфиги или ассеты.</p><p><b>Кому подойдёт</b>: всем, кто устал вручную прописывать длинные relative-пути или путаться в структуре проекта. Особенно выручает на фронтенде, где модулей десятки и легко ошибиться в названии.</p><p>Плюсы:</p><ul><li>Подсказки появляются автоматически при наборе пути;</li><li>Поддерживает большинство языков и фреймворков;</li><li>Учитывает jsconfig.json и tsconfig.json при работе с alias-ами.</li></ul><p><b>Чем полезен</b>: снижает количество опечаток и неверных импортов, ускоряет переход между файлами и помогает писать код чуть быстрее.</p><h2>5. TODO Highlight</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=wayou.vscode-todo-highlight">TODO Highlight</a> подсвечивает комментарии с задачами (например, TODO, FIXME, NOTE) прямо в коде, делая их заметными и удобными для отслеживания. Расширение помогает не терять важные заметки, которые вы оставляете в коде, и быстро находить места, требующие доработки.</p><p>Можно настроить ключевые слова, цвета подсветки и даже добавить свои собственные метки. Работает с любыми языками программирования и интегрируется с панелью задач VSCode для удобного обзора всех TODO в проекте.</p><p><b>Кому подойдёт</b>: разработчикам, которые оставляют заметки в коде, и командам, которым нужно быстро находить задачи или недочёты в проекте.</p><p>Плюсы:</p><ul><li>Яркая подсветка TODO-комментариев прямо в редакторе;</li><li>Гибкая настройка ключевых слов и стилей;</li><li>Интеграция с панелью задач для быстрого обзора.</li></ul><p><b>Чем полезен</b>: экономит время на поиск и управление задачами в коде, помогая не упустить важные доработки или напоминания. Особенно удобно в больших проектах, где комментарии могут затеряться среди строк.</p><h2>6. Prettier – Code formatter</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode">Prettier</a> — расширение, которое автоматически приводит ваш код к единому стилю, избавляет от ручной правки отступов, кавычек и переносов. Оно поддерживает множество языков (JavaScript, TypeScript, CSS, HTML и другие) и интегрируется с линтерами, чтобы ваш код был не только красивым, но и консистентным.</p><p>Можно настроить правила форматирования под ваш проект или использовать готовые пресеты. Prettier форматирует код при сохранении файла или по команде, а также работает с выделенными фрагментами.</p><p><b>Кому подойдёт</b>: разработчикам, которые хотят экономить время на форматировании, и командам, стремящимся к единообразию кода.</p><p>Плюсы:</p><ul><li>Автоматическое форматирование при сохранении или по хоткеям;</li><li>Поддержка множества языков и кастомных настроек;</li><li>Интеграция с ESLint и другими инструментами для проверки кода.</li></ul><p><b>Чем полезен:</b> убирает рутину ручного форматирования, снижает количество ошибок в стиле кода и помогает сосредоточиться на логике, а не на внешнем виде. Идеально, чтобы ускорить работу и поддерживать чистоту в больших проектах.</p><h2>7. Live Server</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">Live Server </a>запускает локальный сервер прямо из VSCode, позволяя просматривать изменения в HTML, CSS и JavaScript в браузере в реальном времени. После сохранения файла страница автоматически обновляется, что исключает необходимость ручного перезапуска или обновления браузера.</p><p>Поддерживает кастомные порты, HTTPS, и работает с любыми фронтенд-проектами, от простых HTML-страниц до сложных приложений на React или Vue. Можно настроить, чтобы сервер открывался автоматически при запуске проекта.</p><p><b>Кому подойдёт</b>: фронтенд-разработчикам, которые работают над веб-интерфейсами и хотят мгновенно видеть результат изменений без лишних действий.</p><p>Плюсы:</p><ul><li>Автоматическое обновление страницы при изменении кода;</li><li>Простая настройка и поддержка HTTPS для безопасного тестирования;</li><li>Лёгкий запуск сервера прямо из редактора.</li></ul><p><b>Чем полезен</b>: ускоряет цикл разработки и тестирования веб-приложений, избавляет от ручного обновления страниц. Это особенно экономит время при частых правках в стилях или скриптах, так как можно сразу видеть результат в браузере.</p><h2>8. Project Manager</h2><p>Если работаете над несколькими проектами одновременно — это расширение сэкономит вам часы. <a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager">Project Manager</a> позволяет создавать список избранных проектов и открывать их в один клик, без ручного поиска папок и недавних вкладок.</p><p>Можно задать свои алиасы, группировать по папкам, запускать с хоткеев — особенно удобно, если у вас десятки репозиториев на локалке или вы фрилансите на несколько команд.</p><p><b>Кому подойдёт</b>: разработчикам, которые ведут сразу несколько проектов, часто переключаются между ними и устали искать нужный путь через File &gt; Open Folder.</p><p>Плюсы:</p><ul><li>Быстрое переключение между проектами через интерфейс или хоткеи;</li><li>Поддержка избранного и тэгов;</li><li>Можно автоматически подтягивать все папки из заданной директории.</li></ul><p><b>Чем полезен:</b> избавляет от рутинных действий при переходе между проектами — особенно когда важно не терять фокус и не сбиваться с рабочего темпа.</p><h2>9. Code Spell Checker</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker">Code Spell Checker </a>выявляет орфографические ошибки в комментариях, строках и именах переменных прямо в редакторе VSCode. Расширение подчёркивает опечатки волнистой линией и предлагает варианты исправления через Ctrl+. или Cmd+., что позволяет быстро исправить ошибки.</p><p>Поддерживает множество ЯП и словари для разных языков (английский, русский, немецкий — с дополнительными расширениями). Можно добавлять свои слова в пользовательский словарь или игнорировать определённые термины, чтобы адаптировать проверку под проект. Работает с camelCase и snake_case, не помечая их как ошибки.</p><p><b>Кому подойдёт</b>: разработчикам, которые пишут много комментариев или документации в коде, и тем, кто хочет избежать опечаток в строках, API или логах, чтобы повысить читаемость.</p><p>Плюсы:</p><ul><li>Мгновенное обнаружение ошибок с подсказками для исправления;</li><li>Гибкая настройка словарей и игнорируемых слов;</li><li>Поддержка технических терминов и различных стилей написания кода.</li></ul><p><b>Чем полезен:</b> экономит время на поиск и исправление опечаток, особенно в документации или пользовательских сообщениях, которые могут повлиять на восприятие проекта.</p><h2>10. REST Client</h2><p><a href="https://marketplace.visualstudio.com/items?itemName=humao.rest-client">REST Client </a>позволяет отправлять HTTP-запросы и просматривать ответы непосредственно в VSCode. Достаточно создать файл с расширением .http или .rest, написать запрос в простом текстовом формате, и вы увидите кнопку Send Request для моментального выполнения.</p><p>Поддерживает все типы запросов (GET, POST, PUT, DELETE и другие), авторизацию (Basic, OAuth, JWT), переменные окружения и даже генерацию кода на разных языках. Запросы можно сохранять в репозиторий, что удобно для командной работы. Расширение также позволяет использовать динамические переменные по типу {{$timestamp}} или {{$guid}}, всё для гибкой настройки запросов.</p><p><b>Кому подойдёт</b>: тем, кто работает с REST API и хочет тестировать эндпоинты прямо в VSCode, сохранять запросы в проекте и почти не переключаться между инструментами.</p><p>Плюсы:</p><ul><li>Простая отправка запросов через .http или .rest файлы с кнопкой Send Request;</li><li>Поддержка переменных окружения и авторизации для сложных API;</li><li>Возможность сохранять запросы в репозитории для совместной работы.</li></ul><p><b>Чем полезен:</b> ускоряет тестирование API, устраняет необходимость в сторонних приложениях. Запросы хранятся рядом с кодом, что упрощает документирование и повторное использование, особенно в проектах, где API-вызовы нужно часто проверять или делиться ими с командой.</p><p><i>А какими расширениями пользуетесь вы? Пишите в комментариях!</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Тот самый парень с HDD на $1 млрд в биткоинах бросил попытку найти выкинутый на свалку накопитель</title>
      <link>https://tproger.ru/news/tot-samyj-paren-s-hdd-na--1-mlrd-v-bitkoinah-brosil-popytku-najti-vykinutyj-na-svalku-nakopitel</link>
      <comments>https://tproger.ru/news/tot-samyj-paren-s-hdd-na--1-mlrd-v-bitkoinah-brosil-popytku-najti-vykinutyj-na-svalku-nakopitel?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/tot-samyj-paren-s-hdd-na--1-mlrd-v-bitkoinah-brosil-popytku-najti-vykinutyj-na-svalku-nakopitel</guid>
      <description><![CDATA[<p>Инженер, потерявший HDD с 8000 BTC, отказался от раскопок и запускает токен INI — он монетизирует право на \$1 млрд в биткоинах.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/tot-samyj-paren-s-hdd-na--1-mlrd-v-bitkoinah-brosil-popytku-najti-vykinutyj-na-svalku-nakopitel">Тот самый парень с HDD на $1 млрд в биткоинах бросил попытку найти выкинутый на свалку накопитель</a>»</p>]]></description>
      <category><![CDATA[Bitcoin]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Мемы]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Aug 2025 13:08:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Британский инженер Джеймс Хауэллс, ставший мемом после того как в 2013 году выбросил на свалку жёсткий диск с 8000 биткоинами, официально <a href="https://cryptodnes.bg/en/james-howells-denies-giving-up-on-915m-lost-bitcoin-shifts-strategy-to-tokenized-ownership/">отказался</a> от попыток выкупить или раскопать полигон в Ньюпорте.</p><p>Но это не значит, что он сдался: Хауэллс меняет тактику и запускает криптостартап, чтобы всё же монетизировать своё цифровое богатство.</p><h2>История одного выкинутого миллиарда</h2><p>Хауэллс стал героем криптосообщества после того, как случайно выбросил накопитель с личными ключами от кошелька, на котором сегодня лежит примерно $915 млн в биткоинах.</p><p>За эти годы он подавал десятки заявок в мэрию Ньюпорта, предлагал от $33 млн до $40 млн за право раскопок, но всё получал отказы. Муниципалитет ссылался на экологические и юридические риски.</p><h2>Владеет — но не физически</h2><p>Ключевой момент: в январе 2025 года Высокий суд Британии признал, что физический диск действительно принадлежит городу, но цифровое содержимое — то есть сами биткоины — всё ещё принадлежат Хауэллсу.</p><p>Эта юридическая формулировка дала инженеру новый шанс: если он не может получить доступ к физическим ключам, он может монетизировать юридическое право на эти биткоины.</p><h2>Новый план: токенизация утраченного сокровища</h2><p>Теперь Хауэллс работает над запуском Ceiniog Coin (INI) — токена на Bitcoin Layer 2, который будет представлять цифровое право собственности на его 8000 BTC.</p><p>Проект опирается на грядущее обновление биткоин-сети, которое снимет ограничение в 80 байт на OP_RETURN, позволяя создавать более функциональные токены.</p><p>INI позиционируется как «Web3-платёжная экосистема на базе биткоина», при этом каждый токен будет обеспечен частью тех самых потерянных биткоинов. По сути, это способ превратить юридическое право на несуществующий актив в цифровой актив, который можно торговать.</p><h2>ICO и комьюнити</h2><p>По словам Хауэллса, ICO INI ожидается в конце 2025 года. Это может привлечь как криптоэнтузиастов, верящих в долгосрочный рост BTC, так и спекулянтов, желающих вложиться в мем-проект с юридическим бэкграундом.</p><h2>Что дальше</h2><p>Ceiniog Coin пока на ранней стадии, и многие эксперты сомневаются в его юридической и технической жизнеспособности.</p><p>Но в мире, где Dogecoin стоит миллиарды, а мемы становятся инвестиционными инструментами, «токен потерянного миллиарда» звучит вполне по-рыночному.</p>]]></content:encoded>
    </item>
    <item>
      <title>Чиповые войны: как кризис железа озолотил программистов</title>
      <link>https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov</link>
      <comments>https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Сахаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov</guid>
      <description><![CDATA[<p>Разберемся, как дефицит кремния породил золотую лихорадку среди разработчиков и почему программисты стали дороже железа.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chipovye-vojny--kak-krizis-zheleza-ozolotil-programmistov">Чиповые войны: как кризис железа озолотил программистов</a>»</p>]]></description>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tesla]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[Samsung]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[NVIDIA]]></category>
      <category><![CDATA[AMD]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 14 Jul 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Два года назад GPU стоила как подержанная Camry. Сегодня за нее дают как за новую Tesla. Пока весь мир страдает от нехватки чипов, программисты неожиданно превратились в самый дорогой ресурс на планете. Когда железа не хватает, компании готовы платить любые деньги за тех, кто умеет выжимать максимум из ограниченных ресурсов.</p><p>В мае 2024 по всему миру <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">разлетелись</a> скриншоты писем от HR с внезапными повышениями зарплат на 40%. Текучка кадров в сфере производства полупроводников выросла с 40% до 53%, и теперь компании дерутся за каждого специалиста.</p><h2>Масштаб проблемы</h2><p>169 отраслей <a href="https://www.spglobal.com/mobility/en/research-analysis/briefcase-another-semiconductor-shortage-may-be-coming.html">пострадали</a> из-за дефицита чипов — от автомобилестроения до бытовой техники. Tesla и Volvo останавливали заводы, цены на подержанные автомобили <a href="https://www.embedded.com/engineering-shortage/">выросли</a> на 10% за квартал. Даже стиральные машины подорожали из-за недостатка микросхем.</p><p>Но настоящая битва кипит в кабинетах бигтехов. США заблокировали экспорт технологий в Китай, Европа <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">запустила</a> программу на €43 миллиарда, а Азия <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">удерживает</a> 77% мирового производства чипов.</p><p>Технологическая война изменила ИТ-индустрию навсегда. Компании теперь не могут просто купить больше серверов — приходится искать тех, кто умеет делать софт быстрее и эффективнее. Apple создала собственные M1 и M2, Google разработал TPU, Amazon — процессоры Graviton. Каждый хочет стать независимым от поставок.</p><h2>Обрушение цепей поставок</h2><p>В 2020 автопроизводители массово отменили заказы чипов, думая, что спрос на машины упадет. Но случилось обратное — спрос на автомобили <a href="https://www.embedded.com/engineering-shortage/">восстановился</a> быстрее ожидаемого во второй половине года, а производственные линии уже переключились на потребительскую электронику.</p><p>Мир оказался в заложниках у нескольких азиатских гигантов. Тайвань <a href="https://www.embedded.com/how-the-chip-shortage-deepens-the-engineering-skills-crisis/">контролирует</a> 65% мирового рынка чипов, TSMC делает процессоры для Apple, AMD и NVIDIA. Samsung доминирует в производстве памяти и накопителей.</p><p>Различные отрасли посыпались, как домино. Время ожидания полупроводников Broadcom выросло до 22 недель против 12 недель в феврале 2020. Автоиндустрия потеряла миллионы машин, дата-центры замедлили расширение, даже PlayStation 5 стали дефицитом.</p><p>США первыми объявили технологическую войну. Пошлины уже изменили процессы производства у Nvidia, Intel и AMD. Китай ответил санкциями против Micron Technology.</p><p>Ключевые игроки <a href="https://news.ycombinator.com/item?id=33436834">разделились</a> на два лагеря. На стороне США — Intel, NVIDIA, AMD, Qualcomm. Китай развивает SMIC и вкладывает миллиарды в собственные технологии. TSMC и Samsung балансируют между сторонами, строя заводы и в Америке, и в Азии.</p><p>Национальные программы превратились в гонку вооружений. CHIPS Act выделил $50 миллиардов на американское производство. Европейская программа нацелена на производство 20% мировых чипов к 2030 году. Китай <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">инвестирует</a> $143 миллиарда в полупроводники.</p><h2>Гонки в мире чипов</h2><p>Рынок AI-чипов взлетел в 15 раз за десятилетие. Компании <a href="https://www.marketsandmarkets.com/Market-Reports/artificial-intelligence-chipset-market-237558655.html">научились</a> делать процессоры умнее, но каждое новое поколение требует больше денег и экспертизы.</p><p>Техпроцессы сжимаются в размере. TSMC освоила 3-нанометровый процесс, Samsung догоняет. Каждый нанометр <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">стоит</a> миллиарды инвестиций и годы разработки. Apple M4 имеет Neural Engine в три раза быстрее M1, но производство одного такого чипа <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">требует</a> сотни инженеров.</p><p>AI-чипы стали новой золотой жилой. Intel <a href="https://www.rootsanalysis.com/ai-chip-market">запустила</a> Gaudi 3, который на 50% быстрее NVIDIA H100. NVIDIA ответила платформой Blackwell с 208 миллиардами транзисторов. Qualcomm Cloud AI 100 <a href="https://www.techtarget.com/searchDataCenter/tip/Top-AI-hardware-companies">обошел</a> H100 по энергоэффективности — 227 запросов на ватт против 108.</p><p>Квантовые технологии пока остаются в лабораториях, но IBM и Google уже тестируют прототипы. Нейроморфные чипы, которые имитируют работу мозга, обещают революцию в энергоэффективности.</p><p>Делать чипы стало сложнее и дороже. Современная фабрика стоит $20 миллиардов, срок окупаемости — 10 лет. Поэтому крупные компании строят собственные решения: Apple создала M-серию, Google — TPU, Amazon — Graviton.</p><p>Компании поменяли философию. Вместо покупки большего количества серверов они <a href="https://www.edge-ai-vision.com/2024/04/ai-chip-market-to-grow-10x-in-the-next-ten-years-and-become-a-300-billion-industry/">нанимают</a> инженеров для оптимизации кода. Netflix <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10186304/">использует</a> персонализированные рекомендации и алгоритмы ранжирования для оптимизации вычислений. Meta* оптимизировала машинное обучение и уменьшила количество GPU на 40%.</p><p>Массовый переход на ARM изменил рынок. Amazon перевела часть ресурсов на собственные процессоры. Microsoft адаптировала Windows под ARM-архитектуру. Даже Intel вынуждена выпускать подобные решения.</p><p>Россия также <a href="https://www.reuters.com/technology/russias-yandex-reports-record-annual-revenues-2024-2025-02-20/">планирует</a> наладить массовое производство 28 нм чипов к 2030 году. Росатом присоединился к разработке нейроморфных процессоров. Сбер тестировал отечественный Эльбрус-8С, но выявил проблемы с памятью и оптимизацией.</p><p>*– компания признана в РФ экстремистской и запрещена.</p><h2>Айтишники в центре шторма</h2><p>Зарплаты разработчиков взлетели вместе с ценами на чипы. Средняя зарплата embedded-инженера <a href="https://www.salary.com/research/salary/listing/performance-engineer-hourly-wages">выросла</a> до $153,383, а топовые специалисты получают до $175,000 в год. Performance-инженеры зарабатывают в среднем $100,522, но спрос превышает предложение. Оптимизация под ARM-архитектуру, разработка драйверов для AI-ускорителей, программирование FPGA — навыки, за которые компании готовы переплачивать. IT-зарплаты в Северной Америке выросли в среднем до $113,211.</p><p>Embedded-разработчики неожиданно стали востребованнее ML-инженеров. Когда Tesla не может купить нужные чипы, она нанимает программистов, которые выжмут из имеющихся процессоров максимум. Один такой специалист экономит компании миллионы долларов на железе.</p><p>География возможностей сместилась. Калифорния лидирует по зарплатам — $126,707 в Сан-Хосе, но спрос есть везде. Даже компании из Техаса и Флориды <a href="https://www.salary.com/research/salary/listing/embedded-software-engineer-salary">переманивают</a> embedded-разработчиков зарплатами в $120,000-150,000.</p><p>Системные администраторы, знающие Kubernetes и контейнеризацию, стали дефицитом. Компании переходят на микросервисы и edge-решения — нужны те, кто умеет управлять распределенной инфраструктурой.</p><p>Прогноз на ближайшие пять лет простой: спрос на оптимизацию будет только расти. Эра дешевого железа закончилась. Началась эра дорогих мозгов. Чем сложнее становятся чипы, тем больше нужно программистов, которые умеют с ними работать.</p><h2>Свет в конце туннеля</h2><p>Эксперты расходятся в прогнозах восстановления. CEO Intel Пат Гелсингер <a href="https://en.wikipedia.org/wiki/2020%E2%80%932023_global_chip_shortage">ожидал</a> дефицит до 2024 года, но рынок полупроводников уже показал рост на 15,2% в начале года. К 2023-му автоиндустрия в основном восстановилась, глобальное производство автомобилей выросло на 3%.</p><p>Новые фабрики меняют географию производства. Intel строит заводы в Аризоне за $20 миллиардов и расширяется в Огайо. TSMC открыла завод в Японии в феврале 2024 и планирует второй к 2027 году. Samsung инвестирует в производство в Техасе.</p><p>Европа также <a href="https://www.techrepublic.com/article/global-chip-shortage-cheat-sheet/">входит</a> в игру. European Chips Act нацелен на производство 20% мировых чипов к 2030 году с бюджетом €43 миллиарда. Intel проектирует заводы в Ирландии и Германии, Micron строит завод в Нью-Йорке, а GlobalFoundries расширяется на Мальте.</p><p>Будущее отрасли — в диверсификации. Тайвань по-прежнему контролирует 65% производства, но объемы будут снижаться. К 2030 году США планируют удвоить свою долю в мировом производстве чипов.</p><p>За четыре года индустрия изменилась больше, чем за предыдущее десятилетие. Компании научились строить собственные чипы, программисты — выжимать максимум из доступных ресурсов, а правительства — инвестировать в технологическую независимость.</p><p>Бигтехи готовы переплачивать за надежность поставок и «мозги». Программисты в выигрыше: чем сложнее становится производство чипов, тем больше нужно людей, которые умеют эффективно их использовать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что скрывает ChatGPT: тайные символы в ответах нейросети</title>
      <link>https://tproger.ru/articles/chto-skryvaet-chatgpt--tajnye-simvoly-v-otvetah-nejroseti</link>
      <comments>https://tproger.ru/articles/chto-skryvaet-chatgpt--tajnye-simvoly-v-otvetah-nejroseti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Сахаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-skryvaet-chatgpt--tajnye-simvoly-v-otvetah-nejroseti</guid>
      <description><![CDATA[<p>В статье расскажем о невидимых метках, которые оставляет ChatGPT во время работы, а также о «мировом заговоре», который возник из-за этого, и как удалось его раскрыть.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-skryvaet-chatgpt--tajnye-simvoly-v-otvetah-nejroseti">Что скрывает ChatGPT: тайные символы в ответах нейросети</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Hardware]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Unicode]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Оружие]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 04 Jul 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>ChatGPT оставляет в текстах невидимые метки. Звучит как начало фильма про ИИ-заговор, но это реальность. Когда эта история впервые появилась в новостях, люди подумали о том, что нейросети шпионят за ними.</p><p>Представьте: студент пишет эссе в ChatGPT, сдает работу, а через неделю преподаватель находит странные символы в его тексте. Это не мистика, а обычная техническая особенность, которая превратилась в детектив в духе Дэна Брауна.</p><p>Пора узнать о том, как обычные пользователи случайно раскрыли «заговор» искусственного интеллекта, почему в интернете началась паника о скрытых водяных знаках, и что на самом деле происходит с новыми моделями OpenAI.</p><h2>Первые улики</h2><p>Все началось в апреле 2025 года. Студенты университетов стали <a href="https://trashbox.ru/link/2025-04-21-chatgpt-vstraivaet-vodyanye-znaki">жаловаться</a> на странные проблемы с текстами ChatGPT. Текстовый редактор Word вел себя странно при копировании эссе. Некоторые символы странно выглядели и в редакторах кода.</p><p>Первыми в теме начали <a href="https://www.rumidocs.com/newsroom/new-chatgpt-models-seem-to-leave-watermarks-on-text">разбираться</a> специалисты из Rumi. Они создавали инструменты для поиска ИИ в курсовых и контрольных, поэтому привыкли анализировать тексты. При тестировании новых моделей GPT o3 и o4-mini команда обнаружила, что нейросеть встраивает в сгенерированные ответы Unicode-символы.</p><p>При этом OpenAI как раз запустила бесплатный доступ к ChatGPT для студентов до конца учебного года, как раз во время сессии. Неразрывные пробелы <a href="https://t-j.ru/news/are-chatgpt-watermarks-real/">появлялись</a> только в длинных ответах — например, если ввести запрос «Напиши эссе о министерстве образования». Хотя некоторые пользователи заметили, что невидимые символы встраиваются и в короткие ответы.</p><p>Разработчики начали <a href="https://itc.ua/en/news/the-new-chatgpt-models-leave-extra-characters-in-the-text-they-can-be-detected-through-word/">обсуждать</a> тему на форумах. Пользователи делились скриншотами из Sublime Text и VS Code, где обычные пробелы подсвечивались как спецсимволы. Кто-то понял, что в Word можно нажать Ctrl+Shift+8 — сочетание клавиш сразу находит водяные знаки ChatGPT и отображает их как кружочки.</p><p>Такие символы не видно в чате с нейросетью и при копировании текста в Word, гугл-документы, мессенджеры или браузер. OpenAI нигде <a href="https://news.finance.ua/ru/chatgpt-stal-tayno-markirovat-svoi-teksty">не сообщала</a> об этом нововведении — вероятно, специально.</p><figure><img src="https://media.tproger.ru/user-uploads/115386/2025-06-19/5d095e83-7ece-4283-ba97-e93a4409b24c.jpg" alt="" /><figcaption>Непечатные символы, которые обнаружила команда Rumi в одном из текстов ChatGPT</figcaption></figure><h2>Охота на невидимку</h2><p>Команда Rumi тестировала новые модели и <a href="https://www.rumidocs.com/newsroom/new-chatgpt-models-seem-to-leave-watermarks-on-text">заметила</a> странность — длинные эссе выглядели нормально, но что-то было не так. Когда разработчики скопировали текст в редактор Sublime, то увидели россыпь странных символов на месте обычных пробелов.</p><p>Виновником <a href="https://gadgetstouse.com/blog/2025/04/25/detect-hidden-watermark-in-chatgpt-generated-text/">оказался</a> Unicode-символ U+202F — узкий неразрывный пробел. Он практически неотличим от обычного пробела, но имеет совершенно другой код. Для программистов это как найти подделку с помощью ультрафиолета.</p><p>Энтузиасты быстро создали инструменты для охоты на невидимку. SoSciSurvey научился находить 34 типа скрытых Unicode-символов — от пробела нулевой ширины до длинных тире.</p><p>Самым простым способом отыскать «партизан» стала комбинация клавиш. В Word нужно нажать Ctrl+Shift+8 — обычные пробелы превращаются в точки, а водяные знаки ChatGPT отображаются кружочками. Sublime Text <a href="https://gadgetstouse.com/blog/2025/04/25/detect-hidden-watermark-in-chatgpt-generated-text/">показывает</a> символы еще нагляднее — можно искать конкретно \u202F через функцию поиска.</p><p>Удалить символы оказалось еще проще. Любой может открыть VS Code или Sublime Text, найти U+202F через поиск и заменить на обычные пробелы. Водяные знаки исчезают за секунды.</p><p>Однако удаление скрытых символов не влияет на обнаружение ИИ-контента детекторами. Текст все равно определяется как сгенерированный. Получается, водяные знаки — это дополнительная, а не основная защита от мухлежа при создании работ.</p><h2>Заговор разрастается</h2><p>В соцсетях началась паника. Пользователи обвиняли OpenAI в том, что она специально выявляет студентов-читеров. Совпадение с бесплатным доступом для учащихся добавило масла в огонь.</p><p>Блогеры рисовали мрачные картины тотальной слежки. Якобы компания тайно <a href="https://mitsloan.mit.edu/ideas-made-to-matter/mit-study-ai-chatbot-can-reduce-belief-conspiracy-theories">помечает</a> каждого пользователя через невидимые символы. Кто-то даже предполагал, что OpenAI готовит массовые облавы на студентов перед защитой дипломов.</p><p>Особенно <a href="https://dl.acm.org/doi/10.1145/3614419.3644014">бурлили</a> студенческие форумы на Reddit. Учащиеся делились страшилками о том, как преподаватели внезапно начали проверять работы через редакторы кода. Появились гайды по обходу любых ИИ-детекторов.</p><p>Конспирологи забыли об одной детали — водяные знаки удаляются за пару кликов через поиск в документе.</p><p>Второй прокол теоретиков заговора — техническая реальность. OpenAI уже несколько лет разрабатывает технологию водяных знаков, но так и не выпустила ее.</p><p>К тому же компания открыто заявляла о работе над детекторами ИИ-контента. «Заговор» рассыпался при первом же фактчекинге.</p><p>Но паника уже распространилась. Студенты массово <a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/openai-has-built-a-text-watermarking-method-to-detect-chatgpt-written-content-company-has-mulled-its-release-over-the-past-year">скачивали</a> инструменты для «очистки текстов», а преподаватели начали подозревать каждую работу. История с невидимыми символами превратилась из мелкого бага в огромный снежный ком из паники и домыслов.</p><h2>Прозаичная реальность</h2><p>OpenAI наконец прокомментировала ситуацию. Официальный ответ звучал предельно скучно: «Это не водяные знаки, а просто особенность масштабного обучения с подкреплением». Никакого заговора, никакой слежки — банальный артефакт.</p><p>При обучении нейросети с подкреплением модель <a href="https://openai.com/index/learning-to-reason-with-llms/">получает </a>«награды» за правильные ответы и «штрафы» за неправильные. В процессе миллионов таких циклов система случайно научилась вставлять специальные символы. Не потому, что так задумывали разработчики. Просто в данных эти символы встречались и улучшали результат.</p><p>Нейросеть приобрела «привычку». Никто ее этому не учил, но действие «отложилось в подсознании».</p><p>В обучении с подкреплением множество таких сюрпризов. Например, алгоритмы учатся играть в видеоигры и внезапно <a href="https://news.ycombinator.com/item?id=41600179">находят</a> баги, которые не замечали разработчики. Или начинают использовать физику игрового движка нестандартными способами. ChatGPT просто продолжил традицию — научился ставить невидимые символы там, где человек поставил бы пробел.</p><p>Конспирологам пришлось сворачиваться. Вместо эпического противостояния студентов и корпораций получился рассказ о том, как нейросеть случайно освоила цифровую каллиграфию.</p><h2>Дело раскрыто</h2><p>Парадокс в том, что разоблачить «заговор» оказалось проще, чем его придумать. Один официальный комментарий OpenAI — и вся конструкция рухнула.</p><p>Урок простой: перед тем как кричать о заговоре, стоит <a href="https://www.wissenschaftskommunikation.de/why-we-shouldnt-panic-about-the-rise-of-conspiracy-theories-75843/">потратить</a> пять минут на фактчекинг. Google по запросу «reinforcement learning side effects» выдаст тонны статей о побочках машинного обучения. Но кто же будет искать скучные объяснения, когда есть яркие теории?</p><p>В следующий раз, когда увидите пост про «тайное оружие техногигантов», вспомните про символы U+202F.</p><p>Над теориями заговора можно только смеяться. Больше — в нашем <a href="https://t.me/+JWynXkY6aXcxZGNi">тг-канале</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как защитить pet-проект почти бесплатно, но эффективно</title>
      <link>https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno</link>
      <comments>https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Гринь]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno</guid>
      <description><![CDATA[<p>Как эффективно защитить pet-проект: управление секретами, логирование, бэкапы, локальные туннели и другие базовые правила безопасности
</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-zashhitit-pet-proekt-pochti-besplatno--no-effektivno">Как защитить pet-проект почти бесплатно, но эффективно</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Slack]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Pet-проекты]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Pet-проекты помогают развивать профессиональные навыки и воплощать собственные идеи, но не стоит забывать об их информационной безопасности. Делать сервис и не думать об инфобезе — всё равно что строить дом без фундамента: выглядит добротно, но всё может рухнуть в самый неожиданный момент. Разберём, как недорого и эффективно защитить проект.</p><h2>Что такое pet-проект и зачем его защищать</h2><p><b>Pet-проект</b> (от английского pet — «домашний питомец») — тренировочный проект, который разработчик создаёт в свободное время по собственному желанию. Обычно их делают, чтобы освоить новую технологию, пополнить портфолио или поучаствовать в хакатонах.</p><p>Такие проекты часто воспринимают как что-то «несерьёзное», но пренебрежение информационной безопасностью может привести к неприятным последствиям. Злоумышленники используют уязвимости pet-проектов для получения доступа к ресурсам разработчика, кражи данных и будущих атак на более крупные цели.</p><p>Кроме того, защита pet-проекта — важный навык, который высоко ценится работодателями.</p><p>Рассмотрим основные правила кибербезопасности, которые нужно учитывать при работе над pet-проектом.</p><h2>Безопасное управление секретами</h2><p><b>Секреты</b> — это чувствительные данные, такие как пароли, токены доступа, ключи API, SSH-ключи, сертификаты и другие данные, которые обеспечивают аутентификацию и шифрование. Если добавить секреты в код, злоумышленники могут получить полный контроль над вашей инфраструктурой.</p><h3>Какие правила нужно соблюдать</h3><ul><li>Не храните секреты в коде. Храните секреты в отдельных файлах env. и добавьте эти файлы в .gitignore, чтобы они не попадали в репозиторий.</li><li>Придерживайтесь принципа минимальных привилегий. Каждый сервис должен иметь только те права, которые необходимы для выполнения своих задач.</li><li>Регулярно обновляйте секреты. Меняйте токены и пароли периодически, особенно после обнаружения утечек или изменений в проекте.</li><li>Используйте менеджеры секретов. Популярные сервисы: Doppler, HashiCorp Vault, AWS Secrets Manager, 1Password Developer Tools.</li><li>Мониторьте утечки. Можно использовать такие инструменты, как GitGuardian, TruffleHog, Gitleaks.</li><li>Шифруйте секреты. Используйте библиотеки типа cryptography в Python и подключайте шифрование на уровне операционной системы.</li></ul><h2>Безопасность CI/CD</h2><p><b>Пайплайн CI/CD</b> (Continuous Integration / Continuous Delivery) — автоматизированный процесс сборки, тестирования и развёртывания приложений. Он помогает автоматически интегрировать код и деплоить его на различные среды.</p><p>Если злоумышленник получит доступ к пайплайну, он может внедрить вредоносный код в ваше приложение, остановить весь процесс разработки или развёртывания, украсть данные пользователей и т.д.</p><h3>Способы защиты пайплайна</h3><ul><li>Моделируйте угрозы. Оцените, какие угрозы наиболее вероятны на каждом этапе пайплайна: от коммита кода до деплоя на сервер.</li><li>Проверяйте зафиксированный код. Используйте статический анализ кода для автоматического поиска уязвимостей.</li><li>Защитите Git-репозитории. Настройте двухфакторную аутентификацию (2FA), ограничьте доступ к репозиториям, используйте обязательную проверку пул-реквестов двумя разработчиками.</li><li>Изолируйте пайплайн. Не запускайте его на том же сервере, где крутится ваше продакшн-приложение.</li></ul><p>Дополнительно стоит шифровать секреты в пайплайне и минимизировать их передачу между этапами сборки.</p><h2>Сервисы мониторинга и логирования</h2><p><b>Логирование</b> — запись событий, ошибок и других данных о работе приложения в специальные файлы или базы данных. По сути, это дневник.</p><p><b>Мониторинг</b> — наблюдение за состоянием приложения, инфраструктуры или сервисов в реальном времени для своевременного выявления падения сервера, роста ошибок и других проблем.</p><p>Анализ логов помогает выявлять баги, попытки несанкционированного доступа, долгие запросы, ошибки базы данных. Мониторинг позволяет мгновенно реагировать на сбои, а также с его помощью вы узнаете, хватает ли приложению серверных мощностей.</p><h3>Примеры популярных сервисов</h3><p><a href="https://logtail.ru/">Logtail </a>— простой инструмент для сбора и анализа логов, есть бесплатный тариф.</p><p><a href="https://github.com/paper-trail-gem/paper_trail">Papertrail</a> — удобный сервис для быстрого поиска по логам, бесплатный план для небольших проектов (10 Мб в день).</p><p><a href="https://docs.sentry.io/">Sentry</a> —  хорош для отслеживания ошибок в приложениях на клиентской стороне и сервере.</p><p><a href="https://betterstack.com/">BetterStack</a> — мониторинг доступности сайтов и серверов с бесплатными уведомлениями об инцидентах по почте, через SMS и Slack.</p><p><a href="https://grafana.com/pricing/">Grafana Cloud Free</a> — мониторинг с красивыми дашбордами, бесплатный лимит ресурсов до 10 тыс. серий данных, 50 ГБ трафика.</p><p><a href="https://prometheus.io/">Prometheus</a> и <a href="https://grafana.com/">Grafana</a> — Prometheus собирает метрики, Grafana их визуализирует.</p><p><a href="https://uptimerobot.com/">UptimeRobot</a> — проверка доступности вашего проекта каждые 5 минут, бесплатный тариф на 50 мониторингов.</p><h2>Бэкап и восстановление данных</h2><p><b>Бэкап</b> — это создание резервной копии данных, которую можно использовать для восстановления в случае утраты или повреждения оригиналов. Может показаться, что для pet-проекта это излишне, однако от случайных удалений данных, взломов серверов, утечек данных никто не застрахован. А ещё можно откатиться к рабочей версии, если будут ошибки в коде и деплойменте.</p><h3>Как сделать бэкап пошагово</h3><ol><li>Определите данные, которые необходимо бэкапить: какие данные критически важны, какие можно восстановить вручную.</li><li>Выберите место хранения: облачные сервисы, собственные серверы, внешние носители, Git-репозиторий.</li><li>Выберите тип бэкапа: при полном копируются все данные целиком, при инкрементном — изменения с момента последнего копирования, при дифференциальном — изменения с момента последнего полного бэкапа.</li><li>Настройте автоматизацию, чтобы не забывать делать бэкапы вручную. Можно использовать скрипты, планировщики задач или бэкап-сервисы.</li><li>Проверьте бэкап. Проведите тестовое восстановление.</li><li>Определите частоту бэкапа. Например, можно проводить полный бэкап раз в неделю и инкрементные бэкапы каждый день.</li><li>Защитите чувствительные данные.</li></ol><h2>Локальные туннели</h2><p>При разработке pet-проекта может возникнуть необходимость показать результат внешнему миру. Кроме того, многие внешние сервисы, такие как платёжные системы и мессенджеры, тоже требуют «боевые» URL для отправки запросов. Однако открывать порты на своём устройстве напрямую небезопасно. Локальные туннели создают временный внешний URL-адрес без развертывания на реальном сервере.</p><p>Когда вы запускаете туннель через специальный инструмент, он:</p><ul><li>устанавливает зашифрованное соединение между вашим компьютером и своим публичным сервером;</li><li>создаёт внешний адрес;</li><li>пересылает все запросы, которые приходят на этот адрес, вашему локальному приложению.</li></ul><p>Трафик при этом шифруется и проходит через защищённый канал.</p><h3>Примеры инструментов</h3><p><a href="https://ngrok.com/?ref=gobigger">Ngrok </a>— самый известный инструмент для быстрого создания туннелей. Есть бесплатный тариф.</p><p>Порты от<b> VSCode</b> — отличное решение для пользователей Visual Studio Code, удобно для быстрой демонстрации.</p><p><a href="https://dev.vk.com/ru/libraries/tunnel">VK Tunnel</a> — российская альтернатива, подходит для работы через VK Cloud.</p><p><b>Tuna</b> и <a href="https://xtunnel.ru/">xTunnel </a>— простые в использовании решения, есть бесплатные тарифы.</p><h2>Чек-лист по инфобезу для тех, кто делает pet-проект</h2><ol><li>Регулярно обновляйте зависимости. Используйте автоматические инструменты, например, Dependabot или npm audit.</li><li>Настройте базовые HTTP-заголовки безопасности. Добавьте заголовки Content-Security-Policy, X-Frame-Options, Strict-Transport-Security, чтобы минимизировать риск XSS, Clickjacking и других атак.</li><li>Используйте бесплатные SSL-сертификаты. Подключите HTTPS через бесплатные сервисы, например, Let's Encrypt.</li><li>Очищайте и валидируйте ввод данных. Фильтрация и валидация данных защитит от SQL-инъекций и XSS.</li><li>Создайте отдельные учётные записи для разных сервисов. Не используйте одну и ту же учётную запись везде.</li><li>Минимизируйте доступы к базе данных. Если сервису нужно только читать, не давайте права на запись или удаление.</li><li>Используйте бесплатные инструменты для сканирования уязвимостей. Проверьте код через такие сканеры, как SonarQube Community Edition, Snyk, OWASP ZAP.</li><li>Делайте резервные копии. Настройте автоматические бэкапы базы данных и важных файлов.</li><li>Не храните секреты в коде. Используйте .env файлы и убедитесь, что они добавлены в .gitignore.</li><li>Включите двухфакторную аутентификацию (2FA). На всех сервисах, где это возможно, включите 2FA для дополнительной защиты.<br /></li></ol><p>А больше про разработку и все, что с ней связано, в нашем<a href="https://t.me/tproger_web"> тг-канале</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>ChatGPT превращается в новый Гугл для новостей: что означает интеграция с The Washington Post и другими медиа</title>
      <link>https://tproger.ru/articles/chatgpt-prevrashhaetsya-v-novyj-gugl-dlya-novostej--chto-oznachaet-integraciya-s-the-washington-post-i-drugimi-media</link>
      <comments>https://tproger.ru/articles/chatgpt-prevrashhaetsya-v-novyj-gugl-dlya-novostej--chto-oznachaet-integraciya-s-the-washington-post-i-drugimi-media?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Михаил Сахаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chatgpt-prevrashhaetsya-v-novyj-gugl-dlya-novostej--chto-oznachaet-integraciya-s-the-washington-post-i-drugimi-media</guid>
      <description><![CDATA[<p>ChatGPT стала новостником с контентом от топовых медиа. Но эта революция расколола инфополе на два лагеря: одни заключают выгодные партнерства, другие подают многомиллиардные иски. Выиграют ли от этого пользователи — разберемся в статье.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chatgpt-prevrashhaetsya-v-novyj-gugl-dlya-novostej--chto-oznachaet-integraciya-s-the-washington-post-i-drugimi-media">ChatGPT превращается в новый Гугл для новостей: что означает интеграция с The Washington Post и другими медиа</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[YouTube]]></category>
      <category><![CDATA[Взлом]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Промпты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 12 Jun 2025 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Представьте: вы спрашиваете ChatGPT о последних событиях в экономике, а она отвечает свежими цитатами из Financial Times со ссылками на статьи. Или интересуетесь политическими новостями — и получаете сводку от The Washington Post. Это уже не фантастика, а реальность.</p><h2>Google — всё?</h2><p>ChatGPT трансформируется из простого ассистента в полноценный агрегатор проверенной информации. Теперь пользователи получают ответы с лицензированным контентом из топовых медиа: <a href="https://openai.com/global-affairs/the-washington-post-partners-with-openai">The Washington Pos</a>t, <a href="https://www.bloomberg.com/news/articles/2024-04-29/openai-strikes-deal-to-use-financial-times-content-in-chatgpt">Bloomberg</a>, Financial Times и <a href="https://www.theverge.com/news/653500/the-washington-post-openai-chatgpt-partnership">других изданий</a>.</p><p>Меняется сам способ получения информации. Пользователь больше не гуглит, а сразу видит структурированный ответ с цитатами, саммари и прямыми ссылками на источники. Эта трансформация напоминает переход от библиотечного каталога к личному секретарю, который не только находит нужные книги, но и выбирает самые важные страницы.</p><p>Питер Элкинс-Уильямс, глава отдела глобальных партнерств The Washington Post, <a href="https://openai.com/global-affairs/the-washington-post-partners-with-openai/#:~:text=%E2%80%9CWe%E2%80%99re%20all%20in%20on%20meeting%20our%20audiences%20where%20they%20are%2C%E2%80%9D%20said%20Peter%20Elkins%2DWilliams%2C%20Head%20of%20Global%20Partnerships%20at%20The%20Washington%20Post.%20%E2%80%9CEnsuring%20ChatGPT%20users%20have%20our%20impactful%20reporting%20at%20their%20fingertips%20builds%20on%20our%20commitment%20to%20provide%20access%20where%2C%20how%20and%20when%20our%20audiences%20want%20it.%E2%80%9D">подчеркивает</a>, что это решение отражает стратегию издания «встречать аудиторию там, где она находится». Варун Шетти из OpenAI <a href="https://openai.com/global-affairs/the-washington-post-partners-with-openai/#:~:text=%E2%80%9CMore%20than%20500,they%20need%20it.%E2%80%9D">отмечает</a>, что компания стремится направлять свыше 500 миллионов еженедельных пользователей ChatGPT к «своевременной, достоверной информации».</p><p>При запросе о текущих событиях ChatGPT больше не ограничивается информацией из предобучения, которое неизбежно устаревает. Вместо этого система предоставляет актуальный контент из авторитетных медиа. Можно сказать, что ИИ превращается в умного редактора новостной ленты, персонализированной под пользователя.</p><h2>Два лагеря СМИ: партнерство и судебные иски</h2><p>Мир медиакомпаний разделился на два противоположных лагеря, сформировав параллельные стратегии взаимодействия с ИИ.</p><p>В первом лагере находятся компании, которые рады сотрудничать с цифровыми проектами. OpenAI заключила соглашения с 20 издательскими домами, охватывающими свыше 160 газет и журналов на более чем 20 языках. Среди них The Washington Post, Financial Times, Time, Axel Springer (владелец Politico, Business Insider), Condé Nast (Vogue, The New Yorker, GQ) и Hearst (Houston Chronicle, Esquire, Cosmopolitan).</p><p>Суть этих сделок заключается в лицензировании контента, доступе к API и направлении трафика обратно к издателям в обмен на возможность использовать и цитировать материалы. Для изданий это не просто новый источник дохода, но и канал дистрибуции — так они привлекают аудиторию, которая никогда бы не зашла на сайт. Хотя финансовые детали часто остаются конфиденциальными, известно, что некоторые соглашения включают многомиллионные выплаты.</p><p>Во втором лагере находятся компании, вставшие в оппозицию нейросетям. The New York Times, The Center for Investigative Reporting, Ziff Davis, а также объединившиеся в коллективный иск The Intercept, Raw Story и AlterNet подали в суд против OpenAI. Издания <a href="https://www.npr.org/2025/03/26/nx-s1-5288157/new-york-times-openai-copyright-case-goes-forward#:~:text=Lawyers%20for%20The%20New%20York%20Times%20believe%20that%20the%20paper%27s%20articles%20are%20one%20of%20the%20biggest%20sources%20of%20copyrighted%20text%20that%20OpenAI%20used%20to%20build%20ChatGPT%20into%20the%20premier%20AI%20chatbot%2C%20and%20they%20allege%20that%20OpenAI%20violated%20copyright%20laws%20in%20its%20siphoning%20of%20the%20newspaper%27s%20journalism.">утверждают</a>, что несанкционированное использование материалов для обучения ИИ нарушает авторские права и наносит ущерб их бизнес-модели.</p><p>NYT в своем иске <a href="https://harvardlawreview.org/blog/2024/04/nyt-v-openai-the-timess-about-face/?utm_source=chatgpt.com">заявляет</a>, что модели OpenAI и Microsoft «угрожают качественной журналистике»    и лишают компании денег за трафик на их сайты. Компания требует многомиллиардную компенсацию и уничтожение моделей, обученных на ее материалах — требование, которое технически практически невозможно выполнить.</p><p>OpenAI отвечает на эти обвинения, заявляя, что NYT «взломала» ChatGPT, используя «фейковые промпты», чтобы собрать доказательства для иска. По мнению компании, обычные пользователи не применяют чат-бот таким образом, а статьи составляют лишь «крошечную часть разнообразных наборов данных», использованных для обучения моделей.</p><h2>Media Manager: инструмент контроля или шаг к прозрачности?</h2><p>В разгар дискуссий о правомерности использования контента OpenAI анонсировала разработку инструмента Media Manager — интерфейса для медиакомпаний, который должен сделать использование их материалов в их модели более прозрачным.</p><p>Издатели получили бы возможность устанавливать правила и ограничения, полностью исключать определенные материалы из обучения, а также получать аналитику о показах и использовании своего контента.   Компания так хотела защититься от постоянных судебных исков и выйти на контакт с авторами статей.</p><p>Однако реализация этой инициативы оказалась под вопросом. Несмотря на то, что OpenAI обещала запустить Media Manager к 2025 году, но этого так и не случилось. По <a href="https://techcrunch.com/2025/01/01/openai-failed-to-deliver-the-opt-out-tool-it-promised-by-2025/">данным</a> источников, знакомых с ситуацией, разработка не рассматривалась как приоритетная задача внутри компании. Один из бывших сотрудников OpenAI даже не смог вспомнить, чтобы хоть кто-то плотно занимался этим проектом.</p><p>В медиасообществе инициативу восприняли неоднозначно. Одни издатели рассматривают ее как шаг к более справедливым отношениям и прозрачности, подобно тому как инструменты монетизации в YouTube позволили создателям контента получать доход от своих работ. Другие видят в этом лишь попытку OpenAI избежать полноценного лицензирования контента.</p><p>Разработка Media Manager «заглохла». Это значит, что OpenAI сделала ставку на прямые партнерства с крупными издателями вместо создания универсального инструмента для всех правообладателей. Такая стратегия выгодна для крупных компаний, но оставляет практически бесправными малые издания и исследовательские организации.</p><h2>А что под капотом?</h2><p>Проект OpenAI сложный и многоуровневный, он связывает генеративный ИИ с контентом, опубликованным в сети. На первом уровне — слое запросов — система анализирует пользовательский вопрос, определяя, нужно ли обращаться к актуальным новостным источникам. Если пользователь спрашивает о последних событиях в экономике или политике, система понимает, что нужны свежие данные из СМИ, а не только базовые знания модели.</p><p>Далее включается слой маршрутизации. Он направляет запрос к API соответствующих партнерских медиа, выбирая наиболее подходящие источники для конкретной темы. Например, если нужно узнать о финансовых рынках, предпочтение может отдаваться Financial Times, а при запросе о международной политике — The Washington Post.</p><p>Полученные данные обрабатываются на следующем уровне — слое обработки. Здесь формируется структурированный ответ, органично интегрирующий информацию из медиаисточников с базовыми знаниями модели. Система выделяет ключевые факты, обобщает контекст и создает целостную картину, понятную пользователю.</p><p>Последним выступает слой атрибуции, который обеспечивает корректное цитирование и оформление ссылок на исходные материалы. Это не только юридическое требование лицензионных соглашений, но и этический момент. Так пользователи могут оценить авторитетность источника и сформировать доверие к нему.</p><p>Механизмы обновления данных работают с различной частотой в зависимости от типа контента. Для «молний» обновления происходят практически в реальном времени — как только статья появляется на сайте издания, она становится доступной для цитирования в ChatGPT. Аналитические материалы обновляются по мере публикации, а архивный контент — с меньшей частотой, но остается доступным для исторического контекста.</p><p>В отличие от традиционных поисковых систем, которые индексируют весь открытый веб и ранжируют результаты по сложным алгоритмам, интеграция ChatGPT с медиа работает с контролируемым потоком лицензированного контента. Это повышает точность и авторитетность информации, минимизирует риски неправомерного использования материалов и помогает выстроить устойчивую систему, выгодную всем участникам: пользователям, ИИ-компаниям и создателям контента.</p><h2>Как новинку могут использовать айтишники?</h2><p>Интеграция ChatGPT с медиаресурсами открывает целый спектр возможностей для разработчиков и продуктовых команд. На стыке искусственного интеллекта и качественной журналистики рождается новое поколение информационных продуктов, способных изменить способы взаимодействия с новостями и аналитикой.</p><p>Особенно перспективным направлением является создание специализированных нейроассистентов для разных сфер. Представьте ИИ-юриста, который не только знает базовые принципы права, но и мгновенно информирует о последних изменениях в нормативных актах, опираясь на публикации профильных изданий. Или финансовый советник, анализирующий рыночные тренды на основе актуальных данных из деловых СМИ и предоставляющий рекомендации с учетом последних экономических событий. В медицинской сфере такой помощник может собирать информацию о новых исследованиях и методиках лечения из авторитетных научных журналов, делая их доступными для практикующих врачей.</p><p>Другое многообещающее направление — разработка «живых» дайджестов. В отличие от традиционных статичных подборок новостей, такие системы способны динамически агрегировать и резюмировать материалы из разных источников с сохранением контекста. Подобные сервисы могут анализировать развитие сюжета, показывать различные интерпретации события, выделять ключевые факты и тренды. Вместо поверхностного скроллинга заголовков пользователь глубоко понимает тему, рассматривая ее со всех сторон и зная предпосылки.</p><p>Для компаний открываются возможности создания инструментов для команд, работающих с информацией. PR-отделы могут использовать платформы для отслеживания репутации бренда в свете актуальных событий и оценивать эффективность информкампаний. Аналитические отделы получат системы мониторинга конкурентов, основанные на анализе публикаций в деловых и отраслевых медиа. Такие инструменты превращаются из простых агрегаторов упоминаний в интеллектуальных ассистентов, способных выявлять неочевидные связи и тренды.</p><p>Бизнес получит множество полезностей от этих технологий, в том числе сможет избежать постоянных судов из-за авторских прав, повысит точность и достоверность ответов нейросетей и завоюет доверие еще большего числа пользователей.</p><h2>А есть ли проблемы?</h2><p>Интеграция ChatGPT с крупными медиа, при всех своих преимуществах, оставляет ряд вопросов, от решения которых зависит будущее всей информационной системы.</p><ul><li><b>Вопрос 1:</b> размер компенсации. Достаточно ли выплат медиакомпаниям, учитывая, что их контент становится важной частью коммерческого продукта OpenAI? Как определить справедливую стоимость лицензирования, особенно в условиях, когда традиционные метрики вроде количества просмотров или переходов работают иначе в контексте ИИ? Пока крупные издания имеют возможность договариваться о взаимовыгодных условиях, менее влиятельные компании рискуют остаться без денег.</li><li><b>Вопрос 2:</b> влияние на бизнес-модели медиа в долгосрочной перспективе. Если пользователь получает качественное саммари материала прямо в ChatGPT, сохранится ли мотивация переходить по ссылке на полную статью? Не приведет ли это к снижению потока прямого трафика и, как следствие, рекламных доходов издателей? Некоторые аналитики отрасли опасаются, что интеграция с ИИ может превратить медиакомпании в поставщиков сырья для технологических гигантов, лишив их прямого контакта с аудиторией.</li><li><b>Вопрос 3: </b>разделение информационного пространства на контент от привилегированных партнеров и всех остальных. Получит ли ChatGPT предпочтение к материалам изданий-партнеров, даже если более релевантная информация доступна у других? Как обеспечить разнообразие контента и избежать перекоса в сторону крупных медиакомпаний? Эти вопросы имеют не только коммерческий, но и этический аспект, так как речь идет о формировании картины мира пользователей.</li><li>Вопрос 4: доверие к ответам и прозрачность алгоритмов выбора информации, ключевой вопрос касается доверия к ответам и прозрачности алгоритмов выбора информации. Как пользователь сможет оценить надежность источника и убедиться, что представленная информация не искажена? Какие механизмы необходимы, чтобы сохранить доверие к системе, особенно в эпоху информационных войн и дипфейков? Без решения этих вопросов даже самая совершенная система рискует стать еще одним каналом распространения дезинформации.</li></ul><h2>Что в итоге?</h2><p>ChatGPT, интегрированный с медиаресурсами, не просто становится новым Google для новостей — он формирует принципиально иную парадигму взаимодействия с информационным пространством. Вместо списков ссылок пользователь получает структурированные ответы и анализ, а также возможность углубиться в материалы.</p><p>Обычным пользователям будет несказанно удобно получать доступ к проверенной информации и больше не копаться в бесконечных ссылках. Медиакомпании — смогут «достучаться» до аудитории иными, нетрадиционными способами, что поменяет маркетинговую парадигму. Разработчики же обретут новую нишу для производства цифровых решений на стыке ИИ и журналистики.</p><p>Будущее этой системы зависит от того, насколько успешно участники рынка смогут решить юридические и этические проблемы, найти баланс между инновациями, правами создателей контента и интересами аудитории. От этого зависит, станет ли интеграция ChatGPT с медиа действительно новой, более совершенной моделью доступа к информации или останется лишь промежуточным этапом в эволюции цифровых медиа.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как встроить распознавание документов в Android: пошаговое руководство</title>
      <link>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</link>
      <comments>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Smart Engines]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</guid>
      <description><![CDATA[<p>Разбираемся, как быстро добавить возможность распознавания документов в Android. Пошаговое руководство по встраиванию Smart Document Engine.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo">Как встроить распознавание документов в Android: пошаговое руководство</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет, Tproger!</p><p>Мы в <a href="https://smartengines.ru/">Smart Engines</a> занимаемся разработкой софта для распознавания самых разных документов — начиная от паспорта РФ, свидетельства о рождении и заканчивая первичкой вроде УПД или ТОРГ-12, а также банковских карт, номеров телефона и баркодов. Наши библиотеки написаны полностью с нуля (на плюсах), мы уделяем огромное внимание скорости алгоритмов, нейросетям (новым архитектурам, размеру и правильному применению) и оптимизации, за счет чего наш софт портируется на любые архитектуры и может быть использован на любой платформе.</p><p>Сегодня продолжим знакомиться через рассказ о нашем софте, на очереди вторая библиотека — Smart Document Engine и ее возможности работы с жесткими и гибкими формами.</p><h2>Гибкие и жесткие формы</h2><p>Вначале про сами формы: они могут быть «жесткими» и «гибкими». Жёсткие формы подразумевают, что положение всех объектов на форме может быть задано прямо в виде координат на шаблоне. Самое простое определение для жестких форм — они совпадают «на просвет». Возьмите пару листов А4 с распечатанной жёсткой формой, наложите друг на друга, и места расположения полей точно совпадут. Гибкие формы устроены гораздо сложнее, но все равно имеют свою характерную структуру и топологию.</p><p>Распознавание жестких форм можно свести к детекции формы на изображении и распознавании определенных областей, где должны быть искомые поля. Гибкие формы требуют гораздо более сложных систем поиска (к тому же, завязанных на результате предыдущих действий, например, OCR, что только увеличивает возможность ошибки).</p><p>Кстати, иногда вместо распознавания текста целиком достаточно просто ответить на вопрос «есть ли текст в выбранной области, и, если есть, то где»</p><p>Но не надо думать, что жёсткие формы совсем просты — большие белые поля без каких-либо символов (или одинаковый узор по краям, как это бывает с бланками гособразца), малый объём статического текста и некоторая вариативность бланков тоже заставляют потрудиться над детекцией и классификацией шаблонов.</p><p>Также существуют общие для подобных форм проблемы. Правильно интерпретировать галочки в чекбоксах, найти штрихкоды, правильно разметить табличные данные — есть куча проблем, каждая из которых имеет своё state-of-the-art решение и набор алгоритмов, над которыми нужно ломать голову.</p><h2>Почему не LLM, хотя казалось бы</h2><p>Сейчас мы переживаем бум развития нейросетей — генеративные и классифицирующие сети появляются как грибы после дождя. Количество задач, которые они могут решить, тоже кажется неисчислимым: казалось бы — дайте обучающую выборку побольше, и всё получится! Тем более, что примеры использования нейросетей для автоматизации рутины уже можно встретить на каждом шагу: об этом пишут заметки и обзорные статьи на научно-популярных ресурсах, а интеграторы и стартапы предлагают решения по созданию чат-ботов и помощников на основе ИИ, обученного на внутренней документации больших компаний.</p><p>Однако чем сложнее нейросеть, чем глубже степень обучения — тем выше шанс, что она начнёт бредить. Мы все какое-то время назад <a href="https://shedevrum.ai/post/bc5bf060107711eeb9ea06d64eab8f23/">смеялись</a> над шести-семипалыми героями очередных сгенерированных изображений, сейчас посмеиваемся над сгенерированными сетями текстами с описанием несуществующих фильмов и книг, но смешно ли будет нам (а особенно бухгалтерии), если нейросеть начнет галлюцинировать при распознавании платёжных реквизитов или суммы НДС? И чем выше степень развития сетей — тем менее заметными будут становиться такие ошибки.</p><p>В прошлом году на одной из ключевых конференций в области анализа и распознавания документов — ICDAR — учёные традиционно задались вопросом о будущем OCR. И сошлись во мнении, что OCR нисколько не устарела, благополучно развивается и остается наиболее надежным инструментом распознавания. Обеспечить требования консистентности (и ещё всякого такого) информации, извлекаемой из изображения, все равно сможет только старый добрый OCR и прочие детерминированные алгоритмы. И именно их разработкой (и доведением до совершенства) мы и занимаемся.</p><p>Вернёмся к библиотеке <a href="https://smartengines.ru/intelligent-document-recognition/">Smart Document Engine</a>. Как уже говорилось выше, гибкие формы на то и гибкие, что исключительно геометрией на них не обойдёшься — вопрос местонахождения полей решается «на лету». На процесс взаимодействия с библиотекой это влияет в самом конце, на моменте работы с результатом. Перейдем к знакомству с интерфейсом на примере всё того же встраивания в андроид.</p><h2>Встраивание</h2><p>В целом, сценарий работы с библиотекой распознавания документов такой же, как и в <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-rf-v-android--powagovoe-rukovodstvo">прошлой статье</a> про распознавание паспорта: создаём движок, формируем настройки сессии, заводим саму сессию и кормим её картинками, после чего работаем с результатом распознавания. В отличие от документов, удостоверяющих личность, гибкие и жесткие формы могут быть многостраничными, с одинаковыми «по смыслу» полями на каждой странице. Помимо этого, часто документы загружают «пакетом», и в этом случае на одном изображении могут быть несколько разных документов. Поэтому результат распознавания устроен сложнее, чем в прошлом примере. Есть «результат распознавания», внутри него лежит набор найденных документов, каждый документ разбивается на «логический» и «физический» набор полей:</p><p>Логическая и физическая части документа разбираются отдельно, так как в некоторых случаях геометрия вообще не нужна (если результат распознавания документа дальше идёт в базу данных):</p><p>Как правило, результат распознавания представляют в виде json-объекта, но для наглядности лучше всего пользоваться html — особенно в случае, когда логические и физические поля имеют больше одного соответствия. Вот простенький генератор html на основе документа:</p><p>В результате получается удобная для взаимодействия html-страничка. Если добавить немного фантазии, то можно сразу сделать форму, в которой можно будет проверять и дополнять неуверенно распознанные поля — очень удобно в случае, если качество изображения плохое или документ плохо пропечатан.</p><p>Конечно, помимо андроида встроить распознавание и организовать удобные представление документа (при необходимости) можно и на любой другой платформе, однако с трендом на создание банковских офисов нового поколения и развития курьерской сети автоматизация ввода документов с помощью средненьких мобильных устройств на Андроиде становятся актуальной задачей.</p><p>На этом мы не заканчиваем, ждите новых статей!</p>]]></content:encoded>
    </item>
    <item>
      <title>Конвейер DevOps, часть 3: пайплайны и хуки в Git</title>
      <link>https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git</link>
      <comments>https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Филон]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git</guid>
      <description><![CDATA[<p>В этой серии статей Олег Филон, ментор Эйч Навыки, рассказывает, как прийти к крутому CI/CD пайплайну. Сегодня разбираемся, как работать с пайплайнами и хуками в Git.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/konvejer-devops--chast-3--pajplajny-i-huki-v-git">Конвейер DevOps, часть 3: пайплайны и хуки в Git</a>»</p>]]></description>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 26 May 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я — Олег Филон,<a href="https://h.careers/curators/oleg-philon"> ментор Эйч Навыки</a> и Senior DevOps Engineer. В этой статье расскажу, как организовать CI/CD пайплайн для контейнеризованного проекта с использованием утилиты make, сравню подходы для Docker и Podman, а также поделюсь хаком с использованием Git bare репозитория для автоматизации деплоя.</p><p>Первые две части лежат здесь: <a href="https://tproger.ru/articles/konvejer-devops--chast-1--kak-organizovat-rabochee-mesto-i-nastroit-oblako-iz-kvm-libvirt">рабочее место/облако</a> и <a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise">Fedora Core/mise</a>.</p><h2>Начало проекта и утилита make</h2><p>Представим идеальную ситуацию: я не только девопс, но и проектный менеджер, выбираю архитектуру проекта, и инструменты, и команду разработчиков, то есть полностью контролирую проект. В жизни такое вряд ли встретишь, но нам это нужно для примера, чтобы рассмотреть разные варианты.</p><p>Первый — классический пайплайн — это утилита make. Обычно она используется для сборки программ из исходного кода. На самом деле make хорошо подходит для решения сразу нескольких задач.</p><ul><li>Первая задача — отслеживание зависимостей одних файлов от других, например, при изменении сервиса пересобрать только соответствующий контейнер.</li><li>Вторая задача, легко реализуемая через make — сборка в один файл много команд или скриптов, чтобы удобно их организовать. Как правило, сборка образа, его загрузка в репо, удаление временных файлов и прочее делается несколькими рутинными командами. Точно так же можно поместить в Makefile команды запуска сервисов и тестирование приложения локально.</li><li>Если эти этапы прошли успешно, можно выполнить коммит кода в репо проекта, сделать деплой в dev или stage environment. В github actions это называется jobs и steps. В make такая группа команд называется целью, она указывается параметром при вызове.</li></ul><p>Так, несмотря на разную терминологию, по сути можно создать полноценный пайплайн для современного проекта с контейнеризованными сервисами.</p><h3>Разбираемся на практике</h3><p>Возьмём для примера проект с прокси сервером traefik и бэкендом на golang из репозитария <a href="https://github.com/ophilon/awesome-pods">awesome-pods</a>. Этот репо задуман как форк замечательного проекта <a href="https://github.com/docker/awesome-compose">awesome-compose</a>, в котором собраны конфиги docker compose для 41 самого популярного сервиса. Я же пытаюсь сделать что-то похожее для манифестов podman. Приглашаю к сотрудничеству начинающих девопс — сможете поучаствовать в открытом проекте, заработать почётные гитхаб-бейджи и улучшить своё резюме. Подробнее — <a href="https://github.com/ophilon/awesome-pods/blob/main/CONTRIBUTING.md">здесь</a>.</p><p>Мой проект в интересном положении: сделаны манифесты для нескольких сервисов, опробованы описанные выше подходы для миграции конфигов compose.yaml в манифесты kube.yaml. Но захотелось большего: а почему бы не сделать сразу пайплайны для тестирования, коммита в апстрим, деплоя и прочее. Зайдём в каталог traefik-golang и создадим пару мейк-файлов. Для начала сделаем всё это локально, начнём с make_compose:</p><p>Этот файл уже в истории, равно как и соответствующий README.md, привожу его для примера. Так как я делаю конфиги сразу для двух платформ — docker и podman, для включения соответствующего Makefile’а нужно сделать линк на него: ln -s make_compose Makefile.</p><p>Отлично, основную идею обсудили, идём дальше. В docker’е есть замечательная опция context, позволяющая работать с любыми серверами, где настроен доступ. В нашем случае список контекстов выглядит так:</p><p>Здесь я использовал простейший хак — сделал копию дефолтного контекста с именем localhost. Теперь мы можем сделать наш пайплайн способным на удалённый деплой. Достаточно прописать в /etc/hosts имя и адрес нашего dev сервера. Вот новая версия make_compose:</p><p>Поясню немного подробнее.</p><ul><li>Самая первая строка — стандартное объявление списка целей.</li><li>Строки 2-4 задают дефолтное значение переменной, если оно не задано в текущем env.</li><li>В хелп — строки 5-10 — добавлено предупреждение о текущем контексте, он задаётся в глобальной переменной, например, export DKR_CONTEXT=localhost для локального контекста.</li><li>Также добавлена цель commit в репо — строки 17-21 — после выполнения цели test.</li><li>Test — строки 31-32 — в свою очередь, выполняется для текущего контекста, см. хак #1. Имя контекста должно совпадать с именем хоста нашего dev-сервера.</li><li>Добавлена также цель clean: очистка старых образов с локальном репо,и зависимости в цель up. Здесь убеждаемся, что образ пересобран и старые контейнеры остановлены.</li></ul><p>Отлично, пайплайн для докера работает. Пробуем сделать то же самое для подмана. Здесь нас ждёт сюрприз, попробую рассказать в стиле прямого репортажа. Первоначально наш пайплайн для podman выглядел вот так:</p><p>В строке 5 определяются зависимости: target back соберёт исполняемый файл только в том случае, если код main.go или сам make_pods новее уже собранного бинарника.</p><p>Строка 6 удаляет backend контейнер с едва заметным знаком минус -, чтобы игнорировать ошибку, если контейнер с именем backend не существует.</p><p>Строки 7–10 создают контейнер с именем backend из пустого (scratch) контейнера — команды buildah следуют обычным командам Dockerfile, но в нижнем регистре: FROM -&gt; from, COPY -&gt; copy, RUN -&gt; run, ENTRYPOINT -&gt; config –entrypoint и т. д. Здесь вы видите основное отличие от традиционного docker buildx подхода — вы работаете в двух контекстах одновременно: в локальном контексте, используя установленный компилятор go, и в контексте контейнера, копируя файлы в/из контейнера, запуская команды внутри контейнера и т. д. Другая новая возможность buildah — вы можете собирать образ шаг за шагом, то есть отлаживать процесс сборки.</p><p>Строка 8 компилирует main.go в исполняемый файл back с соответствующими флагами.</p><p>Строка 11 создаёт из контейнера новый образ (image) с тегом backend:latest.</p><p>Цель up — строка 16 — зависит от цели down — строка 14, — то есть она сначала останавливает pod и удаляет контейнеры, если они всё ещё запущены, затем запускает новый под.</p><p>Цель down в строке 15 подставляет глобальную переменную $XDG_RUNTIME_DIR из env пользователя в kube.yaml, используемый далее в podman kube командах, принимая новый манифест со стандартного ввода. Это также специфика podman — он работает полностью в пространстве пользователя, контейнеры взаимодействуют через собственный podman.sock. Таким образом, делаем пайплайн независимым от UID.</p><p>В подмане есть фунциональность наподобие docker context, под другим именем, в подкоманде system connection:</p><p>Первым в списке стоит настроенная в <a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-misel">прошлой статье ВМ</a>. Пока искал правильные опции для создания коннекшена (aka контекст в докере), столкнулся с подсказкой от подмана — «создайте сначала машину», а именно:</p><p>Выполнил эти рекомендации, подман выкачал, настроил и добавил два новых коннекшена для новой ВМ. Какой же меня ждал сюрприз, когда я стал смотреть, что же это за machine. Во-первых, в моём HOME появились новые файлы и каталоги:</p><p>Во-вторых, это полноценная ВМ fedora coreos:</p><p>Конечно, приятно, что моё мнение совпало с мнением авторов подмана, точнее, со стратегией RedHat — fedora coreos наиболее подходящая система для контейнерных приложений. С другой стороны, ВМ в подмане крутится полностью внутри пространства пользователя. У меня уже настроена почти такая же для удалённой работы всей команды разрабов. Решено: останавливаем новую виртуалку и правим мейкфайл для подмана по образцу компоуза, делаем пайплайн для деплоя и локально, и на удалённый дев-сервер.</p><p>Но прежде нам понадобится ещё один хак #2. Если в случае докера переключение контекста можно было сделать любой переменной, то для подмана между локальным соединением через сокет и удалённым, через uri:ssh, имя переменной фиксировано <a href="https://docs.podman.io/en/stable/markdown/podman.1.html">CONTAINER_HOST</a>. Вот как выглядит пайплайн make_pods.v1, настроенный и для локальной сборки, и для деплоя в наш дев-сервер:</p><p>По большей части цели мейкфайла остались теми же, но для удалённого деплоя настраиваем переменную export CONTAINER_HOST=ssh://dev@fc42dev:22/run/user/1001/podman/podman.sock — берём её из коннекшена, она служит переключателем между локальным и удалённым контекстом. Для локального контекста эту переменную надо удалить: unset CONTAINER_HOST. Команды в строках 19, 21 и 23 — это обычные команды шелла, они также меняются на локальное либо удалённое исполнение, переопределяются на основе этой же переменной CONTAINER_HOST.</p><p>Как заметил внимательный читатель, в цели back исчезла сборка контейнера утилитой buildah. Как и для docker compose, используется возможность самого подмана создавать образы на основе Containerfile, он же Dockerfile, эти названия синонимичны. Это намёк: пора отвыкать от слова докер, контейнеры уже давно стали основой облачных вычислений, для них созданы сотни приложений, например, <a href="https://www.cncf.io/">CNCF</a> и <a href="https://adriancitu.com/2021/12/30/containers-landscape-seen-through-oci-and-cncf-standards-lens/">общепризнанные стандарты</a>.</p><h2>Принципиальный вопрос о контейнерах</h2><p>Основное их преимущество — новый способ доставки приложений в облака, решение проблем с зависимостями, версиями библиотек, фреймворков и проч. Сборка контейнеров в контейнерах — побочный эффект облачных сервисов Github, Gitlab и других, с одной стороны, и ограничения Docker — с другой. Он не умеет, в отличие от подмана, точнее, от его сопутствующей утилиты buildah, выполнять билд и создавать образ, используя локальное окружение.</p><p>Основная проблема сборки образа внутри контейнера — неэффективное использование кэша. Да, появились возможности как-то сохранять объемные загрузки внешних библиотек, модулей: это опции --mount=type=cache для <a href="https://docs.docker.com/build/cache/optimize/#use-bind-mounts">некоторых языков</a>. Но, во-первых, эти возможности используются далеко не всегда. Во-вторых, опции для кэширования отличаются в podman и buildah, см. podman-build(1), придётся делать отдельный Containerfile. В-третьих, эффект от такого кэширования минимален. Предлагаю замерить время сборки, сделав ещё одну, третью версию пайплайна. Сначала соберём команды для buildah в отдельный файл:</p><p>и поправим пару строк в пайплайне:</p><p>Уточню условия нашего эксперимента — мы настроили одинаковую среду разработки с помощью утилиты mise (<a href="https://tproger.ru/articles/konvejer-devops--chast-2--polzuemsya-fedora-core-i-mise">предыдущая статья</a>) на нашем дев-сервере и у каждого из разрабов команды. Репозитарий git использует этот же дев-сервер, доступ к репо и серверу по ключу, парольный доступ закрыт. Пайплайны настроены как для локальной сборки, так и на дев-сервере. Перед запуском 3-й версии пайплайна на дев-сервере нужно сделать коммит изменений в репо — buildah не знает о коннекшенах, работает с кодом в текущем каталоге (строка 1): после логина на сервер переключается в корень проекта. Предварительно выкачиваем образ компилятора go для сборки в контейнере — это вполне честно, мы же выкачали и настроили компилятор golang заранее. Замеряем:</p><p>Мы получили 10+-кратный выигрыш по времени сборки образа для подмана. Абсолютные времена не важны, также не влияет, запускали мы сборку локально или на дев-сервере — мы сравниваем только билд в контейнере и в настроенном локальном окружении. Третье измеренное время — сборка в Docker. Он умеет собирать только в контейнере, для него настроили кэширование в Containerfile:</p><p>Но оно не сильно помогло. Конечно, наш проект игрушечный, golang кэширует лучше других языков, но в целом вывод понятен: сборка в контейнере далеко не оптимальный вариант, если есть возможность настроить дев-сервер для работы команды.</p><p>Ещё замечание: конечно, образы, собираемые buildah, совместимы с Docker, их можно использовать в конфигах compose.yaml. Но для этого надо настроить репозиторий образов и сначала загрузить образ в него. Локальные репозитории отличаются: Docker использует общий репо для всех пользователей — Docker Root Dir: /var/lib/docker, а в подмане всё хранится в домашнем каталоге пользователя — graphRoot: /home/$USER/.local/share/containers/storage.</p><p>Как я предположил в самом начале, мы попробовали вариант с гипотетической идеальной командой разрабов, работающей в Линукс и умеющей в make. А как быть обычному девопсу с разношерстой командой, где кто-то сидит на Винде, а кто-то ни за что не откажется от привычного Макбука на M4? Есть вариант и для этого случая. Пусть они пишут код и тестируют его как им нравится, а в нашем репо на дев-сервере мы сделаем хак #3, а именно git hook и bare репозиторий — githooks(5), выполняющий наши цели сборки и старта приложения при коммите в репо.</p><p>Для этого на пару минут придётся стать безжалостным хакером, удаляющим лишнее и открывающим скрытые возможности гита. Выполняем следующие шаги:</p><ol><li>Заходим под юзером dev на сервер, создадим пустой каталог, например, mkdir -pv ~/bare/t0. Это станет новым GIT_DIR, зайдём в него и выполним cd ~/bare/t0;git init --bare.</li><li>Видим, что файлы, обычно спрятанные в каталоге .git, лежат прямо в корне. Сделаем дополнительно каталог для логов mkdir logs. Переходим в каталог hooks и создаём файл, где укажем команды выполнения при каждом изменении в репо.</li></ol><p>Закомментированные строки 3, 8, 9 полезны при отладке пайплайна. Строки 4 и 5 задают, что есть, собственно, репозиторий, переменная GIT_DIR и переменная WORK_TREE (куда будут записываться файлы проекта). В цикле от строки 6 до 14 читаются и обрабатываются три переменные, с которыми гит вызывает этот хук. Строка 11 принимает все изменения в репо и обновляет WORK_TREE — всё то, что гит обычно делает в общем каталоге, как видим, в bare репо они разные. Далее, в 12 строим имя лога и строка 13 — собственно, пайплайн.</p><ol><li>Идём в каталог, где расположен репо проекта. Без страха и сожаления удаляем старый и создаём новый под тем же именем: cd ~/src;rm -rf traefik-golang;mkdir traefik-golang.</li><li>Завершаем сессию на дев-сервере, возвращаемся на рабочий комп и заходим в репо проекта. Конечно, репо цел, клоны репо не так просто уничтожить, пока есть хотя бы одна копия. Теперь смотрим старые настройки git remote -v и удаляем их git remote remove fc42dev в моём случае. Создаём новый remote, указывая новый гит bare репо: git remote add bare.t0 dev@fc42dev:~/bare/t0. Это также нужно сделать всем разрабам в их локальных копиях.</li><li>Проверяем результат. Возможно, нужно сделать новый комит и push в новый remote. Стоит посмотреть подробнее, как изменился репо проекта на сервере: проверить логи в ~/bare/t0/logs, сравнить конфиги обычного репо проекта и на сервере, проверить, какие команды перестали работать в серверном репо. Например, в WORK_TREE не работают команды гит status; branch; commit; log. То есть наш хак #3 с git --bare не только позволил делать деплой на сервере, но также защитил репо от локальных изменений, а серверный репо всегда в чистоте и порядке. Можно редактировать код, но закомитить его только через обычный репо. Изменения на сервере удалятся после любого коммита.</li></ol><p>Надеюсь, мне удалось показать, что пайплайны можно делать на основе древней забытой утилиты make. В следующей статье разберём, как можно добавить в наш скромный дев-сервер нечто похожее на монстров гит-сервисов, Gitlab и Github, создавать пайплайны, совместимые с github Actions, предоставить команде разрабов привычный интерфейс репо в браузере.</p>]]></content:encoded>
    </item>
    <item>
      <title>В каких странах можно легально привлечь инвестиции в форме ICO/STO</title>
      <link>https://tproger.ru/blogs/ico-sto-paradise</link>
      <comments>https://tproger.ru/blogs/ico-sto-paradise?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/blogs/ico-sto-paradise</guid>
      <description><![CDATA[<p>Правовое регулирование ICO и STO на примере Мальты и Эстонии: почему после расцвета 2017 года инвесторы уходят от ICO к security token offering.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/blogs/ico-sto-paradise">В каких странах можно легально привлечь инвестиции в форме ICO/STO</a>»</p>]]></description>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Криптовалюты]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Блоги]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 21 Mar 2019 10:59:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывет Александр Лукьянов – выпускник-эксперт программы дополнительного образования BCL</p><p>За расцветом ICO в 2017 году, который сейчас часто сравнивают с «бумом доткомов», последовал стремительный спад интереса инвесторов к этой форме привлечения средств. Это вызвано высокими рисками ICO, ведь в большинстве стран мира отсутствует правовое регулирование этой сферы. Интересы инвесторов никак не защищены, правовое положение цифровых активов законодательно не определено, а отношение регуляторов продолжает оставаться скептическим. Поэтому ICO как способ привлечения инвестиций всё больше уступает STO (security token offering).</p><h2>Security token offering: подходы и риски</h2><p>В случае с STO статус цифровых активов определён точнее, так как размещаемые токены по характеристикам схожи с ценными бумагами, которые имеют достаточно развернутое правовое регулирование.</p><p>Тем не менее, STO и сегодня воспринимается с долей осторожности, т. к. ни в одной стране мира нет системного законодательного регулирования размещения секьюрити-токенов, которое основывалось бы на продолжительной правоприменительной практике. Но несмотря на недоверие регуляторов и участников рынка к криптоактивам, в некоторых странах стараются решить эту проблему на государственном уровне. Ведь национальное законодательство можно привести в соответствие с современными технологиями, чтобы привлечь в экономику новые инвестиции.</p><h2>Blockchain-остров: новое законодательство Мальты об STO</h2><p>ICO и STO используются в основном в стартапах, связанных с IT, поэтому на Мальте недавно приняли закон о создании специализированного государственного органа — Malta Digital Innovation Authority (MDIA). Он занимается регулированием и контролем рынка STO как «особой» области современной экономики. MDIA устанавливает процедуры, которые необходимо соблюдать эмитентам токенов и тем, кто взаимодействует с участниками рынка.</p><p>Другим законом Мальты — Virtual Financial Assets Act (VFAA) — регулируются вопросы, непосредственно относящиеся к процедуре проведения STO. Закон выделяет следующие виды DLT-активов:</p><ol><li>Виртуальный токен — токен, ценность и применение которого ограничены приобретением товаров или услуг. Он используется исключительно на платформе или в сети платформ, на которой был выпущен.</li><li>Финансовый инструмент. Перечень активов, подпадающих под это понятие, указан в Законе Мальты об инвестиционных услугах (Investment Services Act) и включает в себя перечисленные в законе ценные бумаги, производные инструменты, инструменты денежного рынка и иные прямо предусмотренные законом активы.</li><li>Электронные деньги.</li><li>Виртуальный финансовый актив. В соответствии с законом VFAA, под виртуальным финансовым активом понимается цифровая запись в любой форме, которую используют в качестве средства расчёта или накопления. При этом она не может быть виртуальным токеном, финансовым инструментом или электронными деньгами.</li></ol><p>В случае если DLT-актив подпадает под последнюю категорию, эмитент актива, желающий провести его размещение (Initial VFA Offering), должен получить лицензию в специализированном государственном органе — MFSA (Управление финансовых услуг Мальты). Для получения такой лицензии необходимо обратиться к VFA-агенту — лицу, зарегистрированному в MFSA и уполномоченному осуществлять взаимодействие между заявителями и MFSA. Также агент проверяет, соответствует ли заявитель установленным законом требованиям.</p><p>Помимо регулирования процедуры Initial VFA Offering, закон VFAA устанавливает требования к whitepaper. Документ должен быть датирован, содержать все пункты, изложенные в специальном приложении к закону, а также заявление совета директоров с подтверждением соответствия требованиям VFAA. Текст whitepaper должен быть составлен на английском языке (перевод на иные языки возможен, но не обязателен). Кроме того, в дальнейшем любые предлагаемые в ходе размещения условия должны соответствовать whitepaper.</p><h2>STO по законодательству Эстонии</h2><p>В настоящий момент Эстония является одной из наиболее популярных стран для проведения ICO. Это не в последнюю очередь связано с тем, что государство старается обеспечить комфортные условия для предпринимательства в целом. Например, упрощает процедуру регистрации компании, уплаты налогов и т. п. Также это связано с относительно проработанным подходом государства к криптоактивам и возможностью просчитывать плюсы и минусы выхода на ICO в рамках данной юрисдикции.</p><p>В соответствии с рекомендациями, опубликованными Финансовой инспекцией Эстонии (Estonian Financial Supervision Authority — EFSA), первоочерёдным для ICO является анализ прав, предоставляемых токенами. Необходимо определить, считаются ли они ценными бумагами в соответствии с законом о рынке ценных бумаг. Токены признаются таковыми в случае, если они могут быть переданы на основании одностороннего волеизъявления либо если они предусматривают для участника право голоса или ожидаемую прибыль в отношении своих инвестиций.</p><p>Если токены признаны ценными бумагами, необходимо определить, является ли их размещение публичным. Закон Эстонии о рынке ценных бумаг предусматривает ряд случаев, когда размещение публичным не является (предложение только для квалифицированных инвесторов, имеющее ограничение по сумме и т.п.). Если размещение не подпадает под данный перечень, оно признаётся публичным и должно соответствовать установленным требованиям. В таком случае, в зависимости от вида ценной бумаги, необходима подготовка и регистрация в EFSA проспекта предложения. Регистрация проспекта, как правило, занимает от трёх до шести месяцев. За нарушение требований о регистрации проспекта эмиссии законодательство Эстонии предусматривает ответственность вплоть до уголовной. Также размещение токенов в ряде случаев может подпадать под действие законов о кредитных учреждениях и об инвестиционных фондах. В таком случае компании-эмитенту необходимо иметь специальные лицензии и разрешения. Кроме того, при определённых условиях разрешение для инвестирования в токены-ценные бумаги требуется и для инвестора.</p><p>В рекомендациях отмечается, что эмитенту необходимо соблюдать общие нормы о рекламе и не вводить людей в заблуждение в отношении характеристик товара или услуги.</p><h2>Заключение</h2><p>В целом действующее законодательство Мальты и Эстонии, несмотря на декларируемый «дружественный» статус по отношению к криптоактивам, выдвигает достаточно серьёзные и не всегда легко реализуемые требования к ним. Вместе с тем, процедура размещения прописана подробно и понятно. Это позволяет эмитенту составить представление о юридических рисках и быть относительно уверенным в том, что у государственных органов в будущем не будет претензий. Также это позволит планировать затраты финансов и времени, что не всегда возможно в большинстве юрисдикций, которые, не имеют развернутого правового регулирования процедуры ICO/STO.</p>]]></content:encoded>
    </item>
    <item>
      <title>«О цифровых финансовых активах»: проект федерального закона о криптовалютах внесен в Госдуму</title>
      <link>https://tproger.ru/news/419059-7-cryptocurrency-project</link>
      <comments>https://tproger.ru/news/419059-7-cryptocurrency-project?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/419059-7-cryptocurrency-project</guid>
      <description><![CDATA[<p>Законопроект № 419059-7 признаёт майнинг предпринимательской деятельностью, а криптовалюты и токены — имуществом, но не платёжным средством.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/419059-7-cryptocurrency-project">«О цифровых финансовых активах»: проект федерального закона о криптовалютах внесен в Госдуму</a>»</p>]]></description>
      <category><![CDATA[Криптовалюты]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Майнинг]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 21 Mar 2018 15:27:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>20 марта депутаты представили на рассмотрение Госдуме законопроект № 419059-7 «О цифровых финансовых активах», выводящий цифровые валюты в российское правовое поле. Документ признает майнинг видом предпринимательской деятельности, а криптовалюты и токены — имуществом, но не платежным средством.</p><p>Согласно пояснительной записке, цель проекта — закрепить в законодательстве определения основных процессов и субъектов рынка цифровых валют, а также создать комфортные условия для привлечения инвестиций путем выпуска токенов.</p><h3>Хайлайты</h3><ul><li>Криптовалюта и токен — цифровые финансовые активы, не являющиеся в России платежным средством.</li><li>Оба считаются имуществом в электронной форме.</li><li>Разница между ними определяется количеством эмитентов: для токена один, для криптовалют — несколько (майнеры).</li><li>Токены подлежат обмену на рубли или иную валюту, перечень операций по другим активам установит Центробанк совместно с Правительством РФ.</li><li>Обменные операции имеют право проводить исключительно операторы обмена цифровых финансовых активов.</li><li>Цифровой кошелек могут открыть только операторы и только после идентификации личности заявителя.</li><li>Майнинг считается предпринимательской деятельностью, если майнер три месяца подряд превышал установленную квоту по потреблению энергии.</li></ul><p>Предложения по выявлению майнеров разрабатывает Минкомсвязи, и, возможно, они будут перекликаться с тезисами из <a href="https://tproger.ru/news/vedomosti-government-regulation-of-mining/">январской концепции регулирования майнинга</a>.</p><p>Кроме того, портал «Ведомости» <a href="https://www.vedomosti.ru/technology/articles/2018/03/20/754339-mainerov-obyazhut-individualnimi-predprinimatelyami">отметил</a>, что проект не затрагивает вопросы налогообложения и ответственности майнеров.</p><h3>Проведение ICO</h3><p>Вся третья статья посвящена регламенту проведения ICO (Initial Coin Offering), иными словами, выпуска токенов. Она описывает этапы процесса, содержание публичной оферты и инвестиционного меморандума.</p><p>В <a href="https://www.minfin.ru/ru/document/?id_4=121810&amp;area_id=4&amp;page_id=2104&amp;popup=Y%20%20%20%20%20">предыдущей версии</a> третья статья устанавливала лимит для вложений неквалифицированных инвесторов — 50 000 рублей. Текущая версия сумму не оговаривает, оставляя решение за Центробанком. Определение квалифицированного инвестора <a href="https://www.consultant.ru/document/cons_doc_LAW_10148/7ce0bd4ff6146a754480aaa7e7d4d7c74f8f21de/#dst195">дано</a> в законе «О рынке ценных бумаг» — это профессиональные участники рынка ценных бумаг, кредитные организации, инвестиционные фонды и т.д.</p><h3>Работа над законопроектом</h3><p>25 января Министерство финансов <a href="https://tproger.ru/news/minfin-cryptocurrency-law-project/">опубликовало</a> первую версию проекта. После согласования с профильными комитетами и внесения изменений документ прошел первую стадию — регистрацию в Госдуме. Сейчас он находится на предварительном рассмотрении.</p><p>До 3 апреля ответственный комитет будет собирать отзывы, предложения и замечания. Рассмотрение документа включено в примерную программу законопроектной работы Госдумы на апрель. Впереди еще три чтения и получение одобрения Совета Федерации. За движением проекта можно следить на государственном портале «Законотворчество».</p>]]></content:encoded>
    </item>
    <item>
      <title>ICO Telegram Павла Дурова привлекло 850 млн долларов</title>
      <link>https://tproger.ru/news/ico-telegram-850-million</link>
      <comments>https://tproger.ru/news/ico-telegram-850-million?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Леонов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ico-telegram-850-million</guid>
      <description><![CDATA[<p>Первый этап ICO Telegram привлёк 850 млн долларов от 81 инвестора. Второй этап запланирован на март и должен принести ещё 1,15 млрд долларов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ico-telegram-850-million">ICO Telegram Павла Дурова привлекло 850 млн долларов</a>»</p>]]></description>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Feb 2018 13:14:55 GMT</pubDate>
      <content:encoded><![CDATA[<p>Павел Дуров, основатель мессенджера Telegram, <a href="https://www.sec.gov/Archives/edgar/data/1729650/000095017218000030/xslFormDX01/primary_doc.xml">предоставил</a> отчет о привлеченных средствах для своей криптовалютной площадки. Он был отправлен в Комиссию по ценным бумагам и биржам США (SEC) и 13 февраля опубликован на их сайте. В нем фигурируют две компании, причастные к ICO: TON Issuer Inc. и Telegram Group Inc. Обе принадлежат Павлу и Николаю Дуровым и зарегистрированы на Британских Виргинских островах.</p><p>Предполагается, что привлеченные 850 миллионов долларов пойдут на развитие криптовалюты Gram и блокчейн-платформы Telegram Open Network (TON), созданной Павлом Дуровым. Первый платеж поступил на счет компании 29 января 2018 года.</p><p>Стоит отметить, что ICO, проведенное Telegram, не было как таковым в привычном смысле. Эта процедура была скорее похожа на закрытое размещение ценных бумаг в обычной валюте. Инвесторы покупали права на Gram, в данный момент представляющую из себя ценные бумаги, которые дают право на участие в предстоящем распределении токенов. Согласно «Ведомостям», запуск Telegram Open Network должен произойти до 31 октября 2019 года. Если этого не случится, то инвесторы получат обратно вложенные в проект средства.</p><h3>Инвесторы проекта</h3><p>В отчете для SEC нет информации о лицах, вложивших деньги в платформу. Однако некоторые инвесторы сами объявили об этом. Так, один из основателей Qiwi, Сергей Солонин, <a href="https://www.vedomosti.ru/technology/articles/2018/02/16/751244-qiwi-telegram">сообщил</a>, что инвестировал 17 млн долларов. Еще 10 миллионов <a href="https://www.vedomosti.ru/business/news/2018/02/16/751269-telegram">внес</a> создатель «Вимм-Билль-Данн» Давид Якобашвили.</p><p>Что касается иностранных инвесторов, то недавно Financial Times <a href="https://www.ft.com/content/790d9506-0175-11e8-9650-9c0ad2d7c5b5">сообщала</a>, что такие крупные фонды, как Benchmark, Sequoia Capital и Kleiner Perkins Caufield &amp; Byers готовы вложить в ICO Telegram по 20 млн $.</p><figure><img src="https://media.tproger.ru/uploads/2018/02/default-2cn-1.jpg" alt="" /></figure><p>Согласно Bloomberg, <a href="https://www.bloomberg.com/news/articles/2018-01-18/biggest-ico-ever-is-said-to-grow-as-telegram-targets-2-billion">состоялся</a> лишь первый этап набора средств. Второй должен начаться в марте и его целью будет привлечение 1,15 млрд долларов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Запущен сайт для генерации идей ICO</title>
      <link>https://tproger.ru/news/yet-another-ico-generator</link>
      <comments>https://tproger.ru/news/yet-another-ico-generator?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вячеслав Шарунов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/yet-another-ico-generator</guid>
      <description><![CDATA[<p>Yet Another ICO выдаёт портфолио проекта от концепции до списка консультантов в шуточной форме, высмеивая мошеннические идеи для сбора средств.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/yet-another-ico-generator">Запущен сайт для генерации идей ICO</a>»</p>]]></description>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 Dec 2017 06:46:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Полное описание продукта, подбор команды, которая будет вам помогать в ICO, спонсоры, принимающие участие в вашем проекте, дорожная карта, информация в СМИ. Всё это необходимо для успешного привлечения средств через ICO.</p><h3>Yet Another ICO</h3><p>Очень плохо, когда желание получить деньги есть, а фантазии, с помощью которой и можно придумать идею, нет. Акселератор FunCubator <a href="https://www.facebook.com/FunCubator/photos/a.1390238134402071.1073741828.1383165958442622/1565796653512884/?type=3&amp;theater">обратил</a> внимание на сайт <a href="http://yetanotherico.com">Yet Another ICO</a>. Его основная цель — генерация идей проектов для сбора средств через ICO.</p><p>Вам будет предложено портфолио идеи — от описания концепта проекта до списка консультантов. Есть, правда, одно но. Все материалы сайта представлены в шуточной форме с целью высмеять мошенников, использующих подобные бредовые идеи для своего обогащения.</p><h3>Пример проекта</h3><figure><img src="https://media.tproger.ru/uploads/2017/12/1-2.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/12/2.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/12/3-2.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/12/4-1.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/12/5.jpg" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2017/12/8-1.jpg" alt="" /></figure>]]></content:encoded>
    </item>
    <item>
      <title>Путин поручил легализовать криптовалюты к июлю 2018 года</title>
      <link>https://tproger.ru/news/russia-cryptocurrency-ico</link>
      <comments>https://tproger.ru/news/russia-cryptocurrency-ico?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Леонов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/russia-cryptocurrency-ico</guid>
      <description><![CDATA[<p>Правительство России и Банк России должны подготовить правила ICO, определить статус цифровых технологий в финансах и внести изменения в законодательство.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/russia-cryptocurrency-ico">Путин поручил легализовать криптовалюты к июлю 2018 года</a>»</p>]]></description>
      <category><![CDATA[Криптовалюты]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Oct 2017 15:25:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>Владимир Путин призвал правительство и Банк России подготовить свод документов для регулирования процедуры первичного размещения криптовалют. Информация об этом <a href="http://kremlin.ru/acts/assignments/orders/55899">появилась</a> на сайте Кремля. В поручении сказано:</p><blockquote>Правительству России совместно с Банком России обеспечить внесение в законодательство России изменений, предусматривающих регулирование публичного привлечения денежных средств и криптовалют путем размещения токенов по аналогии с регулированием первичного размещения ценных бумаг.</blockquote><p>Кроме этого, ведомствам было поручено подготовить поправки по определению статуса цифровых технологий, которые применяются в финансовой сфере, а также их понятий.</p><p>Ранее стало известно о том, что в России планируется запуск <a href="https://tproger.ru/news/russian-cryptocurrency/">крипторубля</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>