<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/programmerguru/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя programmerguru]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Fri, 24 Apr 2026 03:51:56 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[Китайские CPU и GPU почти догнали TSMC]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/954508/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/954508/?utm_campaign=954508&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/88a/680/cce/88a680cce23c00a7728cb2f3366cabe8.png" /><p>Генеральный директор Nvidia Дженсен Хуанг недавно <a href="https://www.youtube.com/watch?v=pE6sw_E9Gh0">заявил</a>, что китайская промышленность буквально «на несколько наносекунд» отстаёт от Запада в производстве CPU и GPU. На самом деле отставание SMIC от TSMC/ASML составляет около трёх лет.</p><p>В свою очередь, российская микроэлектроника может отставать от китайской минимум на восемь лет, если судить по <a href="https://x.com/torgeek/status/1971508324773527658">дорожной карте</a> выпуска литографического оборудования в РФ до 2036 года, и это довольно оптимистичная оценка.</p> <a href="https://habr.com/ru/articles/954508/?utm_campaign=954508&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 08 Oct 2025 13:01:02 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Компьютерное железо]]></category><category><![CDATA[Производство и разработка электроники]]></category><category><![CDATA[Процессоры]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[китай]]></category><category><![CDATA[gpu]]></category><category><![CDATA[cpu]]></category><category><![CDATA[процессоры]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Необычные способы хостинга]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/887446/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/887446/?utm_campaign=887446&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/companies/ruvds/articles/887446/"><img src="https://habrastorage.org/webt/2u/yq/1i/2uyq1iloqugsyb8vn_d_j0sijga.jpeg"></a><br>
<br>
Где разместить сайт? Оказывается, для хостинга необязательно покупать VPS или домашний сервер. Можно поступить более креативно: например, захостить сайт на смартфоне. Причём желательно извлечь из него аккумулятор, чтобы смартфон работал напрямую от сети. А есть ещё более оригинальный вариант: бесплатный хостинг в социальных сетях.<br> <a href="https://habr.com/ru/articles/887446/?utm_campaign=887446&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 04 Mar 2025 09:01:25 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[DIY или Сделай сам]]></category><category><![CDATA[Распределённые системы]]></category><category><![CDATA[Смартфоны]]></category><category><![CDATA[Хостинг]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[Bluesky]]></category><category><![CDATA[Android]]></category><category><![CDATA[Docker]]></category><category><![CDATA[postmarketOS]]></category><category><![CDATA[SSH]]></category><category><![CDATA[MagiskSSH]]></category><category><![CDATA[AT Protocol]]></category><category><![CDATA[Public Benefit LLC]]></category><category><![CDATA[PBLLC]]></category><category><![CDATA[смартфон]]></category><category><![CDATA[SSH-сервер]]></category><category><![CDATA[извлечение аккумулятора]]></category><category><![CDATA[Alpine]]></category><category><![CDATA[USB-C]]></category><category><![CDATA[Android SDK]]></category><category><![CDATA[fastboot]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Обнаружение SSH-туннелей по размеру пакетов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/799255/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/799255/?utm_campaign=799255&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/companies/ruvds/articles/799255/"><img src="https://habrastorage.org/webt/h_/ea/69/h_ea69mevzrplgj4eoebc97czg8.png"></a><br>
<i><font color="gray">Иллюстрация из книги <a href="https://github.com/opsdisk/the_cyber_plumbers_handbook/" rel="nofollow noopener noreferrer">«Справочник киберсантехника»</a></font></i><br>
<br>
Протокол SSH — очень мощный инструмент, который используется для удалённой консоли или передачи файлов (scp, sftp). Есть менее известная функция <a href="https://www.ssh.com/academy/ssh/tunneling-example" rel="nofollow noopener noreferrer">перенаправления портов</a>. Такие SSH-туннели используются для пробития файрволов и хорошо скрываются от обнаружения стандартными средствами мониторинга типа <a href="https://www.trisul.org/" rel="nofollow noopener noreferrer">Trisul</a>, <a href="https://zeek.org/" rel="nofollow noopener noreferrer">Zeek</a> (ранее был известен как Bro), <a href="https://suricata.io/" rel="nofollow noopener noreferrer">Suricata</a> и <a href="https://www.snort.org/" rel="nofollow noopener noreferrer">Snort</a>. Поэтому для их обнаружения в корпоративной сети используются другие методы.<br> <a href="https://habr.com/ru/articles/799255/?utm_campaign=799255&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 17 Mar 2024 10:40:27 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Lua]]></category><category><![CDATA[Информационная безопасность]]></category><category><![CDATA[Настройка Linux]]></category><category><![CDATA[Системное администрирование]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[VDS]]></category><category><![CDATA[хостинг сайтов]]></category><category><![CDATA[ssh-audit]]></category><category><![CDATA[скрытие ssh]]></category><category><![CDATA[шпаргалка]]></category><category><![CDATA[cheat sheet]]></category><category><![CDATA[RSA]]></category><category><![CDATA[ED25519]]></category><category><![CDATA[scp]]></category><category><![CDATA[sftp]]></category><category><![CDATA[прямой туннель]]></category><category><![CDATA[обратный туннель]]></category><category><![CDATA[autossh]]></category><category><![CDATA[перенеправление портов]]></category><category><![CDATA[Trisul]]></category><category><![CDATA[Zeek]]></category><category><![CDATA[Bro]]></category><category><![CDATA[Suricata]]></category><category><![CDATA[Snort]]></category><category><![CDATA[анализ трафика]]></category><category><![CDATA[размер пакетов]]></category><category><![CDATA[нажатия клавиш]]></category><category><![CDATA[обфускация тайминга]]></category><category><![CDATA[OpenSSH]]></category><category><![CDATA[Lua]]></category><category><![CDATA[sshuttle]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Почему Windows настолько медленнее Linux. Расползание фич]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/796215/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/796215/?utm_campaign=796215&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/796215/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/l4/z5/rr/l4z5rrrza-xk8pui3gwhs0otneo.png"></div></a><br>
<i><font color="gray">Время выполнения общих команд Git в Ubuntu и Windows 11 (в секундах, чем меньше — тем лучше), источник: <a href="https://openbenchmarking.org/result/2107013-IB-WIN11LINU39#results" rel="nofollow noopener noreferrer">OpenBenchmarking.org</a></font></i><br>
<br>
В далёком 2013 году один из разработчиков Microsoft детально <a href="https://blog.zorinaq.com/i-contribute-to-the-windows-kernel-we-are-slower-than-other-oper/" rel="nofollow noopener noreferrer">объяснил</a>, в чём главные технические проблемы при разработке ядра Windows NT. Спустя десять лет Windows 10/11 работает на том же ядре, а многие старые проблемы так и остались нерешёнными.<br>
<br>
Хотя в ряде задач <a href="https://openbenchmarking.org/result/2107013-IB-WIN11LINU39#results" rel="nofollow noopener noreferrer">Windows превосходит Linux</a>, но в большинстве тестов она действительно медленнее. По словам разработчика, это отставание усугубляется, а причина «социальная». Суть в том, как организован процесс разработки, внесения изменений в ОС. Если в мире опенсорса это открытый процесс, который несёт пользу и <i>улучшает</i> систему, то в мире корпоративного ПО зачастую изменения вносятся по причинам эгоизма, желания продвижения по карьерной лестнице, славы и т. д. Всё это ведёт к деградации продукта.<br> <a href="https://habr.com/ru/articles/796215/?utm_campaign=796215&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sat, 02 Mar 2024 10:00:32 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Open source]]></category><category><![CDATA[История IT]]></category><category><![CDATA[Управление продуктом]]></category><category><![CDATA[Управление разработкой]]></category>
      <category><![CDATA[Windows]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Windows 11]]></category><category><![CDATA[системные требования]]></category><category><![CDATA[легаси]]></category><category><![CDATA[Windows NT]]></category><category><![CDATA[Windows API]]></category><category><![CDATA[Wine]]></category><category><![CDATA[QNX]]></category><category><![CDATA[Plan 9]]></category><category><![CDATA[Ларс Вирцениус]]></category><category><![CDATA[Lars Wirzenius]]></category><category><![CDATA[Freax]]></category><category><![CDATA[Линус Торвальдс]]></category><category><![CDATA[Softlanding Linux System]]></category><category><![CDATA[SLS]]></category><category><![CDATA[X11]]></category><category><![CDATA[Windows XP]]></category><category><![CDATA[Microsoft]]></category><category><![CDATA[Windows 7]]></category><category><![CDATA[расползание фич]]></category><category><![CDATA[feature-creep]]></category><category><![CDATA[закон Вирта]]></category><category><![CDATA[Win32 API]]></category><category><![CDATA[DCOM]]></category><category><![CDATA[XNA]]></category><category><![CDATA[Source Depot]]></category><category><![CDATA[SDX]]></category><category><![CDATA[TFS]]></category><category><![CDATA[NTFS]]></category><category><![CDATA[SEH]]></category><category><![CDATA[ReFs]]></category><category><![CDATA[POPCNT]]></category><category><![CDATA[SSE4]]></category><category><![CDATA[инструкция АНБ]]></category><category><![CDATA[ruvds_статьи]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Proger sapiens]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/760586/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/760586/?utm_campaign=760586&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Первым моим знакомым программистом была женщина, которая разрабатывала софт на одном из закрытых предприятий союзной республики. Мне было семь лет и она ассоциировалась у меня с волком из «Ну, погоди», который набивал приветствие на стадионе. Однако любопытство завело семилетку далеко и уже через пару недель я с интересом слушала про ленты и рассматривала перфокарты — она мне их подарила целую стопку, хватило даже в школе на шпаргалки-закладки. Ещё тогда удивило, что к ней не было особого отношения среди взрослых: ну мама троих детей, ну математик. Не врач же, не учитель и не космонавт, в конце концов! <br>
