<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>kaurcev</title><subtitle>fullstack web developer</subtitle><author><name>kaurcev</name></author><id>https://teletype.in/atom/kaurcev</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/kaurcev?offset=0"></link><link rel="alternate" type="text/html" href="https://blog.kaurcev.dev/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=kaurcev"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/kaurcev?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-15T21:19:38.807Z</updated><entry><id>kaurcev:9T5kNeZSBkC</id><link rel="alternate" type="text/html" href="https://blog.kaurcev.dev/9T5kNeZSBkC?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=kaurcev"></link><title>Что такое системная безопасность и почему даже безопасники потом не помогут?</title><published>2026-05-08T03:15:03.425Z</published><updated>2026-05-08T03:15:03.425Z</updated><summary type="html">Это не просто пачка лицензий на антивирусы или группа суровых людей из отдела ИБ, запертых в серверной. Это фундаментальное архитектурное свойство системы, её врождённая способность сопротивляться угрозам на всех этапах жизненного цикла: от первой строчки кода до вывода из эксплуатации. Проще говоря, если вы изначально строите дом из песка, то даже лучшая в мире охрана на входе не спасёт ваш домик от рассыпания. Безопасность нельзя «прикрутить» сверху в последний момент — она должна быть вшита в саму логику и структуру проекта, чтобы он оставался устойчивым даже при прямом воздействии.</summary><content type="html">
  &lt;h2 id=&quot;26Eu&quot;&gt;Что такое системная безопасность? &lt;/h2&gt;
  &lt;p id=&quot;EcIu&quot;&gt;Это не просто пачка лицензий на антивирусы или группа суровых людей из отдела ИБ, запертых в серверной. Это фундаментальное архитектурное свойство системы, её врождённая способность сопротивляться угрозам на всех этапах жизненного цикла: от первой строчки кода до вывода из эксплуатации. Проще говоря, если вы изначально строите дом из песка, то даже лучшая в мире охрана на входе не спасёт ваш домик от рассыпания. Безопасность нельзя «прикрутить» сверху в последний момент — она должна быть вшита в саму логику и структуру проекта, чтобы он оставался устойчивым даже при прямом воздействии.&lt;/p&gt;
  &lt;p id=&quot;ePRs&quot;&gt;Поэтому если проект реализуется на коленке с использованием дырявых библиотек и устаревшего инструментария без учёта логики разделения доступа, то ни один безопасник не поможет. Почему? А вот основные причины:&lt;/p&gt;
  &lt;ol id=&quot;RdNY&quot;&gt;
    &lt;li id=&quot;6p10&quot;&gt;Безопасность нельзя просто так взять и навесить сверху. Если архитектура позволяет инъекции в базу данных или разработчик-умничка хранит пароли в открытом виде, то никакой файервол не перекроет все лазейки. Это исключительно системный брак, который лечится только переписыванием кода. Невозможно построить броневик на шасси от самоката.&lt;/li&gt;
    &lt;li id=&quot;MFxY&quot;&gt;Срок годности технологий. Уязвимости находят каждый день. Порой по несколько штук за сутки, а то и целыми списками. Поэтому если стек устарел (End of Life, или EoL), то для этого инструмента больше не выпускают патчи. Важно понимать: списки CVE публикуются открыто. Не нужно быть хакером из кино, чтобы найти все дыры по конкретной технологии — они доступны любому встречному в два клика. Использовать EoL — это как жить в доме с дверями, к которым ключи есть у всей улицы.&lt;/li&gt;
    &lt;li id=&quot;7usP&quot;&gt;Человеческий и процессный фактор. Безопасность — это не результат, а непрерывный процесс. Если разработчики привыкли срезать углы, а менеджмент экономит на обновлении стека, то любой аудит превращается в список невыполнимых рекомендаций. В такой среде ИБ-отдел превращается в декорацию, которая просто фиксирует смерть пациента, пока бизнес надеется на авось.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;MxFB&quot;&gt;Поэтому нужно понимать, что системная безопасность — это задача не только отдела ИБ. Это скорее плотная связка в формате «трио»: разработка, ИБ и бизнес. Без этого треугольника конструкция не устоит.&lt;/p&gt;
  &lt;p id=&quot;P1nA&quot;&gt;Если разработчик не предпринимает никаких действий по устранению уязвимостей и пропускает мимо ушей рекомендации отдела ИБ — это повод серьезно задуматься о его профпригодности. То же касается и бизнеса: игнорирование технических долгов в угоду скорости фич всегда выходит боком.&lt;/p&gt;
  &lt;p id=&quot;FurA&quot;&gt;И да, важный момент: обновляясь своевременно, вы фактически бесплатно получаете защиту, над которой работали лучшие представители индустрии со всего мира. Весь опыт сообщества по латанию дыр прилетает вам вместе со свежим патчем. Игнорировать это — значит добровольно оставлять ключи под ковриком.&lt;/p&gt;
  &lt;h2 id=&quot;sbIt&quot;&gt;WannaCry — как самый яркий пример&lt;/h2&gt;
  &lt;blockquote id=&quot;ls7H&quot;&gt;Если нравятся подробности, то вот &lt;a href=&quot;https://ru.wikipedia.org/wiki/WannaCry&quot; target=&quot;_blank&quot;&gt;статья на Википедии&lt;/a&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;lD8x&quot;&gt;WannaCry — как самый яркий пример того, что бывает, когда на системную безопасность забивают болт. В 2017 году этот вирус-шифровальщик за считанные дни парализовал работу сотен организаций по всему миру: от больниц Великобритании, где отменяли операции, до заводов и железных дорог.&lt;/p&gt;
  &lt;p id=&quot;XlHX&quot;&gt;В чём был основной провал? Вирус использовал дыру в протоколе обмена файлами Windows. Самое смешное и грустное одновременно: Microsoft выпустила критическое обновление, закрывающее эту лазейку, ещё за два месяца до начала эпидемии. Но огромная куча компаний либо сидела на древних системах вроде Windows XP, которые уже давно перешли в статус End of Life, либо просто годами не устанавливала патчи, считая, что «и так работает».&lt;/p&gt;
  &lt;p id=&quot;J3LD&quot;&gt;В итоге злоумышленники воспользовались открытыми списками уязвимостей и устроили цифровой апокалипсис. Это классический случай, когда отсутствие своевременных обновлений и использование устаревшего стека превратили инфраструктуру в карточный домик...&lt;/p&gt;

