<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>kaurcev</title><generator>teletype.in</generator><description><![CDATA[fullstack web developer]]></description><image><url>https://img3.teletype.in/files/2c/f3/2cf3a554-4bcc-4958-92d4-24b81bbd91fc.png</url><title>kaurcev</title><link>https://blog.kaurcev.dev/</link></image><link>https://blog.kaurcev.dev/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/kaurcev?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/kaurcev?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 16 May 2026 03:57:34 GMT</pubDate><lastBuildDate>Sat, 16 May 2026 03:57:34 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.kaurcev.dev/9T5kNeZSBkC</guid><link>https://blog.kaurcev.dev/9T5kNeZSBkC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/9T5kNeZSBkC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Что такое системная безопасность и почему даже безопасники потом не помогут?</title><pubDate>Fri, 08 May 2026 03:15:03 GMT</pubDate><description><![CDATA[Это не просто пачка лицензий на антивирусы или группа суровых людей из отдела ИБ, запертых в серверной. Это фундаментальное архитектурное свойство системы, её врождённая способность сопротивляться угрозам на всех этапах жизненного цикла: от первой строчки кода до вывода из эксплуатации. Проще говоря, если вы изначально строите дом из песка, то даже лучшая в мире охрана на входе не спасёт ваш домик от рассыпания. Безопасность нельзя «прикрутить» сверху в последний момент — она должна быть вшита в саму логику и структуру проекта, чтобы он оставался устойчивым даже при прямом воздействии.]]></description><content:encoded><![CDATA[
  <h2 id="26Eu">Что такое системная безопасность? </h2>
  <p id="EcIu">Это не просто пачка лицензий на антивирусы или группа суровых людей из отдела ИБ, запертых в серверной. Это фундаментальное архитектурное свойство системы, её врождённая способность сопротивляться угрозам на всех этапах жизненного цикла: от первой строчки кода до вывода из эксплуатации. Проще говоря, если вы изначально строите дом из песка, то даже лучшая в мире охрана на входе не спасёт ваш домик от рассыпания. Безопасность нельзя «прикрутить» сверху в последний момент — она должна быть вшита в саму логику и структуру проекта, чтобы он оставался устойчивым даже при прямом воздействии.</p>
  <p id="ePRs">Поэтому если проект реализуется на коленке с использованием дырявых библиотек и устаревшего инструментария без учёта логики разделения доступа, то ни один безопасник не поможет. Почему? А вот основные причины:</p>
  <ol id="RdNY">
    <li id="6p10">Безопасность нельзя просто так взять и навесить сверху. Если архитектура позволяет инъекции в базу данных или разработчик-умничка хранит пароли в открытом виде, то никакой файервол не перекроет все лазейки. Это исключительно системный брак, который лечится только переписыванием кода. Невозможно построить броневик на шасси от самоката.</li>
    <li id="MFxY">Срок годности технологий. Уязвимости находят каждый день. Порой по несколько штук за сутки, а то и целыми списками. Поэтому если стек устарел (End of Life, или EoL), то для этого инструмента больше не выпускают патчи. Важно понимать: списки CVE публикуются открыто. Не нужно быть хакером из кино, чтобы найти все дыры по конкретной технологии — они доступны любому встречному в два клика. Использовать EoL — это как жить в доме с дверями, к которым ключи есть у всей улицы.</li>
    <li id="7usP">Человеческий и процессный фактор. Безопасность — это не результат, а непрерывный процесс. Если разработчики привыкли срезать углы, а менеджмент экономит на обновлении стека, то любой аудит превращается в список невыполнимых рекомендаций. В такой среде ИБ-отдел превращается в декорацию, которая просто фиксирует смерть пациента, пока бизнес надеется на авось.</li>
  </ol>
  <p id="MxFB">Поэтому нужно понимать, что системная безопасность — это задача не только отдела ИБ. Это скорее плотная связка в формате «трио»: разработка, ИБ и бизнес. Без этого треугольника конструкция не устоит.</p>
  <p id="P1nA">Если разработчик не предпринимает никаких действий по устранению уязвимостей и пропускает мимо ушей рекомендации отдела ИБ — это повод серьезно задуматься о его профпригодности. То же касается и бизнеса: игнорирование технических долгов в угоду скорости фич всегда выходит боком.</p>
  <p id="FurA">И да, важный момент: обновляясь своевременно, вы фактически бесплатно получаете защиту, над которой работали лучшие представители индустрии со всего мира. Весь опыт сообщества по латанию дыр прилетает вам вместе со свежим патчем. Игнорировать это — значит добровольно оставлять ключи под ковриком.</p>
  <h2 id="sbIt">WannaCry — как самый яркий пример</h2>
  <blockquote id="ls7H">Если нравятся подробности, то вот <a href="https://ru.wikipedia.org/wiki/WannaCry" target="_blank">статья на Википедии</a></blockquote>
  <p id="lD8x">WannaCry — как самый яркий пример того, что бывает, когда на системную безопасность забивают болт. В 2017 году этот вирус-шифровальщик за считанные дни парализовал работу сотен организаций по всему миру: от больниц Великобритании, где отменяли операции, до заводов и железных дорог.</p>
  <p id="XlHX">В чём был основной провал? Вирус использовал дыру в протоколе обмена файлами Windows. Самое смешное и грустное одновременно: Microsoft выпустила критическое обновление, закрывающее эту лазейку, ещё за два месяца до начала эпидемии. Но огромная куча компаний либо сидела на древних системах вроде Windows XP, которые уже давно перешли в статус End of Life, либо просто годами не устанавливала патчи, считая, что «и так работает».</p>
  <p id="J3LD">В итоге злоумышленники воспользовались открытыми списками уязвимостей и устроили цифровой апокалипсис. Это классический случай, когда отсутствие своевременных обновлений и использование устаревшего стека превратили инфраструктуру в карточный домик...</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/not-relevant</guid><link>https://blog.kaurcev.dev/not-relevant?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/not-relevant?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Почему на рынке так много &quot;нерелевантных&quot; программистов?</title><pubDate>Thu, 22 Jan 2026 04:15:10 GMT</pubDate><description><![CDATA[Это сложный вопрос, и корни его уходят глубже, чем кажется. Мои размышления на эту тему начались ещё в студенчестве, и сегодня я хочу поговорить о тех, кто выходит на рынок с дипломом или сертификатом, но чьи надежды сталкиваются с суровой реальностью.]]></description><content:encoded><![CDATA[
  <p id="KT7M">Это сложный вопрос, и корни его уходят глубже, чем кажется. Мои размышления на эту тему начались ещё в студенчестве, и сегодня я хочу поговорить о тех, кто выходит на рынок с дипломом или сертификатом, но чьи надежды сталкиваются с суровой реальностью.</p>
  <p id="8tAZ">Начнём с мотивации. Почему люди идут в IT? Чаще всего — деньги. Откуда-то появилось твёрдое убеждение, что войти в топ самых оплачиваемых профессий можно по щелчку пальцев, пройдя краткий курс. Это опасная иллюзия и заезжанный стереотип. Практический опыт, который нельзя симулировать, не наработан. У таких &quot;спецов&quot; часто не выработаны качества написания чистого, поддерживаемого кода. Просто убери свои первые наработки в ящик, продолжай изучать и развиваться, а через год открой его снова. Я почти уверен, ты сам будешь критиковать этот код. Увы, такова природа профессионального роста.</p>
  <p id="05Rr">И сразу после выпуска залететь на позицию сеньора или техлида не получится. Это очевидно: нет навыков. Именно эти роли оправдывают высокие зарплатные ожидания, но у новичка нет ни практических кейсов, ни опыта решения критических проблем. Здесь стоит понять важную вещь: сеньоры и выше часто пишут меньше кода, чем мидлы или джуны. Это роль управленческая. Она подразумевает контроль процессов, умение тушить пожары, понимание цены и меры применения инструментов. Такой специалист видит смысл и принимает компромиссные решения там, где джун, охваченный синдромом &quot;переделать всё на свою реализацию&quot;, увидит лишь неидеальность.</p>
  <p id="9zUT">Но проблема не только в самих новичках: сход с верной тропы происходит раньше. Каждый год вузы и курсы выпускают огромное количество программистов. Однако учебные программы дают не всегда релевантный, а порой и узкий набор знаний. То, что принято считать &quot;базой&quot;, зачастую недостаточно для реальных проектов. В итоге молодые специалисты, опиравшиеся исключительно на лекции и игнорировавшие саморазвитие, сталкиваются с требованиями работодателя, у которого уже сформирован запрос на нишевые, готовые к задачам кадры. И даже найдя человека, компания зачастую вынуждена его переучивать — вкладываться в то, что он упустил в рамках самообразования.</p>
  <p id="L3oL">И тут скажу вам: если вас взяли в компанию, и вы чувствуете, что не всё вам по силам, но вас терпят и помогают — вы не обуза, вы <strong>инвестиция</strong>. Вы не приносите сиюминутную отдачу, но в вас тратят ресурсы, чтобы вырастить компетентного специалиста. Это типичная экономика рынка труда в IT.</p>
  <p id="M7cK">Однако картина будет неполной, если не посмотреть шире. Волна &quot;нерелевантности&quot; — это часто вопрос несоответствия. Ожидания рынка изменились: прошел период массового найма &quot;на вырост&quot; на фоне бума айтизации. Сейчас, в эпоху оптимизации, компании чаще ищут более узких, готовых специалистов под конкретные задачи. Выпускник с широким, но поверхностным бэкграундом становится &quot;нерелевантным&quot; не потому, что он плох, а потому, что его профиль не совпадает с острым запросом на специализацию.</p>
  <p id="UZLi">Таким образом, ситуация складывается из трёх ключевых факторов: инфляции ожиданий у новичков, отрыва образования от практики и изменившейся конъюнктуры рынка, который сегодня менее склонен к долгим инвестициям и хочет получить больше готовности &quot;здесь и сейчас&quot;. Это не приговор для начинающих, а скорее чёткий сигнал: путь в IT требует не только стартовых знаний, но и упорства, способности к самообучению и трезвого понимания, что настоящая ценность и, как следствие, высокий доход — это финишная прямая длинного марафона, а не быстрый спринт с дипломом в руке.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/real-time-systems</guid><link>https://blog.kaurcev.dev/real-time-systems?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/real-time-systems?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>СРВ - или системы реального времени. Что это и с чем едят?</title><pubDate>Thu, 25 Dec 2025 10:53:46 GMT</pubDate><description><![CDATA[<img src="https://img1.teletype.in/files/83/c0/83c03344-7034-4562-9c43-d29cb0217cc2.jpeg"></img>Давайте разберемся, что такое система реального времени (СРВ) и какая система может так называться. В чем ее фишка? И главное — причем тут &quot;разница между скоростью и предсказуемостью&quot;?]]></description><content:encoded><![CDATA[
  <p id="is7e">Давайте разберемся, что такое система реального времени (СРВ) и какая система может так называться. В чем ее фишка? И главное — причем тут &quot;разница между скоростью и предсказуемостью&quot;?</p>
  <p id="SatN"><strong>Начнем с определения.</strong> Википедия говорит так:</p>
  <blockquote id="EyQJ">Система реального времени (СРВ) — система, которая должна реагировать на события во внешней среде или воздействовать на нее в рамках <strong>строго заданных временных ограничений</strong>.</blockquote>
  <p id="K337">Прочитав первую часть, можно подумать: &quot;А, любая система, которая быстро реагирует, и есть СРВ!&quot;. И вот здесь — <strong>главное заблуждение большинства</strong>.</p>
  <p id="pfFJ"><strong>&quot;Быстро&quot; НЕ равно &quot;в реальном времени&quot;.</strong></p>
  <p id="rmsk">Суть СРВ — не в скорости, а в <strong>детерминированности</strong>, то есть предсказуемости. Любая хорошая система стремится быть быстрой (это про пропускную способность). Но СРВ делает фишку на другом: она дает результат не просто &quot;в среднем&quot; быстро, а <strong>гарантированно за определенное, часто жестко заданное время</strong>.</p>
  <blockquote id="54uU"><strong>Пример:</strong> если система должна среагировать за 0.1 секунду, она сделает это <strong>всегда</strong> в промежуток от 0.0 до 0.1с. Это и есть ее предсказуемость — ключевой фактор.</blockquote>
  <p id="GiNr">Просто представьте: <strong>подушка безопасности</strong> в машине должна сработать в первые 0.1 секунды после удара. А теперь представьте, что ее процессор в этот момент занят чем-то другим (ну, например, обновлением) и она &quot;думает&quot; 5 секунд. Вы понимаете, что это — <strong>катастрофа</strong>. Вот вам и вся разница.</p>
  <h2 id="8A35"><strong>Классификации: &quot;жесткие&quot; и &quot;мягкие&quot; СРВ</strong></h2>
  <p id="Czq2"><strong>Жесткие СРВ (Hard Real-Time).</strong> Возвращаемся к примеру с подушкой. Это системы, где нарушение временных рамок — это <strong>полный, фатальный отказ</strong> с критическими последствиями. Они повсюду в сферах, где ошибка стоит жизней или миллиардов: медицина (дефибрилляторы), авиация (системы управления полетом), АЭС, промышленные роботы.</p>
  <blockquote id="TC9j"><em>— То есть, они должны срабатывать точно в срок, и точка?</em></blockquote>
  <blockquote id="JWkw"><em>— Да. Моментально и без права на опоздание.</em></blockquote>
  <p id="Hwpk"><strong>Мягкие СРВ (Soft Real-Time).</strong> Это системы, которые ближе к нам, обычным пользователям. Здесь временные рамки важны, но их <strong>нарушение — не фатально</strong>. Оно ухудшает качество сервиса, но не ломает его полностью. Классические примеры — стриминговые сервисы (видео, музыка) и онлайн-игры. Пакет данных задержался? Получаем буферизацию или то самое: &quot;Игра лагает!&quot;. Сервис деградировал, но не сломался.</p>
  <blockquote id="zkGD"><em>— То есть, у &quot;жестких&quot; опоздание — крах, а у &quot;мягких2 — просто косяк и лаг?</em></blockquote>
  <blockquote id="60LJ"><em>— Именно!</em></blockquote>
  <h3 id="qrj6"><strong>А на чем это всё делают? </strong></h3>
  <p id="Zarr">Тут важно сразу понять: ваши обычные Windows, macOS или стандартный Linux <strong>не являются</strong> системами реального времени. Их планировщик задач — демократичный. Он может в любой момент прервать важный процесс, чтобы сделать что-то фоновое (проверить обновления, подвинуть окно). Для СРВ это смерть.</p>
  <p id="hFIl">Для этого существуют <strong>специализированные ОС реального времени (RTOS)</strong>. У них планировщик — &quot;диктатор&quot;. Он заранее знает, какая задача самая важная и сколько у нее есть времени, и не позволит ей опоздать ни при каких условиях:</p>
  <ul id="rvtl">
    <li id="ONnf"><a href="https://ru.wikipedia.org/wiki/QNX" target="_blank">QNX — Википедия</a></li>
    <li id="f0aL"><a href="https://ru.wikipedia.org/wiki/FreeRTOS" target="_blank">FreeRTOS — Википедия</a></li>
    <li id="2P8k"><a href="https://ru.wikipedia.org/wiki/VxWorks" target="_blank">VxWorks — Википедия</a></li>
    <li id="H5ks"><a href="https://ru.wikipedia.org/wiki/RTLinux" target="_blank">RTLinux — Википедия</a></li>
  </ul>
  <p id="AcrA"><strong>Языки программирования</strong> тоже берут особенные. В ходу <strong>C, C++, Ada, Rust, Zig</strong> — те, где программист сам управляет памятью, и нет непредсказуемых пауз. А вот <strong>Java, C# или Python</strong> обычно не годятся — у них есть <strong>Garbage Collector (сборщик мусора)</strong>, который может в самый неподходящий момент взять и остановить программу для уборки, что для СРВ неприемлемо.</p>
  <p id="zJbP">Система реального времени — это не про то, чтобы &quot;летать&quot;. Это про то, чтобы <strong>всегда приземляться точно в заданную секунду</strong>. Даже если для этого иногда приходится лететь чуть медленнее, но гарантированно.</p>
  <p id="KXZO">Надеюсь, теперь стало понятнее =)</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/kak-nadezhno-zaschitit-svoy-akkaunt-na-Gosuslugah</guid><link>https://blog.kaurcev.dev/kak-nadezhno-zaschitit-svoy-akkaunt-na-Gosuslugah?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/kak-nadezhno-zaschitit-svoy-akkaunt-na-Gosuslugah?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Как надёжно защитить свой аккаунт на Госуслугах от мошенников.</title><pubDate>Mon, 08 Dec 2025 16:43:42 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fd/1f/fd1f72eb-00d1-4e30-bab7-935ccce8779f.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/bc/34/bc3426bc-8cca-4c3e-9c8b-9e428f2aef0a.jpeg"></img>Аккаунт на портале Госуслуги - это цифровой ключ к огромному количеству персональных данных и жизненно важных услуг: паспорт, водительские права, налоговые данные, запись к врачу, подача заявлений. Именно поэтому он стал лакомой целью для кибермошенников. Взлом может привести не только к финансовым потерям, но и к краже личности, оформлению кредитов на ваше имя или блокировке доступа к госуслугам.]]></description><content:encoded><![CDATA[
  <p id="8x4G">Аккаунт на портале <strong>Госуслуги</strong> — это цифровой ключ к огромному количеству персональных данных и жизненно важных услуг: паспорт, водительские права, налоговые данные, запись к врачу, подача заявлений. Именно поэтому он стал лакомой целью для кибермошенников. Взлом может привести не только к финансовым потерям, но и к краже личности, оформлению кредитов на ваше имя или блокировке доступа к госуслугам.</p>
  <p id="GuY6">Это руководство поможет вам выстроить максимальную защиту и понять, как действовать злоумышленники, чтобы не попасться на их уловки.</p>
  <h3 id="hR5x"><strong>Часть 1: Как работают мошенники? (Знать врага в лицо)</strong></h3>
  <p id="1Tw4">Мошенники не взламывают портал силой. Они обманывают <em>вас</em>, чтобы вы сами отдали им логин и пароль или коды доступа.</p>
  <ol id="RHsT">
    <li id="pYMJ"><strong>Фишинг («поддельные» сайты и письма):</strong></li>
    <ul id="ZD83">
      <li id="cSkQ">Вам приходит СМС или email, якобы от «Госуслуг», с сообщением о блокировке аккаунта, неоплаченной госпошлине или подозрительной активности.</li>
      <li id="EFk2">Ссылка в сообщении ведёт на идеально повторяющий официальный сайт-подделку.</li>
      <li id="sews">Вы вводите свои логин, пароль и даже пришедший по СМС код на этом фейковом сайте. Всё - мошенники получили полный доступ.</li>
    </ul>
    <li id="jtsV"><strong>Поддельные звонки («социальная инженерия»):</strong></li>
    <ul id="6CqK">
      <li id="ong8">Вам звонит «сотрудник службы безопасности Госуслуг», «банка» или «полиции».</li>
      <li id="2dD1">Сообщает, что на ваше имя пытаются оформить кредит или ваш аккаунт взломали.</li>
      <li id="KKox">Чтобы «заблокировать операцию» или «защитить счёт», он просит продиктовать коды из СМС, которые приходят на ваш телефон. <strong>Ни один настоящий сотрудник никогда не будет спрашивать у вас эти коды!</strong></li>
    </ul>
    <li id="SUqy"><strong>Вредоносное ПО:</strong></li>
    <ul id="GhYI">
      <li id="AtFn">Установив троянскую программу (через сомнительный софт, файл в почте), мошенники могут перехватывать СМС, нажатия клавиш и данные с вашего устройства.</li>
    </ul>
  </ol>
  <h3 id="t55S"><strong>Часть 2: Фундамент защиты — создание неприступного аккаунта</strong></h3>
  <h4 id="x4xW"><strong>1. Суперпароль — это обязательный минимум</strong></h4>
  <ul id="Wn2e">
    <li id="FWOJ"><strong>Длина важнее сложности:</strong> Не менее 12-15 символов.</li>
    <li id="lyEl"><strong>Уникальность:</strong> Никогда не используйте этот пароль на других сайтах (соцсети, почта).</li>
    <li id="SYFn"><strong>Совет:</strong> Придумайте <strong>пассфразу</strong> — несколько случайных слов, разделённых знаками: <code>Лето#Дождь%СтоЛ2025</code>. Запоминается легче, а взломать сложнее.</li>
  </ul>
  <h4 id="LEfF"><strong>2. Двухфакторная аутентификация (2FA) — ГЛАВНЫЙ ЩИТ. Не просто СМС, а TOTP-коды!</strong></h4>
  <p id="3G5C">СМС-код — это хорошо, но не идеально (риск перехвата через SIM-свап). <strong>Настоятельно рекомендуется использовать приложение-аутентификатор (TOTP).</strong></p>
  <p id="4UNR"><strong>Что это такое и как работает?</strong></p>
  <ul id="3NSr">
    <li id="I58B"><strong>TOTP (Time-based One-Time Password)</strong> — это одноразовые коды, которые генерируются в специальном приложении на вашем телефоне (Google Authenticator, Microsoft Authenticator, Яндекс ID). Код обновляется каждые 30 секунд и не зависит от сети.</li>
  </ul>
  <blockquote id="xJTa">Можете довериться Яндексу и ознакомиться более детально тут: <a href="https://yandex.ru/support/id/ru/authorization/twofa" target="_blank">https://yandex.ru/support/id/ru/authorization/twofa</a></blockquote>
  <figure id="VSIL" class="m_retina">
    <img src="https://img2.teletype.in/files/d9/1c/d91c48ec-b760-440b-a989-4f29db5c27bc.png" width="640" />
    <figcaption>Даже если мошенник узнает ваш пароль, без этого кода с вашего конкретного телефона он не зайдёт.</figcaption>
  </figure>
  <ul id="RAuK">
    <li id="zKbF"><strong>Как подключить на Госуслугах:</strong></li>
    <ol id="e4Qb">
      <li id="UtFd">Зайдите в свой профиль на <a href="https://gosuslugi.ru/" target="_blank">gosuslugi.ru</a>.</li>
      <li id="5ukk">Перейдите в раздел <strong>«Настройки» → «Безопасность»</strong>.</li>
      <li id="7SUs">Найдите пункт <strong>«Двухфакторная аутентификация»</strong> и выберите способ <strong>«Мобильное приложение»</strong>.</li>
      <li id="sNki">Отсканируйте QR-код с экрана через ваше приложение-аутентификатор.</li>
      <li id="N1mW">Введите первый сгенерированный код для подтверждения.</li>
    </ol>
    <li id="UgK8"><strong>Результат:</strong> Теперь при каждом входе, кроме пароля, вам нужно будет ввести 6-значный код из этого приложения.<strong> Напомню: если мошенник узнает ваш пароль, без этого кода с <em>вашего конкретного телефона</em> он не зайдёт.</strong></li>
  </ul>
  <h4 id="ecvx"><strong>3. Резервные коды доступа — ваш спасательный круг</strong></h4>
  <p id="e9Fo">При настройке 2FA система предложит вам <strong>распечатать или сохранить резервные коды</strong>. СДЕЛАЙТЕ ЭТО! Если вы потеряете телефон, эти 10-15 одноразовых кодов — единственный способ восстановить доступ. Храните их в надёжном месте (зашифрованный файл, сейф).</p>
  <h3 id="tNjE"><strong>Часть 3: Правила цифровой гигиены</strong></h3>
  <ol id="cZzA">
    <li id="Iqdm"><strong>Проверяйте адрес сайта:</strong> Официальный адрес — <strong><code>gosuslugi.ru</code></strong>. Всегда смотрите на строку браузера. Фишинговые сайты используют похожие адреса: <code>gos-uslugi.ru</code>, <code>gosuslugi.com</code>, <code>gosuslugi.help</code> и т.д.</li>
    <li id="XaNy"><strong>Не переходите по ссылкам из писем и СМС.</strong> Если получили тревожное сообщение, не кликайте. Зайдите на портал <strong>напрямую</strong>, через браузер или приложение, и проверьте уведомления там.</li>
    <li id="WZYk"><strong>Помните про федеральные номера:</strong> Официальные службы (банки, Госуслуги, МВД) звонят только с федеральных (общероссийских) номеров, обычно начинающихся на <strong><code>8 800</code></strong> или <strong><code>495</code></strong>, <strong><code>812</code></strong> (коды Москвы и СПб). <strong>Звонки с мобильных номеров (<code>+79...</code>) от имени этих организаций — 100% мошенничество.</strong></li>
    <li id="GHgm"><strong>Не диктуйте коды никому!</strong> Это золотое правило. Код из СМС или приложения — только для вас.</li>
    <li id="pao8"><strong>Используйте официальное приложение.</strong> Скачивайте его только из официальных магазинов: App Store или Google Play.</li>
  </ol>
  <h3 id="NVWh"><strong>Часть 4: Что делать, если вы всё же попались на удочку?</strong></h3>
  <p id="Hlvy">Главное — действовать <strong>немедленно</strong>.</p>
  <ol id="RsZM">
    <li id="Ena3"><strong>Немедленно позвоните на официальную горячую линию Госуслуг:</strong><br /><strong><code>8 800 100-70-10</code></strong> (звонок бесплатный из любого региона России).</li>
    <ul id="x2VK">
      <li id="ONwQ">Сообщите оператору о случившемся.</li>
      <li id="Opyl">Попросите <strong>заблокировать</strong> ваш аккаунт, чтобы мошенники не смогли ничего сделать.</li>
    </ul>
    <li id="sneg"><strong>Смените пароль</strong> (после разблокировки аккаунта или параллельно, если доступ ещё есть) на новый, сверхнадежный.</li>
    <li id="4a0y"><strong>Проверьте все действия в аккаунте:</strong> Зайдите в <strong>«Настройки» → «Безопасность» → «История входов»</strong>. Там будут видны все устройства и места, откуда заходили в ваш профиль. Если видите незнакомые — завершите эти сеансы.</li>
    <li id="AZBN"><strong>Подайте заявление в полицию.</strong> Особенно если были совершены какие-либо действия (оформлен кредит, списаны деньги). Это важно для вашего же правового защиты.</li>
    <li id="NN7c"><strong>Предупредите свой банк,</strong> если платежные данные или карты были привязаны к аккаунту.</li>
  </ol>
  <h3 id="YqFf"><strong>Краткая памятка-чеклист</strong></h3>
  <ul id="8SLb">
    <li id="dwvi">Пароль от Госуслуг — длинный, сложный и уникальный.</li>
    <li id="u8BC">Включена <strong>двухфакторная аутентификация через приложение (TOTP)</strong>, а не только СМС.</li>
    <li id="PjWs">Резервные коды доступа сохранены в надёжном месте.</li>
    <li id="8eYa">Я <strong>НИКОГДА</strong> и <strong>НИКОМУ</strong> не называю коды из СМС или приложения.</li>
    <li id="NuYM">Я знаю, что официальный сайт — <strong>только <code>gosuslugi.ru</code></strong>.</li>
    <li id="LLHu">Я помню, что звонки о проблемах с аккаунтом <strong>с мобильных номеров — это мошенники</strong>.</li>
    <li id="G2Zc">Я сохранил номер официальной горячей линии: <strong><code>8 800 100-70-10</code></strong>.</li>
  </ul>
  <p id="5ihe"><strong>Итог:</strong> Безопасность вашего аккаунта на 90% зависит от ваших действий. Включив двухфакторную аутентификацию через приложение и следуя простым правилам бдительности, вы сводите риск взлома практически к нулю. Берегите свои данные!</p>
  <blockquote id="Di7r">И помните, если вам всё-таки не повезло (потому что вы не прочитали эту статью ранее), вы всегда можете найти справочную информацию тут:<br /><a href="https://www.gosuslugi.ru/help/faq/personal_data/4562" target="_blank">https://www.gosuslugi.ru/help/faq/personal_data/4562</a></blockquote>
  <figure id="fWns" class="m_retina">
    <img src="https://img1.teletype.in/files/49/ba/49baeb80-bd6b-4894-84fc-8c0395d91cd3.png" width="952" />
    <figcaption>Скриншот страницы Госуслуг <strong>«Если учётную запись взломали».</strong></figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/cats-world</guid><link>https://blog.kaurcev.dev/cats-world?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/cats-world?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Cat's World - или то, как блокировка сподвигла сделать свою игру.</title><pubDate>Sat, 18 Oct 2025 13:41:44 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/54/58/54582a27-8a5e-40ce-bee7-21cc40640913.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/3c/31/3c31af3a-36be-48c2-b5db-af62c12e1676.png"></img>Эту статью можно было бы написать ещё в 2023-м, когда я только загорелся идеей сделать игру, вдохновлённую Pony Town.]]></description><content:encoded><![CDATA[
  <p id="Vz8q">Эту статью можно было бы написать ещё в 2023-м, когда я только загорелся идеей сделать игру, вдохновлённую Pony Town.</p>
  <p id="m27e">Впервые я узнал об этой игре в 2019 году. Сначала я не понимал, чем там занимаются мои друзья - говорили что-то вроде &quot;найди в браузере, и всё&quot;. Меня это заинтриговало, и я решил посмотреть сам.</p>
  <p id="OHd6">Оказалось, всё гораздо проще, чем я думал: игра была браузерной.</p>
  <p id="3g2F">С этого момента я начал глубже изучать её устройство. Она позиционировалась как социальная, но техническая реализация показалась мне чрезвычайно интересной.</p>
  <p id="mD7N">Более того, у разработчиков даже был открыт GitHub-репозиторий для приватного сервера (пока у них не случились внутренние проблемы, после чего его убрали).</p>
  <p id="TJ55">Время шло, я занимался другими проектами, но мысль о подобной игре не отпускала.</p>
  <p id="Ovn6">На дворе стоял уже 2021 год, и желание создать что-то подобное Pony Town снова стало настойчивым. Я решил попробовать.</p>
  <p id="ecfg">Использование игровых движков - это стандартный путь: он ускоряет разработку, да и при масштабировании проекта проще найти людей, которые смогут быстро включиться в работу без глубокого погружения. Я выбрал Construct 2. Да, он очень упрощал и ускорял процесс, но некоторые моменты в нём меня не устраивали. К тому же, на тот момент его уже активно вытеснял Construct 3.</p>
  <p id="SoAE">Разработка сначала шла полным ходом, но потом постепенно замедлилась и, в конце концов, проект попал в стопку &quot;архивных&quot; - тех, что висят в состоянии &quot;заморожен или заброшен&quot;.</p>
  <p id="XXyV">И вот на дворе апрель, весна 2023 года. Я по-прежнему интересуюсь технической стороной Pony Town, и тут мне попадается объявление о поиске программиста в команду разработчиков самой игры.</p>
  <p id="qfXy">Оно выглядело так:</p>
  <blockquote id="k0kb">Мы ищем опытных программистов, обладающих навыками разработки игр, игровых движков или серверной части. По окончании ознакомительного периода ожидается, что вы справитесь с разработкой основных функций (сравнимых с системой друзей или чатов), не требуя, чтобы вас держали за руку.<br />Мы планируем добавить множество важных функций для формирования игры, и вы сыграете значительную роль в их создании.<br />Должность оплачиваемая и на полный рабочий день, при этом вся работа выполняется удалённо.</blockquote>
  <p id="6aaJ">Мне показалось это очень интересным и перспективным предложением, к тому же - удалёнка =)</p>
  <p id="0o0W">Но, увы и ах, скорее всего, моих навыков оказалось недостаточно (и это бесспорно, так как на тот момент я действительно не дотягивал до нужного им уровня).</p>
  <p id="irkD">После этого меня чудесным образом заблокировали в игре. Это был первый раз. Потом я потерял интерес и забил на эту затею. Висели и другие проекты, я занимался своими делами - откровенно говоря, было не до этого.</p>
  <p id="X91L">Наступил 2025 год. Я каким-то образом вспомнил об игре и решил глянуть, что там и как. Создал новый аккаунт, зашёл... и снова увидел всё то же самое. Но вскоре снова получил бан. И вот с этого момента начинается основная часть моей истории.</p>
  <h2 id="28go">Начало разработки</h2>
  <figure id="gjel" class="m_original">
    <img src="https://img4.teletype.in/files/f6/7d/f67de3df-5313-4934-bb98-d27bb74b340f.png" width="885" />
    <figcaption>да, спасибо =)</figcaption>
  </figure>
  <p id="E5vs">Меня задело, что меня снова забанили. Бан со стороны игры был формально оправдан: создание нескольких аккаунтов. Но немного позже я всё-таки решил взяться и реализовать свою версию.</p>
  <p id="srCT">В этот раз я хотел сделать что-то более инновационное. Я отвык от игровых движков, и в итоге пришёл к идее монорепозитория с бэкендом и фронтендом, реализованными на нативном TypeScript. Это решение имело как плюсы, так и минусы, но я начал работу.</p>
  <p id="PJ7w">Организовать простое веб-приложение на вебсокетах - задача несложная, так что с базовой структурой проблем не возникло.</p>
  <p id="YwtV">Первым делом на canvas появились точки, каждая из которых имела набор символов (условный ник, а на деле - идентификатор подключения).</p>
  <p id="dbod">Затем я отправился в &quot;темницу&quot; бесплатных текстур под названием itch.io и снова нашёл тот самый набор, который использовал ещё в 2023-м. Решил: &quot;было раньше так - будет и сейчас&quot;. В наборе были все основные направления спрайтов (но, увы, не хватало диагоналей). Я накидал первый прототип.</p>
  <figure id="1QoY" class="m_retina">
    <img src="https://img4.teletype.in/files/f5/f5/f5f5e8bb-c462-4046-a5e6-f4db9d5f0c0e.png" width="430.5" />
    <figcaption>первый прототип</figcaption>
  </figure>
  <p id="qKuI">Как видно на скриншоте, я добавил отображение вектора скорости (velocity), чтобы персонаж выбирал направление движения.</p>
  <p id="vQd1">Затем встал вопрос синхронизации анимаций. Эту задачу я возложил на клиент, чтобы не нагружать сервер, который лишь передаёт направление движения персонажа.</p>
  <p id="NDCZ">Следующим камнем преткновения стала тайловая карта. Мне нужна была система, совместимая с тайлами из моего набора с itch.io.</p>
  <p id="9znu">Немного подумав, я решил сделать простой двумерный массив на сервере, который клиент бы отрисовывал, используя ID тайлов из ячеек для графического отображения. Так появилась первая версия с тайлами.</p>
  <figure id="m7wQ" class="m_retina">
    <img src="https://img2.teletype.in/files/11/48/114898cf-c4c1-4a0e-b3d1-6f621a5b8dbb.png" width="466.5" />
    <figcaption>вот так выглядит карта</figcaption>
  </figure>
  <p id="LO5W">Выглядело это, конечно, несуразно, потому что вот так выглядел этот массив в реальности:</p>
  <figure id="946h" class="m_retina">
    <img src="https://img4.teletype.in/files/f2/b8/f2b84c09-faa7-4dfd-b94f-c2ffe3c4acfa.png" width="640" />
    <figcaption>вот так карта выглядела в map.json</figcaption>
  </figure>
  <p id="cdtp">Планировать карту таким способом было невероятно сложно. Заниматься лвл-дизайном в голом JSON - то ещё удовольствие.</p>
  <p id="qY4p">Вот буквально моя попытка написать слово &quot;СВОБОДА&quot;, которые так и не увенчалась успехом:</p>
  <figure id="5dzZ" class="m_retina">
    <img src="https://img3.teletype.in/files/a7/1f/a71f3836-17e4-4f96-92e8-eb7e1a458666.png" width="640" />
    <figcaption>ну вы все поняли, да?</figcaption>
  </figure>
  <figure id="emxz" class="m_column">
    <img src="https://img1.teletype.in/files/cb/0e/cb0e4fbe-235c-46ff-9d8c-683edb374c4f.png" width="480" />
    <figcaption>Реально сложно</figcaption>
  </figure>
  <p id="Vrr0">Тут я вспомнил, что у админа в Pony Town (как я видел в одном из обзоров приватного сервера) была возможность редактировать мир прямо в игре. Да и у обычных игроков на личных островах была механика украшения. Я понял, как мне стоит поступить: сделать микро-редактор мира с выбором тайла и живой перезаписью JSON карты. </p>
  <figure id="Ty5U" class="m_retina">
    <img src="https://img2.teletype.in/files/1b/51/1b514c23-b84e-46f7-b55b-20a63b5579de.png" width="419" />
    <figcaption>тут же мир стал преображаться, а такие декор-надписи стало делать куда проще</figcaption>
  </figure>
  <p id="x7y0">Да, это решало проблему, но я не считал такое решение идеальным. Тем не менее, после внедрения редактора благоустройство мира пошло куда легче, хотя чувство &quot;неправильности&quot; решения не отпускало. Но да ладно</p>
  <p id="MSC3">Далее я решил развивать функционал и добавил смену времени суток. Утром - одни тона, днём - светло, вечером - розоватое небо, ночью - темно. Выглядело это примерно так:</p>
  <figure id="TQlL" class="m_retina">
    <img src="https://img2.teletype.in/files/d7/29/d7291b31-6b4a-46c9-a360-523f7a5af473.png" width="640" />
    <figcaption>режим дебага, закат</figcaption>
  </figure>
  <p id="n2EY">Но чем дальше я продвигался, тем больше понимал, что накосячил с архитектурой. Я ушёл слишком далеко вперёд, чтобы легко возвращаться и менять структуру. Моё стремление изначально писать &quot;правильно&quot;, используя принципы SOLID, разбилось о суровую реальность: у меня получился почти что монолит.</p>
  <p id="kjP6">Например, модель клиента и сервера была тесно переплетена. Сервер не только обеспечивал мультиплеер, но и раздавал статический контент. В случае его падения пользователь не мог бы даже загрузить страницу, не понимая, упал сайт или игра закрыта навсегда.</p>
  <p id="nNNx">И вот тут я разделил архитектуру на две части:</p>
  <ul id="kNNh">
    <li id="xtC7">Серверная часть: занимается только вебсокетами, игровой логикой и серверными функциями.</li>
    <li id="g7PI">Клиентская часть: была вынесена отдельно. Её можно разместить на CDN, чтобы игра загружалась мгновенно, а экземпляры бэкенда можно раскидать по регионам для лучшей локализации и производительности.</li>
  </ul>
  <p id="RhrO">Это привело меня в настоящий экстаз! Хотя первый прототип уже работал, он мне не нравился. Я решил переделать механику камеры. Снова начал с пустого мира, снова разделил сервер и клиент.</p>
  <p id="y04l">И вот что в итоге получилось:</p>
  <figure id="i9Ol" class="m_retina">
    <img src="https://img3.teletype.in/files/a0/6b/a06b17e5-b56e-4b1a-a472-e3040c49f45d.png" width="366.5" />
    <figcaption>Котик может &quot;залететь на сервер&quot;.</figcaption>
  </figure>
  <figure id="ImSe" class="m_retina">
    <img src="https://img1.teletype.in/files/00/e4/00e4e81f-441c-447a-ac6e-1f7986e40519.png" width="306.5" />
    <figcaption>Анимации движения полноценно синхронизированы между всеми игроками.</figcaption>
  </figure>
  <figure id="e9E4" class="m_retina">
    <img src="https://img2.teletype.in/files/5d/53/5d53dafb-b8f3-450a-a3a1-d3c3fd0d869f.png" width="282.5" />
    <figcaption>У каждого котика есть свой ник и скин. Свой персонаж подсвечен (возможно, уберу), а при наведении на другого виден его ник.</figcaption>
  </figure>
  <figure id="jQf8" class="m_retina">
    <img src="https://img3.teletype.in/files/ef/3b/ef3b0a78-536e-415f-8bd0-dcdd8e64b33b.png" width="256.5" />
    <figcaption>Реализован статус &quot;печатает&quot;.</figcaption>
  </figure>
  <figure id="SazP" class="m_retina">
    <img src="https://img4.teletype.in/files/7f/d8/7fd8fb14-2da0-4ee9-acf0-1f8cde86c60f.png" width="317" />
    <figcaption>Игроки могут обмениваться сообщениями, которые видны внизу экрана.</figcaption>
  </figure>
  <figure id="vWoN" class="m_retina">
    <img src="https://img1.teletype.in/files/ca/15/ca15a6ac-9cb0-4337-aa1a-41fef753d895.png" width="425" />
    <figcaption>По нажатию F1 открывается полная история чата.</figcaption>
  </figure>
  <figure id="7TqA" class="m_retina">
    <img src="https://img1.teletype.in/files/4f/9e/4f9e2147-5fe7-46dd-b31e-f6523e21eaf9.png" width="312" />
    <figcaption>Добавлена миникарта, показывающая местоположение всех &quot;котят&quot;</figcaption>
  </figure>
  <figure id="Cwyc" class="m_retina">
    <img src="https://img1.teletype.in/files/01/2a/012a8b0f-44e3-47fa-88b7-a29c51ec9eba.png" width="543.5" />
    <figcaption>Реализована функция наблюдения (описание ниже)</figcaption>
  </figure>
  <p id="eXIO">Следующие фичи сложно показать скринами, но они включают:</p>
  <ul id="wpL5">
    <li id="67VD">Плавная камера, следующая за персонажем.</li>
    <li id="ujLN">Функция &quot;Обзор&quot;: зажав V, можно осмотреть местность в радиусе 800 условных единиц. Алгоритм проработан так, что вы видите всё пространство между вами и курсором.</li>
    <li id="EriG">Функция &quot;Наблюдение&quot;: можно закрепить фокус на другом игроке. Игра будет показывать расстояние до него, а ваш персонаж автоматически повернётся в сторону объекта наблюдения.</li>
  </ul>
  <p id="ZnCF">Структура проекта наконец-то начала радовать глаз:</p>
  <figure id="OaMv" class="m_retina">
    <img src="https://img1.teletype.in/files/cf/da/cfda1454-e92d-4fef-afd3-fb6e819f40a3.png" width="146.5" />
    <figcaption>сказка, структура проекта такая лакомая, мммммм</figcaption>
  </figure>
  <p id="5LNR">Далее я решил отвлечься на что-то более приятное - интерфейс (да, я знаю, что нарушил принцип YAGNI, но дедлайнов нет, это пет-проект).</p>
  <p id="oCbY">Пока баловался с GUI, я уже размышлял, как превратить этот пет-проект из простой социальной игры в полноценную MMORPG... Но это были просто идеи, чтобы отвлечься, потому что я очень глубоко погрузился в разработку и мне нужен был отдых (на тот момент я уже 5 дней подряд жил этим проектом).</p>
  <p id="BtL8">Я начал нагружать видеокарту различными эффектами:</p>
  <figure id="PESF" class="m_retina">
    <img src="https://img4.teletype.in/files/3b/fd/3bfd7f87-e06c-4ff4-8442-c195ca5161a9.png" width="640" />
    <figcaption>нюансы, что требовали оптимизации</figcaption>
  </figure>
  <p id="428I">Затем встала задача оптимизации. Те, кто занимался разработкой игр, знают: часто быстрее перерисовать объект, чем постоянно хранить его в памяти. Я вернулся к одной из плановых задач и реализовал отрисовку мира по тайлам &quot;на лету&quot;.</p>
  <figure id="8kBp" class="m_retina">
    <img src="https://img4.teletype.in/files/33/79/3379e38d-e49e-4ccc-bee6-88b95859cc78.png" width="640" />
    <figcaption>перед тем как начать тестить прорисовку тайлов</figcaption>
  </figure>
  <figure id="l1Q6" class="m_retina">
    <img src="https://img4.teletype.in/files/f8/49/f8498d9b-cd36-41df-8bfc-f114d26c0fdb.png" width="640" />
    <figcaption>вот так выглядит минимальная прорисовка, функция &quot;обзор&quot; уже фокусируется на курсоре</figcaption>
  </figure>
  <figure id="HuxU" class="m_retina">
    <img src="https://img1.teletype.in/files/03/78/0378617c-47df-4f60-a2c7-5ae07438182d.png" width="640" />
    <figcaption>взгляд в сторону, функция &quot;обзор&quot; уже фокусируется на курсоре</figcaption>
  </figure>
  <figure id="gjho" class="m_retina">
    <img src="https://img1.teletype.in/files/45/7f/457f5b9f-9a48-46d0-b779-d9a2f7443fbc.png" width="640" />
    <figcaption>функция &quot;обзор&quot; уже фокусируется на другом игроке</figcaption>
  </figure>
  <figure id="9OkY" class="m_column">
    <img src="https://img1.teletype.in/files/c2/16/c216f018-9ad8-410c-8131-5acf957724ee.png" width="1280" />
    <figcaption>функция &quot;обзор&quot; уже фокусируется на другом игроке</figcaption>
  </figure>
  <p id="gQqQ">Оптимизировав концепцию, я добился максимальной производительности даже с эффектами размытия и плавной камерой.</p>
  <figure id="NpxY" class="m_retina">
    <img src="https://img2.teletype.in/files/92/b6/92b6322a-86b0-424c-8511-33943221d413.png" width="640" />
    <figcaption>функция &quot;обзор&quot; уже фокусируется на другом игроке с размытием, FPS обманывает, честно говорю =)</figcaption>
  </figure>
  <p id="RAUR">После этого я снова вернулся к циклу дня и ночи. К счастью, логика осталась от предыдущей концепции, и я без труда её перенёс.</p>
  <p id="bGB5">Вот для сравнения скриншоты на максимальных настройках графики и на минимальных:</p>
  <figure id="VKfo" class="m_retina">
    <img src="https://img3.teletype.in/files/e2/64/e2648424-7a1a-465b-ad29-e3e8f673613c.png" width="640" />
    <figcaption>Максимальное количество тайлов + размытие</figcaption>
  </figure>
  <figure id="NCfv" class="m_retina">
    <img src="https://img2.teletype.in/files/d9/d7/d9d701be-1889-44ae-b6d2-4e888ff06082.png" width="640" />
    <figcaption>Минимальное количество тайлов + размытие</figcaption>
  </figure>
  <p id="9V3V">Затем я занялся внутриигровым взаимодействием, тем же слежением за персонажем. Помимо функции обзора, добавилась фиксация фокуса на другом игроке с расчётом расстояния до него:</p>
  <figure id="NPI9" class="m_retina">
    <img src="https://img3.teletype.in/files/23/5f/235f0eda-3085-40fd-bafb-8529a97b8909.png" width="640" />
    <figcaption>Следят друг за другом, сталкера</figcaption>
  </figure>
  <p id="LGX4">И снова я вернулся к вопросу с тайлами. Как сделать это правильно? Я решил, что этот вопрос пока второстепенен, так как многое другое требовало внимания. Обошёлся простым генератором квадратных комнат, заполненных тайлами.</p>
  <p id="LYUd">И снова я пошёл нарушать YAGNI: раз уж есть смена дня и ночи, почему бы не сделать динамичные тени?</p>
  <p id="tlUC">Из нюансов: я не использовал WebGL и сторонние графические библиотеки, решив пойти &quot;тёмным&quot; путём. Вот что из этого вышло:</p>
  <figure id="5skw" class="m_retina">
    <img src="https://img2.teletype.in/files/da/d0/dad0695f-437e-4d42-b430-6a8eedd498f6.png" width="461" />
    <figcaption>Динамичные тени (обрубыши)</figcaption>
  </figure>
  <figure id="jqDv" class="m_retina">
    <img src="https://img1.teletype.in/files/47/12/4712f924-d184-44a3-b1f2-49ab4382bff2.png" width="445" />
    <figcaption>Темнота и эффект неполноценного свечения</figcaption>
  </figure>
  <h2 id="Cg9Y">Сюр при попытке дать поиграть знакомому</h2>
  <p id="z34D">Пожалуй, это один из ключевых моментов. Мой знакомый поинтересовался прогрессом и захотел посмотреть на игру. Я решил показать ему вторую концепцию (первую он уже видел, а я её полностью переделал).</p>
  <p id="fzkC">И тут я столкнулся с проблемой: у меня не было готовой методики развёртывания. Я-то понимал, как всё устроено, но к такому резкому повороту событий готов не был. У меня не было готового docker-compose, никаких инструкций. Задача сместилась: нужно было срочно навести порядок в деплое.</p>
  <p id="nJPq">Я настроил webpack, прописал сценарии сборки для монорепозитория, проверил, как всё билдится и устанавливается. На деле это было сделано быстро, но перепроверить всё стоило.</p>
  <p id="BRGV">Раз реализация подразумевала подключение к разным серверам, нужно было оформить главную страницу. Сначала я сделал простое меню с вводом ника и выбором сервера:</p>
  <figure id="eL6D" class="m_original">
    <img src="https://img1.teletype.in/files/43/d2/43d27ffb-65c7-41f6-aad8-b190230ed1fc.png" width="581" />
    <figcaption>Обычный select с выбором сервера</figcaption>
  </figure>
  <p id="5Y8b">И вот, всё было готово для создания первой альфа-версии. Я решил использовать сервисы, которые могут подключаться напрямую к GitHub-репозиторию. Игра вытягивалась двумя разными серверами, каждый из которых по своему сценарию разворачивал систему через npm. Клиентская часть улетала на CDN, а бэкенд оставался с меткой &quot;сервер&quot;.</p>
  <figure id="u3Vw" class="m_retina">
    <img src="https://img2.teletype.in/files/1e/5a/1e5ac83b-63eb-48f7-ad8e-eb83df62434b.png" width="384" />
    <figcaption>Если что, они все в режиме наблюдения за игроком asd</figcaption>
  </figure>
  <p id="gC5l">Последние полтора дня я потратил на редизайн главной страницы, отладку взаимодействия клиента с сервером и настройку приятных прогулок по кошачьему миру.</p>
  <figure id="i0q4" class="m_retina">
    <img src="https://img4.teletype.in/files/b9/dd/b9ddd96a-5e26-4988-be99-211faf38ec31.png" width="960" />
    <figcaption>Вот так сейчас выглядит главная страница</figcaption>
  </figure>
  <p id="R2wn">Вот такая получилась история о том, почему и как я реализовал этот пет-проект.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/Mfi_38P6o0l</guid><link>https://blog.kaurcev.dev/Mfi_38P6o0l?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/Mfi_38P6o0l?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Руководство по установке .NET 8.0 на Debian 13</title><pubDate>Thu, 02 Oct 2025 06:09:08 GMT</pubDate><category>Debian</category><description><![CDATA[Актуально на октябрь 2025 года | Версия .NET: 8.0]]></description><content:encoded><![CDATA[
  <h1 id="pdIn">Руководство по установке .NET 8.0 на Debian 13</h1>
  <blockquote id="DWve">Актуально на октябрь 2025 года | Версия .NET: 8.0</blockquote>
  <h3 id="5mwU">Введение</h3>
  <p id="kQ87">Тут инфа как установить .NET SDK 8.0 на операционную систему Debian 13. .NET SDK включает в себя все необходимое для разработки, сборки и запуска приложений на платформе .NET.</p>
  <h3 id="6GwA">Подготовка системы</h3>
  <p id="2OWS">Перед установкой .NET рекомендуется обновить систему до последних доступных версий пакетов:</p>
  <pre id="SytG">sudo apt update &amp;&amp; sudo apt upgrade -y</pre>
  <h3 id="73tG">Установка необходимых зависимостей</h3>
  <p id="eXpd">Для работы с репозиториями Microsoft потребуется установить дополнительные пакеты:</p>
  <pre id="xeSl">sudo apt install -y apt-transport-https ca-certificates gnupg wget</pre>
  <p id="AvLW">Эти пакеты обеспечивают:</p>
  <ul id="6Nej">
    <li id="yx2U">apt-transport-https - поддержку HTTPS-соединений для APT</li>
    <li id="eg0c">ca-certificates - доверенные SSL-сертификаты</li>
    <li id="i6Q4">gnupg - работу с GPG-ключами</li>
    <li id="TdiM">wget - загрузку файлов из интернета</li>
  </ul>
  <h3 id="wdO2">Добавление репозитория Microsoft</h3>
  <p id="AgyG">Добавляем официальный репозиторий Microsoft в систему:</p>
  <pre id="hamz"># Загружаем пакет с настройками репозитория
wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
# Устанавливаем пакет
sudo dpkg -i packages-microsoft-prod.deb
# Удаляем загруженный файл (больше не нужен)
rm packages-microsoft-prod.deb</pre>
  <h3 id="TTfj">Установка .NET SDK 8.0</h3>
  <p id="Ebif">Обновляем информацию о пакетах и устанавливаем .NET SDK 8.0:</p>
  <pre id="96S5">sudo apt update
sudo apt install -y dotnet-sdk-8.0</pre>
  <h3 id="TDxb">Проверка установки</h3>
  <p id="EvIx">Убедимся, что .NET успешно установлен:</p>
  <pre id="4sWx">dotnet --version</pre>
  <blockquote id="aD7D">kaurcev@debian:$ dotnet --version<br />8.0.414<br />kaurcev@debian:$</blockquote>
  <h2 id="8tek">Пример работы</h2>
  <pre id="HCwZ"># Создаем новое консольное приложение
dotnet new console -n MyTestApp

# Переходим в директорию проекта
cd MyTestApp

# Запускаем приложение
dotnet run</pre>
  <p id="aNm1"><em>Можно найти в GitHub Gist: <a href="https://gist.github.com/kaurcev/617bb52920a953279a07cef52a3c41b8" target="_blank">https://gist.github.com/kaurcev/617bb52920a953279a07cef52a3c41b8</a></em></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.kaurcev.dev/50o2AqBnlV4</guid><link>https://blog.kaurcev.dev/50o2AqBnlV4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev</link><comments>https://blog.kaurcev.dev/50o2AqBnlV4?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=kaurcev#comments</comments><dc:creator>kaurcev</dc:creator><title>Мессенджер без сервера: WebRTC как технологическая альтернатива централизованным решениям</title><pubDate>Wed, 01 Oct 2025 17:27:24 GMT</pubDate><description><![CDATA[Появление национального мессенджера МАХ в 2025 году действительно вызвало важную дискуссию о балансе между удобством, безопасностью и приватностью. Критические замечания ФСБ, касающиеся защиты персональных данных и требований по созданию модели угроз, подчеркивают фундаментальную проблему централизованных систем: чем больше контроль, тем выше риски для приватности.]]></description><content:encoded><![CDATA[
  <h1 id="sUcZ">Мессенджер без сервера: WebRTC как технологическая альтернатива централизованным решениям</h1>
  <h2 id="wq4A">Введение: почему децентрализация становится актуальной</h2>
  <p id="U0Lu">Появление национального мессенджера МАХ в 2025 году действительно вызвало важную дискуссию о балансе между удобством, безопасностью и приватностью. Критические замечания ФСБ, касающиеся защиты персональных данных и требований по созданию модели угроз, подчеркивают <strong>фундаментальную проблему централизованных систем</strong>: чем больше контроль, тем выше риски для приватности.</p>
  <p id="x1hs">Этот контекст побудил исследовать альтернативные подходы к коммуникации, в частности - технологии <strong>peer-to-peer (P2P)</strong>, позволяющие создавать мессенджеры без центрального сервера. Актуальность такого подхода подтверждается растущим интересом к децентрализованным технологиям и Web3.</p>
  <h2 id="8zdZ">WebRTC: технологическая основа децентрализованной коммуникации</h2>
  <h3 id="QxgK">Архитектурные принципы</h3>
  <p id="DiNg"><strong>WebRTC (Web Real-Time Communication)</strong> - это не просто протокол, а целая экосистема стандартов W3C и IETF, предназначенная для организации прямой связи между браузерами и другими приложениями. Ключевое отличие от традиционных мессенджеров - отсутствие необходимости в промежуточных серверах для передачи данных.</p>
  <p id="cCID"><strong>Технический стек WebRTC включает</strong>:</p>
  <ul id="f5qd">
    <li id="QZA3"><strong>RTCPeerConnection</strong> - ядро системы, управляющее установлением соединения</li>
    <li id="5B9k"><strong>RTCDataChannel</strong> - би-directional канал для произвольных данных</li>
    <li id="wAux"><strong>getUserMedia</strong> - API для доступа к медиаустройствам</li>
    <li id="HLFG"><strong>STUN/TURN</strong> - инфраструктура для преодоления NAT</li>
  </ul>
  <h3 id="OpKL">Механизм установления соединения</h3>
  <p id="ghCS">Процесс &quot;рукопожатия&quot; в WebRTC - это сложная последовательность этапов:</p>
  <h4 id="Vm34">1. Обмен сигнальной информацией</h4>
  <p id="8ZIb">Сигнальный обмен - единственный этап, требующий стороннего сервера. В проекте использовался файловый обмен (.kae файлы) как альтернатива традиционному сигнальному серверу:</p>
  <pre id="wIzE" data-lang="javascript">const offerData = {
    type: &#x27;offer&#x27;,
    sdp: peerConnection.localDescription.sdp,
    candidates: localIceCandidates,
    timestamp: new Date().toISOString()
};</pre>
  <p id="spGJ"><strong>SDP (Session Description Protocol)</strong> содержит информацию о поддерживаемых кодеках, параметрах сети и возможностях устройств. В проекте SDP генерируется автоматически при создании оффера и включает данные о поддерживаемых форматах и сетевых возможностях.</p>
  <h4 id="2Q14">2. Сбор ICE-кандидатов</h4>
  <p id="wvIX"><strong>ICE (Interactive Connectivity Establishment) Framework</strong> решает проблему NAT-траверсала. Каждый клиент собирает список &quot;кандидатов&quot; - возможных путей для соединения:</p>
  <ul id="9yhy">
    <li id="m61h"><strong>Host candidates</strong> - локальные IP-адреса (192.168.x.x, 10.x.x.x)</li>
    <li id="hGvn"><strong>SRFLX candidates</strong> - публичные IP-адреса через NAT, полученные от STUN-серверов</li>
    <li id="hn00"><strong>Relay candidates</strong> - через TURN-серверы, используются когда прямое соединение невозможно</li>
  </ul>
  <p id="ikoy"><strong>STUN (Session Traversal Utilities for NAT) серверы</strong> выполняют критически важную функцию - помогают клиентам определить свои публичные IP-адреса и типы NAT. В проекте используется распределенная публичная инфраструктура:</p>
  <pre id="AEm3" data-lang="javascript">const configuration = {
    iceServers: [
        { urls: &#x27;stun:stun.l.google.com:19302&#x27; },
        { urls: &#x27;stun:stun1.l.google.com:19302&#x27; },
        { urls: &#x27;stun:stun2.l.google.com:19302&#x27; },
        { urls: &#x27;stun:stun3.l.google.com:19302&#x27; },
        { urls: &#x27;stun:stun4.l.google.com:19302&#x27; },
        { urls: &#x27;stun:stun.services.mozilla.com&#x27; },
        { urls: &#x27;stun:stun.stunprotocol.org:3478&#x27; }
    ]
};</pre>
  <p id="45M7">Эта конфигурация обеспечивает высокую отказоустойчивость: 7 различных STUN-серверов от разных провайдеров (Google, Mozilla, STUN Protocol) гарантируют работу даже при частичных отказах инфраструктуры.</p>
  <h2 id="1AlW">Data Channels: транспортный уровень мессенджера</h2>
  <h3 id="NLrj">Архитектура каналов данных</h3>
  <p id="kUMg"><strong>RTCDataChannel</strong> предоставляет надежный, упорядоченный канал для передачи произвольных данных с низкой задержкой. В отличие от WebSocket, Data Channels работают поверх <strong>SCTP (Stream Control Transmission Protocol)</strong>, что обеспечивает:</p>
  <ul id="AMw6">
    <li id="fwq5"><strong>Multiplexing</strong> - несколько независимых потоков в одном соединении</li>
    <li id="5AaE"><strong>Partial reliability</strong> - гибкие настройки надежности доставки</li>
    <li id="KA9b"><strong>Message-oriented</strong> - передача дискретных сообщений вместо потока байтов</li>
  </ul>
  <h3 id="bmNs">Реализация в проекте</h3>
  <pre id="eAcW" data-lang="javascript">dataChannel = peerConnection.createDataChannel(&#x27;chatChannel&#x27;, {
    ordered: true,  // Гарантирует порядок доставки сообщений
});</pre>
  <p id="YnFf">Канал настраивается с параметром <code>ordered: true</code>, что обеспечивает последовательную доставку сообщений - критически важная функция для чата, где порядок сообщений имеет значение.</p>
  <h2 id="TucY">Оптимизация передачи файлов и медиа</h2>
  <h3 id="WoeJ">Чанкинг больших данных</h3>
  <p id="Pfqr">WebRTC имеет ограничения на размер передаваемых сообщений (обычно 16-64KB). Для передачи файлов и изображений реализован sophisticated механизм чанкинга:</p>
  <pre id="wHWT" data-lang="javascript">const CHUNK_SIZE = 16000; // Оптимальный размер для минимизации фрагментации
const totalChunks = Math.ceil(fileBuffer.byteLength / CHUNK_SIZE);

// Метаданные передачи
const fileMessage = {
    type: &#x27;file_start&#x27;,
    id: fileId,
    fileName: file.name,
    fileSize: file.size,
    fileType: file.type,
    chunkCount: totalChunks
};</pre>
  <p id="EUAa">Размер чанка в 16000 байт выбран как компромисс между эффективностью использования канала и накладными расходами на обработку.</p>
  <h3 id="EMlm">Система прогресса передачи</h3>
  <pre id="5QlD" data-lang="javascript">// Визуализация прогресса отправки
function updateFileProgress(messageElement, progress) {
    const progressBar = messageElement.querySelector(&#x27;.progress-bar&#x27;);
    if (progressBar) {
        progressBar.style.width = progress + &#x27;%&#x27;;
    }
}

// Блокировка повторной отправки во время передачи
let isSendingFile = false;</pre>
  <p id="X25U">Переменная <code>isSendingFile</code> предотвращает конкурентную отправку нескольких файлов, что могло бы привести к перегрузке канала и путанице в порядке доставки.</p>
  <h3 id="rqw4">Качество изображений: технический компромисс</h3>
  <p id="jA2Z">Проблема качества изображений в прототипе имеет системный характер:</p>
  <pre id="pcJJ" data-lang="javascript">photoCanvas.width = 1024;
photoCanvas.height = 768;</pre>
  <p id="7Mgi">Установка высокого разрешения canvas (1024x768) позволяет сохранять детализацию изображений, однако используемый механизм передачи через <code>ImageData</code> имеет ограничения:</p>
  <ol id="Rgfu">
    <li id="jgVD"><strong>Canvas compression</strong> - преобразование в ImageData приводит к потере качества из-за RGB-представления без сжатия</li>
    <li id="eIRy"><strong>Chunking overhead</strong> - накладные расходы на разбивку и сборку (~5-7% от общего размера)</li>
    <li id="vTlX"><strong>Bandwidth constraints</strong> - адаптация под ограничения каналов связи</li>
  </ol>
  <p id="6AkO"><strong>Перспективное решение</strong>: использование современных форматов типа WebP или AVIF могло бы значительно улучшить качество при тех же объемах данных.</p>
  <h2 id="f75I">Persistent Storage: локальное хранение с IndexedDB</h2>
  <h3 id="JKkI">Архитектура хранения сообщений</h3>
  <pre id="ajrq" data-lang="javascript">const DB_NAME = &#x27;ChatDB&#x27;;
const DB_VERSION = 1;
const STORE_NAME = &#x27;messages&#x27;;

function openDB() {
    return new Promise((resolve, reject) =&gt; {
        const request = indexedDB.open(DB_NAME, DB_VERSION);
        
        request.onerror = () =&gt; reject(request.error);
        request.onsuccess = () =&gt; resolve(request.result);
        
        request.onupgradeneeded = (event) =&gt; {
            const db = event.target.result;
            if (!db.objectStoreNames.contains(STORE_NAME)) {
                const store = db.createObjectStore(STORE_NAME, { 
                    keyPath: &#x27;id&#x27;, 
                    autoIncrement: true 
                });
                store.createIndex(&#x27;timestamp&#x27;, &#x27;timestamp&#x27;, { unique: false });
            }
        };
    });
}</pre>
  <p id="cL9l">IndexedDB обеспечивает persistent хранение сообщений даже после закрытия браузера. Схема данных включает автоматическую инкрементацию ID и индекс по времени для эффективного поиска.</p>
  <h3 id="J8mm">Пагинация и оптимизация памяти</h3>
  <p id="Zucr">Реализация lazy loading сообщений предотвращает перегрузку DOM и оптимизирует использование памяти:</p>
  <pre id="VHPV" data-lang="javascript">const MESSAGES_PER_PAGE = 20; // Оптимальное количество для рендеринга
let currentMessageOffset = 0; 
let renderedMessages = new Set(); // Предотвращение дубликатов

async function loadMessagesFromDB(offset = 0, limit = MESSAGES_PER_PAGE) {
    // ... загрузка с пагинацией
    const start = Math.max(0, allMessages.length - offset - limit);
    const end = allMessages.length - offset;
    const messages = allMessages.slice(start, end);
}</pre>
  <p id="6w8K">Использование <code>Set</code> для отслеживания отрендеренных сообщений предотвращает дублирование при динамической подгрузке. Пагинация по 20 сообщений обеспечивает баланс между производительностью и удобством использования.</p>
  <h2 id="7GpX">Безопасность и приватность: анализ рисков</h2>
  <h3 id="XngA">Криптографические возможности WebRTC</h3>
  <p id="HnOX">WebRTC включает встроенное шифрование через <strong>DTLS-SRTP</strong>, обеспечивающее:</p>
  <ul id="ze0z">
    <li id="nF5E"><strong>Confidentiality</strong> - защита от прослушивания с использованием AES-128/GCM</li>
    <li id="fU1w"><strong>Integrity</strong> - защита от модификации данных через HMAC-SHA1</li>
    <li id="D1kS"><strong>Authentication</strong> - верификация участников через X.509-сертификаты</li>
  </ul>
  <p id="JBhi">Все данные, передаваемые через DataChannel, автоматически шифруются на транспортном уровне.</p>
  <h3 id="hMBe">Ограничения и уязвимости</h3>
  <ol id="aVRw">
    <li id="4EaC"><strong>Сигнальный канал</strong> - в данном проекте SDP-описания передаются через файлы (.kae), что исключает перехват в процессе передачи, но требует безопасного обмена файлами</li>
    <li id="UGKD"><strong>STUN-серверы</strong> - возможность сбора метаданных (IP-адреса, порты) сторонними провайдерами</li>
    <li id="9TyT"><strong>WebRTC leaks</strong> - риск утечки реальных IP-адресов через ICE-кандидаты</li>
    <li id="wJaf"><strong>Локальное хранение</strong> - сообщения сохраняются в IndexedDB, что требует защиты устройства от несанкционированного доступа</li>
  </ol>
  <h3 id="OlMq">Меры противодействия в реализации</h3>
  <pre id="Bx2Y" data-lang="javascript">// Очистка чувствительных данных при разрыве соединения
function cleanupConnection() {
    if (peerConnection) {
        peerConnection.close();
        peerConnection = null;
    }
    localIceCandidates = [];
    dataChannel = null;
}</pre>
  <p id="2p7E">Реализация включает очистку соединения при разрыве, что предотвращает утечку данных при повторном использовании приложения.</p>
  <h2 id="4kZf">Производительность и масштабируемость</h2>
  <h3 id="zfgh">Метрики производительности</h3>
  <p id="e4i8">На основе тестирования реализации можно ожидать следующие показатели:</p>
  <ul id="XF1L">
    <li id="T5sz"><strong>Latency</strong>: 20-100ms для текстовых сообщений (зависит от качества сети)</li>
    <li id="Xgrv"><strong>Throughput</strong>: 2-8 Mbps для файловых передач (ограничено WebRTC и браузером)</li>
    <li id="apaC"><strong>Connection time</strong>: 2-10 секунд для установления соединения (включая ICE-negotiation)</li>
    <li id="wLOI"><strong>Memory usage</strong>: ~50-150MB при активном использовании (зависит от объема истории)</li>
  </ul>
  <h3 id="UzEs">Ограничения масштабируемости</h3>
  <p id="niBg">WebRTC оптимален для 1:1 коммуникации. Архитектура проекта предполагает:</p>
  <ul id="hjZe">
    <li id="bG2l"><strong>Только парные соединения</strong> - не поддерживаются групповые чаты</li>
    <li id="NOnf"><strong>Локальное хранение</strong> - история не синхронизируется между устройствами</li>
    <li id="TEp1"><strong>Ручной обмен сигналами</strong> - не подходит для массового использования</li>
  </ul>
  <p id="cQA3">Для масштабирования на группы потребовались бы:</p>
  <ul id="jXya">
    <li id="1HlO"><strong>SFU/MCU архитектуры</strong> для многопользовательских сессий</li>
    <li id="zH1f"><strong>Centralized signaling</strong> для автоматического установления соединений</li>
    <li id="DDf0"><strong>Distributed storage</strong> для синхронизации истории между устройствами</li>
  </ul>
  <h2 id="9tfQ">Будущее развитие технологии</h2>
  <h3 id="Rzar">WebTransport и QUIC</h3>
  <p id="QnnV">Новые стандарты обещают улучшить производительность:</p>
  <ul id="fuQZ">
    <li id="Qtji"><strong>Multiplexing</strong> без блокировки головы линии</li>
    <li id="QpJx"><strong>Улучшенное восстановление</strong> после потерь</li>
    <li id="s2GU"><strong>Низкая задержка</strong> установления соединения</li>
  </ul>
  <h3 id="zuoV">Децентрализованная идентификация</h3>
  <p id="Eqhv">Интеграция с <strong>DIDs (Decentralized Identifiers)</strong> могла бы обеспечить:</p>
  <ul id="4oDI">
    <li id="ueXo"><strong>Self-sovereign identity</strong> - пользователи контролируют свои идентификаторы</li>
    <li id="tqj4"><strong>Verifiable credentials</strong> - криптографически проверяемые атрибуты</li>
    <li id="PfBB"><strong>Decentralized authentication</strong> - без зависимости от центральных провайдеров</li>
  </ul>
  <h3 id="WDRK">Service Workers для офлайн-работы</h3>
  <p id="jbCt">Расширение функциональности через Service Workers позволило бы:</p>
  <ul id="ijRB">
    <li id="sbUr"><strong>Фоновую синхронизацию</strong> при появлении соединения</li>
    <li id="asHB"><strong>Push-уведомления</strong> для входящих сообщений</li>
    <li id="ldZA"><strong>Кэширование ресурсов</strong> для быстрой загрузки</li>
  </ul>
  <h2 id="0vyZ">Заключение: перспективы децентрализованных мессенджеров</h2>
  <p id="AODa">Данная реализация демонстрирует, что создание работающего P2P-мессенджера возможно с использованием современных веб-технологий. WebRTC представляет собой технологически зрелую платформу для децентрализованных коммуникационных решений.</p>
  <p id="Cjqb"><strong>Ключевые преимущества подхода</strong>:</p>
  <ul id="C9hH">
    <li id="GpDj"><strong>Полный контроль над данными</strong> - отсутствие центрального сервера</li>
    <li id="vePt"><strong>Прямое шифрование</strong> - встроенная защита на транспортном уровне</li>
    <li id="SqQz"><strong>Независимость от инфраструктуры</strong> - работа даже при отказе отдельных компонентов</li>
  </ul>
  <p id="GZbT"><strong>Основные вызовы</strong>:</p>
  <ul id="u4ps">
    <li id="FVBU"><strong>UX-сложности</strong> - ручной обмен сигналами неудобен для обычных пользователей</li>
    <li id="cHTq"><strong>Ограниченная функциональность</strong> - отсутствие групповых чатов, push-уведомлений</li>
    <li id="IQob"><strong>Зависимость от публичной инфраструктуры</strong> - STUN-серверы контролируются третьими сторонами</li>
  </ul>
  <p id="HnZ1">В эпоху возрастающего внимания к цифровому суверенитету и приватности, технологии типа WebRTC предлагают практический компромисс между удобством и контролем над собственными данными. Будущее, вероятно, увидит <strong>гибридные подходы</strong>, сочетающие преимущества как централизованных, так и децентрализованных архитектур.</p>
  <p id="kNdv">Развитие стандартов <strong>WebTransport, QUIC и децентрализованной идентификации</strong> откроет новые возможности для создания полностью децентрализованных коммуникационных платформ, где пользователи сохраняют полный контроль над своими данными без потери удобства использования.</p>
  <p id="3KYn">Данный проект служит proof-of-concept, демонстрирующим техническую осуществимость подхода и открывающим путь для дальнейших исследований в области децентрализованных коммуникаций.</p>
  <p id="qRAM"></p>
  <p id="0ZVA">Побаловаться можно ссылке: <a href="https://chat.kaurcev.dev" target="_blank">https://chat.kaurcev.dev</a> или <a href="https://chat.kaurcev.dev" target="_blank">https://kaurcev.dev/chat</a> </p>
  <p id="Lcev"><em>Ссылка на GitHub репозиторий: <a href="https://github.com/kaurcev/webrtc-chat-example" target="_blank">https://github.com/kaurcev/webrtc-chat-example</a></em></p>

]]></content:encoded></item></channel></rss>