<br>
<a href="https://habr.com/ru/companies/ruvds/articles/760586/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/na/vl/sa/navlsakjl6_mpu9f2i2kmkphmhs.png"></div></a> <a href="https://habr.com/ru/articles/760586/?utm_campaign=760586&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 13 Sep 2023 09:00:02 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Карьера в IT-индустрии]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[день программиста]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Массовый дефейс веб-сайтов .РФ]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/739898/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/739898/?utm_campaign=739898&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/739898/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/yt/e0/da/yte0dagshbncx0ily1dyfh_wcrw.png"></div></a><br>
26 мая 2023 года произошёл массовый дефейс веб-серверов национального сегмента сети интернет&nbsp;.РФ. В качестве цели атаки выступила CMS «Битрикс».<br>
<br>
В ходе расследования выяснилось, что атака подготовлена заранее. Подготовка велась с 2022 года через известные уязвимости, включая <a href="https://helpdesk.bitrix24.com/open/15536776/" rel="nofollow noopener noreferrer">CVE-2022-27228</a>. Техническое описание см. <a href="https://dev.1c-bitrix.ru/community/forums/messages/forum6/topic147346/message731078/#message731078" rel="nofollow noopener noreferrer">на форуме разработчиков</a>. Возможно, это самая крупная атака против национального сегмента&nbsp;.РФ в его истории.<br>
<br>
Компания <a href="https://www.cyberok.ru/" rel="nofollow noopener noreferrer">CyberOK</a> выпустила <a href="https://www.cyberok.ru/docs/CyberOK-bitrix_web_1.pdf" rel="nofollow noopener noreferrer">отчёт</a> c описанием атаки и разъяснением необходимых действий для того, чтобы удалить с сервера бэкдор, устранить уязвимости «Битрикса» и восстановить приложение. Также приведены рекомендации по защите веб-приложения.<br> <a href="https://habr.com/ru/articles/739898/?utm_campaign=739898&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 05 Jun 2023 13:00:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[1С-Битрикс]]></category><category><![CDATA[CMS]]></category><category><![CDATA[Информационная безопасность]]></category><category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[дефейс]]></category><category><![CDATA[Битрикс]]></category><category><![CDATA[CVE-2022-27228]]></category><category><![CDATA[&amp;nbsp;.РФ]]></category><category><![CDATA[CyberOK]]></category><category><![CDATA[НКЦКИ]]></category><category><![CDATA[защита сайтов]]></category><category><![CDATA[ruvds_статьи]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Получаем бесплатные бесконечные сессии TeamViewer]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/726852/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/726852/?utm_campaign=726852&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/726852/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/ba/hl/or/bahloro3zivnyxbuju8xnhkgpx8.jpeg"></div></a><br>
Многие знают о существовании такого ПО, как TeamViewer, но не все в курсе о нестандартных сценариях его использования. Знали ли вы, что можете легально использовать сессии, неограниченные во времени? Это осуществимо благодаря возможности TeamViewer подключаться не только с использованием уникального ID, но и по IP-адресу.<br>
<br>
<blockquote>Рассуждения, что лучше использовать что-то другое, а не TeamViewer, оставим за бортом, здесь просто рассматриваются возможности TeamViewer. Насколько имеет смысл практического применения изложенных методов, каждый пусть решит сам.</blockquote> <a href="https://habr.com/ru/articles/726852/?utm_campaign=726852&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 04 Apr 2023 13:00:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Системное администрирование]]></category><category><![CDATA[Софт]]></category><category><![CDATA[Удалённая работа]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[teamviewer]]></category><category><![CDATA[удалённый доступ]]></category><category><![CDATA[бесконечные сессии]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Js, трюки, наблюдения, бенчмарки и как Лиса уничтожает Хром. Я протестировал всё, что вам было лень]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/712386/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/712386/?utm_campaign=712386&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/712386/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/ai/z5/gz/aiz5gztttvvkegk_annvvgtumv8.png"></div></a><i><font color="#999999">Картинка, конечно, стронгли анрилейтед</font></i><br>
<br>
Разные трюки я тестировал на Google Chrome 107.0.5304.107 и Mozilla Firefox 107.0 на Windows 10.<br>
<br>
Чтобы результаты всегда были железно воспроизводимыми, я отключил все С-State’ы, ядра зафиксировал на 5 ГГц.<br>
<br>
У меня 9900К, это Coffee Lake c AVX256, какие оптимизации применит Jit для вашего процессора — я не знаю, результат на вашем компьютере может отличаться от моего, в т.ч. из-за микроархитектуры процессора.<br>
<br>
Скорость парсинга кода тоже входит в бенчмарк, поэтому браузер с быстрым парсером будет впереди.<br> <a href="https://habr.com/ru/articles/712386/?utm_campaign=712386&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 24 Jan 2023 09:00:03 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Браузеры]]></category><category><![CDATA[Высоконагруженные системы]]></category><category><![CDATA[Клиентская оптимизация]]></category>
      <category><![CDATA[javascript]]></category><category><![CDATA[google chrome]]></category><category><![CDATA[mozilla firefox]]></category><category><![CDATA[браузеры]]></category><category><![CDATA[высокая производительность]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[ruvds_статьи]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Ускоряем разработку]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/686628/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/686628/?utm_campaign=686628&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/686628/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/p5/fu/y4/p5fuy4lwubtr8ppbtsqo-wcswp0.png"></div></a><br>