</content></entry><entry><id>kaurcev:not-relevant</id><link rel="alternate" type="text/html" href="https://blog.kaurcev.dev/not-relevant?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=kaurcev"></link><title>Почему на рынке так много &quot;нерелевантных&quot; программистов?</title><published>2026-01-22T04:15:10.934Z</published><updated>2026-05-08T03:27:32.815Z</updated><summary type="html">Это сложный вопрос, и корни его уходят глубже, чем кажется. Мои размышления на эту тему начались ещё в студенчестве, и сегодня я хочу поговорить о тех, кто выходит на рынок с дипломом или сертификатом, но чьи надежды сталкиваются с суровой реальностью.</summary><content type="html">
  &lt;p id=&quot;KT7M&quot;&gt;Это сложный вопрос, и корни его уходят глубже, чем кажется. Мои размышления на эту тему начались ещё в студенчестве, и сегодня я хочу поговорить о тех, кто выходит на рынок с дипломом или сертификатом, но чьи надежды сталкиваются с суровой реальностью.&lt;/p&gt;
  &lt;p id=&quot;8tAZ&quot;&gt;Начнём с мотивации. Почему люди идут в IT? Чаще всего — деньги. Откуда-то появилось твёрдое убеждение, что войти в топ самых оплачиваемых профессий можно по щелчку пальцев, пройдя краткий курс. Это опасная иллюзия и заезжанный стереотип. Практический опыт, который нельзя симулировать, не наработан. У таких &amp;quot;спецов&amp;quot; часто не выработаны качества написания чистого, поддерживаемого кода. Просто убери свои первые наработки в ящик, продолжай изучать и развиваться, а через год открой его снова. Я почти уверен, ты сам будешь критиковать этот код. Увы, такова природа профессионального роста.&lt;/p&gt;
  &lt;p id=&quot;05Rr&quot;&gt;И сразу после выпуска залететь на позицию сеньора или техлида не получится. Это очевидно: нет навыков. Именно эти роли оправдывают высокие зарплатные ожидания, но у новичка нет ни практических кейсов, ни опыта решения критических проблем. Здесь стоит понять важную вещь: сеньоры и выше часто пишут меньше кода, чем мидлы или джуны. Это роль управленческая. Она подразумевает контроль процессов, умение тушить пожары, понимание цены и меры применения инструментов. Такой специалист видит смысл и принимает компромиссные решения там, где джун, охваченный синдромом &amp;quot;переделать всё на свою реализацию&amp;quot;, увидит лишь неидеальность.&lt;/p&gt;
  &lt;p id=&quot;9zUT&quot;&gt;Но проблема не только в самих новичках: сход с верной тропы происходит раньше. Каждый год вузы и курсы выпускают огромное количество программистов. Однако учебные программы дают не всегда релевантный, а порой и узкий набор знаний. То, что принято считать &amp;quot;базой&amp;quot;, зачастую недостаточно для реальных проектов. В итоге молодые специалисты, опиравшиеся исключительно на лекции и игнорировавшие саморазвитие, сталкиваются с требованиями работодателя, у которого уже сформирован запрос на нишевые, готовые к задачам кадры. И даже найдя человека, компания зачастую вынуждена его переучивать — вкладываться в то, что он упустил в рамках самообразования.&lt;/p&gt;
  &lt;p id=&quot;L3oL&quot;&gt;И тут скажу вам: если вас взяли в компанию, и вы чувствуете, что не всё вам по силам, но вас терпят и помогают — вы не обуза, вы &lt;strong&gt;инвестиция&lt;/strong&gt;. Вы не приносите сиюминутную отдачу, но в вас тратят ресурсы, чтобы вырастить компетентного специалиста. Это типичная экономика рынка труда в IT.&lt;/p&gt;
  &lt;p id=&quot;M7cK&quot;&gt;Однако картина будет неполной, если не посмотреть шире. Волна &amp;quot;нерелевантности&amp;quot; — это часто вопрос несоответствия. Ожидания рынка изменились: прошел период массового найма &amp;quot;на вырост&amp;quot; на фоне бума айтизации. Сейчас, в эпоху оптимизации, компании чаще ищут более узких, готовых специалистов под конкретные задачи. Выпускник с широким, но поверхностным бэкграундом становится &amp;quot;нерелевантным&amp;quot; не потому, что он плох, а потому, что его профиль не совпадает с острым запросом на специализацию.&lt;/p&gt;
  &lt;p id=&quot;UZLi&quot;&gt;Таким образом, ситуация складывается из трёх ключевых факторов: инфляции ожиданий у новичков, отрыва образования от практики и изменившейся конъюнктуры рынка, который сегодня менее склонен к долгим инвестициям и хочет получить больше готовности &amp;quot;здесь и сейчас&amp;quot;. Это не приговор для начинающих, а скорее чёткий сигнал: путь в IT требует не только стартовых знаний, но и упорства, способности к самообучению и трезвого понимания, что настоящая ценность и, как следствие, высокий доход — это финишная прямая длинного марафона, а не быстрый спринт с дипломом в руке.&lt;/p&gt;

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

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

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

