<?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/hubs/webdev/posts/</link>
    <description><![CDATA[Веб-разработка – делаем веб лучше]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Mon, 27 Apr 2026 06:06:58 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[Пост @nin-jin — Веб-разработка (+1) — 25.04.2026 16:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027860/</guid>
    <link>https://habr.com/ru/posts/1027860/?utm_campaign=1027860&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><a href="https://youtu.be/cXPLmrytIiY" rel="noopener noreferrer nofollow">Препарируем Lit и находим родовые травмы</a></strong></p><iframe id="69ecc5d3aeeb010208e02339" src="https://embedd.srv.habr.com/iframe/69ecc5d3aeeb010208e02339" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Задействованы самые современные веб-стандарты, однако:</p><ul><li><p>Заявляется отсутствие VDOM, однако он есть, со всеми вытекающими.</p></li><li><p>Любое исключение капитально ломает весь компонент.</p></li><li><p>Неизбежные конфликты имён компонент всё ломают.</p></li><li><p>Адовые тормоза и потребление памяти из-за привязки к DOM.</p></li><li><p>Тонны бойлерплейта, если нужна кастомизация хотя бы стилей компонент.</p></li></ul><p>Поблагодарить: <a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow">https://boosty.to/hyoo</a><br>Обсудить: <a href="https://t.me/giper_dev" rel="noopener noreferrer nofollow">https://t.me/giper_dev</a></p> <a href="https://habr.com/ru/posts/1027860/?utm_campaign=1027860&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 25 Apr 2026 13:49:41 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[Lit]]></category><category><![CDATA[web-components]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rozhnev — SQL (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027118/</guid>
    <link>https://habr.com/ru/posts/1027118/?utm_campaign=1027118&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как я запускал российское зеркало для SQL-песочниц: гибридное облако и блокировки Composer</p><p>Привет, Хабр! Меня зовут Слава, я развиваю SQL-платформы <a href="https://sqltest.online" rel="noopener noreferrer nofollow">sqltest.online</a> и <a href="https://sqlize.online" rel="noopener noreferrer nofollow">sqlize.online</a> для бесплатной тренировки запросов на реальных СУБД (PostgreSQL, Oracle, MariaDB 12.3, MS SQL 2025).</p><p>Зачем понадобилось зеркало?</p><p>От 30% моей аудитории из РФ стали приходить сообщения: «Сайт открывается только через VPN».</p><p>Переносить бэкенд целиком - дорого, сервер завязан на тяжелые СУБД в Docker. Поэтому я выбрал гибридную модель: поднять фронтенд в зоне <code>.ru</code>, оставив бэкенд в Германии.</p><p>Архитектура: Фронт в РФ, мозг в Германии</p><p>Фронтенд: PHP без фреймворков</p><p>Нативный PHP, HTML и JS. Меньше зависимостей - проще деплой. Для RU-зеркала я выбрал <a href="https://sweb.ru/?utm_term=paveavec" rel="noopener noreferrer nofollow">SpaceWeb</a>*, где есть отличные бюджетные тарифы и классная поддержка.</p><pre><code>sqltest-online.ru (SpaceWeb, РФ)
├── PHP (без фреймворков) + HTML/JS
└── Минимум зависимостей
</code></pre><p>Бэкенд: Docker Compose</p><p>Мощный сервер в Германии у <a href="https://contabo.com" rel="noopener noreferrer nofollow">Contabo</a>*, где в контейнерах крутятся MySQL, PostgreSQL, ClickHouse и другие базы. Серьезные СУБД требуют ресурсов, так что всё живет на одной полноценной машине.</p><p>Как они общаются?</p><p>Пользователь отправляет запрос -&gt; браузер делает AJAX-вызов к <code>.ru</code> серверу -&gt; фронт делает HTTP-запрос к бэкенду в Германии (server-to-server) -&gt; бэкенд выполняет SQL и возвращает результат.</p><p><strong>Плюсы схемы:</strong></p><ul><li><p>CORS не нужен: браузер общается только со своим доменом.</p></li><li><p>Бэкенд закрыт: принимает запросы только от white-list IP.</p></li><li><p>Задержка минимальна: интерфейс грузится из РФ, тяжелые запросы идут по быстрому каналу серверов.</p></li></ul><p>Резервного бэкенда нет - проект бесплатный, на второй сервер пока нет бюджета. Если падает Германия, ложится всё.</p><p>Проблемы деплоя: Composer «ушел в отказ»</p><p>С <code>git pull</code> всё прошло гладко, но установка зависимостей зависла намертво.</p><p><strong>Проблема:</strong> Composer не мог достучаться до packagist.org. Просто бесконечный таймаут, вызванный нестабильностью сетевых маршрутов.</p><p><strong>Решение:</strong> Поддержка SpaceWeb не стала отписываться «проблема на вашей стороне», а сразу дала адрес HTTP-прокси.</p><p>Дело одной команды:</p><pre><code class="bash">export HTTPS_PROXY=http://proxy.host:port
composer install
</code></pre><p><em>(Для Windows: <code>set HTTPS_PROXY=...</code>)</em></p><p><strong>Мораль:</strong> При деплое на российские площадки проверяйте доступность packagist.org (<code>curl -v https://packagist.org</code>). Если висит - просите прокси у хостера, не тратьте время на Composer.</p><p>Итоги</p><p>Зеркало <a href="https://sqltest-online.ru" rel="noopener noreferrer nofollow">sqltest-online.ru</a> работает. Гибридная схема спасает: пользователи получают быстрый интерфейс без VPN, а запросы улетают на проверенный бэкенд.</p><p>Я верю, что образование должно быть доступным. Если для практики SQL нужно включать VPN и ждать по 10 секунд - человек не будет учиться. Зеркало <code>.ru</code> - мой способ сказать: «Продолжайте практиковаться».</p><p>А как вы деплоите зависимости на RU-площадки? Используете прокси, зеркала или есть решения изящнее?</p><p><em>* P.S. Ссылки на SpaceWeb и Contabo в статье - реферальные. Сервисами пользуюсь сам и смело рекомендую, а бонусы пойдут на оплату серверов проекта.</em></p> <a href="https://habr.com/ru/posts/1027118/?utm_campaign=1027118&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 24 Apr 2026 07:01:10 GMT</pubDate>
    <dc:creator><![CDATA[rozhnev]]></dc:creator>
      
      <category><![CDATA[PHP]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Composer]]></category><category><![CDATA[Хостинг]]></category><category><![CDATA[Пет-проект]]></category><category><![CDATA[Личный опыт]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @fil_and — Браузеры (+4) — 17.04.2026 17:03]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1024722/</guid>
    <link>https://habr.com/ru/posts/1024722/?utm_campaign=1024722&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Подборка залипательнейших прикольных интернет-сервисов. Собирал для вас годами, чтобы вы могли покликать и поухмыляться. </p><p><a href="https://pointerpointer.com/" rel="noopener noreferrer nofollow">https://pointerpointer.com/</a> — PointerPointer: сервис находит фото, где человек указывает пальцем прямо на ваш курсор.</p><p><a href="https://hackertyper.net/" rel="noopener noreferrer nofollow">https://hackertyper.net/</a> — HackerTyper: почувствуйте себя кинохакером — просто быстро жмите любые клавиши.</p><p><a href="https://www.window-swap.com/" rel="noopener noreferrer nofollow">https://www.window-swap.com/</a> — WindowSwap: видео из случайных окон реальных людей по всему миру.</p><p><a href="https://astronaut.io/" rel="noopener noreferrer nofollow">https://astronaut.io/</a> — <a href="http://Astronaut.io" rel="noopener noreferrer nofollow">Astronaut.io</a>: случайные видео с YouTube с нулевым количеством просмотров и странными названиями.</p><p><a href="https://neal.fun/wonders-of-street-view/" rel="noopener noreferrer nofollow">https://neal.fun/wonders-of-street-view/</a> — Wonders of Street View: самые необычные и прикольные места, найденные на Google Картах.</p><p><a href="https://radio.garden/" rel="noopener noreferrer nofollow">https://radio.garden/</a> — Radio Garden: глобус, на котором можно слушать прямой эфир радиостанций из любой точки планеты.</p><p><a href="https://radiooooo.com/" rel="noopener noreferrer nofollow">https://radiooooo.com/</a> — Radiooooo: музыкальная машина времени — выбираете страну и десятилетие.</p><p><a href="https://earth.fm/" rel="noopener noreferrer nofollow">https://earth.fm/</a> — <a href="http://Earth.fm" rel="noopener noreferrer nofollow">Earth.fm</a>: интерактивная карта с записями звуков природы со всего мира.</p><p><a href="https://floor796.com/" rel="noopener noreferrer nofollow">https://floor796.com/</a> — Floor796: огромная живая анимация с сотнями персонажей поп-культуры.</p><p><a href="https://www.windows93.net/" rel="noopener noreferrer nofollow">https://www.windows93.net/</a> — Windows 93: полноценная (и очень странная) операционная система прямо в вашем браузере.</p><p><a href="http://www.excelworld.ru/" rel="noopener noreferrer nofollow">http://www.excelworld.ru/</a> — ExcelWorld: всё о работе в Excel и даже чуть больше.</p><p><a href="https://www.makewordart.com/" rel="noopener noreferrer nofollow">https://www.makewordart.com/</a> — MakeWordArt: тот самый дизайн надписей из Microsoft Word 2000.</p><p><a href="https://90s.myretrotvs.com/" rel="noopener noreferrer nofollow">https://90s.myretrotvs.com/</a> — 90s TV: симулятор телевизора из 90-х с рекламой и передачами того времени.</p><p><a href="https://archive.org/details/softwarelibrary_msdos_games" rel="noopener noreferrer nofollow">https://archive.org/details/softwarelibrary_msdos_games</a> — MS-DOS Games: огромный архив старых игр, в которые можно играть онлайн.</p><p><a href="https://webamp.org/" rel="noopener noreferrer nofollow">https://webamp.org/</a> — Webamp: легендарный плеер Winamp, работающий в браузере.</p><p><a href="https://poolsuite.net/" rel="noopener noreferrer nofollow">https://poolsuite.net/</a> — Poolsuite: эстетика 80-х, ретро-радио и летний вайб.</p><p><a href="http://savethesounds.info/" rel="noopener noreferrer nofollow">http://savethesounds.info/</a> — Save The Sounds: музей исчезающих звуков (от кассет до старых модемов).</p><p><a href="https://zzz.zoomquilt2.com/" rel="noopener noreferrer nofollow">https://zzz.zoomquilt2.com/</a> — Zoomquilt 2: бесконечное сюрреалистичное изображение, в которое можно «влипать» вечно.</p><p><a href="https://stars.chromeexperiments.com/" rel="noopener noreferrer nofollow">https://stars.chromeexperiments.com/</a> — 100,000 Stars: визуализация ближайших к нам звезд в 3D.</p><p><a href="https://htwins.net/scale2/" rel="noopener noreferrer nofollow">https://htwins.net/scale2/</a> — Scale of the Universe: интерактивная шкала масштабов Вселенной — от атомов до галактик.</p><p><a href="https://pastvu.com/" rel="noopener noreferrer nofollow">https://pastvu.com/</a> — PastVu: архив исторических фотографий с привязкой к месту на карте.</p><p><a href="https://pudding.cool/" rel="noopener noreferrer nofollow">https://pudding.cool/</a> — The Pudding: визуализация плотности населения Земли в виде 3D-гор.</p><p><a href="https://trismegistus.tech/apps/begit/index.html" rel="noopener noreferrer nofollow">https://trismegistus.tech/apps/begit/index.html</a> — Бегит, Анжуманя: забавный чеклист для тренировок (пресс качать, анжуманя).</p><p><a href="https://www.koalastothemax.com/" rel="noopener noreferrer nofollow">https://www.koalastothemax.com/</a> — Koalas to the Max: расщепляйте круги, пока не увидите картинку.</p><p><a href="https://www.incredibox.com/demo/" rel="noopener noreferrer nofollow">https://www.incredibox.com/demo/</a> — Incredibox: создавайте крутой битбокс с помощью стильных персонажей.</p><p>Записал видео, как показываю эти сервисы:</p><iframe id="69e23c6e80609702592c70c6" src="https://embedd.srv.habr.com/iframe/69e23c6e80609702592c70c6" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1024722/?utm_campaign=1024722&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 17 Apr 2026 14:03:34 GMT</pubDate>
    <dc:creator><![CDATA[fil_and]]></dc:creator>
      
      <category><![CDATA[интернет-сервисы]]></category><category><![CDATA[интересное]]></category><category><![CDATA[игры и игровые приставки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @iamshpeht — Развитие стартапа (+1) — 08.04.2026 11:13]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1020690/</guid>
    <link>https://habr.com/ru/posts/1020690/?utm_campaign=1020690&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><em>Не особо интересный пост. </em><br><br>Я все еще считаю, что стартап — это весело 🐙</p><p><br>Наша разработка hardware продукта напрямую связана с софтом. В нашем случае <strong>умный датчик качества воздуха Atmy</strong>, становится по настоящему “умным” в связке с целой экосистемой в виде интеграций ML моделей, системы подтверждения качества данных Atmy Trust Rating (хочу об этом написать отдельно позже), токенизации, веб-сайта и приложения для управления устройством. <br><br>Всю эту архитектуру приходиться менять практически в real-time. Поймал себя на ощущении, что уже немного вышел в пограничное состояние. Дни заканчиваются не вечером, а как-то плавно перетекают в следующий день. Иногда в голове уже слышен характерный «треск» старого жесткого диска. Но самое странное — мне это нравится. Потому что именно сейчас добрался до тех вещей, которые годами откладывал «на потом, когда будут ресурсы».</p><p><strong>Спойлер 👀: ресурсов никогда не будет хватать.&nbsp;</strong></p><p><br>Приведу вам пример того, как мы работаем над платформой <a href="http://atmy.ai" rel="noopener noreferrer nofollow">atmy.ai<br><br></a>Наша платформа раскладывается на три уровня:</p><p>↖️User product <strong>← сейчас мы здесь</strong></p><p>Какой воздух вокруг меня?</p><p>↖️Device management</p><p>Как живут мои станции?</p><p>↖️Data intelligence</p><p>Дай аналитику, API, выгрузки и объясни, что вообще происходит.</p><p><strong><br>Объем большой. Мы реализуем функционал, которого еще не существует, поэтому выбрали работу по уровням и с быстрым тестированием:</strong></p><p><strong>накрутить идеи на максимум → быстро обкатать → выкинуть лишнее → остальное в прод и допиливать API</strong></p><p>На практике это выглядит так: <br><br>появилась идея → накидываем проект в Figma (важно визуальное, так как делаем для людей) → дорабатываем за пару дней MPV через Cursor → тестируем → а далее либо удаляем без сожалений / либо сразу на git программистам.</p><p>Из того, что уже долетело до продакшна:<br></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c42/fea/dc5/c42feadc58335e80c2fee00d19cc7ce7.png" width="3246" height="1954"></figure><p><strong>— Atmy Data Hub</strong></p><p>Место, где наконец появилась нормальная аналитика по стране и миру. Скачивание графика по клику или скачать готовый csv файл. Графики, которых мне самому отчаянно не хватало в начале пути, когда заинтересовался экологией в своем городе.</p><p><strong>— Режим “Мониторинг”</strong></p><p>Внутри я его называю «око Саурона». По клику кнопки “Мониторинг” переходишь в этот режим сразу с карты, где “сейчас” находишься — и просто наблюдаешь за динамикой изменения воздуха в реальном времени. Все элементы в большем масштабе для удобного считывания с расстояния, обновление происходит практически real-time.</p><p><br>Есть ещё несколько фич, но их судьба пока под вопросом. <br><br>Например:</p><p>Мы тестируем <strong>гибридный режим (CAMS+AirMap Local)</strong> отображения глобального слоя pm2.5 CAMS совмещенный с локальными данными с земли, чтобы достичь максимальной актуальности данных. Здесь много математики и это тоже очень увлекательно. <br><br>И это всё — только первый слой.</p><p>В общем, путь, как обычно, не самый простой. Но, кажется, именно так и должно быть в любом стартапе<br><br><strong>Больше картинок и общения в нашем маленьком чате разработки телеграм: <a href="https://t.me/atmyhub" rel="noopener noreferrer nofollow">https://t.me/atmyhub</a></strong></p> <a href="https://habr.com/ru/posts/1020690/?utm_campaign=1020690&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 08 Apr 2026 08:13:42 GMT</pubDate>
    <dc:creator><![CDATA[iamshpeht]]></dc:creator>
      
      <category><![CDATA[atmy]]></category><category><![CDATA[стартап]]></category><category><![CDATA[стартапы]]></category><category><![CDATA[веб-дизайн]]></category><category><![CDATA[web]]></category><category><![CDATA[веб-сайт]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Искусственный интеллект (+3) — 06.04.2026 08:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1019662/</guid>
    <link>https://habr.com/ru/posts/1019662/?utm_campaign=1019662&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/VoltAgent/awesome-design-md" rel="noopener noreferrer nofollow">Awesome DESIGN.md</a> для обучения ИИ на основе дизайнов 30 топовых IT-компаний, включая полный разбор дизайнов каждой компании: например Airbnb, Pinterest, Revolut, Uber, Spotify, SpaceX, NVIDIA и Apple. В итоге получается набор данных, в том числе паттерны, шрифты, цвета, кнопки, отступы и вообще всё, что формирует стиль. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/434/3c8/5cf/4343c85cf6fa08061394774aa9fc12ed.png" width="700" height="601"></figure> <a href="https://habr.com/ru/posts/1019662/?utm_campaign=1019662&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 06 Apr 2026 05:07:09 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Awesome DESIGN.md]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Dalee_group — Блог компании Далее (+2) — 03.04.2026 17:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/dalee_group/posts/1019046/</guid>
    <link>https://habr.com/ru/companies/dalee_group/posts/1019046/?utm_campaign=1019046&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/dfb/e3a/331/dfbe3a33169c15daa7948f43ddddd6c8.png" width="1200" height="600"></figure><p>Вам пишет рекрутер из известной компании. Вакансия — мечта. Собеседование — завтра. Нужно только установить «утилиту для тестового задания». А дальше — украденные учётки, шантаж и ощущение, что мир сошёл с ума.<br><br>HRD Далее Ася Маркевич выступила экспертом подкаста от Департамента разработки «Как не стать жертвой фейковых рекрутеров». <br><br>Смотрите на Rutube  <a href="https://rutube.ru/video/8888fe21f49e6c50f1e78816fde1216c/" rel="noopener noreferrer nofollow">https://rutube.ru/video/8888fe21f49e6c50f1e78816fde1216c/</a> </p> <a href="https://habr.com/ru/posts/1019046/?utm_campaign=1019046&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 03 Apr 2026 14:18:28 GMT</pubDate>
    <dc:creator><![CDATA[Dalee_group (Далее)]]></dc:creator>
      
      <category><![CDATA[рекрутинг]]></category><category><![CDATA[фейки]]></category><category><![CDATA[фрод]]></category><category><![CDATA[hr]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @erbanovanastasia — Блог компании Selectel (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1018970/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1018970/?utm_campaign=1018970&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Вторая часть курса по JavaScript уже доступна</strong> 💻</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/77c/0c0/cac/77c0c0cacc0c6e8c0457a3455027e578.png" width="1999" height="664"></figure><p>Привет, Хабр! Массивы, объекты, операторы, DOM — если вы еще не работаете с ними, проходите бесплатный курс «<a href="https://study.selectel.ru/javascript_course/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=course_post_javascript_030425" rel="noopener noreferrer nofollow">Первые шаги в JavaScript</a>». Во время обучения вы освоите базовый синтаксис и конструкции языка, а затем напишете пет-проект. &nbsp;</p><p>Вторая часть состоит из пяти модулей. После курса вы сможете:</p><ul><li><p>изучать более продвинутые фреймворки и библиотеки;</p></li><li><p>понимать архитектуру простых веб-приложений;</p></li><li><p>писать скрипты, управлять DOM и изменять интерфейс веб-страниц.</p></li></ul><p>Осваивайте практические навыки с помощью IT-инфраструктуры Selectel — промокод на бесплатный доступ уже ждет на курсе. После успешного прохождения финального теста пришлем именной сертификат.</p><p><strong><a href="https://study.selectel.ru/javascript_course/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=course_post_javascript_030425" rel="noopener noreferrer nofollow">Начните обучение прямо сейчас →</a></strong></p> <a href="https://habr.com/ru/posts/1018970/?utm_campaign=1018970&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 03 Apr 2026 12:53:03 GMT</pubDate>
    <dc:creator><![CDATA[erbanovanastasia (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[курс]]></category><category><![CDATA[обучение]]></category><category><![CDATA[разработка]]></category><category><![CDATA[js]]></category><category><![CDATA[javascript]]></category><category><![CDATA[бесплатные курсы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Viktoria_Arturovna — Веб-разработка (+1) — 02.04.2026 14:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1018474/</guid>
    <link>https://habr.com/ru/posts/1018474/?utm_campaign=1018474&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Будет слишком по девчачьи сказать, что я плакала из-за код ревью? </p><p>Это было года три или&nbsp;четыре назад, когда я ещё не&nbsp;нашла общий язык со своим новым тех.лидом. Тогда много всего накопилось, и каждый новый комментарий, хоть он и&nbsp;был очень корректным, ощущался как&nbsp;еще один удар сверху. Помню&nbsp;было что‑то из&nbsp;серии: «Тут надо изменить нейминг».</p><p>Ничего такого, вроде все ок. Но я смотрела на него и зависла в моменте: а что именно не так то? Есть какие то правила в новой команде, о которых я еще не знаю? Нужно переименовать только эту переменную или мне нужно пройтись по всему файлу?</p><p>Начинаешь писать ответ, ждешь уточнения, потом опять ответ... В какой то момент я просто закрыла ноут и разревелась. Я уже находилась в состоянии нервного клубка и такие комментарии добивали больше, чем любой жёсткий разнос. </p><p>Но самое забавное, спустя время я пересмотрела старые ПР и поняла, что мой техлид был максимально корректным и без токсичности. Просто я уже была на грани выгорания и каждый комментарий превращался в испытание. </p><p>Мне захотелось поделиться своими мыслями на тему код-ревью, о том как формулировки влияют на скорость работы и состояния людей:</p><blockquote><p><a href="https://habr.com/ru/companies/alfa/articles/1017452/" rel="noopener noreferrer nofollow">Ссылка на статью</a></p></blockquote><p>Если хоть раз сидел и думал: «что от меня тут вообще хотят?» — ты точно поймёшь&nbsp;:)</p> <a href="https://habr.com/ru/posts/1018474/?utm_campaign=1018474&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 02 Apr 2026 11:48:40 GMT</pubDate>
    <dc:creator><![CDATA[Viktoria_Arturovna]]></dc:creator>
      
      <category><![CDATA[code review]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @VitBurk — Веб-разработка (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1015422/</guid>
    <link>https://habr.com/ru/posts/1015422/?utm_campaign=1015422&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Какой user-side подход выбрать?</strong></p><p>Может многие и не задавались вопросом, но я думаю это интересная тема, которую можно прояснить.</p><p>Допустим, мы пилим какой-нибудь интересный сервис. Ну вот написали мы бэкенд, а как пользователь будет с ним взаимодействовать? По моему мнению сейчас есть несколько основных вариантов: веб-приложение, мобильное прилижение и телеграм-бот. Конечно, если есть много лишних рук, можно написать всё и сразу, но это не мой варик.</p><p>В моём случае каждая строчка кода дорога. Работаю я в одиночку.</p><p>Сейчас я разрабатываю сервис по изучению иностранных слов и на основе моего опыта хочу сделать некое сравнение этих подходов.</p><p><strong>Телеграм-бот</strong></p><p>Вообще начал я user-side телеграм-ботом. Поначалу это, конечно, может, и казалось достаточным, но всё-таки для какого-либо функционала простого телеграм-бота не хватает.</p><p>Да и ещё в добавок в Russian Federation начали блокировать тг, поэтому пользоваться им приходится с костылями, а бот перестал стабильно работать.</p><p>Вывод: тг-бот - для простого функционала, но довольно нестабилен и ограничен функционал</p><p>Хотя, есть mini-app, но в их подробности я не вдавался.</p><p><strong>Веб-приложение</strong></p><p>Следующий очень популярный вариант - веб-приложение. Этот вариант намного более гибок. Но по моему мнению всё же не максимально стабилен, так как его работа зависит от состояния браузера. Но у этого варианта есть огромное преимущество: он работает на всех устройствах, на которых можно открыть веб-сайт. Это, так сказать, униварсальный вариант.</p><p>Но есть проблема. Допустим, человек пользуется чем-то на постоянной основе и хочет максимально быструю и адаптированную работу. Он будет постоянно заходить в браузер и копаться во вкладках? Или лучше тогда выбрать мобильное приложение?</p><p><strong>Мобильное приложение</strong></p><p>Наверное самый сложный и трудозатратный, но по моему мнению в нынешнее время самый перспективный вариант. Да, по сравнению с веб-собратом работать оно будет не везде, а только на мобилке, при том на определённой (IOS или Android).</p><p>Но при этом мобильное приложение даёт реализовать максимально удобное и оптимизированное управление, потому что почти всё можно настроить под свой продукт.</p><p><strong>Небольшая сводка</strong></p><p>Для чего бот: для простого функционала. Можно использовать как небольшое дополнение к какой-либо инфраструктуре. Этот подход наименее трудозатратен.</p><p>Для чего веб-приложения: для продуктов, где нужна кроссплатформенность и довольно широкая кастомизация. Подход не сильно трудозатратный.</p><p>Для чего мобильные приложения: для продуктов где важна максимальная быстрота и удобство и наилучшии возможности кастомизации. По моему мнению наиболее подходит для каких-то интересных и уникальных сервисов. Это самый трудозатратный подход из перечисленный, но в некоторых случаях он более чем себя оправдывает.</p><p>Что кому разрабатывать в первую очередь зависит от самого проекта, универсального варианта здесь нет по моему мнению.</p><p>PS: интересно узнать чужое мнение, так как возможно здесь много субъективщины.</p> <a href="https://habr.com/ru/posts/1015422/?utm_campaign=1015422&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 31 Mar 2026 14:21:56 GMT</pubDate>
    <dc:creator><![CDATA[VitBurk]]></dc:creator>
      
      <category><![CDATA[разработка]]></category><category><![CDATA[программирование]]></category><category><![CDATA[мобильная разработка]]></category><category><![CDATA[бот]]></category><category><![CDATA[веб-приложения]]></category><category><![CDATA[rust]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @blognaumen — Блог компании NAUMEN (+3) — 26.03.2026 14:22]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/naumen/posts/1015350/</guid>
    <link>https://habr.com/ru/companies/naumen/posts/1015350/?utm_campaign=1015350&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Мы привыкли воспринимать DevTools как инструмент для разработчиков и тестировщиков. Но на практике это хороший источник информации и для других специалистов: через него можно понять, как устроена страница, где возникают проблемы и как интерфейс ведет себя в разных сценариях.</p><p>Попросили Костю, frontend-разработчика Naumen, рассказать, какие возможности DevTools он использует в работе и на что стоит обращать внимание.</p><div class="floating-image"><figure class="float full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c45/8a6/517/c458a6517f24b94754e77979c1b6be5e.jpg" width="1244" height="462"></figure></div><p><strong>1️⃣ Как открыть DevTools, если F12 не сработал</strong></p><p>Самый простой способ&nbsp;— клавиша <strong>F12</strong>&nbsp;для&nbsp;Windows/Linux. На&nbsp;macOS сочетание отличается, но&nbsp;открыть DevTools можно не&nbsp;только с&nbsp;клавиатуры.</p><p>Например, <strong>через&nbsp;контекстное меню&nbsp;</strong>— нажать правой кнопкой мыши на&nbsp;элемент страницы и&nbsp;<strong>выбрать «Исследовать элемент»</strong>. DevTools откроются сразу на&nbsp;нужном месте.</p><blockquote><p>Иногда DevTools пытаются ограничить на уровне страницы, и стандартный способ не работает. В&nbsp;таких случаях выручают <strong>браузерные расширения </strong>с&nbsp;похожими возможностями.</p></blockquote><p>2️⃣ <strong>Как работать с версткой во вкладке Элементы</strong></p><p>Вкладка <strong>Элементы</strong> показывает DOM-дерево страницы — структуру документа, из которого собран интерфейс.&nbsp;</p><p>Здесь можно:</p><ul><li><p>навести курсор на элемент и посмотреть, где он находится на странице</p></li><li><p>быстро найти нужный блок через селектор</p></li><li><p>посмотреть размеры, фон и отступы </p></li></ul><blockquote><p>А еще можно посмотреть доступность — как элементы переключаются через Tab.</p></blockquote><p>3️⃣ <strong>Как находить итоговые стили&nbsp;</strong></p><p>Если&nbsp;у&nbsp;элемента много CSS-правил, я&nbsp;перехожу во&nbsp;вкладку <strong>Вычисленные</strong>.</p><p>Там&nbsp;собраны<strong> все&nbsp;итоговые стили элемента</strong>&nbsp;— включая те, что&nbsp;пришли через&nbsp;наследование или&nbsp;заданы браузером. Можно быстро найти нужное свойство, например, border-radius, и&nbsp;понять, какое значение реально применяется.</p><p> 4️⃣ <strong>Как проверять изменения без правок в коде</strong></p><p>Элементы можно менять прямо в&nbsp;браузере: редактировать текст, менять цвет, удалять элементы или&nbsp;добавлять&nbsp;их — можно вручную вставить длинный текст и&nbsp;посмотреть, не&nbsp;ломается&nbsp;ли&nbsp;верстка.</p><blockquote><p>После обновления страницы все возвращается как было.</p></blockquote><p>5️⃣ <strong>Как разбирать запросы во вкладке Сеть</strong></p><p>Во&nbsp;вкладке <strong>Сеть</strong> видно, какие запросы отправляет страница и&nbsp;что&nbsp;приходит в&nbsp;ответ. А&nbsp;еще&nbsp;в&nbsp;этой вкладке есть&nbsp;не&nbsp;только список запросов, но&nbsp;и&nbsp;инструменты для&nbsp;фильтрации, поиска и&nbsp;просмотра этапов выполнения. Если&nbsp;нужно исключить что‑то из&nbsp;поиска, можно использовать инверсию или&nbsp;минус в&nbsp;строке фильтра.</p><p>Также&nbsp;можно <strong>сохранить HAR-файл</strong> и&nbsp;передать его&nbsp;разработчику&nbsp;— в&nbsp;нем&nbsp;будет вся&nbsp;история сетевых запросов. Но&nbsp;в&nbsp;HAR попадут только те&nbsp;запросы, которые видны с&nbsp;учетом текущих фильтров.</p><p>6️⃣ <strong>Как подменять ответ бэка</strong></p><p>В&nbsp;DevTools можно изменить ответ запроса и&nbsp;посмотреть, как&nbsp;на&nbsp;него отреагирует интерфейс.</p><blockquote><p>Я&nbsp;использую это, когда нужно проверить нестандартный кейс. Например, подставить более длинный текст или&nbsp;другие данные и&nbsp;посмотреть, что&nbsp;произойдет на&nbsp;странице.</p></blockquote><p>7️⃣<strong> Как проверять работу при медленном интернете</strong></p><p>DevTools позволяют проверить, как&nbsp;работает интерфейс при&nbsp;плохом соединении. Во&nbsp;вкладке Сеть можно:</p><ul><li><p>выбрать готовые профили — 3G, 4G</p></li><li><p>настроить <strong>собственную скорость сети</strong></p></li><li><p>протестировать поведение приложения <strong>в режиме офлайн</strong></p></li></ul><p>8️⃣ <strong>Как работать с локальными данными</strong></p><p>Во вкладке <strong>Приложение</strong> можно посмотреть данные, которые браузер сохраняет на стороне пользователя:</p><ol><li><p><strong>Локальное хранилище</strong>&nbsp;— данные, которые сохраняются надолго и&nbsp;не&nbsp;исчезают после&nbsp;перезагрузки страницы.</p></li><li><p><strong>Сессионное хранилище</strong>&nbsp;— данные, которые живут только пока открыта вкладка.</p></li><li><p><strong>Файлы cookie</strong>&nbsp;— похожи на&nbsp;локальное хранилище, но&nbsp;у&nbsp;них есть&nbsp;срок жизни и&nbsp;дополнительные ограничения по&nbsp;источнику.</p></li></ol><p>Все это можно просматривать, изменять и очищать.&nbsp;</p><p>9️⃣ <strong>Как менять геолокацию и часовой пояс</strong></p><p>DevTools позволяют изменить геолокацию и часовой пояс, <strong>не меняя настройки операционной системы</strong>.</p><p>Можно выбрать готовую точку или указать координаты вручную. Полезно, когда нужно проверить поведение элементов в другом городе, регионе или стране.</p><p>🔟 <strong>Как записывать пользовательские сценарии</strong></p><p>Инструмент <strong>Регистратор</strong> умеет записывать действия пользователя на&nbsp;странице&nbsp;— фиксируются шаги, например, клики и&nbsp;переходы по&nbsp;интерфейсу.</p><p>После&nbsp;записи сценарий можно воспроизвести, отредактировать, сохранить и&nbsp;отправить коллегам.</p> <a href="https://habr.com/ru/posts/1015350/?utm_campaign=1015350&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Mar 2026 11:22:11 GMT</pubDate>
    <dc:creator><![CDATA[blognaumen (NAUMEN)]]></dc:creator>
      
      <category><![CDATA[DevTools]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[frontend]]></category><category><![CDATA[отладка интерфейсов]]></category><category><![CDATA[debugging]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ceomt — PHP (+3) — 25.03.2026 08:39]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014594/</guid>
    <link>https://habr.com/ru/posts/1014594/?utm_campaign=1014594&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Выпустили бесплатный курс для PHP-разработчиков</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/8e7/86d/2aa/8e786d2aa9b0c3b0cfc2ac4b61307939.png" alt="Пример одного из уроков курса" title="Пример одного из уроков курса" width="1280" height="720"><div><figcaption>Пример одного из уроков курса</figcaption></div></figure><p>Всем привет! Год назад рассказывал в <a href="https://habr.com/ru/articles/875194/" rel="noopener noreferrer nofollow">этой статье на Хабре</a> о том, как мы подготовили и записали курс на 30+ часов для наших PHP-разработчиков. В итоге у нас вышло 43 урока, разбитые на 5 направлений.</p><p>Сначала думали упаковать все это в коммерческий формат, но решили оставить все как есть и просто поделиться с сообществом. Надеюсь, что он принесет вам пользу.  </p><p><a href="https://mediaten.ru/education/backend" rel="noopener noreferrer nofollow">Курс охватывает PHP от базовых механизмов до архитектуры и тестирования</a>. В программе — устройство языка, работа с памятью и производительностью, принципы ООП и проектирования, а также взаимодействие с базами данных.</p><p>Отдельные блоки посвящены внутренностям PHP (zval, сборщик мусора, OPcache, асинхронность), архитектурным подходам (SOLID, DDD, паттерны, организация бизнес-логики) и работе с БД — от проектирования схем до оптимизации запросов и масштабирования.</p><p>В части тестирования рассматриваются TDD, структура тестов и подходы к оценке их качества.</p><p>Материал основан на практических кейсах и разбирает задачи, которые встречаются в реальных проектах.</p><p>  </p> <a href="https://habr.com/ru/posts/1014594/?utm_campaign=1014594&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Mar 2026 05:39:11 GMT</pubDate>
    <dc:creator><![CDATA[ceomt]]></dc:creator>
      
      <category><![CDATA[php-программист]]></category><category><![CDATA[бесплатные курсы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Open source (+4) — 20.03.2026 13:40]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1012678/</guid>
    <link>https://habr.com/ru/posts/1012678/?utm_campaign=1012678&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://github.com/spinov001-art/awesome-web-scraping-2026" rel="noopener noreferrer nofollow">Awesome Web Scraping Tools 2026</a> с веб-скрейперами с API-ориентированным подходом (YouTube, Bluesky, Reddit, Google Maps).</p><p>Все инструменты бесплатны и доступны в <a href="https://apify.com/store" rel="noopener noreferrer nofollow">Apify Store</a>, включая компоненты для:</p><ul><li><p>API-first — более 20 инструментов используют официальные API (Reddit JSON, YouTube Innertube, Wikipedia MediaWiki);</p></li><li><p>JSON-LD вместо CSS — для сайтов с обзорами структурированные данные более надежны;</p></li><li><p>бесплатных API — CoinGecko, Open-Meteo, ip-api, Frankfurter;</p></li><li><p>ограничения скорости запросов — встроенные задержки, никогда не нацелены на DDoS-атаки на сайты.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/be4/39d/1a9/be439d1a940debc07733c105f5cffbf9.png" width="788" height="377"></figure> <a href="https://habr.com/ru/posts/1012678/?utm_campaign=1012678&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 20 Mar 2026 10:40:46 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[веб-скрейперы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 17.03.2026 08:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011098/</guid>
    <link>https://habr.com/ru/posts/1011098/?utm_campaign=1011098&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>WT CDEK library v.1.3.0 - обновление PHP SDK для Joomla + CDEK.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/1c7/764/fee/1c7764fee34e3292ba69e3c18366cac8.png" width="1048" height="857"></figure><p>Небольшая нативная PHP Joomla библиотека для работы с API v.2 службы доставки CDEK. Библиотека представляет собой клиент для авторизации в CDEK API по OAuth, работы с некоторыми методами API: получения ряда данных и расчета стоимости доставки. Поддерживается Joomla 4.2.7 и выше.</p><p>В пакет входят:</p><ul><li><p>библиотека Webtolk/Cdekapi</p></li><li><p>системный плагин System&nbsp;— WT Cdek для&nbsp;хранения настроек и AJAX‑интеграций</p></li><li><p>task‑плагин Task&nbsp;— Update WT Cdek data для&nbsp;обновления локальных копий справочников CDEK по&nbsp;расписанию</p></li><li><p>web asset с&nbsp;официальным JavaScript‑виджетом СДЭК</p></li></ul><p><strong>👉 v.1.3.0. Что нового?</strong></p><ul><li><p>Полный рефакторинг библиотеки. Библиотека переработана в&nbsp;entity‑based API с&nbsp;фасадом Cdek и отдельным слоем запросов. Обратная совместимость не&nbsp;нарушена, поэтому версия библиотеки&nbsp;— 1.3.0.</p></li><li><p>Добавлена поддержка новых разделов API СДЭК. Добавлена поддержка новых разделов API СДЭК: webhooks, prealert, печатные формы, payment, passport, reverse, intakes и других сущностей.</p></li><li><p>Улучшена интеграция с&nbsp;Joomla. Улучшена интеграция с&nbsp;Joomla: installer script для&nbsp;layouts, новые поля Joomla Form для&nbsp;тарифов и обновлённые js виджета CDEK.</p></li><li><p>документация библиотеки. Все методы библиотеки подробно описаны, а&nbsp;так&nbsp;же текст документации собран в&nbsp;отдельной папке в&nbsp;git репозитории.</p></li></ul><p>Пример запроса&nbsp;— запрос информации о&nbsp;городе.</p><pre><code class="php">&lt;?php

use Webtolk\Cdekapi\Cdek;

\defined('_JEXEC') or die;

// Вариант 1: брать credentials из настроек плагина
$cdek = new Cdek();

// Вариант 2: передать credentials явно
$cdek = new Cdek(test_mode: true, client_id: 'your_client_id', client_secret: 'your_client_secret');

$result = $cdek-&gt;location()-&gt;getCities([
    'postal_code' =&gt; '410012',
    'city'        =&gt; 'Саратов',
    'size'        =&gt; 1,
]);
</code></pre><p>Результат запроса:</p><pre><code>Array
(
    [0] =&gt; Array
        (
            [code] =&gt; 428
            [city_uuid] =&gt; 7e54a0b3-76f0-41e2-92e0-f1e600ad84fd
            [city] =&gt; Саратов
            [fias_guid] =&gt; bf465fda-7834-47d5-986b-ccdb584a85a6
            [country_code] =&gt; RU
            [country] =&gt; Россия
            [region] =&gt; Саратовская область
            [region_code] =&gt; 47
            [fias_region_guid] =&gt; df594e0e-a935-4664-9d26-0bae13f904fe
            [sub_region] =&gt; городской округ Саратов
            [longitude] =&gt; 46.034266
            [latitude] =&gt; 51.533562
            [time_zone] =&gt; Europe/Saratov
            [payment_limit] =&gt; -1
        )

)</code></pre><p>Библиотека эта нужна для разработчиков, создающих свои расширения для интеграции Joomla и курьерской службы CDEK.</p><p><a href="https://web-tolk.ru/dev/biblioteki/wt-cdek-library-for-joomla-developers" rel="noopener noreferrer nofollow">Страница расширения</a></p><p><a href="https://github.com/WebTolk/WT-CDEK-Joomla-PHP-library" rel="noopener noreferrer nofollow">GitHub расширения</a> </p> <a href="https://habr.com/ru/posts/1011098/?utm_campaign=1011098&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Mar 2026 05:20:35 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[cdek]]></category><category><![CDATA[php sdk]]></category><category><![CDATA[php]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @DmitryOlkhovoi — Веб-разработка (+1) — 16.03.2026 20:16]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011002/</guid>
    <link>https://habr.com/ru/posts/1011002/?utm_campaign=1011002&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/5d0/361/06f/5d036106fa32eb9a548e22391f736305.png" width="1516" height="1490"></figure><p>Собрал форк Backbone.js без jQuery, Underscore.<br>Typescript, ES module, поддержка классов<br><a href="https://ostovjs.org/" rel="noopener noreferrer nofollow">https://ostovjs.org/</a><br><a href="https://github.com/DmitryOlkhovoi/Ostov" rel="noopener noreferrer nofollow">https://github.com/DmitryOlkhovoi/Ostov</a></p> <a href="https://habr.com/ru/posts/1011002/?utm_campaign=1011002&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 16 Mar 2026 17:16:33 GMT</pubDate>
    <dc:creator><![CDATA[DmitryOlkhovoi]]></dc:creator>
      
      <category><![CDATA[backbone]]></category><category><![CDATA[jquery]]></category><category><![CDATA[underscore]]></category><category><![CDATA[javascript]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myshkin_does_it — Python (+1) — 14.03.2026 14:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1010186/</guid>
    <link>https://habr.com/ru/posts/1010186/?utm_campaign=1010186&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Два факта об int в</strong> <strong>Python</strong></p><p>Один забавный факт привел меня к открытию другого :)</p><p>Читал Fluent Python и наткнулся на пример кода, который меня заинтересовал (помимо миллиона других, книга – топ). В главе про конкурентность и работу GIL была константа <code>NUMBERS</code> с необычным значением:</p><pre><code class="python">NUMBERS = 5_000_111_000_222_021</code></pre><p><strong>Нижние подчеркивания</strong></p><p>Если не встречали в работе или документации, то вряд ли знаете (как и я): в числах можно использовать <code>_</code> для читаемости. Интерпретатор их игнорирует:</p><pre><code class="bash">&gt;&gt;&gt; x = 1_2
&gt;&gt;&gt; y = 12
&gt;&gt;&gt; x == y
True
&gt;&gt;&gt; x is y
True</code></pre><p>Особенно удобно в высокоразрядных числах. Согласитесь <code>5_000_111_000_222_021</code> куда проще читать, чем <code>5000111000222021</code></p><p><strong>Кеш малых чисел</strong></p><p>Примеры ниже разбирал на домашнем ноуте с Cpython 3.13.11 и 3.14.3.</p><p>Пока игрался, меня заинтересовал один прикол. Я попробовал тот же пример с большими числами:</p><pre><code class="bash">&gt;&gt;&gt; x = 100_500
&gt;&gt;&gt; y = 100500
&gt;&gt;&gt; x == y
True
&gt;&gt;&gt; x is y
False # Но ведь в примере выше было True..</code></pre><p>Почему переменные больше не ссылаются на один объект?</p><p>В Cpython есть кеш для маленьких чисел, чтобы частые значения переменных не занимали много памяти и код был отзывчивее.</p><p>Ответ на вопрос: «где граница, до которой числа закешированы?» я решил не гуглить, проверил небольшим скриптом:</p><pre><code class="bash">&gt;&gt;&gt; x = 0
&gt;&gt;&gt; y = 0
&gt;&gt;&gt; for n in range(1000):
... &nbsp; &nbsp; print(f'If {x=} and {y=}, x is y: {x is y}')
... &nbsp; &nbsp; x += 1
... &nbsp; &nbsp; y += 1

# Пропустим часть строк
If x=254 and y=254, x is y: True
If x=255 and y=255, x is y: True
If x=256 and y=256, x is y: True
If x=257 and y=257, x is y: False # Вот и граница
If x=258 and y=258, x is y: False&nbsp;
...</code></pre><p>Сначала я сделал эмпирически вывод, что закеширован диапазон 0 – 256. Но после самопроверки с гуглом узнал, что также в амортизированный диапазон входят числа от -5 до -1. Итого : от -5 до 256 включительно.</p><p><strong>UPD 15.03.2026.</strong>  Добрый <a href="https://habr.com/ru/users/zzzzzzerg/" rel="noopener noreferrer nofollow">дядя</a> в комментах принес ссылку на <a href="https://github.com/python/cpython/pull/133160/changes" rel="noopener noreferrer nofollow">pr</a> в Cpython 3.15, где кеш малых чисел увеличен  до 1024 :). Ух, заживем..</p><p>Для присвоения переменным чисел вне диапазона, интерпретатор начнет выделять уже раздельные области памяти и <code>is</code> станет возвращать <code>False</code>.</p><p>Так то. В оптимизации пригодится вряд ли, но удивить друзей в баре сможете.</p> <a href="https://habr.com/ru/posts/1010186/?utm_campaign=1010186&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 14 Mar 2026 11:57:09 GMT</pubDate>
    <dc:creator><![CDATA[myshkin_does_it]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[integer]]></category><category><![CDATA[оптимизация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @toxicmt — Программирование (+2) — 09.03.2026 16:57]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1008182/</guid>
    <link>https://habr.com/ru/posts/1008182/?utm_campaign=1008182&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Учимся писать промпты правильно</strong></p><p>Я когда начинал погружаться в агентскую разработку, постоянно испытывал легкое чувство стыда, за то, что делаю все как колхозник, а не как "настоящий инженер", который значит продумал задачу, разложил на шаги, обсудил с ии, дальше итеративно, задав кучу условий и ограничений начал реализовывать.</p><p>Мой подход&nbsp; "надо сделать вот это" и дальше уже куда поведет его и куда поведет меня. И это действительно было проблемой, когда я работал в агентах без режима планирования. Доходило до смешного, ты хотел с ним поговорить, он начинает херачить, ты ему "стоять нахер", он там уже наломал дров. В итоге постоянно откатывался сам либо просил откатывать его. В целом, это тоже хороший опыт, понимания того как вообще такие системы работают, где у них границы, как лучше формулировать и так далее.</p><p>Но в любом случае, даже это не приучило меня как-то сидеть и расписывать, потому что ты никогда точно не знаешь, куда поведет агента на чем он запнется. Тебе мерещится одно, а он начинает тупить ваще в неожиданном месте.</p><p>А потом появился режим планирования. И в этот момент, все эти обучалки и принципы того как надо заранее хорошо подумать над задачей превратились в тыкву. Даже если вы начинаете мычать что-то в терминале, современные агенты сами направят, сами зададут вопросы и подсветят важные моменты. Главное в целом понимать что вам нужно и каким будет финальный результат. В этот момент мне перестало быть стыдно.</p><p>Вдруг меня осенило, слишком сильное обдумывание до начала работы в агентской разработке (последние полгода), стало чем-то сродни преждевременной оптимизации. Поработав с большим числом моделей и агентов, могу сказать, что если вы будете сами все продумывать, то заставите работать более менее нормально даже самые тупые модели, но вы никогда не поймете границы их возможностей, где они могут еще больше взять на себя освободив вас от рутины. А модели и агенты постоянно развиваются, там где раньше надо было подсказывать, теперь они могут сами. Плюс если вы работаете над <a href="http://AGENTS.md" rel="noopener noreferrer nofollow">AGENTS.md</a>, скилами и mcp, то и тут мы ловим буст.</p><p>Поэтому сейчас я иду по такому пути. Включаю режим планирования и дальше даю короткое описание задачи и подробный контекст.</p><p>Для упавшего ci это выглядит так:</p><ol><li><p>Поправь тесты</p></li><li><p>Прошу посмотреть последний запущенный билд на github actions</p></li></ol><p>Баг в браузере:</p><ol><li><p>прошу открыть страницу (он это делает через mcp chrome) и самому изучить</p></li></ol><p>Для рефакторинга:</p><ol><li><p>Переводим вот это на это</p></li><li><p>Вот эталон (тут ссылка на файл)</p></li></ol><p>Для фичи:</p><ol><li><p>Нужно реализовать такую фичу</p></li><li><p>Даю пример или говорю с помощью какого инструмента</p></li></ol><p>И все. Самые продвинутые модели типа opus 4.6 или codex 5.3 справятся самостоятельно с большинством острых углов. Сами спросят объем, посмотрят разные варианты, изучат доку и так далее. Модели по тупее, не сделают глубокого анализа и ничего особо не спросят, но именно тут вы поймете где их надо вести и включать свой мозг чаще. Хотя хорошие модели настолько сильно помогают, что я физически не могу использовать более простые для задач планирования. Они хороши в авторежиме только для работы по аналогии, рефакторинг, написание тестов и так далее.</p><p>Даже если вы что-то забудете или пропустите сразу, все это можно будет доуточнить, попросить показать примеры кода, сходить открыть браузер. Если в процессе появляются вещи, которые агент делает из раза в раз, например, пытается выяснить где что-то лежит, как работать с какой-то частью системы, то постепенно это выносится в <a href="http://AGENTS.md" rel="noopener noreferrer nofollow">AGENTS.md</a> и с определенного размера и уровни сложности (когда уже нужны скрипты например и команды) выносится в skill.</p> <a href="https://habr.com/ru/posts/1008182/?utm_campaign=1008182&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 09 Mar 2026 13:57:30 GMT</pubDate>
    <dc:creator><![CDATA[toxicmt]]></dc:creator>
      
      <category><![CDATA[ии]]></category><category><![CDATA[агенты]]></category><category><![CDATA[нас не заменят]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @shanker — Информационная безопасность (+4) — 07.03.2026 20:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1007772/</guid>
    <link>https://habr.com/ru/posts/1007772/?utm_campaign=1007772&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>А зачем покупаете WAF, который можно обойти?</strong></p><p>С таким вопросом разработчиков периодически сталкиваюсь.  Добавлю контекста. Работаю AppSec инженером в финтехе. Когда нахожу уязвимости — сообщаю разработчикам. Среди прочего - доношу мысль: если в данном случае можно смягчить потеницальные последствия угрозы через <abbr class="habraabbr" title="Web Application Firewall" data-title="&lt;p&gt;Web Application Firewall&lt;/p&gt;" data-abbr="WAF">WAF</abbr> — это не значит, что уязвимость не нужно исправлять в приложении. Нередко разработчики спорят. Примерный диалог:</p><blockquote><p>— Ну, есть же WAF — на нём и делайте фикс, зачем нам-то в код лезть? WAF — он же для того и нужен, чтоб уязвимости устранять.<br>— WAF — не панацея: на нём мы сделаем правило. Но это не значит, что в самом приложении не нужно устранять.<br>— Почему?<br>— Например, потому, что практически любой WAF можно обойти.<br>— <strong>А зачем покупаете WAF, который можно обойти?</strong></p></blockquote><p>Отвечаю так: потому что WAF пишут такие же разработчики, как Вы, и они тоже иногда ошибаются (как и все люди). Некоторые особо настырные разработчики желают доказательств, что WAF можно обойти. В целом я солидарен, что <a href="https://t.me/avleonovrus/814" rel="noopener noreferrer nofollow">практика "а ты докажи" в управлении уязвимостями - не очень хороша</a>. Но, если есть под рукой на что можно быстро сослаться - можно это сделать. Я ссылаюсь на <a href="https://habr.com/ru/articles/984632/" rel="noopener noreferrer nofollow">эту статью</a>.<br>В моей практике были случаи, когда WAF из-за сбоя переставал применять правила на несколько дней. Т.е. трафик через него шёл, сервис за WAF продолжал быть доступным. Но, правила на WAF не работали — будто их и нет.</p><p>Эта история в очередной раз показывает: насколько бывают различны в оценке ситуации разработчики и "безопасники". Более интересный вариант — когда разработчики считают, что только они могут решать: что является уязвимостью, а что — нет (подробнее об этом я писал в статье "<a href="https://habr.com/ru/articles/927672/" rel="noopener noreferrer nofollow">Как я зарегистрировал CVE и разозлил вендора</a>").</p> <a href="https://habr.com/ru/posts/1007772/?utm_campaign=1007772&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 07 Mar 2026 17:53:41 GMT</pubDate>
    <dc:creator><![CDATA[shanker]]></dc:creator>
      
      <category><![CDATA[waf]]></category><category><![CDATA[web application firewall]]></category><category><![CDATA[рбпо]]></category><category><![CDATA[безопасная разработка]]></category><category><![CDATA[безопасная инфраструктура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myshkin_does_it — Python (+2) — 01.03.2026 21:30]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005252/</guid>
    <link>https://habr.com/ru/posts/1005252/?utm_campaign=1005252&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Экономия памяти со <code>__slots__</code></strong></p><p>В Python атрибуты классов по-умолчанию хранятся в специальном dunder-атрибуте  <code>__dict__</code>. В описании класса его задавать не надо, он есть неявно и доступен для просмотра при необходимости. Каждый экземпляр класса также имеет свой <code>__dict__</code>:</p><pre><code class="python">class Standard:
	def __init__(self, x, y):
		self.x = x
		self.y = y
		
std = Standard(100, 200)
std.__dict__ # {'x': 100, 'y': 200}
</code></pre><p>Помимо того, что и класс и экземпляры отдельно занимают своими <strong><code>__dict__</code></strong> место в памяти, хранение данных в словарях само по себе несет большие накладные расходы. Хеш-таблица в основе словаря хранит служебные структуры и растёт скачками при увеличении числа атрибутов, поэтому на больших количествах объектов затраты памяти ощутимы:</p><pre><code class="python">from sys import getsizeof

std_size = getsizeof(std) + getsizeof(std.__dict__)
std_size # 344 байта
</code></pre><p>Один из эффективных способов сэкономить память, это реализовать в классе  специальный атрибут <code>__slots__</code> и объявить в нем последовательность атрибутов  экземпляра. Тогда вместо <code>__dict__</code>, Python будет использовать альтернативную структуру хранения атрибутов с помощью дескрипторов.  <code>__slots__</code> для экземпляров классов отдельно не создается и хранится только на уровне класса:</p><pre><code class="python">class Slot:
	__slots__ = ('x', 'y') # Неизменный кортеж из имен атрибутов
	
	def __init__(self, x, y): # Остальное – без изменений
		self.x = x
		self.y = y
		
slt = Slot(100, 200)
slt.__dict__ # **AttributeError**: 'Slot' object has no attribute '__dict__'. Did you mean: '__dir__'?

slt_size = getsizeof(slt)
slt_size # 48 байтов
</code></pre><p>Так добавив одну строчку кода, можно сэкономить расходы памяти в  приложении, где требуется создавать миллионы одинаковых объектов.</p><p>---<br><strong>Важные ограничения</strong></p><ol><li><p>Стоит отметить, что реализация <code>__slots__</code> запрещает динамически добавлять экземпляру класса атрибуты, в отличие от <code>__dict__</code>. В ситуациях, где такое необходимо, <code>__slots__</code> не подойдет.</p><pre><code class="python">std.z = 300
std.__dict__ # {'x': 100, 'y': 200, 'z': 300}

slt.z = 300 # **AttributeError**: 'Slot' object has no attribute 'z' and no __dict__ for setting new attributes
</code></pre></li><li><p>Важно, не забывать расширять слоты, если мы добавляем в код класса новые атрибуты:</p><pre><code class="python">class PartialSlots:
	__slots__ = ('x', 'y') # Не добавили атрибут экземпляра 'z'
	
	def __init__(self, x, y, z):
		self.x = x
		self.y = y
		self.z = z

p = PartialSlots(100, 200, 300) # **AttributeError**: 'PartialSlots' object has no attribute 'z' and no __dict__ for setting new attributes
</code></pre></li><li><p>В подклассах от класса со <code>__slots__</code> наследование этого атрибута проходит лишь частично. Для полноценного использования, его стоит определить еще раз, включив новые атрибуты подкласса:</p><pre><code class="python"># Подкласс без доп. логики
class InheritSlot(Slot):
&nbsp; &nbsp; pass


inh_slt = InheritSlot(100, 200)

inh_slt.__dict__ # {}, атрибут снова доступен
inh_slt.z = 300 # Нет ошибок при динамическом расширении атрибутов
inh_slt.__dict__ # {'z': 300}, словарь подкласса снова занимает память

# Поправим
class InheritSlot(Slot):&nbsp;
&nbsp;&nbsp; &nbsp; __slots__ = ('z', ) # Слоты суперкласса добавятся в начало кортежа. В конце не забываем запятую, так как это кортеж из одного элемента.


inh_slt2 = InheritSlot(100, 200, 300)
inh_slt2.__dict__ # AttributeError ... теперь слоты используются корректно в подклассе</code></pre></li></ol> <a href="https://habr.com/ru/posts/1005252/?utm_campaign=1005252&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 01 Mar 2026 18:30:33 GMT</pubDate>
    <dc:creator><![CDATA[myshkin_does_it]]></dc:creator>
      
      <category><![CDATA[python]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[память]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Искусственный интеллект (+4) — 26.02.2026 15:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1004022/</guid>
    <link>https://habr.com/ru/posts/1004022/?utm_campaign=1004022&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Команда проекта <a href="https://www.pencil.dev/" rel="noopener noreferrer nofollow">Pencil</a>.dev обновила сервис и теперь он генерит любые интерфейсы по&nbsp;клику. В решение&nbsp;внедрили режим «Рой», который создаёт сразу несколько вариаций вашего проекта с помощью шести ИИ‑агентов параллельно. Можно грузить любые файлы и даже кастомные шрифты. Проект поддерживает Antigravity, Copilot, Gemini CLI, Opus 4.6, Sonnet 4.6&nbsp;и даже OpenCode. Результат можно экспортировать во&nbsp;всех самых популярных форматах: PDF, JPG, PNG и WebP. Также стало доступно полноценное приложение для&nbsp;Windows. </p><iframe id="69a03974e1d1260a4c49c18b" src="https://embedd.srv.habr.com/iframe/69a03974e1d1260a4c49c18b" class="embed_video embed__content" allowfullscreen="true"></iframe> <a href="https://habr.com/ru/posts/1004022/?utm_campaign=1004022&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 26 Feb 2026 12:18:30 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Pencil.dev]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 25.02.2026 13:46]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1003492/</guid>
    <link>https://habr.com/ru/posts/1003492/?utm_campaign=1003492&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Особенность Joomla: json-значения для пользовательских полей и их рендер в subform и вне дочерней формы.</strong></p><p>Опять длинное название, но куда уж без этого...</p><p>Итак,  если вы делаете плагин пользовательского поля - его можно использовать через FieldsHelper. И в процессе ваши данные проходят через различные этапы обработки (недавно <a href="https://habr.com/ru/articles/1000064/" rel="noopener noreferrer nofollow">была статья на эту тему</a>). И может так оказаться, что ваше поле хранит в <code>rawvalue</code> json (и в базе данных соответственно тоже), а в <code>value</code> вы на его основе рендерите значение. Это стандартный подход Joomla. Так работают,  например, поля <code>accessiblemedia</code>.  Однако, если вы поместили ваше поле в дочернюю форму (пользовательское поле типа <code>subform</code> и включили <strong>"Рендеринг значений = Да"</strong>, то у вашего замечательного поля может появиться поломанный Json в <code>value</code> вместо нормального значения.</p><p><strong>Например:</strong></p><pre><code class="json">{&amp;quot;basePath&amp;quot;:&amp;quot;...&amp;quot;,&amp;quot;layout&amp;quot;:&amp;quot;...&amp;quot;}</code></pre><p><strong>❓ Что там под капотом Joomla происходит?</strong></p><ol><li><p>В обычном потоке Joomla сначала вызывает событие <code>onCustomFieldsBeforePrepareField</code>, а потом <code>onCustomFieldsPrepareField</code>.</p></li><li><p>Внутри <code>subform</code> же  для подполей при <code>render_values=1</code> вызывается только событие - <code>onCustomFieldsPrepareField</code>.</p></li><li><p>Если преобразование значения (например, <code>json_decode</code>) сделано в вашем плагине только в <code>beforePrepareField</code>, оно не обработает данные  для подполя и...</p></li><li><p>В шаблоне поля строка заэкранируется (<code>htmlentities</code>), кавычки превратятся <s>в тыкву</s> в <code>&amp;quot;</code> и вы получите кривой json, вместо вашего значения.</p></li></ol><p><strong>👉 Собственно полезный совет по Joomla:</strong></p><p>Для полей, которые могут жить внутри <code>subform</code>, делайте нормализацию значения и в <code>onCustomFieldsPrepareField</code> тоже, не только в <code>beforePrepareField</code>.</p> <a href="https://habr.com/ru/posts/1003492/?utm_campaign=1003492&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 25 Feb 2026 10:46:01 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla form]]></category><category><![CDATA[joomla form field]]></category><category><![CDATA[joomla fieldshelper]]></category><category><![CDATA[поля]]></category><category><![CDATA[баги]]></category><category><![CDATA[ошибки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+2) — 17.02.2026 13:21]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/1000422/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/1000422/?utm_campaign=1000422&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Фронтенд 2026: взлеты и падения</strong>  </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/849/eb4/84f/849eb484f412432b5bba8f90847b6a33.png" width="779" height="435"></figure><p>Открываешь проект 2020 года и видишь знакомые имена в package.json: create-react-app, enzyme, moment.js, axios. Пять лет назад это был золотой стандарт. Сегодня же эти технологии вызывают у коллег искреннее недоумение: «Зачем это тут?»</p><p>Подготовили для вас быстрый, но очень полезный срез того, как за 5 лет поменялась ментальная модель фронтендера. Внутри инструменты реально умерли, разберемся почему SSR/SSG снова в игре, а TypeScript теперь почти must-have, узнаем почему фронтенд всё чаще = full-stack и что с этим делать.</p><p>Главный урок 2015→2025: фронтенд развивается циклически. Каждый цикл — это не «прогресс», а перебалансировка компромиссов. Читайте на Хабр в статье <a href="https://habr.com/ru/companies/alfa/articles/990118/" rel="noopener noreferrer nofollow">«Фронтенд 2026: что умерло, что выжило и что взлетело неожиданно»</a></p> <a href="https://habr.com/ru/posts/1000422/?utm_campaign=1000422&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Feb 2026 10:21:58 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[frontend]]></category><category><![CDATA[react]]></category><category><![CDATA[next]]></category><category><![CDATA[css]]></category><category><![CDATA[html]]></category><category><![CDATA[mongo]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Dalee_group — Блог компании Далее (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/dalee_group/posts/1000388/</guid>
    <link>https://habr.com/ru/companies/dalee_group/posts/1000388/?utm_campaign=1000388&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как понять, что ваш интернет-магазин вот-вот сломается: триггеры и решения для сайтов на Magento</strong></p><p>Привет! Это Дмитрий Абакумов  magento-разработчик в Далее, и Максим Бровко, тимлид в Далее.  </p><p>Мы собрали 5 типичных симптомов, которые сигнализируют, что система уже нестабильна — на примере Magento, популярной CMS в сфере e-com. </p><p>В первую очередь скажем, что на Magento работают крупные бренды по всему миру. Она гибкая, масштабируемая, с богатой экосистемой. Однако без регулярных обновлений, контроля и DevOps-поддержки любой проект начинает замедляться, сбоить, а со временем — ломаться. Сигналы появляются заранее: сначала падает скорость, потом checkout, потом весь сайт.</p><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Сигнал 1: падение скорости при большом трафике — во время акций и распродаж">Сигнал 1: падение скорости при большом трафике — во время акций и распродаж</abbr></strong></p><p><strong>Что проверить</strong></p><ul><li><p>Узкие места в БД: тяжелые SELECT, отсутствие индексов.</p></li><li><p>Дублирующиеся или вложенные вызовы блоков в Magento layout.</p></li><li><p>Как ведет себя cron и очередь задач.</p></li><li><p>Используется ли Varnish для FPC и/или Redis для общего кеша.</p></li></ul><p><strong>Как чинить</strong></p><ol><li><p>Настроить загрузку тяжелых блоков после рендера страницы — через AJAX.</p></li><li><p>Внедрить нагрузочное тестирование — k6, Siege, JMeter.</p></li><li><p>Перенастроить кеш Magento, включить компиляцию DI.</p></li><li><p>Заложить горизонтальное масштабирование или CDN.</p></li></ol><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Сигнал 2: долгая загрузка интернет-магазина при обычной посещаемости (более 3 секунд)">Сигнал 2: долгая загрузка интернет-магазина при обычной посещаемости (более 3 секунд)</abbr></strong></p><p><strong>Что проверить</strong></p><ul><li><p>Логи Magento и серверов: timeouts, ошибки, блокировки.</p></li><li><p>Скорость отклика API.</p></li><li><p>Время сборки layout и количество подключаемых блоков.</p></li></ul><p><strong>Как чинить</strong></p><ol><li><p>Проанализировать профилировку — Xdebug, New Relic.</p></li><li><p>Отключить неиспользуемые плагины и модули.</p></li><li><p>Настроить мониторинг производительности и ошибок — New Relic, Grafana, Prometheus.</p></li></ol><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Сигнал 3: Клиенты доходят до оформления, но не покупают — особенно на мобильных устройствах">Сигнал 3: Клиенты доходят до оформления, но не покупают — особенно на мобильных устройствах</abbr></strong></p><p><strong>Что проверить</strong></p><ul><li><p>Как работает checkout: отрисовка, JS, блоки, сторонние виджеты доставки/оплаты.</p></li><li><p>Как отрабатывает кнопка «Оформить заказ» — все ли проходит быстро.</p></li><li><p>Нет ли тяжелых или повторяющихся вызовов.</p></li></ul><p><strong>Как чинить</strong></p><ol><li><p>Кешировать доступные блоки внутри checkout.</p></li><li><p>Упростить форму и ускорить ввод данных — DaData.</p></li><li><p>Включить асинхронную обработку заказов, если оформление занимает много времени.</p></li><li><p>Протестировать на реальных устройствах и подключить фронтовый логгер — Sentry.</p></li></ol><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Сигнал 4: когда починили один баг — появился другой&nbsp;">Сигнал 4: когда починили один баг — появился другой&nbsp;</abbr></strong></p><p><strong>Что проверить</strong></p><ul><li><p>Архитектуру модулей: tight coupling, перезапись классов, обилие around-плагинов.</p></li><li><p>Есть ли автотесты, CI.</p></li><li><p>Как внедряются хотфиксы.</p></li></ul><p><strong>Как чинить</strong></p><ol><li><p>Минимизировать around-плагины и preference (перезаписей классов), отдавать предпочтение before/after-плагинам и observer.</p></li><li><p>Покрывать фиксы хотя бы базовыми unit/integration-тестами.</p></li><li><p>Настроить dev → stage → prod, релизный процесс с changelog.</p></li><li><p>Ввести code style, практику ревью и договоренности внутри команды.</p></li></ol><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Сигнал 5: CMS или модули устарели, все «на костылях» и никто не решается трогать">Сигнал 5: CMS или модули устарели, все «на костылях» и никто не решается трогать</abbr></strong></p><p><strong>Что проверить</strong></p><ul><li><p>Версии ядра Magento и зависимостей.</p></li><li><p>Нет ли deprecated-библиотек, особенно JS.</p></li><li><p>Насколько кастомно переопределены шаблоны и классы.</p></li><li><p>Есть ли onboarding-документация, описание архитектуры, миграций, cron.</p></li></ul><p><strong>Как чинить</strong></p><ol><li><p>Если кастомный код внесен прямо в ядро Magento, то его нужно вынести в отдельные модули.</p></li><li><p>Сравнить архитектуру с best practices Magento и рекомендациями вендоров.</p></li><li><p>Написать README и настроить автоматизацию — Docker, Ansible.</p></li><li><p>Запланировать регулярные апдейты проекта.</p></li></ol><p><strong><abbr class="habraabbr" title="" data-title="&lt;p&gt;&lt;/p&gt;" data-abbr="Если у вас совпадают 3+ пункта — пора на техаудит">Если у вас совпадают 3+ пункта — пора на техаудит</abbr></strong></p><p>Magento почти всегда подает сигналы заранее: снижается скорость, растет количество багов, страдает checkout. Если таких симптомов становится много — пора остановиться и разобраться, что происходит внутри.</p><p><strong>Что делать</strong></p><ul><li><p>Использовать метрики: PageSpeed, TTFB, логи ошибок.</p></li><li><p>Провести аудит: кеш, модули, layout, архитектура, DevOps.</p></li><li><p>Найти узкие места и критичные зависимости.</p></li><li><p>Выделить приоритеты по улучшениям и составить roadmap по рефакторингу.</p></li></ul> <a href="https://habr.com/ru/posts/1000388/?utm_campaign=1000388&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 17 Feb 2026 09:42:32 GMT</pubDate>
    <dc:creator><![CDATA[Dalee_group (Далее)]]></dc:creator>
      
      <category><![CDATA[magento]]></category><category><![CDATA[CMS]]></category><category><![CDATA[cms разработка]]></category><category><![CDATA[e-commerce]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[интернет-магазин]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @rurikovich — Java — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/996012/</guid>
    <link>https://habr.com/ru/posts/996012/?utm_campaign=996012&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Разбираемся как принимать звонки в браузере. Основы WebRTC\SIP\</strong>RTP.</p><p>Во многих коммуникационных продуктах возникает потребность работы с голосом. В этой серии постов разберемся как организовать прием звонков непосредственно из вашего web приложения. Какие есть варианты передачи звукового потока и какая может быть архитектура backend приложения, обеспечивающего его работу.</p><p>Начнем с самой простой в реализации схемы, в которой передача голоса осуществляется напрямую между браузером пользователя, открывшего ваше web приложение и серверами провайдера "виртуальной телефонии"(aka "виртуальная атс" ).<br>При этом вся мета информация о поступившем входящем звонке и событиях всего жизненного цикла звонка принимает ваш backend. У разных провайдеров телефонии набор событий и строения api может отличаться, но общая схема работы схожа.</p><p>Разберем основную схему организации передачи голоса. Браузер по сути работает как SIP‑телефон: сигнализация через WebSocket, медиа — по RTP.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/22a/292/3db/22a2923db755023444002a474be79336.png" alt="Упрощенно схему работы WebRTC/SIP можно разделить на &quot;регистрацию&quot;, &quot;звонок&quot; и &quot;завершение&quot;:" title="Упрощенно схему работы WebRTC/SIP можно разделить на &quot;регистрацию&quot;, &quot;звонок&quot; и &quot;завершение&quot;:" width="2816" height="1536"><div><figcaption>Упрощенно схему работы WebRTC/SIP можно разделить на "регистрацию", "звонок" и "завершение":</figcaption></div></figure><p>1. Регистрация в сети</p><ul><li><p>Оператор открывает страницу&nbsp;в браузере.</p></li><li><p>Браузер отправляет SIP REGISTER на SIP‑сервер (WebSocket/TLS).</p></li><li><p>SIP‑сервер&nbsp;отвечает 200 OK.</p></li><li><p>В интерфейсе показывается «Вы в сети» — оператор готов к звонкам.</p></li></ul><p>2. Звонок</p><ul><li><p>SIP‑сервер отправляет&nbsp;SIP INVITE в браузер.</p></li><li><p>Браузер показывает уведомление&nbsp;«Входящий».</p></li><li><p>Оператор нажимает «Принять».</p></li><li><p>Браузер&nbsp;запрашивает доступ к микрофону&nbsp;(getUserMedia) — внутреннее действие.</p></li><li><p>Браузер отправляет SIP 200 OK + SDP на SIP‑сервер.</p></li><li><p>SIP‑сервер отправляет SIP ACK в браузер.</p></li><li><p>SIP‑сервер даёт команду&nbsp;RTP/SRTP‑шлюзу установить медиа‑сессию.</p></li><li><p>Медиа (RTP/SRTP по UDP) передаётся между браузером и RTP‑шлюзом.</p></li><li><p>Начинается разговор.</p></li></ul><p>3. Завершение звонка</p><ul><li><p>Оператор&nbsp;нажимает «Завершить».</p></li><li><p>Браузер отправляет SIP BYE на SIP‑сервер.</p></li><li><p>SIP‑сервер отвечает 200 OK.</p></li><li><p>Передача RTP/SRTP прекращается.</p></li></ul><p>Если тема будет интересна, то далее обсудим схему работы backend'а и варианты развития общей схемы передачи голоса с плюсами, минусами и ограничениями.<br><br>В  своем&nbsp;<a href="https://t.me/+VvEl_EKGE1w0ODMy" rel="noopener noreferrer nofollow">канале в Telegram</a> и <a href="https://max.ru/join/3g33rHRy936aspuXPILwvsfk7x6b4GUjqmW5hWVww_8" rel="noopener noreferrer nofollow">канале в Max</a> о разработке в стартапах рассказываю еще больше интересного и делюсь опытом, заходите, буду рад!</p><p>Спокойных вам релизов и захватывающих решений !</p> <a href="https://habr.com/ru/posts/996012/?utm_campaign=996012&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 15 Feb 2026 20:43:03 GMT</pubDate>
    <dc:creator><![CDATA[rurikovich]]></dc:creator>
      
      <category><![CDATA[Webrtc]]></category><category><![CDATA[websockets]]></category><category><![CDATA[udp]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[голос]]></category><category><![CDATA[проектирование]]></category><category><![CDATA[system-design]]></category><category><![CDATA[sip-телефония]]></category><category><![CDATA[rtp]]></category><category><![CDATA[атс]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AndPronin — Веб-разработка — 15.02.2026 18:50]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/996794/</guid>
    <link>https://habr.com/ru/posts/996794/?utm_campaign=996794&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>В чём подвох пожизненной гарантии на сайт</strong></p><p><br>Просматривая сайты коллег по опасному бизнесу сайтостроения иногда натыкаюсь на термин «пожизненная гарантия на сайт» и становится дико смешно от этого.</p><p>Вообще, сайт сам по себе не ломается. Это или баг, который не нашли при разработке, или влияние внешних сил:</p><ol><li><p>Поменялось API у системы, с которой сайт интегрирован. Гугл почта включила режим паранойя, ЯндексКарты формат запроса, чат гопоты стал хотеть другой прокси-сервер.<br> И сайт уже работает не так, как задумывалось.</p></li><li><p>Мамкины хакеры поломали. Если во-время обновлять версии безопасности, сайты вполне могут страдать. </p></li><li><p>Полозушные руки чужих разработчиков ковырялись в коде. Если нет резервных копий или нельзя откатиться по версиям — это печаль.</p></li><li><p>Проблема с сервером. Закончилось место на диске, не хватает вычислительной мощности,  набежали боты,  DDoS-атака </p></li><li><p>Некорректное отображение в версиях браузеров, вышедших после создания сайта. Это бывает редко, однако возможно, что сайт по прошествии нескольких лет может перестать правильно отображаться в браузерах. Браузеры (Гугл Хром, Опера и другие) постоянно совершенствуются, меняются, перестают поддерживать какие-то устаревшие функции и стандарты.</p></li></ol><p>И это всё  гарантию никто не включает. Оно и понятно. Предсказать их влияние невозможно, а чинить проблему может быть трудозатратно.</p><p>А «пожизненная гарантия» распространяется только на случай, если в процессе эксплуатации сайта будут выявлены ошибки, связанные с разработкой, компания бесплатно исправит их.</p><p><code>ИТОГО. Пожизненная гарантия — полная туфта.</code></p><p>Не играйте в эти игры. Лучше честно сделать договор на техподдержку, где указаны форсмажоры.</p><p>Мой&nbsp;<a href="https://t.me/TeamPronin" rel="noopener noreferrer nofollow">тг-канал</a>&nbsp;— Факапы, инсайты, проблемы, взаимоотношения,  клиенты, немного юмора.</p> <a href="https://habr.com/ru/posts/996794/?utm_campaign=996794&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 15 Feb 2026 15:50:45 GMT</pubDate>
    <dc:creator><![CDATA[AndPronin]]></dc:creator>
      
      <category><![CDATA[сайты]]></category><category><![CDATA[заказ сайта]]></category><category><![CDATA[гарантия на сайт]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 11.02.2026 23:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/995568/</guid>
    <link>https://habr.com/ru/posts/995568/?utm_campaign=995568&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Спустя почти год работы мой PR приняли в ядро Joomla!</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/97d/468/c4f/97d468c4f8357a3e7d6fc3c98cb85768.jpg" width="1013" height="1351"></figure><p>[<em>Тут должна быть победная пляска</em>] Год назад у моих клиентов возникла необходимость во вставке видео в кастомные поля материалов в раздел портфолио. Я начал делать и увидел, что именно стандартное пользовательское поле Media не умеет вставлять в поле ничего, кроме изображений, хотя поле Joomla Form <code>MediaField </code> умеет выбирать и документы (pdf и иже), аудио, видео и даже папки. Я начал работу над тем, чтобы добавить этот функционал&nbsp; в ядро и очень надеялся успеть к Joomla 5.3, которая выходила в апреле. В целом все сделал, сделал PR 25 февраля 2025 года, но PR не приняли, сказав, что это шибко новый функционал и ему будет хорошо в Joomla 6.0.0. Клиентам пришлось использовать&nbsp; медиа-менеджер от JCE, а PR отправился ждать релиза 6.0.0, который выходил осенью. К слову сказать, эта пауза была полезна для него, так как летом, уже неспешно я получал советы по улучшению и в июле всё точно было готово.</p><p>Релизный цикл Joomla состоит из нескольких этапов: сначала выходят alpha-версии (до 3х штук), где просто фиксируются накопленные изменения, потом beta, где наступает feature freeze - заморозка новых функций, их нельзя уже добавлять. Дальше только отладка и правки&nbsp; существующих новшеств. У каждого релиза есть 2 релиз-менеджера.</p><p>В работе над PR мне помогал все это время Брайан Тиман - ко-фаундер Joomla. К концу июля все было готово, проверено, PR имел 2 необходимых независимых теста. Ждём беты. </p><p>Дата беты приходилась на понедельник. Где-то в пятницу днём я отписался в PR и получил совет написать релиз+менеджерам. Как-то удалось найти их в Mattermost, где обитает международное сообщество, но пятница и выходные, а все ж волонтеры и не на зарплате... Моё сообщение прочитали после релиза беты... Сказали, что не были в курсе моего PR (ожидаемо, их около 200-250 все время открытых). И сказали, что поезд ушёл, хоть и so sorry. Зато будет хорошо увидеть PR на тестах в Pizza, Bugz and Fun и вообще welcome в 6.1. </p><p>После выхода 6.0.0 меняются релиз-менеджеры. Мы списались: да, все хорошо, но нужно кое-что подправить. Тут конец года и закрытие дедлайнов, потом Новый год и весь январь никто толком не работает. Beta для 6.1 выходит 17 февраля. Последняя alpha&nbsp; недели за 3 до этого.</p><p>Незадолго до выхода альфы я-таки получаю сообщение, что реализуемый функционал сделан не по "Joomla way" и если код в ядре, то этот код является учебным пособием по тому, как ядро использовать. Резонно. А ещё у релиз-менеджера есть собственные наработки и экспертиза в этой теме и свой медиа-менеджер, в котором он тоже прошел огонь, воду и медные трубы. Согласно Joomla way мне нужно было разделить одно мега-крутое поле на 4 отдельных (картинки, аудио, видео и документы). Я подумал, что требуется сделать 4 плагина вместо одного и сказал, что не успею. Мне ответили, что beta is more important for us и время ещё есть, что мне подскажут и 4 плагина делать не нужно. </p><p>Пока суть да дело - время идёт. У меня тоже работа, трое детей, карантины, уроки... Но добить этот PR уже стало делом принципа. Я&nbsp; нашел как нужно было делать, принял несколько правок и пожеланий, потом фиксы code style. Сегодня с утра был последний коммит. Сегодня вечером, 11 февраля 2026 года, PR наконец-то смержен в ядро Joomla.</p><p>Эта работа научила меня очень многому. 170 комментариев в conversation на GitHub, несколько отдельных переписок, 1 год на разработку и внедрение простой в целом фичи, "звоночек" в голове: "не забыть, успеть, сделать, найти"... </p><p>Сегодня я поднимаю кружку пенного за этот небольшой&nbsp; в целом PR, за этот прошедший год, за Joomla и за Open Source.</p><p><a href="https://github.com/joomla/joomla-cms/pull/45013" rel="noopener noreferrer nofollow">https://github.com/joomla/joomla-cms/pull/45013</a></p><p>#joomla #cms #opensource #community #webdev</p><p>P.S. Фото с пивом сюда выставлять не буду, но представьте, что оно тут есть.</p> <a href="https://habr.com/ru/posts/995568/?utm_campaign=995568&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 11 Feb 2026 20:07:56 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[Joomla]]></category><category><![CDATA[community]]></category><category><![CDATA[github]]></category><category><![CDATA[open source]]></category><category><![CDATA[жизнь]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @runity — Блог компании Рунити (+2) — 10.02.2026 10:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/runity/posts/994736/</guid>
    <link>https://habr.com/ru/companies/runity/posts/994736/?utm_campaign=994736&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>ИИ в техподдержке SpaceWeb решает каждый четвертый запрос</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/2c8/ea6/a99/2c8ea6a996711d55090c9ec0387c80a5.png" width="1920" height="1080"></figure><p>В SpaceWeb ИИ-ассистент стал полноценным инструментом для работы с запросами веб-разработчиков. Сегодня нейросеть полностью закрывает 23,5% обращений пользователей, а ещё в 64% случаев помогает специалистам поддержки формировать ответы.</p><p>ИИ берет на себя типовые задачи, с которыми разработчики сталкиваются при запуске и сопровождении сайтов: подключение доменов и SSL, установка CMS, настройка почты, работа в панели управления. Среднее время ответа — около 30 секунд вместо 10–15 минут у человека. В месяц бот самостоятельно обрабатывает более 1200 запросов.</p><p>За счет этого нагрузка на сотрудников поддержки снизилась на 9,5%, а эксперты смогли сосредоточиться на сложных и нестандартных кейсах. Для дообучения модели используется обратная связь от пользователей — ответы ИИ можно оценивать лайками.</p><p>Как именно устроена работа ИИ-ассистента, какие сценарии он закрывает уже сейчас и зачем SpaceWeb внедрял нейросеть в поддержку — <a href="https://sweb.ru/news/?type=news&amp;utm_source=habr&amp;utm_medium=post&amp;utm_campaign=ai" rel="noopener noreferrer nofollow">читайте на сайте.</a></p> <a href="https://habr.com/ru/posts/994736/?utm_campaign=994736&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 10 Feb 2026 07:08:48 GMT</pubDate>
    <dc:creator><![CDATA[runity (Рунити)]]></dc:creator>
      
      <category><![CDATA[spaceweb]]></category><category><![CDATA[ai]]></category><category><![CDATA[ai agent]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[разработка]]></category><category><![CDATA[разработка сайтов]]></category><category><![CDATA[поддержка]]></category><category><![CDATA[поддержка пользователей]]></category><category><![CDATA[поддержка клиентов]]></category><category><![CDATA[ssl]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Веб-разработка (+3) — 02.02.2026 12:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991740/</guid>
    <link>https://habr.com/ru/posts/991740/?utm_campaign=991740&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/omodaka9375/peerweb" rel="noopener noreferrer nofollow">Представлен</a> открытый проект <a href="https://peerweb.lol/" rel="noopener noreferrer nofollow">PeerWeb</a>&nbsp;— децентрализованного веб‑хостинга на&nbsp;базе WebTorrent. Решение обеспечивает децентрализованный, устойчивый к&nbsp;цензуре веб‑хостинг через пиринговые сети. «Загружайте свои статические веб‑сайты и делитесь ими по&nbsp;всему миру, не&nbsp;полагаясь на&nbsp;централизованные серверы и не&nbsp;оплачивая хостинг»,&nbsp;— пояснили авторы решения.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/ff5/6b3/307/ff56b3307cab675724b5a3bfee06c7d4.png" width="1176" height="1115"></figure> <a href="https://habr.com/ru/posts/991740/?utm_campaign=991740&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 02 Feb 2026 09:11:45 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[PeerWeb]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Веб-дизайн (+4) — 31.01.2026 08:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991230/</guid>
    <link>https://habr.com/ru/posts/991230/?utm_campaign=991230&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Проект <a href="https://http.cat/" rel="noopener noreferrer nofollow">HTTP Cats</a> (<a href="https://github.com/httpcats/http.cat" rel="noopener noreferrer nofollow">GitHub</a>) позволяет использовать котиков в разных ситуациях для объяснения сетевых ошибок и проблем в работе веб-систем. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3a0/53b/e7c/3a053be7c2aa83b3b84be8212350a91a.jpg" width="1726" height="840"></figure> <a href="https://habr.com/ru/posts/991230/?utm_campaign=991230&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 31 Jan 2026 05:37:52 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[HTTP Cats]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @TrexSelectel — Блог компании Selectel (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/987972/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/987972/?utm_campaign=987972&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Selectel открыл первую часть курса по JavaScript</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/fe6/df0/d1a/fe6df0d1a293cd6a21974efc66c0e63a.jpg" width="2688" height="1296"></figure><p>Привет, Хабр! Новичкам бывает трудно сделать первый шаг в программировании. В интернете много сомнительных курсов, а качественные требуют финансовых вложений и несколько месяцев на изучение. </p><p>Мы в Selectel подготовили <a href="https://study.selectel.ru/javascript_course/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=course_post_javascript_260126_content" rel="noopener noreferrer nofollow">бесплатный курс</a>, который поможет быстро и без лишних затрат изучить основы JavaScript. В первую часть входят три модуля. Вы узнаете:&nbsp;</p><ul><li><p>для чего разработчики используют JavaScript,</p></li><li><p>как работать с со скриптами, веб-страницами и переменными,</p></li><li><p>как создать рабочее окружение на IT-инфраструктуре Selectel.</p></li></ul><p>Участники курса смогут бесплатно протестировать сервисы Selectel, а по итогам тестирования — получить сертификат о прохождении.&nbsp;</p><p><a href="https://study.selectel.ru/javascript_course/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=course_post_javascript_260126_content" rel="noopener noreferrer nofollow">Начните изучение курса прямо сейчас →&nbsp;</a></p> <a href="https://habr.com/ru/posts/987972/?utm_campaign=987972&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 29 Jan 2026 09:00:38 GMT</pubDate>
    <dc:creator><![CDATA[TrexSelectel (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[веб-разработка]]></category><category><![CDATA[javascript]]></category><category><![CDATA[курс]]></category><category><![CDATA[онлайн-курсы]]></category><category><![CDATA[программирование]]></category><category><![CDATA[обучение]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 29.01.2026 08:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990436/</guid>
    <link>https://habr.com/ru/posts/990436/?utm_campaign=990436&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Событие Pizza, Bugs &amp; Fun  - 29-30  января 2026 года.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/a40/1e9/8ae/a401e98ae67bfa1b04837bb53a38294a.png" width="1280" height="670"></figure><p>Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs &amp; Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.</p><p>Ссылки на видео и статьи из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF, а так же что и как делать. Координация международного сообщества Joomla происходит в Mattermost (<a href="https://docs.joomla.org/Mattermost" rel="noopener noreferrer nofollow">присоединиться</a>).</p><p>В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.</p><p>Каждый помогает тем, что он умеет:</p><ul><li><p>кто-то пишет недостающую документацию,</p></li><li><p>кто-то пишет код,</p></li><li><p>кто-то тестирует как исправлены ошибки или сделан новый функционал.</p></li></ul><p>На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.</p><p>На момент написания данного поста в репозитории Joomla 810 открытых Issue (как правило это баги) и 236 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.</p><p>Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀 И ничего не останется нашим коллегам из международных Joomla-чатов.</p><ul><li><p><a href="https://www.youtube.com/watch?v=a-FuVKXg_Uw" rel="noopener noreferrer nofollow">Смотреть видео</a></p></li><li><p><a href="https://www.pizza-bugs-fun.com/en/" rel="noopener noreferrer nofollow">Сайт события</a></p></li><li><p><a href="https://web-tolk.ru/blog/joomla-kak-testirovat-vsego-8-minut" rel="noopener noreferrer nofollow">Joomla: как тестировать? Всего 8 минут.</a></p></li><li><p><a href="https://habr.com/ru/posts/980678/" rel="noopener noreferrer nofollow">Как тестировать Joomla PHP-разработчику? Компонент Patch tester.</a>  (кстати, не только PHP разработчику)</p></li></ul><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскояызчного Joomla-сообщества</a></p> <a href="https://habr.com/ru/posts/990436/?utm_campaign=990436&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 29 Jan 2026 05:51:28 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[pbf]]></category><category><![CDATA[pizza bugs and fun]]></category><category><![CDATA[community]]></category><category><![CDATA[сообщество]]></category><category><![CDATA[тестирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ArturGukasov — Веб-разработка (+4) — 27.01.2026 17:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/989612/</guid>
    <link>https://habr.com/ru/posts/989612/?utm_campaign=989612&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Пост о наболевшем. Clawd и как же им пользоваться.</strong></p><p>В общем два дня уже потратил на то чтобы развернуть Clawd bot, естественно в бесплатном формате, по началу шло все хорошо, развернул бота на локальном компе Linux Mint 22.2, создал бота в Телеграмме, привязал к нему Clawdbot. </p><p>Так как у clawd нет своей нейронки, ему нужно прикрутить свои мозги. Сначала запросил API ключ в Gemini. Обычная модель, даже самая простая не запускалась. Затем тыкнул в Google Antigravity, который как оказалось имитирует думающую модель Claude 4.5 пуская один и тот же запрос в себя по кругу. Эта штука быстро отвалилось, но успел немного поразвлекаться с ней. </p><p>Перебрал половину представленных в списке Clawd моделей, например тот же Deepseek дает API только разработчикам, но в него можно получить доступ через такие сервисы (из списка Clawd), как Openrouter. Openrouter в свою очередь выдал ключ, но выбирая из списка модели, даже с пометкой free ничего не взлетало. На этом я уже устал если честно, поэтому обращаюсь к хабру, дабы развернуть актуальную дискусиию, может накидаете вариантов решения или альтернатив Clawd, а то уж очень захотелось поиграть в агента.<br></p><p>Успел спросить у него, с мозгом Google Antigravity, что он может:</p><blockquote><p>🔧 Код и файлы<br> — Читать, писать, редактировать код и документы<br> — Запускать команды в терминале, работать с git</p><p>🌐 Интернет<br> — Искать в вебе, парсить страницы<br> — Управлять браузером (автоматизация, скрейпинг)</p><p>📅 Организация<br> — Напоминания и cron-задачи<br> — Вести заметки, память между сессиями</p><p>💬 Коммуникация<br> — Telegram (вот тут и сидим), можно подключить другие каналы<br> — Могу отправлять сообщения, реагировать</p><p>🏠 Умный дом / устройства<br> — Если подключишь ноды — камеры, уведомления на телефон</p><p>🤖 Сложные задачи<br> — Могу запускать саб-агентов на длинные задачи в фоне</p><p>По сути — твой персональный ассистент-разработчик, который живёт в терминале и мессенджерах.</p></blockquote><p>И соответсвенно мой список вопросов:<br>Стоит ли брать платную модель? И какую брать если, уж брать?<br>Насколько я понимаю штука супер небезопасная, а если запускать из песочницы, то все равно прийдется давать какие-то доступы?<br>Какие есть альтернативы? Уж очень понравился способ взаимодействия через ТГ<br></p> <a href="https://habr.com/ru/posts/989612/?utm_campaign=989612&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 27 Jan 2026 14:07:07 GMT</pubDate>
    <dc:creator><![CDATA[ArturGukasov]]></dc:creator>
      
      <category><![CDATA[вайб-кодинг]]></category><category><![CDATA[вайбкодинг]]></category><category><![CDATA[вайб-программирование]]></category><category><![CDATA[вайб-код]]></category><category><![CDATA[ии]]></category><category><![CDATA[ии-агенты]]></category><category><![CDATA[ии и машинное обучение]]></category><category><![CDATA[ии-ассистент]]></category><category><![CDATA[ии чат-бот]]></category><category><![CDATA[clawdbot]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Обработка изображений (+3) — 26.01.2026 09:49]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988930/</guid>
    <link>https://habr.com/ru/posts/988930/?utm_campaign=988930&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/steffest/DPaint-js" rel="noopener noreferrer nofollow">Представлен</a> открытый веб-редактор изображений <a href="https://www.stef.be/dpaint/" rel="noopener noreferrer nofollow">DPaint.js</a> (онлайн-версия) на JavaScript, созданный по образцу легендарного Deluxe Paint, с упором на ретро-форматы файлов Amiga. Помимо современных форматов изображений, DPaint.js может читать и записывать файлы иконок Amiga и изображения IFF ILBM.</p><p>Основные возможности проекта: слои, выделение, маскирование, инструменты трансформации, эффекты и фильтры, множественная отмена/повтор действий, копирование/вставка из любой другой программы обработки изображений или источника изображений, настраиваемые инструменты дизеринга и циклическая смена цветов.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/17a/4a7/9df/17a4a79dffe1dc6bd4140185ba21f6e0.png" width="692" height="822"></figure> <a href="https://habr.com/ru/posts/988930/?utm_campaign=988930&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 06:49:47 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[DPaint.js]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlekseyVY — Angular (+3) — 25.01.2026 22:01]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988838/</guid>
    <link>https://habr.com/ru/posts/988838/?utm_campaign=988838&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Коллеги привет, искал себе решение как реагировать на изменения в объекте и нашел отличный сервис, который используется внутри директив таких как NgClass и NgStyle.</p><p>KeyValueDiffers позволяет создать KeyValueDiffer для сравнения изменений текущих пар ключ-значение с новыми. Если вы используете иммутабельные объекты, то можно просто обернуть все в эффект, ну а если вы наследники крутого легаси, где все объекты мутируются по ссылке, тогда проверку нужно вешать в DoCheck, чтобы реагировать на  каждый тик change detection. </p><p>Накидал оба примера, чтобы поделиться с вами: </p><p>Иммутабельный с effect:</p><pre><code class="typescript">
@Component({
  selector: 'app-test',
  template: ''
})
export class TestComponent {
  public state = input.required&lt;Record&lt;string, string | number&gt;&gt;();
  
  private differs = inject(KeyValueDiffers);
  private differ: KeyValueDiffer&lt;string, string | number&gt; | undefined;

  constructor() {
    effect(() =&gt; {
      const currentState = this.state();
      
      // создаем диффер, если он еще не создан
      if (!this.differ) {
        this.differ = this.differs.find(currentState).create();
      }

      // Эффект будет перезапускаться при изменении инпут-сигнала.
      const changes = this.differ.diff(currentState);

      // только если есть изменения
      if (changes) {
        changes.forEachAddedItem((record) =&gt; {
          console.log(`В объект добавлена запись: Ключ: ${record.key} | Значение: ${record.currentValue}`)
        });

        changes.forEachChangedItem((record) =&gt; {
          console.log(`Изменено: ${record.key} | Новое значение: ${record.currentValue}`)
        });

        changes.forEachRemovedItem((record) =&gt; {
          console.log(`Удалено: ${record.key}`)
        });
        
        // Остальные методы forEachItem и forEachPreviousItem по необходимости
      }
    })
  }
}
</code></pre><p>Легаси подход, которого, надеюсь, ни у кого нет, но на всякий случай :) </p><pre><code class="typescript">@Component({
  selector: 'app-legacy',
  template: ''
})
export class LegacyComponent implements OnInit, DoCheck {
  @Input({ required: true }) state!: Record&lt;string, string | number&gt;;
  
  private differs = inject(KeyValueDiffers);
  private differ: KeyValueDiffer&lt;string, string | number&gt; | undefined;

  ngOnInit() {
    // Создаем диффер при инициализации
    this.differ = this.differs.find(this.state).create();
  }

  // Запускается на каждый тик change detection, так как мутации по-другому не отследим.
  ngDoCheck(): void {
    const changes = this.differ?.diff(this.state);

    if (changes) {
      changes.forEachAddedItem((record) =&gt; {
        console.log(`В объект добавлена запись: Ключ: ${record.key} | Значение: ${record.currentValue}`)
      });

      changes.forEachChangedItem((record) =&gt; {
        console.log(`Значение изменилось: ${record.key}`)
      });

      changes.forEachRemovedItem((record) =&gt; {
        console.log(`Запись удалена: ${record.key}`)
      });

      // Остальные методы forEachItem и forEachPreviousItem по необходимости
    }
  }
}
</code></pre> <a href="https://habr.com/ru/posts/988838/?utm_campaign=988838&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 25 Jan 2026 19:01:01 GMT</pubDate>
    <dc:creator><![CDATA[AlekseyVY]]></dc:creator>
      
      <category><![CDATA[angular]]></category><category><![CDATA[KeyValueDiffers]]></category><category><![CDATA[signals]]></category><category><![CDATA[change detection]]></category><category><![CDATA[ngDoCheck]]></category><category><![CDATA[perfomance]]></category><category><![CDATA[effect]]></category><category><![CDATA[mutability]]></category><category><![CDATA[typescript]]></category><category><![CDATA[frontend development]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @shanker — Информационная безопасность (+2) — 23.01.2026 17:32]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988350/</guid>
    <link>https://habr.com/ru/posts/988350/?utm_campaign=988350&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Онлайн сервис проверки конфига nginx на безопасность (Gixy-Next)</strong></p><p>На Хабре уже упоминался Gixy как средство проверки безопасности\хардеринга nginx (статья <a href="https://habr.com/ru/articles/966914/" rel="noopener noreferrer nofollow">раз</a>, статья <a href="https://habr.com/ru/companies/yandex/articles/327590/" rel="noopener noreferrer nofollow">два</a>). Недавно появился ещё один проект, основанный на форке Gixy: Gixy-Next (<a href="https://github.com/MegaManSec/Gixy-Next/" rel="noopener noreferrer nofollow">репозиторий</a>, <a href="https://gixy.io/scanner/" rel="noopener noreferrer nofollow">сайт проекта</a>). Из интересного: прямо на сайте есть <a href="https://gixy.io/scanner/" rel="noopener noreferrer nofollow">возможность проверить конфиг nginx</a> (если по какой-то причине не хочется устанавливать приложение). В тексте найденных проблем - ссылки на страницы с подробным описанием типа ошибки.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3e5/151/611/3e515161145d77f1af669c0dc0a7d2fd.png" alt="Результат проверки конфига" title="Результат проверки конфига" width="1772" height="1518"><div><figcaption>Результат проверки конфига</figcaption></div></figure> <a href="https://habr.com/ru/posts/988350/?utm_campaign=988350&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 23 Jan 2026 14:32:38 GMT</pubDate>
    <dc:creator><![CDATA[shanker]]></dc:creator>
      
      <category><![CDATA[gixy]]></category><category><![CDATA[gixy-next]]></category><category><![CDATA[hardering]]></category><category><![CDATA[sast]]></category><category><![CDATA[статические анализаторы кода]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlekseyVY — Angular (+2) — 11.01.2026 13:48]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/984154/</guid>
    <link>https://habr.com/ru/posts/984154/?utm_campaign=984154&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Решил сегодня почитать, что пишут в Ангуляр комьюнити Хабра, и увидел сильно популярный <a href="https://habr.com/ru/companies/ruvds/articles/967016/" rel="noopener noreferrer nofollow">пост </a>с аж 51 лайком и 71 закладкой.<br><br>Начал читать и был удивлен примерами. Автор с уверенностью говорит, как писать на Ангуляр грамотно, и при этом приводит плохие практики в качестве примеров. Я дошел до примера с RxJS, который меня немного триггернул.</p><p>Не буду разбирать все кейсы указанные в данном посте, покажу лишь самый плохой пример который меня немного тригернул:</p><p>Автор условно говорит, что у нас есть плохой пример использования:</p><pre><code class="typescript">this.http.get('/api/data').subscribe((data) =&gt;; {
  this.data = data; // Что если запрос не вернётся?
});</code></pre><p>и затем приводит хороший пример с сигналами и RxJs:</p><pre><code class="typescript">readonly data = signal([]);
readonly error = signal(null);

loadData() {
  this.http.get('/api/data').pipe(
    tap(() =&gt;; this.error.set(null)), // Сбрасываем предыдущую ошибку перед загрузкой
    catchError((err) =&gt;; {
      this.error.set('Не удалось загрузить данные');
      return of([]); // Возвращаем пустой массив, чтобы поток не прерывался
    })
  ).subscribe((result) =&gt;; {
    this.data.set(result);
  });
}</code></pre><p>я даже не буду указывать на количество антипатернов и плохих практик в данном примере, я просто покажу правильный пример с сигналами и RxJs:</p><pre><code class="typescript">interface State&lt;T = object&gt; {
  data: T[];
  error: string | null;
}

@Component({...})
export class BestRxJs {
  private http = inject(HttpClient);
  private loadDataAction$ = new Subject&lt;void&gt;();

  private state$ = this.loadDataAction$.pipe(
    switchMap(() =&gt; 
      this.http.get&lt;State[]&gt;('/api/data').pipe(
        map((result) =&gt; ({ data: result, error: null })),
        catchError(() =&gt; of({ data: [], error: 'Не удалось загрузить данные' })),
        startWith({ data: [], error: null })
      )
    ),
    shareReplay({ bufferSize: 1, refCount: true })
  );

  readonly private state = toSignal(this.state$, {
    initialValue: { data: [], error: null } 
  });

  readonly protected data = computed(() =&gt; this.state().data);
  readonly protected error = computed(() =&gt; this.state().error);

  protected loadData(): void {
    this.loadDataAction$.next();
  }
}</code></pre><p>Этот пост для новичков, которые, начитавшись популярных статей, могут начать применять вредные практики. </p> <a href="https://habr.com/ru/posts/984154/?utm_campaign=984154&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 11 Jan 2026 10:48:59 GMT</pubDate>
    <dc:creator><![CDATA[AlekseyVY]]></dc:creator>
      
      <category><![CDATA[angular]]></category><category><![CDATA[rxjs]]></category><category><![CDATA[typescript]]></category><category><![CDATA[javascript]]></category><category><![CDATA[best practices]]></category><category><![CDATA[clean code]]></category><category><![CDATA[рефакторинг]]></category><category><![CDATA[веб разработка]]></category><category><![CDATA[паттерны]]></category><category><![CDATA[архитектура]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlekseyVY — Angular (+2) — 08.01.2026 14:51]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/983604/</guid>
    <link>https://habr.com/ru/posts/983604/?utm_campaign=983604&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Почему стоит использовать&nbsp;protected&nbsp;в Angular компонентах?</p><p>Если вы используете в своих компонентах только&nbsp;public&nbsp;и&nbsp;private, вы упускаете возможность сделать архитектуру чище. Я предлагаю четко разделять ответственность членов класса.</p><p>Часто мы по инерции делаем&nbsp;public&nbsp;любые методы и свойства, которые нужны в шаблоне (HTML). Но&nbsp;public&nbsp;в TypeScript означает, что это публичный API&nbsp;компонента - к этим методам может получить доступ любой родительский компонент через&nbsp;@ViewChild.</p><p>Почему стоит использовать&nbsp;protected:</p><p>1. Явное намерение:&nbsp;protected&nbsp;сигнализирует, что метод предназначен для использования внутри класса или в его шаблоне, но&nbsp;не должен вызываться извне.</p><p>2. Защита от регрессии:&nbsp;Если другой разработчик попытается вызвать такой метод через&nbsp;@ViewChild, TypeScript выдаст ошибку. Это заставит его задуматься: «Действительно ли мне нужно делать этот метод публичным?» или «Может, стоит создать отдельный метод для API?».</p><p>3. Читаемость:&nbsp;Открывая код, вы сразу видите:&nbsp;public&nbsp;- для внешнего мира, protected&nbsp;- для шаблона,&nbsp;private&nbsp;- для внутренней логики сервисов и подписок.</p><p>Разделяйте Public API и внутреннюю логику шаблона - ваш код станет надежнее и понятнее.</p><pre><code class="typescript">@Component({
  selector: 'app-user-profile',
  template: `
    &lt;!-- В шаблоне мы без проблем обращаемся к protected свойствам --&gt;
    &lt;div class="card"&gt;
      &lt;h3&gt;{{ userName() }}&lt;/h3&gt;
      &lt;button (click)="onUpdateClick()"&gt;Обновить&lt;/button&gt;
        @if(isLoading()) {
          &lt;div&gt;Загрузка...&lt;/div&gt;
        }
    &lt;/div&gt;
  `
})
export class UserProfileComponent {
  // PRIVATE: Внутренняя логика. 
  // Не доступно ни в шаблоне, ни родительскому компоненту.
  private _userId = 123;

  // PROTECTED: Доступно только внутри класса и в ШАБЛОНЕ.
  // Идеально для переменных состояния UI и обработчиков событий.
  protected userName = signal('Алексей');
  protected isLoading = signal(false);

  protected onUpdateClick(): void {
    this.logAction();
    console.log('Кнопку нажали в шаблоне');
  }

  // PUBLIC: Публичный API компонента.
  // Только эти методы мы разрешаем вызывать родительскому компоненту.
  public resetState(): void {
    this.userName.set('Гость');
    this.isLoading.set(false);
  }

  private logAction(): void {
    console.log(`Action logged for userId: ${this._userId}`);
  }
}</code></pre> <a href="https://habr.com/ru/posts/983604/?utm_campaign=983604&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 08 Jan 2026 11:51:38 GMT</pubDate>
    <dc:creator><![CDATA[AlekseyVY]]></dc:creator>
      
      <category><![CDATA[angular]]></category><category><![CDATA[typescript]]></category><category><![CDATA[frontend]]></category><category><![CDATA[clean code]]></category><category><![CDATA[best practices]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[инкапсуляция]]></category><category><![CDATA[рефакторинг]]></category><category><![CDATA[ооп]]></category><category><![CDATA[веб разработка]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Python (+4) — 31.12.2025 08:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/982072/</guid>
    <link>https://habr.com/ru/posts/982072/?utm_campaign=982072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/kalil0321/reverse-api-engineer" rel="noopener noreferrer nofollow">Представлен</a> открытый проект на&nbsp;Python под&nbsp;названием Reverse API engineer. Это консольный инструмент, который фиксирует трафик браузера и автоматически генерирует готовые к&nbsp;работе клиенты Python API. Больше никакого ручного реверс‑инжиниринга&nbsp;— просто просматривайте, записывайте и получайте чистый API‑код. </p><p>«Этот инструмент выполняет код локально, используя Claude Code‑ пожалуйста, следите за&nbsp;выводом/ На&nbsp;некоторых веб‑сайтах используется расширенная система обнаружения ботов, которая может ограничивать захват или&nbsp;требовать ручного взаимодействия»,&nbsp;— пояснил автор проекта.</p><p>Особенности Reverse API: </p><ul><li><p>автоматизация браузера: создан на базе Playground с режимом скрытности для реалистичного просмотра;</p></li><li><p>режим автономного агента: полностью автоматизированное взаимодействие с браузером с помощью агентов искусственного интеллекта (автоматический режим с MCP, использование браузера, stagehand);    </p></li><li><p>запись HAR: фиксирует весь сетевой трафик в архивном формате HTTP;    </p></li><li><p>генерация на основе искусственного интеллекта: использует Claude 4.5 для анализа трафика и генерации чистого кода на Python;    </p></li><li><p>поддержка нескольких SDK: встроенная интеграция с Claude и OpenCode SDK;    </p></li><li><p>интерактивный интерфейс командной строки: минималистичный интерфейс терминала с переключением режимов (Shift+Tab);    </p></li><li><p>готовность к работе: сгенерированные скрипты содержат обработку ошибок, подсказки по вводу текста и документацию;  </p></li><li><p>история сеансов: все запуски сохраняются локально с полными журналами сообщений;</p></li><li><p>отслеживание затрат: подробное использование токенов и оценка затрат с поддержкой кэширования.</p></li></ul><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d0d/8dc/19d/d0d8dc19d09474c27b48b72ad9b38553.gif" width="800" height="505"></figure> <a href="https://habr.com/ru/posts/982072/?utm_campaign=982072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 31 Dec 2025 05:33:16 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Reverse API]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 26.12.2025 08:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/980678/</guid>
    <link>https://habr.com/ru/posts/980678/?utm_campaign=980678&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как тестировать Joomla PHP-разработчику? Компонент Patch tester.</strong></p><p>Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать.</p><iframe id="694e22c51af3cf77e5703c83" src="https://embedd.srv.habr.com/iframe/694e22c51af3cf77e5703c83" class="embed_video embed__content" allowfullscreen="true"></iframe><p>На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla.</p><p>Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора.</p><p><a href="https://github.com/joomla-extensions/patchtester" rel="noopener noreferrer nofollow">Компонент на GitHub</a></p><p>Это видео также на:</p><ul><li><p><a href="https://www.youtube.com/watch?v=wIIV3RQxVBI" rel="noopener noreferrer nofollow">Видео на YouTube</a></p></li><li><p><a href="https://rutube.ru/video/fc3be7ceae76bb8ebf501d7ee9fc29a7/" rel="noopener noreferrer nofollow">Видео на RuTube</a></p></li></ul><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскоязычного Joomla-сообщества</a></p><p>#joomla #php #webdev #community</p> <a href="https://habr.com/ru/posts/980678/?utm_campaign=980678&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Dec 2025 05:53:41 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla patch tester]]></category><category><![CDATA[joomla test]]></category><category><![CDATA[joomla github]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[тестирование веб-приложений]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sergeytolkachyov — Joomla (+4) — 23.12.2025 14:11]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/979716/</guid>
    <link>https://habr.com/ru/posts/979716/?utm_campaign=979716&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>WT IndexNow плагин для Joomla - отправка страниц сайта на переиндексацию в поисковые системы.</strong></p><p>Пакет плагинов, обеспечивающий ручную и автоматическую отправку url адресов Joomla в поисковые системы на переиндексацию по протоколу IndexNow.</p><iframe id="694a77c9f90e6596c21f46f8" src="https://embedd.srv.habr.com/iframe/694a77c9f90e6596c21f46f8" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Согласно документации протокол поддерживают все крупнейшие поисковые системы, кроме Google. Протокол служит для получения от сайтов URL, которые нужно переиндексировать заново или проиндексировать в первый раз как можно быстрее. Отправка адресов сайта таким образом существенно ускорит индексацию нового или изменённого контента поисковыми системами.</p><p>Поисковые системы по этому протоколу обмениваются друг с другом данными, поэтому отправив URL в одну из них вы сообщаете их сразу всем.</p><p>Протокол IndexNow поддерживают:</p><ul><li><p>Amazon</p></li><li><p>Microsoft Bing</p></li><li><p>Naver</p></li><li><p>Seznam.cz</p></li><li><p>Yandex</p></li><li><p>Yep</p></li></ul><p>Суточный лимит URL - 10000 в сутки. Возможна отправка вручную и автоматически. Пакетом поддерживаются:</p><ul><li><p>материалы и категории материалов Joomla</p></li><li><p>контакты и категории контактов Joomla</p></li><li><p><a href="https://web-tolk.ru/dev/components/sw-jprojects" rel="noopener noreferrer nofollow">SW JProjects</a> - компонент каталога расширений для Joomla</p></li><li><p><a href="https://www.webdesigner-profi.de/joomla-webdesign/shop.html" rel="noopener noreferrer nofollow">JoomShopping</a> - компонент интернет-магазина для Joomla</p></li><li><p><a href="https://www.phoca.cz/phocadownload" rel="noopener noreferrer nofollow">Phoca Download</a> - компонент каталога файлоа для Joomla</p></li><li><p><a href="https://www.phoca.cz/phocacart" rel="noopener noreferrer nofollow">Phoca Cart</a> - компонент интернет-магазина для Joomla</p></li><li><p><a href="https://radicalmart.ru" rel="noopener noreferrer nofollow">RadicalMart</a> - компонент интернет-магазина для Joomla</p></li></ul><p>Разработчики могут по образу и подобию создать собственный плагин для поддержки необходимых компонентов.</p><p>Пакет плагинов работает с Joomla 4.3+. Тестировался на Joomla 5 и Joomla 6.</p><p>Ссылки:</p><p><a href="https://web-tolk.ru/dev/joomla-plugins/wt-indexnow" rel="noopener noreferrer nofollow">Страница расширения</a></p><p><a href="https://github.com/WebTolk/WT-Index-now-joomla-package" rel="noopener noreferrer nofollow">GitHub расширения</a></p><p><a href="https://yandex.ru/support/webmaster/ru/indexing-options/index-now" rel="noopener noreferrer nofollow">Раздел Поддержка протокола IndexNow в справке Яндекса</a></p><p><a href="https://t.me/joomlaru" rel="noopener noreferrer nofollow">Чат русскоязычного Joomla-сообщества</a></p> <a href="https://habr.com/ru/posts/979716/?utm_campaign=979716&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 23 Dec 2025 11:11:08 GMT</pubDate>
    <dc:creator><![CDATA[sergeytolkachyov]]></dc:creator>
      
      <category><![CDATA[joomla]]></category><category><![CDATA[joomla 6]]></category><category><![CDATA[joomla seo]]></category><category><![CDATA[joomla index now]]></category><category><![CDATA[index now]]></category><category><![CDATA[поисковые системы]]></category><category><![CDATA[индексация]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlekseyVY — Angular (+4) — 19.12.2025 23:17]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/978672/</guid>
    <link>https://habr.com/ru/posts/978672/?utm_campaign=978672&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Коллеги, всем привет!<br><br>За годы менторства по Angular (в том числе в HTML Academy) я заметил одну системную проблему: студенты и даже миддлы часто знают синтаксис <code>RxJS</code>, но не понимают реактивного мышления. В итоге мы получаем subscribe внутри subscribe и императивную лапшу.<br><br>Я искал интерактивные курсы, но большинство бесплатных ресурсов ограничиваются основами.<br><br>Курс бесплатный. Делал для себя и студентов, но теперь делюсь со всеми.</p><p>Буду рад фидбеку и баг-репортам (проект активно допиливаю).<br><br>Ссылка на курс: <a href="https://rxjs-course-avy.web.app/" rel="noopener noreferrer nofollow">https://rxjs-course-avy.web.app/</a>  </p> <a href="https://habr.com/ru/posts/978672/?utm_campaign=978672&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 19 Dec 2025 20:17:33 GMT</pubDate>
    <dc:creator><![CDATA[AlekseyVY]]></dc:creator>
      
      <category><![CDATA[RxJS]]></category><category><![CDATA[Angular]]></category><category><![CDATA[TypeScript]]></category><category><![CDATA[Reactive Programming]]></category><category><![CDATA[Frontend]]></category><category><![CDATA[Unit Testing]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Architecture]]></category><category><![CDATA[Design Patterns]]></category><category><![CDATA[Best Practices]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