Любая работа java-программиста опирается на базис, под которым подразумевается не только непосредственно знание самого языка программирования, но также и знание дополнительных компонентов, без которых программирование в чистом виде, становится достаточно затруднительным либо неконкурентоспособным по времени. Именно об этом мы поговорим в этой статье. <a href="https://habr.com/ru/articles/686628/?utm_campaign=686628&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 06 Sep 2022 09:00:04 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Java]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[spring framework]]></category><category><![CDATA[hibernate]]></category><category><![CDATA[mockito]]></category><category><![CDATA[junit]]></category><category><![CDATA[ruvds_статьи]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Проект — электрический помощник для редакции]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/677482/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/677482/?utm_campaign=677482&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/677482/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/gj/ki/o3/gjkio3qlcr1beuh04lht3yvu6ea.png"></div></a><br>
Казалось бы, для чего редакции может понадобиться telegram-бот? Мы смогли вполне точно ответить на это, когда число наших авторов начало превышать разумные возможности редакторов. В новых экономических реалиях ценна каждая рабочая минута, потому встала задача убрать часть работы, связанной с повторяющимися вопросами, которые можно было бы свалить на бота, для улучшения комфорта взаимодействия всех сторон и, конечно, экономии бесценного времени. А учитывая, что большая часть общения происходит именно внутри телеграма, то и было принято решение завести себе там электрического помощника. Как говорится: телеграм-бот — это не только 40 строчек кода, но ещё и очень полезный выхлоп. <a href="https://habr.com/ru/articles/677482/?utm_campaign=677482&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 20 Jul 2022 09:00:02 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Проектирование API]]></category><category><![CDATA[Python]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Хостинг]]></category>
      <category><![CDATA[telegram bot]]></category><category><![CDATA[ruvds_статьи]]></category><category><![CDATA[хостинг]]></category><category><![CDATA[впс]]></category><category><![CDATA[vps]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Семь раз отмерь, а SOLID все равно не про ООП. Монолог об архитектуре]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/672288/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/672288/?utm_campaign=672288&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/672288/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/j6/gf/jx/j6gfjxehwtwpbb0viendkogyagm.png"></div></a><br>