</content></entry><entry><id>kaurcev:Mfi_38P6o0l</id><link rel="alternate" type="text/html" href="https://blog.kaurcev.dev/Mfi_38P6o0l?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=kaurcev"></link><title>Руководство по установке .NET 8.0 на Debian 13</title><published>2025-10-02T06:09:08.238Z</published><updated>2025-10-02T06:18:13.000Z</updated><category term="debian" label="Debian"></category><summary type="html">Актуально на октябрь 2025 года | Версия .NET: 8.0</summary><content type="html">
  &lt;h1 id=&quot;pdIn&quot;&gt;Руководство по установке .NET 8.0 на Debian 13&lt;/h1&gt;
  &lt;blockquote id=&quot;DWve&quot;&gt;Актуально на октябрь 2025 года | Версия .NET: 8.0&lt;/blockquote&gt;
  &lt;h3 id=&quot;5mwU&quot;&gt;Введение&lt;/h3&gt;
  &lt;p id=&quot;kQ87&quot;&gt;Тут инфа как установить .NET SDK 8.0 на операционную систему Debian 13. .NET SDK включает в себя все необходимое для разработки, сборки и запуска приложений на платформе .NET.&lt;/p&gt;
  &lt;h3 id=&quot;6GwA&quot;&gt;Подготовка системы&lt;/h3&gt;
  &lt;p id=&quot;2OWS&quot;&gt;Перед установкой .NET рекомендуется обновить систему до последних доступных версий пакетов:&lt;/p&gt;
  &lt;pre id=&quot;SytG&quot;&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;/pre&gt;
  &lt;h3 id=&quot;73tG&quot;&gt;Установка необходимых зависимостей&lt;/h3&gt;
  &lt;p id=&quot;eXpd&quot;&gt;Для работы с репозиториями Microsoft потребуется установить дополнительные пакеты:&lt;/p&gt;
  &lt;pre id=&quot;xeSl&quot;&gt;sudo apt install -y apt-transport-https ca-certificates gnupg wget&lt;/pre&gt;
  &lt;p id=&quot;AvLW&quot;&gt;Эти пакеты обеспечивают:&lt;/p&gt;
  &lt;ul id=&quot;6Nej&quot;&gt;
    &lt;li id=&quot;yx2U&quot;&gt;apt-transport-https - поддержку HTTPS-соединений для APT&lt;/li&gt;
    &lt;li id=&quot;eg0c&quot;&gt;ca-certificates - доверенные SSL-сертификаты&lt;/li&gt;
    &lt;li id=&quot;i6Q4&quot;&gt;gnupg - работу с GPG-ключами&lt;/li&gt;
    &lt;li id=&quot;TdiM&quot;&gt;wget - загрузку файлов из интернета&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;wdO2&quot;&gt;Добавление репозитория Microsoft&lt;/h3&gt;
  &lt;p id=&quot;AgyG&quot;&gt;Добавляем официальный репозиторий Microsoft в систему:&lt;/p&gt;
  &lt;pre id=&quot;hamz&quot;&gt;# Загружаем пакет с настройками репозитория
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&lt;/pre&gt;
  &lt;h3 id=&quot;TTfj&quot;&gt;Установка .NET SDK 8.0&lt;/h3&gt;
  &lt;p id=&quot;Ebif&quot;&gt;Обновляем информацию о пакетах и устанавливаем .NET SDK 8.0:&lt;/p&gt;
  &lt;pre id=&quot;96S5&quot;&gt;sudo apt update
sudo apt install -y dotnet-sdk-8.0&lt;/pre&gt;
  &lt;h3 id=&quot;TDxb&quot;&gt;Проверка установки&lt;/h3&gt;
  &lt;p id=&quot;EvIx&quot;&gt;Убедимся, что .NET успешно установлен:&lt;/p&gt;
  &lt;pre id=&quot;4sWx&quot;&gt;dotnet --version&lt;/pre&gt;
  &lt;blockquote id=&quot;aD7D&quot;&gt;kaurcev@debian:$ dotnet --version&lt;br /&gt;8.0.414&lt;br /&gt;kaurcev@debian:$&lt;/blockquote&gt;
  &lt;h2 id=&quot;8tek&quot;&gt;Пример работы&lt;/h2&gt;
  &lt;pre id=&quot;HCwZ&quot;&gt;# Создаем новое консольное приложение
dotnet new console -n MyTestApp

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

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

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

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

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

function openDB() {
    return new Promise((resolve, reject) =&amp;gt; {
        const request = indexedDB.open(DB_NAME, DB_VERSION);
        
        request.onerror = () =&amp;gt; reject(request.error);
        request.onsuccess = () =&amp;gt; resolve(request.result);
        
        request.onupgradeneeded = (event) =&amp;gt; {
            const db = event.target.result;
            if (!db.objectStoreNames.contains(STORE_NAME)) {
                const store = db.createObjectStore(STORE_NAME, { 
                    keyPath: &amp;#x27;id&amp;#x27;, 
                    autoIncrement: true 
                });
                store.createIndex(&amp;#x27;timestamp&amp;#x27;, &amp;#x27;timestamp&amp;#x27;, { unique: false });
            }
        };
    });
}&lt;/pre&gt;
  &lt;p id=&quot;cL9l&quot;&gt;IndexedDB обеспечивает persistent хранение сообщений даже после закрытия браузера. Схема данных включает автоматическую инкрементацию ID и индекс по времени для эффективного поиска.&lt;/p&gt;
  &lt;h3 id=&quot;J8mm&quot;&gt;Пагинация и оптимизация памяти&lt;/h3&gt;
  &lt;p id=&quot;Zucr&quot;&gt;Реализация lazy loading сообщений предотвращает перегрузку DOM и оптимизирует использование памяти:&lt;/p&gt;
  &lt;pre id=&quot;VHPV&quot; data-lang=&quot;javascript&quot;&gt;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);
}&lt;/pre&gt;
  &lt;p id=&quot;6w8K&quot;&gt;Использование &lt;code&gt;Set&lt;/code&gt; для отслеживания отрендеренных сообщений предотвращает дублирование при динамической подгрузке. Пагинация по 20 сообщений обеспечивает баланс между производительностью и удобством использования.&lt;/p&gt;
  &lt;h2 id=&quot;7GpX&quot;&gt;Безопасность и приватность: анализ рисков&lt;/h2&gt;
  &lt;h3 id=&quot;XngA&quot;&gt;Криптографические возможности WebRTC&lt;/h3&gt;
  &lt;p id=&quot;HnOX&quot;&gt;WebRTC включает встроенное шифрование через &lt;strong&gt;DTLS-SRTP&lt;/strong&gt;, обеспечивающее:&lt;/p&gt;
  &lt;ul id=&quot;ze0z&quot;&gt;
    &lt;li id=&quot;nF5E&quot;&gt;&lt;strong&gt;Confidentiality&lt;/strong&gt; - защита от прослушивания с использованием AES-128/GCM&lt;/li&gt;
    &lt;li id=&quot;fU1w&quot;&gt;&lt;strong&gt;Integrity&lt;/strong&gt; - защита от модификации данных через HMAC-SHA1&lt;/li&gt;
    &lt;li id=&quot;D1kS&quot;&gt;&lt;strong&gt;Authentication&lt;/strong&gt; - верификация участников через X.509-сертификаты&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;JBhi&quot;&gt;Все данные, передаваемые через DataChannel, автоматически шифруются на транспортном уровне.&lt;/p&gt;
  &lt;h3 id=&quot;hMBe&quot;&gt;Ограничения и уязвимости&lt;/h3&gt;
  &lt;ol id=&quot;aVRw&quot;&gt;
    &lt;li id=&quot;4EaC&quot;&gt;&lt;strong&gt;Сигнальный канал&lt;/strong&gt; - в данном проекте SDP-описания передаются через файлы (.kae), что исключает перехват в процессе передачи, но требует безопасного обмена файлами&lt;/li&gt;
    &lt;li id=&quot;UGKD&quot;&gt;&lt;strong&gt;STUN-серверы&lt;/strong&gt; - возможность сбора метаданных (IP-адреса, порты) сторонними провайдерами&lt;/li&gt;
    &lt;li id=&quot;9TyT&quot;&gt;&lt;strong&gt;WebRTC leaks&lt;/strong&gt; - риск утечки реальных IP-адресов через ICE-кандидаты&lt;/li&gt;
    &lt;li id=&quot;wJaf&quot;&gt;&lt;strong&gt;Локальное хранение&lt;/strong&gt; - сообщения сохраняются в IndexedDB, что требует защиты устройства от несанкционированного доступа&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;OlMq&quot;&gt;Меры противодействия в реализации&lt;/h3&gt;
  &lt;pre id=&quot;Bx2Y&quot; data-lang=&quot;javascript&quot;&gt;// Очистка чувствительных данных при разрыве соединения