Каждые 5 лет количество программистов увеличивается в два раза. И об этом знают уже все, кто хотя бы раз смотрел или читал <a href="https://inexsu.wordpress.com/2020/02/15/%D1%80%D0%BE%D0%B1%D0%B5%D1%80%D1%82-%D0%BC%D0%B0%D1%80%D1%82%D0%B8%D0%BD-%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B5-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0/" rel="nofollow noopener noreferrer">Боба Мартина</a>. Программное обеспечение есть повсюду. Вы не можете найти в мире такое место, где в радиусе трёх метров от вас не было бы программного обеспечения (на самом деле это про пауков, кажется, но я же просто шучу). И вот если обратить внимание, то окажется, что в ваших часах есть ПО, в вашем телефоне очень много ПО, в холодильниках у некоторых есть ПО, во всех современных автомобилях есть ПО, даже в некоторых собаках (не шутка) уже есть ПО и этот список можно долго продолжать.<br>
<br>
Разработчик программного обеспечения в нашем современном мире имеет самое большое влияние. Буквально нет ни одного уголка человеческой жизни на этой планете, на который не повлияло бы качество нашего программного обеспечения <a href="https://medium.com/devschacht/composing-software-an-introduction-b49ce93e3ec8" rel="nofollow noopener noreferrer">Composing Software Eric Elliott</a>. Но вместе с ростом количества разработчиков в современном мире растёт ли качество программного обеспечения? Да, количество разработчиков растёт, но растёт ли количество хороших разработчиков?<br>
<br>
Знаете, если бы кто-то в прошлом (с десяток лет назад) мне сказал, что есть такие гайдлайны, от которых мой код изменится к лучшему, то я обязательно бы ознакомился с ними. Но к тому времени, как я понял, что мне нужно знать на самом деле, чтобы стать хорошим программистом, я успел написать уже очень много плохого кода. Надеюсь, что эта статья поможет некоторым изменить своё отношение к архитектуре.<br> <a href="https://habr.com/ru/articles/672288/?utm_campaign=672288&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 20 Jun 2022 09:00:03 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[SOLID]]></category><category><![CDATA[IT]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Роберт Мартин]]></category><category><![CDATA[разработка]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Горшочек, не вари! Как я получил три оффера, а потом еще, и еще, и…]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/649611/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/649611/?utm_campaign=649611&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/649611/"><div style="text-align:center;"><img src="https://habrastorage.org/webt/5n/dn/dt/5ndndtnbivakck7o2_9-_kdwhow.jpeg"></div></a><br>
Эту историю попросил рассказать меня мой знакомый, так как очень хотел сохранить анонимность. Далее будет напрямую с его слов:<br>
<br>
Здравствуйте, меня зовут Игорь и я разработчик.<br>
<br>
Такими словами обычно начинают стендапы в клубе анонимных алкоголиков. И сегодня я пришёл сюда, чтобы рассказать вам о моей зависимости. Может это и не зависимость даже, а вполне нормальное поведение. В любом случае я хочу вынести это на ваш суд. Итак, вот моя проблема: я очень хорошо прохожу собеседования на позицию старшего разработчика и соглашаюсь на эти собеседования раз в месяц, если меня приглашают. Звучит не очень впечатляюще? Насколько хорошо я прохожу собеседования? Последние шесть собеседований я прошёл с лёгкостью и по результату каждого из них получил оффер. А если сложить предложенные суммы ЗП из этих офферов, то получится сумма немного превышающая 21 тысячу евро! Конечно, на финишной прямой с потенциальным работодателем у меня устанавливается почти полное взаимопонимание, мы улыбаемся друг другу в скайпе, мне задают последний вопрос, что-то вроде: «а что тебя не устраивает на текущем месте работы, почему ты в поиске?». И вот в этом месте я добавляю изюминку, говорю: «я не в поиске, просто мне предложили пройти собеседование, и я согласился — вдруг, что интересное подвернётся». Возможно, это моё заявление и стреляет точнее всего.<br> <a href="https://habr.com/ru/articles/649611/?utm_campaign=649611&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 04 Feb 2022 09:00:02 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[IT-компании]]></category><category><![CDATA[Карьера в IT-индустрии]]></category><category><![CDATA[Управление персоналом]]></category><category><![CDATA[Читальный зал]]></category>
      <category><![CDATA[ruvds_статьи]]></category><category><![CDATA[собеседование]]></category><category><![CDATA[интервью]]></category><category><![CDATA[трудоустройство]]></category><category><![CDATA[вакансии]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 7: GraphQL]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/568472/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/568472/?utm_campaign=568472&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Перед вами — седьмая (заключительная) часть серии статей о разработке REST-серверов на Go. В предыдущих статьях мы занимались, в основном, различными подходами к разработке REST API для простого приложения, автоматизирующего управление задачами. Сегодня мы исследуем кое-что совершенно новое и поговорим о том, как сделать похожий API, пользуясь не REST, а GraphQL.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/566106/"><img src="https://habrastorage.org/webt/vj/wc/vl/vjwcvlhnpegzdveazheanrlkjtm.png"></a><br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/568472/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 7: GraphQL</a><br>
</div>
                    </div><br>
Хотя тут я уделяю определённое внимание причинам выбора GraphQL и сравнению GraphQL и REST, это здесь не главное. Есть множество статей, освещающих эти вопросы, и я советую вам поискать их и почитать. Главная цель этого материала заключается в том, чтобы привести пример создания GraphQL-сервера на Go. Для того чтобы не усложнять нашу задачу, этот сервер использует модель данных, очень похожую на модель, реализованную в одном из вариантов сервера из предыдущих материалов (речь идёт о простом бэкенде, дающем возможность работать со списком задач).<br> <a href="https://habr.com/ru/articles/568472/?utm_campaign=568472&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 20 Jul 2021 13:09:52 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>GraphQL</category><category>ruvds_перевод</category><category>сервер</category><category>программирование</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 6: аутентификация]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/567280/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/567280/?utm_campaign=567280&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Перед вами — шестой материал из серии статей, посвящённых разработке REST-серверов на Go. Наша сегодняшняя тема — безопасность, а именно — аутентификация. Если бы сервер, разработанный в предыдущих материалах, был бы развёрнут, и к нему мог бы обратиться кто угодно, то у любого, имеющего выход в интернет, был бы полный доступ к его API. Хотя некоторым REST-серверам это вполне подходит, такой сценарий работы с сервером желателен далеко не всегда. Обычно как минимум часть API должна быть защищена таким образом, чтобы доступ к ней могли бы получить лишь аутентифицированные пользователи.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/"><img src="https://habrastorage.org/webt/3b/v7/98/3bv798tk17ypoa1uypia-hobnss.png"></a><br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br> <a href="https://habr.com/ru/articles/567280/?utm_campaign=567280&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 13 Jul 2021 13:01:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>ruvds_перевод программирование</category><category>сервер</category><category>аутентификация</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 5: Middleware]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/566198/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/566198/?utm_campaign=566198&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Это — пятый материал из <a href="https://habr.com/ru/users/programmerguru/posts/">серии статей</a>, посвящённой разработке REST-серверов на Go. Здесь мы поговорим о middleware. У меня есть <a href="https://eli.thegreenplace.net/2021/life-of-an-http-request-in-a-go-server/" rel="nofollow noopener noreferrer">материал</a>, посвящённый жизненному циклу HTTP-запросов в серверах, написанных на Go. Для того чтобы разобраться в том, о чём пойдёт речь ниже, вам нужно ориентироваться в этой теме.<br>
<br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br>
<a href="https://habr.com/ru/company/ruvds/blog/565142/"><img src="https://habrastorage.org/webt/qv/ed/oq/qvedoqzdlzyt8k7i-hwwsumf0eu.png"></a><br> <a href="https://habr.com/ru/articles/566198/?utm_campaign=566198&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 05 Jul 2021 13:02:02 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>ruvds_перевод</category><category>серверное администрирование</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/564508/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/564508/?utm_campaign=564508&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Перед вами четвёртый материал о разработке REST-серверов на Go. Здесь мы поговорим о том, как можно воспользоваться OpenAPI и Swagger для реализации стандартизированного подхода к описанию REST API, и о том, как генерировать Go-код на основе спецификации OpenAPI.<br>
<br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/"><img src="https://habrastorage.org/webt/wi/oy/tg/wioytg_1qk2o0sgkkxednunxhqq.png"></a><br> <a href="https://habr.com/ru/articles/564508/?utm_campaign=564508&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 24 Jun 2021 17:01:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>сервера</category><category>rest</category><category>ruvds_перевод</category><category>OpenAPI</category><category>Swagger</category><category>REST API</category><category>код</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/562878/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/562878/?utm_campaign=562878&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Сегодня, в третьей части серии материалов, посвящённых разработке серверов на Go, мы займёмся реализацией нашего REST-сервера с использованием <a href="https://github.com/gin-gonic/gin" rel="nofollow noopener noreferrer">Gin</a> — одного из самых популярных веб-фреймворков для Go. <a href="https://github.com/eliben/code-for-blog/tree/master/2021/go-rest-servers/gin" rel="nofollow noopener noreferrer">Вот</a> код, который мы будем тут обсуждать.<br>
<br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/"><img src="https://habrastorage.org/webt/uz/2g/zx/uz2gzxdkwsyqgobfu-a3paawjq8.png"></a><br> <a href="https://habr.com/ru/articles/562878/?utm_campaign=562878&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 17 Jun 2021 13:01:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Веб-разработка]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>системное администрирование</category><category>веб-фреймворк</category><category>ruvds_перевод</category><category>программирование</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/561108/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/561108/?utm_campaign=561108&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Перед вами второй материал из серии статей, посвящённой разработке REST-серверов на Go. В <a href="https://habr.com/ru/company/ruvds/blog/559816/">первом</a> материале этой серии мы создали простой сервер, пользуясь стандартными средствами Go, а после этого отрефакторили код формирования JSON-данных, вынеся его во вспомогательную функцию. Это позволило нам выйти на достаточно компактный код обработчиков маршрутов.<br>
<br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/">Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br>
Там мы говорили об одной проблеме нашего сервера, которая заключается в том, что логика маршрутизации разбросана по нескольким местам нашей программы.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/560742/"><img src="https://habrastorage.org/webt/zu/en/ft/zuenft-gjchjgzq6ob0odyksfce.jpeg"></a><br>
<br>
Это — проблема, с которой сталкиваются все, кто пишет HTTP-сервера, не используя зависимости. Если только сервер, принимая во внимание систему его маршрутов, не является до крайности минималистичной конструкцией (например — это некоторые специализированные серверы, имеющие лишь один-два маршрута), то оказывается, что размеры и сложность организации кода маршрутизатора — это нечто такое, на что очень быстро обращают внимание опытные программисты.<br> <a href="https://habr.com/ru/articles/561108/?utm_campaign=561108&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 06 Jun 2021 10:04:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>ruvds_перевод</category><category>rest сервер</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Разработка REST-серверов на Go. Часть 1: стандартная библиотека]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/559816/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/559816/?utm_campaign=559816&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Это — первый материал из серии статей, посвящённой разработке REST-серверов на Go. В этих статьях я планирую описать реализацию простого REST-сервера с использованием нескольких различных подходов. В результате эти подходы можно будет сравнить друг с другом, можно будет понять их относительные преимущества друг перед другом.<br>
<a href="https://habr.com/ru/company/ruvds/blog/557672/"><img src="https://habrastorage.org/webt/a5/q4/fk/a5q4fkjrvndyodrxchetcxb7eus.png"></a><br>
Первый вопрос разработчиков, которые только начинают применять Go, часто выглядит так: «Какой фреймворк стоит использовать для решения задачи X». И хотя это — совершенно нормальный вопрос, если задавать его, имея в виду веб-приложения и серверы, написанные на многих других языках, в случае с Go при ответе на этот вопрос нужно принять во внимание множество тонкостей. Существуют серьёзные аргументы как «за», так и «против» использования фреймворков в Go-проектах. Я, работая над статьями из этой серии, вижу своей целью объективное разностороннее исследование этого вопроса.<br>
<br>
<div class="spoiler" role="button" tabindex="0">
                        <b class="spoiler_title">Предыдущие части:</b>
                        <div class="spoiler_text"><a href="https://habr.com/ru/company/ruvds/blog/559816/"><b><font color="#3AC1EF">Вы тут </font></b> — Разработка REST-серверов на Go. Часть 1: стандартная библиотека</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/561108/">Разработка REST-серверов на Go. Часть 2: применение маршрутизатора gorilla/mux</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/562878/">Разработка REST-серверов на Go. Часть 3: использование веб-фреймворка Gin</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/564508/">Разработка REST-серверов на Go. Часть 4: применение OpenAPI и Swagger</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/566198/">Разработка REST-серверов на Go. Часть 5: Middleware</a><br>