function cleanupConnection() {
    if (peerConnection) {
        peerConnection.close();
        peerConnection = null;
    }
    localIceCandidates = [];
    dataChannel = null;
}&lt;/pre&gt;
  &lt;p id=&quot;2p7E&quot;&gt;Реализация включает очистку соединения при разрыве, что предотвращает утечку данных при повторном использовании приложения.&lt;/p&gt;
  &lt;h2 id=&quot;4kZf&quot;&gt;Производительность и масштабируемость&lt;/h2&gt;
  &lt;h3 id=&quot;zfgh&quot;&gt;Метрики производительности&lt;/h3&gt;
  &lt;p id=&quot;e4i8&quot;&gt;На основе тестирования реализации можно ожидать следующие показатели:&lt;/p&gt;
  &lt;ul id=&quot;XF1L&quot;&gt;
    &lt;li id=&quot;T5sz&quot;&gt;&lt;strong&gt;Latency&lt;/strong&gt;: 20-100ms для текстовых сообщений (зависит от качества сети)&lt;/li&gt;
    &lt;li id=&quot;Xgrv&quot;&gt;&lt;strong&gt;Throughput&lt;/strong&gt;: 2-8 Mbps для файловых передач (ограничено WebRTC и браузером)&lt;/li&gt;
    &lt;li id=&quot;apaC&quot;&gt;&lt;strong&gt;Connection time&lt;/strong&gt;: 2-10 секунд для установления соединения (включая ICE-negotiation)&lt;/li&gt;
    &lt;li id=&quot;wLOI&quot;&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;: ~50-150MB при активном использовании (зависит от объема истории)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;UzEs&quot;&gt;Ограничения масштабируемости&lt;/h3&gt;
  &lt;p id=&quot;niBg&quot;&gt;WebRTC оптимален для 1:1 коммуникации. Архитектура проекта предполагает:&lt;/p&gt;
  &lt;ul id=&quot;hjZe&quot;&gt;
    &lt;li id=&quot;bG2l&quot;&gt;&lt;strong&gt;Только парные соединения&lt;/strong&gt; - не поддерживаются групповые чаты&lt;/li&gt;
    &lt;li id=&quot;NOnf&quot;&gt;&lt;strong&gt;Локальное хранение&lt;/strong&gt; - история не синхронизируется между устройствами&lt;/li&gt;
    &lt;li id=&quot;TEp1&quot;&gt;&lt;strong&gt;Ручной обмен сигналами&lt;/strong&gt; - не подходит для массового использования&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cQA3&quot;&gt;Для масштабирования на группы потребовались бы:&lt;/p&gt;
  &lt;ul id=&quot;jXya&quot;&gt;
    &lt;li id=&quot;1HlO&quot;&gt;&lt;strong&gt;SFU/MCU архитектуры&lt;/strong&gt; для многопользовательских сессий&lt;/li&gt;
    &lt;li id=&quot;zH1f&quot;&gt;&lt;strong&gt;Centralized signaling&lt;/strong&gt; для автоматического установления соединений&lt;/li&gt;
    &lt;li id=&quot;DDf0&quot;&gt;&lt;strong&gt;Distributed storage&lt;/strong&gt; для синхронизации истории между устройствами&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;9tfQ&quot;&gt;Будущее развитие технологии&lt;/h2&gt;
  &lt;h3 id=&quot;Rzar&quot;&gt;WebTransport и QUIC&lt;/h3&gt;
  &lt;p id=&quot;QnnV&quot;&gt;Новые стандарты обещают улучшить производительность:&lt;/p&gt;
  &lt;ul id=&quot;fuQZ&quot;&gt;
    &lt;li id=&quot;Qtji&quot;&gt;&lt;strong&gt;Multiplexing&lt;/strong&gt; без блокировки головы линии&lt;/li&gt;
    &lt;li id=&quot;QpJx&quot;&gt;&lt;strong&gt;Улучшенное восстановление&lt;/strong&gt; после потерь&lt;/li&gt;
    &lt;li id=&quot;s2GU&quot;&gt;&lt;strong&gt;Низкая задержка&lt;/strong&gt; установления соединения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;zuoV&quot;&gt;Децентрализованная идентификация&lt;/h3&gt;
  &lt;p id=&quot;Eqhv&quot;&gt;Интеграция с &lt;strong&gt;DIDs (Decentralized Identifiers)&lt;/strong&gt; могла бы обеспечить:&lt;/p&gt;
  &lt;ul id=&quot;4oDI&quot;&gt;
    &lt;li id=&quot;ueXo&quot;&gt;&lt;strong&gt;Self-sovereign identity&lt;/strong&gt; - пользователи контролируют свои идентификаторы&lt;/li&gt;
    &lt;li id=&quot;tqj4&quot;&gt;&lt;strong&gt;Verifiable credentials&lt;/strong&gt; - криптографически проверяемые атрибуты&lt;/li&gt;
    &lt;li id=&quot;PfBB&quot;&gt;&lt;strong&gt;Decentralized authentication&lt;/strong&gt; - без зависимости от центральных провайдеров&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;WDRK&quot;&gt;Service Workers для офлайн-работы&lt;/h3&gt;
  &lt;p id=&quot;jbCt&quot;&gt;Расширение функциональности через Service Workers позволило бы:&lt;/p&gt;
  &lt;ul id=&quot;ijRB&quot;&gt;
    &lt;li id=&quot;sbUr&quot;&gt;&lt;strong&gt;Фоновую синхронизацию&lt;/strong&gt; при появлении соединения&lt;/li&gt;
    &lt;li id=&quot;asHB&quot;&gt;&lt;strong&gt;Push-уведомления&lt;/strong&gt; для входящих сообщений&lt;/li&gt;
    &lt;li id=&quot;ldZA&quot;&gt;&lt;strong&gt;Кэширование ресурсов&lt;/strong&gt; для быстрой загрузки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;0vyZ&quot;&gt;Заключение: перспективы децентрализованных мессенджеров&lt;/h2&gt;
  &lt;p id=&quot;AODa&quot;&gt;Данная реализация демонстрирует, что создание работающего P2P-мессенджера возможно с использованием современных веб-технологий. WebRTC представляет собой технологически зрелую платформу для децентрализованных коммуникационных решений.&lt;/p&gt;
  &lt;p id=&quot;Cjqb&quot;&gt;&lt;strong&gt;Ключевые преимущества подхода&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;C9hH&quot;&gt;
    &lt;li id=&quot;GpDj&quot;&gt;&lt;strong&gt;Полный контроль над данными&lt;/strong&gt; - отсутствие центрального сервера&lt;/li&gt;
    &lt;li id=&quot;vePt&quot;&gt;&lt;strong&gt;Прямое шифрование&lt;/strong&gt; - встроенная защита на транспортном уровне&lt;/li&gt;
    &lt;li id=&quot;SqQz&quot;&gt;&lt;strong&gt;Независимость от инфраструктуры&lt;/strong&gt; - работа даже при отказе отдельных компонентов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;GZbT&quot;&gt;&lt;strong&gt;Основные вызовы&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;u4ps&quot;&gt;
    &lt;li id=&quot;FVBU&quot;&gt;&lt;strong&gt;UX-сложности&lt;/strong&gt; - ручной обмен сигналами неудобен для обычных пользователей&lt;/li&gt;
    &lt;li id=&quot;cHTq&quot;&gt;&lt;strong&gt;Ограниченная функциональность&lt;/strong&gt; - отсутствие групповых чатов, push-уведомлений&lt;/li&gt;
    &lt;li id=&quot;IQob&quot;&gt;&lt;strong&gt;Зависимость от публичной инфраструктуры&lt;/strong&gt; - STUN-серверы контролируются третьими сторонами&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HnZ1&quot;&gt;В эпоху возрастающего внимания к цифровому суверенитету и приватности, технологии типа WebRTC предлагают практический компромисс между удобством и контролем над собственными данными. Будущее, вероятно, увидит &lt;strong&gt;гибридные подходы&lt;/strong&gt;, сочетающие преимущества как централизованных, так и децентрализованных архитектур.&lt;/p&gt;
  &lt;p id=&quot;kNdv&quot;&gt;Развитие стандартов &lt;strong&gt;WebTransport, QUIC и децентрализованной идентификации&lt;/strong&gt; откроет новые возможности для создания полностью децентрализованных коммуникационных платформ, где пользователи сохраняют полный контроль над своими данными без потери удобства использования.&lt;/p&gt;
  &lt;p id=&quot;3KYn&quot;&gt;Данный проект служит proof-of-concept, демонстрирующим техническую осуществимость подхода и открывающим путь для дальнейших исследований в области децентрализованных коммуникаций.&lt;/p&gt;
  &lt;p id=&quot;qRAM&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;0ZVA&quot;&gt;Побаловаться можно ссылке: &lt;a href=&quot;https://chat.kaurcev.dev&quot; target=&quot;_blank&quot;&gt;https://chat.kaurcev.dev&lt;/a&gt; или &lt;a href=&quot;https://chat.kaurcev.dev&quot; target=&quot;_blank&quot;&gt;https://kaurcev.dev/chat&lt;/a&gt; &lt;/p&gt;
  &lt;p id=&quot;Lcev&quot;&gt;&lt;em&gt;Ссылка на GitHub репозиторий: &lt;a href=&quot;https://github.com/kaurcev/webrtc-chat-example&quot; target=&quot;_blank&quot;&gt;https://github.com/kaurcev/webrtc-chat-example&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</content></entry></feed>