<a href="https://habr.com/ru/company/ruvds/blog/567280/">Разработка REST-серверов на Go. Часть 6: аутентификация</a><br>
</div>
                    </div><br> <a href="https://habr.com/ru/articles/559816/?utm_campaign=559816&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 28 May 2021 13:02:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Серверное администрирование]]></category>
      <category>Go</category><category>разработка</category><category>ruvds_перевод</category><category>rest сервер</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Эмуляция компьютера: интерпретатор CHIP-8, графика и стриминг текстур]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/535762/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/535762/?utm_campaign=535762&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/535760/">В прошлый раз</a> мы остановились на том, что создали интерпретатор CHIP-8 и оснастили его системой для формирования кадров. Видеть то, что должно попасть на экран, можно в консоли. Теперь же мы собираемся взять то, что формирует интерпретатор, вынести это за пределы консоли и показать на экране.<br>
<br>
Решать вышеозначенные задачи мы будем с помощью библиотеки <a href="https://www.libsdl.org/" rel="nofollow">SDL</a>, которая умеет выводить графические данные на экран, принимать то, что вводит пользователь, и проигрывать звуки. Настройка SDL-проекта может вызвать некоторые сложности. Поэтому я рекомендую перед началом работы с библиотекой почитать мой <a href="https://river.codes/setting-up-a-cross-platform-sdl-project/" rel="nofollow">материал</a> о ней.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/535762/"><img src="https://habrastorage.org/webt/xi/1h/kg/xi1hkgwlgce15kqtvzyutdmgyt4.png"></a><br>
<br>
Есть много способов вывести что-либо на экран с использованием SDL. В играх, в основном, изображения не формируются, как в нашем случае, средствами CPU. Но при эмуляции и (что встречается чаще) при воспроизведении видео изображение (вполне возможно — сжатое) готовится к выводу средствами CPU. Такое изображение, для вывода его на экране, нужно загрузить в GPU. После того, как изображение попадёт в GPU, мы называем его «текстурой», а весь этот процесс называют «стримингом текстур».<br> <a href="https://habr.com/ru/articles/535762/?utm_campaign=535762&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 10 Jan 2021 13:22:38 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[C++]]></category><category><![CDATA[Программирование]]></category>
      <category>CHIP-8</category><category>C++</category><category>разработка</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Эмуляция компьютера: интерпретатор CHIP-8, таймеры и обработка ввода]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/535764/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/535764/?utm_campaign=535764&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Мы уже создали вполне рабочий эмулятор CHIP-8, но он, к сожалению, получился очень медленным. Почему? Если заглянуть в его главный цикл — можно увидеть, что данные на экран выводятся после выполнения каждого шага цикла. При включённом vsync SDL пытается привязать скорость рендеринга к частоте обновления кадров дисплея (возможно это — 60 Гц). Для нас это означает то, что метод <code>SDLViewer::Update</code>, почти при каждом его вызове, долго будет находиться в заблокированном состоянии, ожидая сигнала vsync от монитора.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/535764/"><img src="https://habrastorage.org/webt/g5/it/zg/g5itzgx9iqab3lhg4ctzatbvi94.png"></a><br>
<br>
Насколько быстро должен работать наш эмулятор? Точный ответ на этот вопрос дать не так уж и просто. На реальном компьютере на выполнение операций с разными кодами нужно разное время, но известны ориентировочные временные показатели выполнения различных операций. Можно выполнить инструкцию, выяснить то, сколько времени её выполнение должно занимать на реальном аппаратном обеспечении, а после этого «усыпить» программу до того момента, когда можно будет продолжать работу. Но тут есть одна проблема, которая заключается в том, что у нас, при таком подходе, нет доступа к временным параметрам работы CPU. На выполнение большинства этих инструкций должна уходить пара микросекунд, но на современных системах «усыплять» программы можно, как минимум, на одну миллисекунду.<br> <a href="https://habr.com/ru/articles/535764/?utm_campaign=535764&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 03 Jan 2021 16:27:25 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[C++]]></category><category><![CDATA[Программирование]]></category>
      <category>CHIP-8</category><category>C++</category><category>разработка</category><category>ruvds_перевод</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Эмуляция компьютера: интерпретатор CHIP-8 и формирование изображений]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/535760/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/535760/?utm_campaign=535760&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Недавно мы опубликовали перевод <a href="https://habr.com/ru/company/ruvds/blog/534118/">первого материала</a> из серии статей, посвящённой эмуляции компьютера. Автор этих статей подробно рассказывает о написании интерпретатора CHIP-8 на C++. В той публикации мы устроили опрос о целесообразности перевода продолжения цикла. Почти 94% тех, кто принял участие в опросе, продолжение перевода поддержали. Поэтому сегодня мы представляем вашему вниманию второй материал о CHIP-8.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/535760/"><img src="https://habrastorage.org/webt/wi/lj/fr/wiljfr4gkwxjhsbuyaildmaxppw.png"></a><br> <a href="https://habr.com/ru/articles/535760/?utm_campaign=535760&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 01 Jan 2021 13:27:27 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[C++]]></category><category><![CDATA[Программирование]]></category>
      <category>CHIP-8</category><category>C++</category><category>разработка</category><category>ruvds_перевод</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Эмуляция компьютера: интерпретатор CHIP-8]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/534118/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/534118/?utm_campaign=534118&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<a href="https://habr.com/ru/company/ruvds/blog/534118/"><img src="https://habrastorage.org/webt/t8/qx/fj/t8qxfj1mxskczlwl23cxdzk-jhc.png"></a><br>
<br>
Меня, по ряду причин, всегда завораживала эмуляция. Программа, которая выполняет другую программу… Мне эта идея кажется невероятно привлекательной. И у меня такое ощущение, что тот, кто напишет подобную программу, не пожалеет ни об одной минуте потраченного на это времени. Кроме того, написание эмулятора — это очень похоже на создание настоящего компьютера программными средствами. Мне было очень интересно разбираться в устройстве компьютерной архитектуры, писать простой HDL-код, но эмуляция — это гораздо более простой способ ощутить себя тем, кто своими руками создаёт компьютер. А ещё, в детстве, когда я впервые увидел игру Super Mario World, я поставил себе цель, которая до сих пор не потеряла для меня ценности. Она заключается в том, чтобы полностью понять то, как именно работает эта игра. Именно поэтому я уже некоторое время подумываю о написании эмулятора SNES/SNC. Недавно я решил, что пришло время сделать <a href="https://github.com/rivergillis/chip-8" rel="nofollow noopener noreferrer">первый шаг</a> к этой цели.<br>
<br>
Предлагаю поговорить о разработке эмулятора и обсудить простой, но полноценный пример эмуляции CHIP-8.<br> <a href="https://habr.com/ru/articles/534118/?utm_campaign=534118&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 22 Dec 2020 13:10:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[C++]]></category><category><![CDATA[Программирование]]></category>
      <category>CHIP-8</category><category>C++</category><category>разработка</category><category>ruvds_перевод</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Реализация epoll, часть 4]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/527174/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/527174/?utm_campaign=527174&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Это — последний материал из серии четырёх статей (<a href="https://habr.com/ru/company/ruvds/blog/523946/">часть 1</a>, <a href="https://habr.com/ru/company/ruvds/blog/526582/">часть 2</a>, <a href="https://habr.com/ru/company/ruvds/blog/526802/">часть 3</a>), посвящённой реализации <code>epoll</code>. Тут речь пойдёт о том, как <code>epoll</code> передаёт события из пространства ядра в пользовательское пространство, и о том, как реализованы режимы срабатывания по фронту и по уровню.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/525850/"><img src="https://habrastorage.org/webt/gq/yl/ut/gqylut4qvzqlzxrdeygsby73mt8.jpeg"></a><br>
<br>
Эта статья написана позже остальных. Когда я начинал работу над первым материалом, самой свежей стабильной версией ядра Linux была 3.16.1. А во время написания данной статьи это уже версия 4.1. Именно на коде этой версии ядра и основана данная статья. Код, правда, изменился не особенно сильно, поэтому читатели предыдущих статей могут не беспокоиться о том, что что-то в реализации <code>epoll</code> очень сильно изменилось.<br> <a href="https://habr.com/ru/articles/527174/?utm_campaign=527174&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 09 Nov 2020 15:48:52 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[*nix]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Системное программирование]]></category>
      <category>Linux</category><category>epoll</category><category>разработка</category><category>ruvds_перевод</category><category>системные вызовы</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Реализация epoll, часть 3]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/526802/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/526802/?utm_campaign=526802&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[В предыдущих двух материалах (<a href="https://habr.com/ru/company/ruvds/blog/523946/">часть 1</a>, <a href="https://habr.com/ru/company/ruvds/blog/526582/">часть 2</a>) этой серии речь шла об общих вопросах работы <code>epoll</code>, и о том, как <code>epoll</code> получает уведомления о новых событиях от файловых дескрипторов, за которыми наблюдает. Здесь я расскажу о том, как <code>epoll</code> хранит уведомления о событиях, и о том, как эти уведомления получают приложения, работающие в пользовательском режиме.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/525848/"><img src="https://habrastorage.org/webt/sf/8w/xy/sf8wxyszwqhvtlbxbrrnyjuaylm.jpeg"></a><br> <a href="https://habr.com/ru/articles/526802/?utm_campaign=526802&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sun, 08 Nov 2020 13:15:04 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[*nix]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Системное программирование]]></category>
      <category>Linux</category><category>epoll</category><category>разработка</category><category>ruvds_перевод</category><category>системные вызовы</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Реализация epoll, часть 2]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/526582/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/526582/?utm_campaign=526582&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Публикуя перевод <a href="https://habr.com/ru/company/ruvds/blog/523946/">первой</a> статьи из цикла материалов о реализации <code>epoll</code>, мы провели опрос, посвящённый целесообразности перевода продолжения цикла. Более 90% участников опроса высказались за перевод остальных статей. Поэтому сегодня мы публикуем перевод второго материала из этого цикла.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/525844/"><img src="https://habrastorage.org/webt/cl/mr/3b/clmr3buvuusltfpliyxnmq_csgi.jpeg"></a><br> <a href="https://habr.com/ru/articles/526582/?utm_campaign=526582&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Thu, 05 Nov 2020 13:15:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[*nix]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Системное программирование]]></category>
      <category>ruvds_перевод</category><category>системные вызовы</category><category>linux</category><category>epoll</category><category>разработка</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Реализация epoll, часть 1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/ruvds/articles/523946/</guid>
      <link>https://habr.com/ru/companies/ruvds/articles/523946/?utm_campaign=523946&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Сегодня мы публикуем перевод первой статьи из <a href="https://idndx.com/tag/epoll/" rel="nofollow">серии</a> материалов, посвящённых реализации <code>epoll</code> в ядре Linux 3.16.1*. Автор исходит из предположения о том, что читатели знакомы с API и с использованием <code>epoll</code>. Он уделяет основное внимание реализации подсистемы <code>epoll</code> в ядре Linux, а не особенностям её применения. Если вы не знаете о том, как пользоваться <code>epoll</code> — автор рекомендует сначала почитать <a href="http://man7.org/linux/man-pages/man7/epoll.7.html" rel="nofollow">документацию</a>. Это значительно облегчит понимание деталей реализации этого механизма.<br>
<br>
<a href="https://habr.com/ru/company/ruvds/blog/523946/"><img src="https://habrastorage.org/webt/iw/gk/dd/iwgkddqbawdnta45lkgs1t2lnco.jpeg"></a><br>
<br>
<i>* — Linux 3.16.1 достаточно старое ядро, но информация работы с epoll актуальна и сегодня (прим. переводчика).</i><br> <a href="https://habr.com/ru/articles/523946/?utm_campaign=523946&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 20 Oct 2020 13:15:01 GMT</pubDate>
      <dc:creator><![CDATA[programmerguru (RUVDS.com)]]></dc:creator>
      <category><![CDATA[Блог компании RUVDS.com]]></category><category><![CDATA[*nix]]></category><category><![CDATA[Программирование]]></category><category><![CDATA[Linux]]></category><category><![CDATA[Системное программирование]]></category>
      <category>Linux</category><category>epoll</category><category>разработка</category>
    </item>
  

  

      

      

      

    
  </channel>
</rss>
