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

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

  <channel>
    <title><![CDATA[Все посты подряд / JavaScript / Хабр]]></title>
    <link>https://habr.com/ru/hubs/javascript/posts/</link>
    <description><![CDATA[JavaScript – прототипно-ориентированный язык программирования]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Thu, 30 Apr 2026 01:19:44 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[Пост @azTotMD — Игры и игровые консоли (+2) — 23.04.2026 23:20]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1027248/</guid>
    <link>https://habr.com/ru/posts/1027248/?utm_campaign=1027248&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/0fc/f53/855/0fcf5385568408d52832812a86d3d9ce.jpg" alt="Герое-подобная игра в браузере" title="Герое-подобная игра в браузере" width="955" height="661"><div><figcaption>Герое-подобная игра в браузере</figcaption></div></figure><p>Поскольку в голосовании в предыдущей <a href="https://habr.com/ru/articles/1016298/" rel="noopener noreferrer nofollow">статье </a>победил вариант с AI, сделал пока простенький его вариант.</p><p>Также теперь можно кликать два раза по гексу с противником, чтобы атаковать его (старый способ с выбором позиции атаки остался). Тачи поддерживаются.</p><p>На очереди: стрелки, летуны и статичные объекты.</p><p>Ссылки, чтоб потыкать: <a href="https://nheroes.netlify.app/" rel="noopener noreferrer nofollow">netlify</a>, <a href="https://titanplayers.itch.io/heroes" rel="noopener noreferrer nofollow">ITCH</a>.</p> <a href="https://habr.com/ru/posts/1027248/?utm_campaign=1027248&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 23 Apr 2026 20:20:16 GMT</pubDate>
    <dc:creator><![CDATA[azTotMD]]></dc:creator>
      
      <category><![CDATA[герои]]></category><category><![CDATA[герои 2]]></category><category><![CDATA[герои 3]]></category><category><![CDATA[heroes]]></category><category><![CDATA[heroes might and magic]]></category><category><![CDATA[стратегия]]></category><category><![CDATA[тактические игры]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @PechoraDev — PHP (+2) — 22.04.2026 20:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1026750/</guid>
    <link>https://habr.com/ru/posts/1026750/?utm_campaign=1026750&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Мультиязычность. Ад для разработчика. </strong></p><p>Сейчас для моего движка понадобилась мультиязычность. Ну как понадобилась - на гитхабе прозрачно намекнули, что негоже одной гордой cms для ведения блога быть сугубо на русском языке. </p><p><strong>И понеслась...</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/e8e/f02/615/e8ef026154f5ed0bc2318694b326f0b5.png" alt="Процесс перевода движка" title="Процесс перевода движка" width="1920" height="943"><div><figcaption>Процесс перевода движка</figcaption></div></figure><p>Это хорошо, что сейчас есть нейросети и они здорово упрощают процесс перевода. Но - по старинке все делаю вручную, каждый файл...Сначала размечаю обыкновенными дефайнами либо класс контроллера, либо шаблона, ну а потом выношу это все в соответствующие языковые папки. </p><p>Вайбкодеры меня наверняка закидали бы тапками, мол - все можно автоматизировать и перевести хоть тонну файлов за 20 минут. Но - мне это не в кайф =) </p><p>Кто хочет помочь в процессе перевода, а заодно и движок потестить - милости прошу: <a href="https://github.com/pechoradev/BloggyCms" rel="noopener noreferrer nofollow">https://github.com/pechoradev/BloggyCms</a></p> <a href="https://habr.com/ru/posts/1026750/?utm_campaign=1026750&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 22 Apr 2026 17:43:04 GMT</pubDate>
    <dc:creator><![CDATA[PechoraDev]]></dc:creator>
      
      <category><![CDATA[cms]]></category><category><![CDATA[мультиязычность]]></category><category><![CDATA[перевод]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — JavaScript (+4) — 15.04.2026 14:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1023764/</guid>
    <link>https://habr.com/ru/posts/1023764/?utm_campaign=1023764&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Вышла <a href="https://github.com/felixrieseberg/windows95/releases/tag/v5.0.1" rel="noopener noreferrer nofollow">пятая версия</a> открытого проекта <a href="https://github.com/felixrieseberg/windows95" rel="noopener noreferrer nofollow">windows95</a> с исходным кодом полностью на JavaScript. «Это Windows 95, работающая в&nbsp;приложении Electron. Да, это полная версия. Извините»,&nbsp;— пояснил разработчик решения.</p><p>Проект работает в Windows, а также на macOS и Linux, что подарит вам ностальгию или возможность обойти ограничения старой операционной системы независимо от вашей текущей платформы. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/dc3/e47/49f/dc3e4749fcfd2dda547a23c90c597a37.png" width="780" height="763"></figure> <a href="https://habr.com/ru/posts/1023764/?utm_campaign=1023764&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 15 Apr 2026 11:24:31 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[windows95]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Rombneromb — Блог компании X5 Tech — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/X5Tech/posts/1019838/</guid>
    <link>https://habr.com/ru/companies/X5Tech/posts/1019838/?utm_campaign=1019838&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/c2f/a92/f79/c2fa92f797183053d1020d89f8ea4791.png" width="1420" height="1080"></figure><p>Вместе с сообществом <a href="https://t.me/moscowjs" rel="noopener noreferrer nofollow">Moscow JS</a> приготовили классную <strong>программу с двумя потоками докладов</strong> про:</p><ul><li><p>performance и масштабирование фронтенда, </p></li><li><p>внедрение LLM в продукты и процессы, </p></li><li><p>изменение инженерной практики и культуры</p></li></ul><p>От X5 Tech — сразу два прикладных кейса:</p><ul><li><p>Как внедрять LLM в прод без перестройки архитектуры</p></li><li><p>Web-First в мобильных приложениях: офлайн, файлы, Workbox и ключевые подводные камни</p></li></ul><p>Для тех, кто хочет поучаствовать в дискуссии — круглый стол с холиварами про переход на «бигтех-рельсы».</p><p>📆 30 апреля, 18:30<br>Москва, Мясницкая, 13, с20</p><p>🔗 <a href="https://moscowjs.timepad.ru/event/3880642/?utm_source=moscowjs_site&amp;utm_medium=website&amp;utm_campaign=mjs70&amp;utm_content=registration_70habr" rel="noopener noreferrer nofollow">Регистрация по ссылке</a></p><p><strong>Программа:</strong></p><p><strong>«Перформанс без головной боли: Системная оптимизация фронтенда в большой команде» (</strong><em>Мирзоев Руслан,&nbsp;Premier.one</em><strong>)</strong></p><p>Доклад основан на реальном опыте команды из 24 разработчиков, столкнувшихся с критическими показателями LCP. Мы разберем комплексный подход к ускорению продукта: от «фундамента» (анализ бандла, Tree Shaking и борьба с циклическими зависимостями) до продвинутых стратегий рендеринга, таких как ISR и оптимизация внутренних запросов при SSR (перевод на internal hosts).</p><p>Вы получите набор готовых рецептов по работе с ассетами (SVG, шрифты, сжатие) и узнаете, как выстроить культуру производительности с помощью Performance Budgets, чтобы предотвратить регрессии в будущем</p><p><strong>«Веб-компоненты: плохая реализация хорошей идеи» (</strong><em>Евгений Кучерявый,&nbsp;larana.tech</em><strong>)</strong></p><p>Разберёмся, почему веб-копмоненты не прижились, что нужно сделать, чтобы это исправить, и есть ли им место в современной фронтенд-разработке.</p><p><strong>«LLM в продакшене: от идеи до внедрения за неделю» (</strong><em>Артем Шкуренко,&nbsp;Х5 Tech</em><strong>)</strong></p><p>Интеграция языковых моделей в существующие продукты не требует масштабных изменений архитектуры. Покажу практические паттерны — от прямой интеграции через API до выделенных сервисов, которые позволяют запускать AI-функциональность за считанные дни.</p><p>В докладе — реальные кейсы: интеллектуальные таблицы, ассистенты и аналитика, а также разбор ключевых вызовов — контроль качества, предсказуемость результатов и стабильность работы.</p><p><strong>«Вторая жизнь инженерных практик: как ИИ делает сложные подходы наконец-то удобными» (</strong><em>Вадим Царегородцев,&nbsp;Frontend Guild Lead в островке</em><strong>)</strong></p><p>За последние годы индустрия накопила множество инженерных практик: ADR, Clean Architecture, TDD, архитектурные границы, строгие правила зависимостей.</p><p>Многие из них отличные на уровне идей, но на практике часто оказываются слишком дорогими и трудоёмкими: требуют много документации, boilerplate-кода и ручного контроля правил.</p><p>Появление LLM меняет эту ситуацию.</p><p>Интересно, что ИИ не столько создаёт новые подходы, сколько делает жизнеспособными старые идеи, которые раньше было сложно применять из-за высокой стоимости их поддержки.</p><p>В докладе я покажу несколько реальных примеров из production-разработки, где привычные инженерные практики получили вторую жизнь благодаря ИИ.</p><p><strong>«А доки где? Пишем продуктовую документацию» (</strong><em>Егор Левченко,&nbsp;Wildberries &amp; Russ</em><strong>)</strong></p><p>У вас самый крутой уникальный продукт или сервис на рынке, вы знаете наверняка, что он делает и как им пользоваться. А понятен ли он вашему клиенту? Надо написать документацию, но как? Давайте разберёмся, чтобы потом не было больно.</p><p><strong>«Секретная жизнь фотографий в Клубе Тайных Покупателей X5» (</strong><em>Артур Басак,&nbsp;Х5 Tech</em><strong>)</strong></p><p>Поговорим о подходе Web-First в мобильных приложениях. В частности о том, как работать с файлами, про удобство и ограничения Workbox, нюансы оффлайн-режима и о какие подводные камни можно споткнуться.</p><p><strong>Инженерная культура и переход на «бигтех-рельсы»</strong></p><p><strong>Круглый стол с экспертами:</strong> <em>Глеб Михеев, Роман Троицкий</em> <strong>(</strong>состав уточняется…<strong>)</strong></p><p><strong>Модератор:</strong>&nbsp;<em>Иван Сизов, техлид фронтенд X5 Digital</em></p> <a href="https://habr.com/ru/posts/1019838/?utm_campaign=1019838&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 06 Apr 2026 12:28:37 GMT</pubDate>
    <dc:creator><![CDATA[Rombneromb (X5 Tech)]]></dc:creator>
      
      <category><![CDATA[llm]]></category><category><![CDATA[mobile development]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[инженерные практики]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[митап]]></category><category><![CDATA[доклады]]></category><category><![CDATA[веб-компоненты]]></category><category><![CDATA[продуктовая документация]]></category><category><![CDATA[webview]]></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[Пост @preciousvictory106 — JavaScript (+4) — 01.04.2026 07:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1017778/</guid>
    <link>https://habr.com/ru/posts/1017778/?utm_campaign=1017778&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><a href="https://cursor.com/" rel="noopener noreferrer nofollow">Cursor</a> или <a href="https://t.me/harvi_pro" rel="noopener noreferrer nofollow">Harvi Code</a>: какой ИИ для кодинга в 2026 году реально работает в России без VPN и головной боли с платежами</strong></p><p><em>В 2026 году почти каждый разработчик в России стоит перед одним и тем же выбором: </em>хочешь мощный ИИ, который реально ускоряет разработку, или хочешь, чтобы всё работало просто, без посредников и ежемесячных нервов с оплатой.</p><p><strong><a href="https://cursor.com/" rel="noopener noreferrer nofollow">Cursor</a></strong> — это сейчас, пожалуй, самый продвинутый AI-редактор на рынке. По сути, это VS Code, в который встроили настоящий искусственный интеллект на стероидах. Composer позволяет одной командой править сразу десяток файлов, агент понимает весь проект, хорошо справляется с рефакторингом, поиском багов и даже архитектурными решениями. Качество кода от Claude Sonnet 4.5 или свежих GPT часто вызывает искреннее «вау».</p><p>Но есть большая ложка дёгтя. <a href="https://cursor.com/" rel="noopener noreferrer nofollow">Cursor</a> — американский продукт, и российские карты он не принимает. Чтобы купить подписку Pro, приходится либо использовать виртуальные карты через крипту, либо платить посредникам (Oplatym и подобные), либо покупать готовые аккаунты (что рискованно). Сам редактор после оплаты работает без VPN, но первоначальная настройка оплаты — это отдельный квест. Бесплатная версия быстро упирается в лимиты, особенно если активно юзаешь мощные модели.</p><p><strong><a href="https://t.me/harvi_pro" rel="noopener noreferrer nofollow">Harvi Code</a></strong><a href="https://t.me/harvi_pro" rel="noopener noreferrer nofollow"> </a>— <strong>Первый в России AI кодинг-агент</strong>. Российский ответ на все эти заморочки. Это полноценный AI-агент прямо внутри VS Code. Пишешь задачу в чате — он генерит код, рефакторит, фиксит баги, работает с контекстом всего проекта. Не тормозит, контекст держит хорошо, интерфейс привычный.</p><p>Самое приятное — модели на любой бюджет. Есть топовые (Claude Sonnet 4.5, GPT-5.4 и другие). <strong>А главное — очень низкая стоимость токенов</strong>. Для каждой модели есть свой коэффициент стоимости. Для большинства повседневных задач их хватает с головой, и можно вообще почти не тратить деньги. Оплата — российскими картами или СБП, без всяких посредников и VPN.</p><p><strong>Коротко по делу:</strong></p><ul><li><p>Если тебе нужен мощный <strong>multi-file agent </strong>и ты готов один раз настроить оплату через проверенного посредника — бери <strong>Cursor</strong>. Он до сих пор в топе по возможностям.</p></li><li><p>Если хочешь работать стабильно, без лишних телодвижений и не думать каждый месяц про «как бы оплатить» — <strong><a href="https://t.me/harvi_pro" rel="noopener noreferrer nofollow">Harvi Code</a></strong> сейчас выглядит гораздо практичнее для российского разработчика.</p></li></ul><p>А вы как сейчас кодите с ИИ? Пробовали оба варианта? Что в итоге оставили в основном редакторе? Пишите в комментариях, интересно почитать реальный опыт.</p> <a href="https://habr.com/ru/posts/1017778/?utm_campaign=1017778&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 01 Apr 2026 04:37:20 GMT</pubDate>
    <dc:creator><![CDATA[preciousvictory106]]></dc:creator>
      
      <category><![CDATA[ИИ]]></category><category><![CDATA[Кодинг Агент]]></category><category><![CDATA[разработка]]></category><category><![CDATA[автоматизация]]></category><category><![CDATA[искусственный интеллект]]></category><category><![CDATA[нейросети]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @El_Gato_Grande — Блог компании Selectel (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/selectel/posts/1015904/</guid>
    <link>https://habr.com/ru/companies/selectel/posts/1015904/?utm_campaign=1015904&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Обновления в подборках обучающих материалов и курсов от Selectel</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/94a/4a6/ec7/94a4a6ec722a13a2accba633d2595f30.png" width="1191" height="669"></figure><p>Привет, Хабр! На дворе пятница, а значит, пришло время для нашей нерегулярной рубрики с полезными материалами для новичков. Как всегда, все бесплатно, учитесь и развивайтесь. И вот с чем я сегодня пришел.</p><ul><li><p><a href="https://selectel.ru/blog/courses/start-with-ml/?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_coursesselection_270326_content" rel="noopener noreferrer nofollow">Начало работы с ML-моделями</a>. Это подборка статей в Академии Selectel. Изучите базу по алгоритмам, научитесь подбирать железо и настраивать инфраструктуру и мое любимое — подборка в подборке — узнаете, что еще полезного по теме можно почитать/посмотреть.</p></li><li><p><a href="https://study.selectel.ru/mobiletesting_course?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_coursesselection_270326_content" rel="noopener noreferrer nofollow">Тестирование мобильных приложений</a>. Это уже полноценный курс с теорией, тестами и практическими заданиями. Кстати, практика — это прямо практика. Вы получите возможность бесплатно поработать с&nbsp;реальными устройствами в мобильной ферме Selectel, а не упражняться только в эмуляторах. Буквально на этой неделе мы запустили вторую часть курса, так что если вы уже начали его изучение, самое время продолжить.</p></li><li><p><a href="https://study.selectel.ru/javascript_course?utm_source=habr.com&amp;utm_medium=referral&amp;utm_campaign=academy_post_coursesselection_270326_content" rel="noopener noreferrer nofollow">Первые шаги в&nbsp;JavaScript</a>. Этот курс ориентирован на фронтенд-разработчиков уровня junior, веб-дизайнеров и тех, кто только делает первые шаги в программировании. Кстати, буквально на днях этот курс будет расширен, так что не пропустите. Начать изучение первых уроков можно уже сейчас.</p></li></ul> <a href="https://habr.com/ru/posts/1015904/?utm_campaign=1015904&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 27 Mar 2026 11:30:17 GMT</pubDate>
    <dc:creator><![CDATA[El_Gato_Grande (Selectel)]]></dc:creator>
      
      <category><![CDATA[selectel]]></category><category><![CDATA[javascript]]></category><category><![CDATA[ml]]></category><category><![CDATA[qa]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[обучение]]></category><category><![CDATA[курсы]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Gen-7 — .NET (+3) — 24.03.2026 16:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014380/</guid>
    <link>https://habr.com/ru/posts/1014380/?utm_campaign=1014380&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Всем хабровчанам удачной недели!</p><p>Хотел поинтересоваться такой темой как&nbsp;школа «Result/University». Кто обучался, как&nbsp;быстро удалось найти работу? Какова оценка по 5&nbsp;шкале?</p><p>Смогут&nbsp;ли ребята ввести в&nbsp;данную тему с&nbsp;минимальными рисками?</p> <a href="https://habr.com/ru/posts/1014380/?utm_campaign=1014380&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Mar 2026 13:24:13 GMT</pubDate>
    <dc:creator><![CDATA[Gen-7]]></dc:creator>
      
      <category><![CDATA[frontend]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @box-570 — ReactJS (+1) — 24.03.2026 15:18]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014342/</guid>
    <link>https://habr.com/ru/posts/1014342/?utm_campaign=1014342&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Solid.js должен был исправить React…но доказал, что React был прав</p><p>Все ругали React за массивы зависимостей, странные хуки и непонятные стадии рендеринга. Возникало чувство, что они усложнили фронтенд и добавили в него отложенную реакцию. Команда Solid.js решила это исправить: убрать лишние рендеры и магию по капоту. Идея была проста — использовать реактивность. Solid создавался, чтобы заменить React, но когда они <a href="https://github.com/solidjs/solid/releases/tag/v2.0.0-beta.0" rel="noopener noreferrer nofollow">работали над второй версией</a>, тут они уперлись в проблему, которую невозможно решить — ассинхронность.</p><p>Представьте: одни данные загрузились, другие ещё нет. Что покажет интерфейс? Фейковый фронтенд, который обманывает пользователя. React решал это с помощью отложенного обновления. Тогда Solid решили встроить ассинхронность прямо в реактивность. Появилось управление загрузкой, ожиданием и обновлениями — реактивность как она есть. Становится понятно, что и та, и та команда приходят к одному выводу с разных сторон, но Solid делает ее частью системы, засовывает ассинхронность прямо в реактивность и внезапно оказывается, что React не был таким уж и плохим дизайном, просто команда React-а пришла к этой проблеме гораздо раньше, чем остальные.</p><p>И главный вопрос: что важнее — устоявшийся подход React или более чистая, но сложная реактивность Solid? Или дело вовсе не в фреймворке, а в том, как ты управляешь асинхронностью?</p><p><a href="https://dev.to/playfulprogramming/two-react-design-choices-developers-dont-like-but-cant-avoid-d6g" rel="noopener noreferrer nofollow">https://dev.to/playfulprogramming/two-react-design-choices-developers-dont-like-but-cant-avoid-d6g</a></p><p>Подписывайтесь:  <a href="https://www.youtube.com/@atamrazov" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://vkvideo.ru/@club229100280" rel="noopener noreferrer nofollow">VK</a> | <a href="https://x.com/TamrazovAlex" rel="noopener noreferrer nofollow">Twitter</a></p> <a href="https://habr.com/ru/posts/1014342/?utm_campaign=1014342&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Mar 2026 12:18:38 GMT</pubDate>
    <dc:creator><![CDATA[box-570]]></dc:creator>
      
      <category><![CDATA[react.js]]></category><category><![CDATA[Solid.js]]></category><category><![CDATA[solid]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Звук (+4) — 24.03.2026 08:31]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1014072/</guid>
    <link>https://habr.com/ru/posts/1014072/?utm_campaign=1014072&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый мультиплатформенный проект <a href="https://snowify.cc/" rel="noopener noreferrer nofollow">Snowify</a>. Это аналог Spotify в виде музыкального плеера с <a href="https://github.com/nyakuoff/Snowify?tab=readme-ov-file" rel="noopener noreferrer nofollow">кодом на JavaScript</a> без рекламы и без регистрации. Музыка стримится с YouTube Music. Все функции Spotify на месте: списки треков, текст песен, плейлисты с рекомендациями и даже синхронизация с облаком. При этом в интерфейсе нет ничего лишнего, что отвлекало бы от музыки. Проект поддерживает кастомные плагины.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/de7/06b/5c4/de706b5c4d183edcd0affc8bcaa43af9.png" width="793" height="860"></figure> <a href="https://habr.com/ru/posts/1014072/?utm_campaign=1014072&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 24 Mar 2026 05:31:16 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[Snowify]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @seriych — Habr (+3) — 23.03.2026 19:09]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1013904/</guid>
    <link>https://habr.com/ru/posts/1013904/?utm_campaign=1013904&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Расширение AI-Less Habr&nbsp;— Чистим Хабр от ИИ</strong></p><p>Надоела лента, забитая ИИ? У меня есть готовое решение для вас. Shut up and take my money:</p><ul><li><p><a href="https://chromewebstore.google.com/detail/ai-less-habr/ommpbndiakfdikdhigffognkjmdpiifb" rel="noopener noreferrer nofollow">Chrome Web Store</a></p></li><li><p><a href="https://github.com/seriych/AI-Less-Habr" rel="noopener noreferrer nofollow">GitHub</a></p></li></ul><figure class=""><img src="https://habrastorage.org/getpro/habr/upload_files/eb2/7a9/562/eb27a9562cf35ca496cefbc74afe2cd0.png" alt="Интерфейс расширения" title="Интерфейс расширения" width="373" height="400"><div><figcaption>Интерфейс расширения</figcaption></div></figure><div class="floating-image"><p>Расширение для&nbsp;Chrome (и совместимых браузеров) позволяет скрывать статьи про «Искусственный интеллект». Скрывается не&nbsp;контент, написанный ИИ (LLM), а&nbsp;контент про&nbsp;ИИ (что сейчас обычно под&nbsp;этим подразумевается). Бесконечные статьи об&nbsp;очередной революции, вызванной тем, что&nbsp;такая‑то LLM модель опередила конкурентов на 0.1&nbsp;балл в&nbsp;одном из 186&nbsp;имеющихся бенчмарков, и вот этот вот всё.</p><p>Чтобы видеть счетчик скрытых статей, закрепите иконку расширения на&nbsp;панели инструментов через меню расширений (иконка паззла).</p></div><p>Есть следующие возможности:</p><ul><li><p>скрывать хаб «Искусственный интеллект»</p></li><li><p>скрывать по&nbsp;словам в&nbsp;заголовке (настраиваемый список)</p></li><li><p>скрывать по&nbsp;тегам (настраиваемый список)</p></li><li><p>инвертированный режим (показать, попадающее под&nbsp;фильтры, и скрыть остальное)</p></li></ul><p>По&nbsp;умолчанию включено только скрытие хаба «Искусственный интеллект». Фильтры по&nbsp;словам/тегам с&nbsp;большей вероятностью допускают ложноположительные срабатывания, поэтому выключены по&nbsp;умолчанию. По&nbsp;этой&nbsp;же причине в&nbsp;фильтрах по&nbsp;словам по&nbsp;умолчанию нет слов «ии»/«ai», так как&nbsp;есть достаточно много статей, содержащих что‑то вроде «без ИИ». Внимательно относитесь к&nbsp;добавлению слов в&nbsp;фильтры, чтобы минимизировать ложноположительные срабатывания.</p> <a href="https://habr.com/ru/posts/1013904/?utm_campaign=1013904&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 23 Mar 2026 16:09:34 GMT</pubDate>
    <dc:creator><![CDATA[seriych]]></dc:creator>
      
      <category><![CDATA[хабр]]></category><category><![CDATA[habr.com]]></category><category><![CDATA[расширения chrome]]></category><category><![CDATA[расширение]]></category><category><![CDATA[habr]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @cmyser — $mol (+2) — 18.03.2026 19:53]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1011926/</guid>
    <link>https://habr.com/ru/posts/1011926/?utm_campaign=1011926&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Сделал <a href="https://b-on-g.github.io/blitz/" rel="noopener noreferrer nofollow">интерактивный квиз</a>!</p><p>→ <a href="https://b-on-g.github.io/blitz/blog/#!screen=about" rel="noopener noreferrer nofollow">Ознакомительная статья</a></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/b93/8df/798/b938df7987e4e3a5c1fbbc3f7e415924.png" alt="экран лобби, стримит хост" title="экран лобби, стримит хост" width="3092" height="2206"><div><figcaption>экран лобби, стримит хост</figcaption></div></figure><p><br>Смотрите пробуйте играйте, формируйте своё мнение, и всегда помните&nbsp;— хост&nbsp;— это не&nbsp;игрок, он не&nbsp;может выбирать ответы, но&nbsp;вы можете запустить игру с&nbsp;пк, и зайти с&nbsp;телефона. Или&nbsp;с&nbsp;одного пк на&nbsp;разных браузерах.</p><p>Делал долго, мой магнум опус.</p> <a href="https://habr.com/ru/posts/1011926/?utm_campaign=1011926&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 18 Mar 2026 16:53:49 GMT</pubDate>
    <dc:creator><![CDATA[cmyser]]></dc:creator>
      
      <category><![CDATA[$mol]]></category><category><![CDATA[квиз]]></category><category><![CDATA[квизы]]></category><category><![CDATA[квиз бесплатно]]></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[Пост @Viktor9354 — JavaScript — 07.03.2026 16:07]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1007702/</guid>
    <link>https://habr.com/ru/posts/1007702/?utm_campaign=1007702&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/9cb/f5c/fe7/9cbf5cfe7d7e4d342e4346fcc99e72af.png" width="1280" height="853"></figure><p><strong><u>Гибкое управление фокусом элемента</u></strong></p><p><a href="https://developer.chrome.com/release-notes/145" rel="noopener noreferrer nofollow">Chrome в 145 версии</a> добавил параметр <code>focusVisible</code> в метод <code>focus</code>:</p><p><code>input.focus({ focusVisible: true });</code></p><p>Как вы уже, наверное, догадываетесь, это позволяет самостоятельно управлять тем, будет ли элемент при ручном вызове фокуса, помимо CSS-псевдокласса <code>:focus</code>, соответствовать ещё и <code>:focus-visible</code>.</p><p>Ранее без данного параметра браузер самостоятельно решал этот вопрос.</p><p>⚙️ Поддержка браузерами <a href="https://caniuse.com/mdn-api_htmlelement_focus_options_focusvisible_parameter" rel="noopener noreferrer nofollow">широкая</a><br>🔗 <a href="https://t.me/fe_notes" rel="noopener noreferrer nofollow">Мой телеграм канал</a></p> <a href="https://habr.com/ru/posts/1007702/?utm_campaign=1007702&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 07 Mar 2026 13:07:26 GMT</pubDate>
    <dc:creator><![CDATA[Viktor9354]]></dc:creator>
      
      <category><![CDATA[javascript]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Stugi — VueJS (+2) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1005242/</guid>
    <link>https://habr.com/ru/posts/1005242/?utm_campaign=1005242&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Как я оптимизировала фронт на 40% и никто не заметил</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/d65/e14/154/d65e141549403b38761f1304557e5aab.png" width="1124" height="1148"></figure><p><strong>Предыстория</strong></p><p>Когда я помогала с поиском сотрудника и просматривала резюме на фронтенд разработчика, очень часто встречала фразу - <strong>"Оптимизировал(а) размер бандла на 30% / 40% / 50%, что увеличило ..."</strong> как под копирку от ИИ, а у меня из достижений в резюме - "делаю задачи и фикшу баги"&nbsp;</p><p>Ну что ж, возьмем свое приложение и оптимизируем его</p><p><strong>О приложении</strong></p><p>Это небольшое SPA на Vue 3 для администрирования справочников. Ничего особенного, но это приложение экономит время программистам, которые не лезут в БД, и, как мне кажется, полезно для аналитиков и QA - это позволяет лучше понять, как устроена база, и почему иногда что-то не работает как ожидается.</p><p><strong>Начнем оптимизацию</strong></p><p>Запускаем <code>npx vite-bundle-visualizer</code> и получаем вот такую красивую розовую визуализацию (прикрепила бы скрин, на то что получилось, но в пост можно одну картинку добавить)</p><p>Смотрим роутинг у приложения... Все роуты импортируются сразу. Применяем легкий фикс:</p><ul><li><p>Оставляем синхронный импорт только для страниц, которые первыми открываются у пользователей </p></li><li><p>Остальные подгружаем отдельно с помощью lazy import</p></li></ul><pre><code>// Было:
import PaymentTypes from '@/views/Directories/PaymentType/PaymentTypes.vue';
import OrderTypes from '@/views/Directories/OrderType/OrderTypes.vue';
import Configurations from '@/views/Directories/Configuration/Configurations.vue';
import NewConfiguration from '@/views/Directories/Configuration/NewConfiguration.vue';
import ConfigurationPage from '@/views/Directories/Configuration/ConfigurationPage.vue';
import Source from '@/views/Directories/Source/Source.vue';
import City from '@/views/Directories/City/City.vue';
import Brand from '@/views/Directories/Brand/Brand.vue';
import CloseReason from '@/views/Directories/CloseReason/CloseReason.vue';
import ChangeReason from '@/views/Directories/ChangeReason/ChangeReason.vue';
import Restaurants from '@/views/Directories/Restaurants/Restaurants.vue';
import RestaurantPage from '@/views/Directories/Restaurants/RestaurantPage.vue';
import NewRestaurant from '@/views/Directories/Restaurants/NewRestaurant.vue';
import Discounts from '@/views/Directories/Discounts/Discounts.vue';
import PriceTypes from '@/views/Directories/PriceType/PriceTypes.vue';
</code></pre><pre><code>// Стало:
  children: [
            {
                path: 'brand',
                name: 'Бренды',
                component: () =&gt;
                    import('@/views/Directories/Brand/Brand.vue'), // &lt;--тут
                meta: {
                    breadcrumbs: ['Справочники', 'Бренды'],
                    requiresAuth: true,
                    permissions: ['admin.admin'],
                    title: 'Бренды',
                    section: 'directories',
                },
            },
...
]</code></pre><p>Запускаем снова и уже получаем уже разбитый бандл. <strong>Code Splitting работает, в</strong>ывод сборки теперь показывает множество маленьких JS-файлов для каждой страницы.</p><p><strong>Итоги оптимизации:</strong></p><p>Уменьшили основной бандл с 245 kB до 148 kB (gzip) — это минус 39%</p><p><strong>Что получили:</strong></p><ul><li><p><strong>✅ </strong>Оптимизировала размер бандла на <strong>40%</strong></p></li><li><p><strong>✅</strong> Улучшила First Contentful Paint</p></li><li><p><strong>✅</strong> Внедрила code splitting</p></li><li><p><strong>✅</strong> Повысила производительность</p></li><li><p><strong>✅ </strong>Уменьшила основной JavaScript-файл почти на <strong>40%</strong> (в gzip)</p></li><li><p><strong>✅</strong> Уменьшила сырой размер на <strong>46%</strong></p></li><li><p><strong>✅</strong> Теперь загружается только то, что нужно для текущей страницы</p></li></ul><p><strong> Реальность:</strong></p><ul><li><p><strong>❌ Съэкономил ли бизнес деньги?</strong> - Нет</p></li><li><p><strong>❌</strong> <strong>Выросла ли конверсия?</strong> - Как? 🌝 это внутренний админ-интерфейс</p></li><li><p><strong>❌</strong> <strong>Применили ли чудо-технологию?</strong> - Нет, добавили lazy import из коробки фреймворка и рекомендацией из документации</p></li><li><p><strong>❌</strong> <strong>Кто-то это заметил?</strong> - Только я в отчете, "на глаз" даже мне не заметно</p></li><li><p><strong>❌ Заметил ли пользователь?</strong> - Нет, потому что основное время все равно уходит на получение данных с backend</p></li></ul><p><strong>Мысли по этому поводу</strong></p><p>И так, мы теперь можем добавить заветную строчку в резюме! </p><p><strong>А вы встречаете эту строчку в резюме?</strong></p><ul><li><p>Какие чувства она у вас вызывает?</p></li><li><p>Красный флаг ли она для вас?</p></li><li><p>Или наоборот - показатель того, что человек думает о производительности?</p></li></ul><p><a href="https://t.me/shimanchuk_arina" rel="noopener noreferrer nofollow">Мой канал</a> о поиске работы (ничего не продаю и не рекламирую, только себя)</p> <a href="https://habr.com/ru/posts/1005242/?utm_campaign=1005242&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 01 Mar 2026 17:54:50 GMT</pubDate>
    <dc:creator><![CDATA[Stugi]]></dc:creator>
      
      <category><![CDATA[Vue 3]]></category><category><![CDATA[оптимизация]]></category><category><![CDATA[code splitting]]></category><category><![CDATA[резюме]]></category><category><![CDATA[фронтенд]]></category><category><![CDATA[поиск работы в it]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @gtosss — Тестирование IT-систем (+4) — 28.02.2026 06:43]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1004780/</guid>
    <link>https://habr.com/ru/posts/1004780/?utm_campaign=1004780&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Недавно общался с крупной зарубежной продуктовой компанией. Штат 500–1000 человек, вроде зрелые процессы, ЗП у разрабов  5000<strong>€</strong> баг-репорты по ISO/IEC/IEEE 29119. И при этом:</p><blockquote><p><em>«Не успеваем уделять время автотестам. Сфокусированы на скорости разработки и релизах.»</em></p></blockquote><p>Что меня зацепило — каждый их аргумент против тестов я интерпретировал как аргумент за:</p><p> — «Слишком частые релизы» → А не потому ли они такие частые, что баги проскакивают на прод? </p><p>— «Требования постоянно меняются» → Тем более — как вы контролируете, что старое не ломается? </p><p>— «И так работают наизнос если еще и тесты заставить писать — выгорят» → А не от бесконечного ли футбола с багами они выгорают?</p><p>А как у вас? Есть автотесты на проекте? Или тоже «не до них»? <br><br>Я написал целую статью на эту тему, если все выше вам откликается рекомендую к прочтению: <a href="https://habr.com/ru/articles/1004396/" rel="noopener noreferrer nofollow">Нет времени на тесты — через неделю релиз</a></p> <a href="https://habr.com/ru/posts/1004780/?utm_campaign=1004780&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 28 Feb 2026 03:43:08 GMT</pubDate>
    <dc:creator><![CDATA[gtosss]]></dc:creator>
      
      <category><![CDATA[cypress]]></category><category><![CDATA[jest]]></category><category><![CDATA[тестирование]]></category><category><![CDATA[тестирование по]]></category><category><![CDATA[тестирование веб-приложений]]></category><category><![CDATA[nest]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Stugi — VueJS (+3) — 19.02.2026 12:37]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/1001350/</guid>
    <link>https://habr.com/ru/posts/1001350/?utm_campaign=1001350&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Выбор вакансии: как я кинулась во всё — и это не дало результата.</strong></p><p>Есть разработчики, у которых развитие идёт линейно и предсказуемо: верстальшик → джун фронтендер → мидл → мидл в сильной компании → сеньор/лид/уход в бэкенд </p><p><strong>Красиво. Понятно. Логично.</strong></p><p>Но у меня кривая черта развития сначала бэк на Java в закрытом предприятии. Потом фулстек в фудтехе: в основном Vue,  но ещё и Go (и все сопутствующее), и CUBA Platform (lowcode на java, он же «Тезис»), и n8n. </p><p><strong>Широко. Разнообразно. Интересно.</strong> </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/eac/1d9/b1f/eac1d9b1f917965e2f799b1ffa625887.png" width="1536" height="1024"></figure><p><strong>Как я начала откликаться - на всё, что блестит</strong> </p><p>И сейчас Когда я вышла на рынок, то сначала я откликалась на все что близко: </p><ol><li><p> <strong>Frontend - Vue / React / Angular</strong>  <br>Ну фронт же. Есть мнение, что «не нужно учить конкретный фреймворк — важны принципы». </p></li><li><p><strong>Go</strong>  <br>а почему бы нет? Знаю , умею , курсы закончены, писала на нем  </p></li><li><p><strong>Fullstack (Go или JDK + фронт)</strong> </p></li><li><p><strong>N8N, автоматизаторы особенно с ИИ </strong> <br>Интересно. Растущее направление. </p></li><li><p><strong>Lowcode платформы CUBA, тезис, WebTutor - замаскированный под фронтенд</strong> Опыт есть. Почему не использовать?  </p></li></ol><p><strong>И это фатал еrror</strong></p><ol><li><p><strong>Ошибка №1. Переключение контекста </strong><br>Очень сложно переключать контекст и даже синтаксис языка - на первом собесе по TS я не смогла вспомнить синтаксис (на ум приходил только java, так как он изучался более долго и в закрытой среде, ирония: хоть я на нем и не пишу, но разбуди среди ночи - код напишу) </p></li><li><p><strong>Ошибка №2. Рынок </strong><br>Рассматривать вакансии на Angular, React без опыта в продакшене - на данный момент наивно. <br><br>Рынок перегрет: <br>- Vue ~ 1000 откликов за неделю,  <br>- React - 4000 ,  <br><br>Неужели Арина (или тот кто читает эту статью) ты думаешь, что кто-то будет рассматривать ваше резюме со Vue? Каким бы в целом хорошим инженером вы не были. Рынок не покупает «в целом». </p></li><li><p><strong>Ошибка №3. Fullstack со связкой Go + Vue или JDK + Vue</strong> <br>Фуллстеки со связкой go или jdk - это бред вакансии, это карьерный тупик. <br>- PHP + Vue  - норм<br>- Node + Vue - норм, <br>но Go + Vue - это нонсенс, это только подработка для поддержания штанов. Чаще это небольшие команды, поддержка, нестабильные проекты. </p></li><li><p><strong>Ошибка №4. n8n — нравится, но это уже не совсем разработка</strong> <br>Автоматизация, интеграции, AI — это интересно.  Но это больше аналитика и orchestration, чем классическая инженерия. Если хочешь быть разработчиком — нужно понимать, куда ты смещаешь фокус.  </p></li><li><p><strong>Ошибка №5. Low-code —  карьерный тупик</strong> <br>Проблем с окружением больше. Кода меньше. Рынок уже. Ты становишься зависимой от конкретной платформы. И выйти обратно в «чистую разработку» становится сложнее.   </p></li></ol><p><strong>Мой&nbsp;Hotfix: Фокус</strong></p><p>Я поняла, что на падающем рынке выживают либо "универсалы" c ИИ подбоком, либо эксперты </p><p><strong>Моя новая стратегия:</strong></p><ul><li><p><strong>Vue 3 + TypeScript + Nuxt </strong>(как зона роста)  </p></li><li><p><strong>n8n</strong> — как подработку и интересный дополнительный навык.</p></li></ul><p>Иногда рост — это не добавить ещё стек.  А убрать лишнее.</p> <a href="https://habr.com/ru/posts/1001350/?utm_campaign=1001350&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 19 Feb 2026 09:37:59 GMT</pubDate>
    <dc:creator><![CDATA[Stugi]]></dc:creator>
      
      <category><![CDATA[vue]]></category><category><![CDATA[поиск работы в it]]></category><category><![CDATA[fullstack]]></category><category><![CDATA[soft skills]]></category><category><![CDATA[фокус]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @VamWebStore — Git (+4) — 11.02.2026 14:55]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/995354/</guid>
    <link>https://habr.com/ru/posts/995354/?utm_campaign=995354&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/31b/e40/eef/31be40eef6492e93894c2e00c8192c11.png" width="2496" height="1154"></figure><p><strong>OAuth на практике: что оказалось удобным, а что отпугнуло пользователей</strong></p><blockquote><p>Мы запустили молодую платформу с двумя типами аккаунтов: обычные пользователи и разработчики (публикуют PWA и управляют приложениями).</p><p>Бренда и доверия пока нет, поэтому вопрос авторизации быстро стал не техническим, а психологическим.</p></blockquote><p>С чего начали</p><p>Для обычных пользователей:<br> •	Email / пароль<br> •	Google<br> •	GitHub</p><p>Для разработчиков — жёстче:<br> •	Обязательная привязка Google<br> •	Обязательная привязка GitHub</p><p>Логика казалась разумной:<br> «Разработчик = есть GitHub»<br> «Двойная верификация = меньше спама»</p><p>На практике это не сработало.</p><p>Первые тревожные сигналы</p><p>Регистрация разработчиков шла крайне медленно, несмотря на интерес к публикации приложений.</p><p>Сначала списывали на:<br> •	новый продукт<br> •	низкое доверие<br> •	отсутствие аудитории</p><p>Но после общения с разработчиками (в том числе через Habr) картина прояснилась.</p><p>Что отпугивало разработчиков</p><ol><li><p>Новый сервис → нежелание делиться данными</p></li></ol><p>Даже если это «просто email», психологический барьер остаётся.</p><p>Когда с первого шага нужно:<br> •	линковать внешние аккаунты<br> •	проходить несколько этапов подтверждения<br> •	подключать сторонние сервисы</p><p>это воспринимается как лишний фрикцион.</p><p>Особенно для соло-разработчиков и небольших команд.</p><ol start="2"><li><p>Git ≠ GitHub</p></li></ol><p>Ключевой инсайт.</p><p>Мы обнаружили, что:<br> •	не все хотят логиниться через GitHub<br> •	часть использует GitLab или Bitbucket<br> •	некоторые принципиально не хотят связывать GitHub с новым сервисом</p><p>Обязательная привязка GitHub стала серьёзным барьером.</p><p>А мнение стандартных пользователей разделилось:</p><p>Часть говорила:</p><p>«Чем больше OAuth-кнопок, тем солиднее выглядит платформа».</p><p>Логика простая:<br> •	если есть Google / Facebook / Discord — значит не ноунейм<br> •	интеграции с крупными сервисами повышают доверие</p><p>Это не про безопасность — это про ощущение легитимности.</p><p>Другие говорили ровно противоположное:</p><p>«Слишком много кнопок — ощущение перегруженности».</p><p>И это тоже справедливый аргумент.</p><p>Что мы изменили</p><ol><li><p>Упростили форму для пользователей</p></li></ol><p>Оставили:<br> •	Google<br> •	Facebook<br> •	Discord</p><p>Достаточно выбора для доверия, без визуального шума.</p><ol start="2"><li><p>Git-провайдеры вынесли в отдельную группу</p></li></ol><p>Под отдельной кнопкой:<br> •	GitHub<br> •	GitLab<br> •	Bitbucket</p><p>Для разработчиков это стало понятнее и логичнее.</p><ol start="3"><li><p>Убрали обязательный GitHub</p></li></ol><p>Теперь для developer-аккаунта нужно подключить любой Git-аккаунт, если ни один не подключён.</p><p>Без принудительного GitHub.</p><p>Первые цифры (осторожно)</p><p>Прошла всего неделя, выборка маленькая, платформа всё ещё молодая.</p><p>Тем не менее:<br> •	Зарегистрированные пользователи: +13%<br> (было 0–6% в неделю)<br> •	Зарегистрированные разработчики: +16%<br> (было 0–3%)</p><p>Похоже, это те разработчики, которые знали о платформе, но их останавливало требование GitHub.</p><p>Выводы (пока не финальные)<br> •	OAuth — это не только безопасность, но и психология доверия<br> •	Жёсткие требования на старте почти всегда бьют по росту<br> •	Git ≠ GitHub — и это важно<br> •	Много провайдеров могут как повышать доверие, так и перегружать UI</p><p>Для молодой платформы даже такие ранние сигналы уже показательны.</p><p>Интересно услышать опыт коллег:<br> добавляли ли вы OAuth-провайдеров после запуска?<br> были ли случаи, когда обязательная авторизация через конкретный сервис тормозила рост?</p> <a href="https://habr.com/ru/posts/995354/?utm_campaign=995354&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 11 Feb 2026 11:55:09 GMT</pubDate>
    <dc:creator><![CDATA[VamWebStore]]></dc:creator>
      
      <category><![CDATA[OAuth]]></category><category><![CDATA[аутентификация]]></category><category><![CDATA[авторизация]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Bitbucket]]></category><category><![CDATA[доверие пользователей]]></category><category><![CDATA[рост продукта]]></category><category><![CDATA[pwa]]></category><category><![CDATA[store]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @atomlib — JavaScript (+4) — 10.02.2026 09:25]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/994724/</guid>
    <link>https://habr.com/ru/posts/994724/?utm_campaign=994724&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Греческие мифы рассказывают про титана Прометея, который украл у богов огонь и поделился им с людьми. Персонажа за это приковали к скале не просто в наказание, но и в назидание остальным: знание не даётся бесплатно, за него нужно платить.</p><p>Если судить по названию, автор проекта <a href="https://codeberg.org/smnx/promethee" rel="noopener noreferrer nofollow">Promethee</a> кары богов нисколько не боится. Некто SMNX взял самый сакральный слой современного компьютера&nbsp;— прошивку UEFI&nbsp;— и добавил туда JavaScript. Как гласит <code>readme.md</code>, на старте загрузки Promethee подхватывает <code>script.js</code> с загрузочного тома и исполняет его, то есть этот скрипт и будет загрузчиком.</p><p>Понятно, что на боевую машину это ставить смысла нет, это просто эксперимент. Лабораторный характер подчёркивается сборкой и запуском в QEMU. Проект реализован автономно (freestanding), с минимальными заглушками libc. В качестве движка используется <a href="https://duktape.org/" rel="noopener noreferrer nofollow">Duktape</a>&nbsp;— встраиваемый JS-движок, рассчитанный на портируемость и компактность.</p><p>Для SMNX это уже не первый подобный забавный самопис. На <a href="https://smnx.sh/" rel="noopener noreferrer nofollow">своём сайте</a> автор представляется как Клем и прямо говорит, что любит строить «операционные системы, компиляторы, инструменты и веб-движки». Там же перечислены другие поделки: модульная хобби-операционка <a href="https://github.com/skift-org/skift" rel="noopener noreferrer nofollow">SkiftOS</a>, HTML/CSS-движок <a href="https://github.com/skift-org/vaev" rel="noopener noreferrer nofollow">Vaev</a>, экспериментальные инструменты для генерации документов, а также операционная система с эстетикой брутализма и идеалами UNIX семидесятых <a href="https://github.com/brutal-org/brutal" rel="noopener noreferrer nofollow">BRUTAL</a>.</p><p>JavaScript исторически задумывался как язык, который оживляет веб-страницы и делает их интерактивными. Сегодня же он расползся по всем слоям стека, <a href="https://www.espruino.com/" rel="noopener noreferrer nofollow">от микроконтроллеров</a> до <a href="https://jerryscript.net/" rel="noopener noreferrer nofollow">ультра-лёгких движков для Интернета вещей</a>. В том числе бывают попытки писать на JavaScript то, что не следует, хоть операционные системы. Самый цитируемый пример&nbsp;— это <a href="https://github.com/NodeOS/NodeOS" rel="noopener noreferrer nofollow">NodeOS</a>, дистрибутив Linux, где вместо привычного пользовательского мира предлагается использовать Node.js и npm как основной пакетный менеджер, и многие утилиты предполагается брать из npm-экосистемы. Другой полюс&nbsp;— <a href="http://runtimejs.org/" rel="noopener noreferrer nofollow">runtime.js</a>, библиотечная операционка, где JavaScript-рантайм на базе V8 и минимальная операционка собираются в лёгкий неизменяемый образ виртуальной машины для запуска на KVM, то есть ОС здесь становится упаковкой для единственного приложения на JS.</p><p>Promethee&nbsp;— не первый проект, где соседствуют JavaScript и UEFI. Беглый поиск обнаруживает <a href="https://github.com/TuvianNavy/Duktape-UEFI" rel="noopener noreferrer nofollow">порт Duktape под UEFI-приложения</a>.</p> <a href="https://habr.com/ru/posts/994724/?utm_campaign=994724&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 10 Feb 2026 06:25:45 GMT</pubDate>
    <dc:creator><![CDATA[atomlib]]></dc:creator>
      
      <category><![CDATA[UEFI]]></category><category><![CDATA[извращения]]></category><category><![CDATA[программирование]]></category><category><![CDATA[личные проекты]]></category><category><![CDATA[open source]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Duktape]]></category><category><![CDATA[SkiftOS]]></category><category><![CDATA[операционные системы]]></category><category><![CDATA[ненормальное программирование]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — JavaScript (+3) — 03.02.2026 05:32]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/992052/</guid>
    <link>https://habr.com/ru/posts/992052/?utm_campaign=992052&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Открытый учебный проект <a href="https://github.com/Solomonkassa/javascript-mastery" rel="noopener noreferrer nofollow">JavaScript Mastery&nbsp;— Complete Learning Path</a>&nbsp;— это курс для&nbsp;изучения языка программирования JavaScript. Энтузиасты собрали более 500&nbsp;учебных материалов&nbsp;—&nbsp;репозиторий заменяет буквально 4&nbsp;года учёбы в&nbsp;университете. Есть вся база от&nbsp;определения переменных до&nbsp;ООП, замыканий и других сложных, но&nbsp;функциональных концепций. Сотни упражнений для&nbsp;повторения материалов и закрепления знаний. Примеры кода, визуализация всех концепций, каждый учебный пример авторы разжёвывают до&nbsp;последней строчки. В&nbsp;конце есть идеи пет‑проектов, чтобы закрепить знания. В проекте есть гайд для&nbsp;подготовки к&nbsp;собеседованиям со всеми актуальными вопросами.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/3ce/905/d88/3ce905d88ef7a0460f7dfa8bc1932d30.jpg" width="890" height="697"></figure> <a href="https://habr.com/ru/posts/992052/?utm_campaign=992052&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Tue, 03 Feb 2026 02:32:13 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[JavaScript Mastery]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @tatapstar — JavaScript (+4) — 31.01.2026 09:54]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/991232/</guid>
    <link>https://habr.com/ru/posts/991232/?utm_campaign=991232&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>А как? </p><p>Как? </p><p>Реально, как? Скажите мне. Почему это происходит так.. </p> <a href="https://habr.com/ru/posts/991232/?utm_campaign=991232&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 31 Jan 2026 06:54:50 GMT</pubDate>
    <dc:creator><![CDATA[tatapstar]]></dc:creator>
      
      <category><![CDATA[разработка]]></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[Пост @box-570 — JavaScript — 28.01.2026 17:08]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/990106/</guid>
    <link>https://habr.com/ru/posts/990106/?utm_campaign=990106&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Макротасок не существует.</p><p>Один из самых частых вопросов на собеседованиях для frontend разработчиков: Расскажите про событийный цикл? как выполняются таски? что такое микротаски и макротаски?</p><p>В архитектуре event loop вообще нет такого слова как макротаски(macrotasks). Я вообще не смог найти ни одной спецификации, где было бы написано слово macrotask. Кроме <a href="https://promisesaplus.com/" rel="noopener noreferrer nofollow">Promises/A+</a>. Так в чем же разница между Promise и setTimeout? Почему Promise всегда(не всегда) будут исполняться в приоритете?</p><p>Браузер имеет несколько очередей задач (task queues) для разных типов тасок. Таска - это любой javascript код, запланированный стандартными механизмами, такие как запуск программы, запуск события или коллбэки. Помимо этого вы можете создать таску с помощью API, например WindowTimers(setTimeout, setInterval). Микротаски же в свою очередь такие же конструкции javascript, которые позволяют выполнять операции не дожидаясь запуска нового цикла event loop (process.nextTick, Promises, queueMicrotask). Так вот, так как setTimeout, setInterval относятся к браузерному API, то очередь микротасок, таких как Promise и т.д. всегда будет в приоритете выполнения, перед браузерным API.</p><p>При этом стоит учитывать, что браузерные API исполняют таски в разные очереди и по разному, например <a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver" rel="noopener noreferrer nofollow">MutationObserver </a> среагировавший после того, как в очередь микротасок попал успешный промис от функции fetch, будет выполнен раньше. То есть вставка в очередь тасок может быть не только как push. Таким образом то, что называют макротасками - это таски браузерного API, которые выполняются по одной на цикл движка браузера.</p><p>Полезные материалы</p><ol><li><p>W3 (<a href="https://www.w3.org/TR/2011/WD-html5-20110525/webappapis.html#task-queue" rel="noopener noreferrer nofollow">https://www.w3.org/TR/2011/WD-html5-20110525/webappapis.html#task-queue</a>)</p></li><li><p>MDN Event Loop (<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop" rel="noopener noreferrer nofollow">https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop</a>)</p></li><li><p>Tasks, microtasks, queues and schedules (<a href="https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules" rel="noopener noreferrer nofollow">https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules</a>)</p></li><li><p>Филипп Робертс: Что за чертовщина такая event loop? | JSConf EU 2014 (<a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ" rel="noopener noreferrer nofollow">https://www.youtube.com/watch?v=8aGhZQkoFbQ</a>)</p></li><li><p>Джейк Арчибальд. В цикле - JSConf.Asia (<a href="https://www.youtube.com/watch?v=cCOL7MC4Pl0" rel="noopener noreferrer nofollow">https://www.youtube.com/watch?v=cCOL7MC4Pl0</a>)</p></li></ol> <a href="https://habr.com/ru/posts/990106/?utm_campaign=990106&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Wed, 28 Jan 2026 14:08:07 GMT</pubDate>
    <dc:creator><![CDATA[box-570]]></dc:creator>
      
      <category><![CDATA[javascript]]></category><category><![CDATA[eventloop]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @Prikalel — CSS (+3) — 27.01.2026 00:06]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/989308/</guid>
    <link>https://habr.com/ru/posts/989308/?utm_campaign=989308&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Игра на джем "Rush lvl 8"</strong></p><iframe id="6977d674c0ff20607677b88e" src="https://embedd.srv.habr.com/iframe/6977d674c0ff20607677b88e" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Ребята всем привет, опубликовал на джем игру простую, но довольно интересную.</p><p>Мне посоветовали её на гитхаб pages выложить, что я и сделал.</p><p>Если хотите - зацените геймплей и если хотите непосредственно попробовать то вот ссылка</p><p><a href="https://prikalel.github.io/they-grow/" rel="noopener noreferrer nofollow">https://prikalel.github.io/they-grow/</a></p><p>Если хотите поддержать то оставьте комментарий под постом или зайдите на <a href="https://myindie.ru/games/game/they-groth" rel="noopener noreferrer nofollow">страницу джема</a> и поставьте лайк мне будет очень приятно)</p> <a href="https://habr.com/ru/posts/989308/?utm_campaign=989308&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 26 Jan 2026 21:06:57 GMT</pubDate>
    <dc:creator><![CDATA[Prikalel]]></dc:creator>
      
      <category><![CDATA[electron]]></category><category><![CDATA[jam]]></category><category><![CDATA[gamejam]]></category><category><![CDATA[javascript]]></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[Пост @VamWebStore — JavaScript (+4) — 24.01.2026 13:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/988500/</guid>
    <link>https://habr.com/ru/posts/988500/?utm_campaign=988500&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/adb/e9b/083/adbe9b08338d590134b6ba8ce5c9eb54.webp" width="1920" height="1080"></figure><p>Почему у PWA до сих пор нет полноценного «магазина приложений» — возможно ли это вообще?</p><p>Всем привет.</p><p>В течение последних месяцев, работая с PWA-приложениями, мы постоянно сталкивались с одним и тем же вопросом:</p><p>Почему в 2025 году у PWA до сих пор нет настоящего App Store?</p><p>Не просто каталога ссылок, а полноценного магазина приложений — знакомого, вызывающего доверие и понятного обычным пользователям.</p><p>При изучении существующих PWA-магазинов и каталогов обнаруживаются одни и те же повторяющиеся проблемы.</p><p>⸻</p><ol><li><p>Установка остаётся непонятной для пользователей</p></li></ol><p>Даже сегодня установка PWA вызывает затруднения у обычных пользователей.</p><p>Большинство из них не понимают:<br> •	когда приложение действительно можно установить,<br> •	почему инструкции по установке не совпадают с реальными шагами в их браузере или на устройстве.</p><p>Во многих PWA-каталогах всё ограничивается текстовой инструкцией — и на этом взаимодействие с сервисом фактически заканчивается.</p><p>⸻</p><ol start="2"><li><p>Отсутствие доверия</p></li></ol><p>Со стороны пользователя это проявляется в следующем:<br> •	нет содержательных отзывов,<br> •	отсутствует история установок,<br> •	нет ощущения личной библиотеки приложений.</p><p>Со стороны разработчиков наблюдаются крайности:<br> •	либо любой может опубликовать приложение без подтверждения права собственности,<br> •	либо проверка обязательна, но сложна и ограничена одним способом (например, через DNS-записи).</p><p>В итоге доверие не формируется ни у одной из сторон.</p><p>⸻</p><ol start="3"><li><p>Разработчики — второстепенные участники экосистемы</p></li></ol><p>Распространённые проблемы:<br> •	медленные и неудобные процессы публикации,<br> •	почти полное отсутствие автоматического заполнения данных из манифеста,<br> •	нехватка инструментов, которые были бы полезны разработчику ещё до установки приложения пользователем.</p><p>Экосистема не стимулирует разработчиков поддерживать и развивать свои PWA.</p><p>⸻</p><ol start="4"><li><p>Интерфейс не воспринимается как «нативный»</p></li></ol><p>Это тонкий, но важный момент.</p><p>Если магазин:<br> •	выглядит как обычный веб-сайт,<br> •	не вызывает ассоциаций с App Store или Google Play,</p><p>пользователи инстинктивно доверяют ему меньше — даже если сами приложения качественные.</p><p>⸻</p><p>При этом сами PWA как технология за последние годы заметно повзрослели: офлайн-режим, push-уведомления, installability, Web APIs.<br> Однако именно слой распространения и доверия остаётся самым слабым звеном.</p><p>⸻</p><p>Главный вопрос, к которому мы пришли</p><p>Возможно ли вообще создать PWA-магазин, который:<br> •	пользователи будут воспринимать как настоящий магазин приложений,<br> •	не станет источником боли для разработчиков,<br> •	сможет устойчиво развиваться, а не быть заброшенным через несколько месяцев?</p><p>Или же сама идея магазина PWA в текущей экосистеме изначально ошибочна?</p><p>Будет интересно узнать ваш опыт.</p><p>Вы публиковали PWA-приложения в существующих магазинах или каталогах?<br> Что вызывало наибольшие сложности — у разработчиков или у пользователей?</p> <a href="https://habr.com/ru/posts/988500/?utm_campaign=988500&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sat, 24 Jan 2026 10:19:19 GMT</pubDate>
    <dc:creator><![CDATA[VamWebStore]]></dc:creator>
      
      <category><![CDATA[pwa]]></category><category><![CDATA[web developement]]></category><category><![CDATA[web apps]]></category><category><![CDATA[app store]]></category><category><![CDATA[дистрибуция]]></category><category><![CDATA[прогрессивные веб-приложения]]></category><category><![CDATA[ux]]></category><category><![CDATA[store]]></category><category><![CDATA[platform]]></category><category><![CDATA[инструкции]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Сетевое оборудование (+4) — 19.01.2026 18:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/986720/</guid>
    <link>https://habr.com/ru/posts/986720/?utm_campaign=986720&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><a href="https://github.com/apenwarr/blip" rel="noopener noreferrer nofollow">Открытый проект blip</a> в режиме онлайн <a href="https://gfblip.appspot.com/" rel="noopener noreferrer nofollow">позволяет</a> визуально оценить сетевую задержку (латентность или latency) при передачи данных от ПК до разных серверов в мире. Решение работает в браузере на любом ПК, ноутбуке, планшете, смартфоне с поддержкой javascript и HTML canvas.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/154/a75/469/154a7546968cd5443f4aa298cd940b5f.png" width="1920" height="909"></figure> <a href="https://habr.com/ru/posts/986720/?utm_campaign=986720&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 19 Jan 2026 15:19:42 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[blip]]></category><category><![CDATA[latency]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @nin-jin — $mol (+3) — 15.01.2026 23:41]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/985676/</guid>
    <link>https://habr.com/ru/posts/985676/?utm_campaign=985676&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><br><strong><a href="https://youtu.be/psugXzYCa1E" rel="noopener noreferrer nofollow">ESLint, Prettier и что не так с насаждением единого стиля</a></strong></p><iframe id="69694f84a9ac3d23668a7d14" src="https://embedd.srv.habr.com/iframe/69694f84a9ac3d23668a7d14" class="embed_video embed__content" allowfullscreen="true"></iframe><p>Упомянутые материалы:</p><ul><li><p><a href="https://mol.hyoo.ru/#!section=docs/=5t5qb6_8ofefk" rel="noopener noreferrer nofollow">Автоформатирование</a></p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=cz8cl9_h5n5ys" rel="noopener noreferrer nofollow">Отступы</a></p></li><li><p><a href="https://mol.hyoo.ru/#!section=docs/=yhm6e9_l5h97i" rel="noopener noreferrer nofollow">Форматирование имён</a></p></li></ul><p><em>+</em><a href="https://boosty.to/hyoo" rel="noopener noreferrer nofollow"><em> Копилка благодарностей</em></a></p> <a href="https://habr.com/ru/posts/985676/?utm_campaign=985676&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 15 Jan 2026 20:41:08 GMT</pubDate>
    <dc:creator><![CDATA[nin-jin]]></dc:creator>
      
      <category><![CDATA[eslint]]></category><category><![CDATA[prettier]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @AlfaTeam — Блог компании Альфа-Банк (+1) — 15.01.2026 10:04]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/alfa/posts/985382/</guid>
    <link>https://habr.com/ru/companies/alfa/posts/985382/?utm_campaign=985382&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Функциональное программирование перевернуло фронтенд: почему JS возвращается к платформам?</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/154/e6d/64a/154e6d64a2813214ad23a4ad1d4e4b0a.png" width="780" height="436"></figure><p>Функциональное программирование перевернуло фронтенд-разработку, но теперь индустрия возвращается к платформенным подходам — почему и как это меняет JS-экосистему?</p><p>Статья <a href="https://habr.com/ru/companies/alfa/articles/975256/" rel="noopener noreferrer nofollow">«Как функциональное программирование изменило фронтенд и почему отрасль возвращается к платформе»</a> разбирает эволюцию: от чистого FP к гибридным решениям, с примерами и выводами для фронтендеров.</p><p>Виктория Копылова делится своим анализом, основанным на современных наблюдениях и на тех статьях прошлого, где функциональное программирование воспринималось как путь к «правильному» фронтенду.</p> <a href="https://habr.com/ru/posts/985382/?utm_campaign=985382&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 15 Jan 2026 07:04:26 GMT</pubDate>
    <dc:creator><![CDATA[AlfaTeam (Альфа-Банк)]]></dc:creator>
      
      <category><![CDATA[фронтенд]]></category><category><![CDATA[функциональное программирование]]></category><category><![CDATA[программирование]]></category><category><![CDATA[javascript]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @pinelab — Arduino (+4) — 08.01.2026 20:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/983668/</guid>
    <link>https://habr.com/ru/posts/983668/?utm_campaign=983668&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>polluSensWeb теперь поддерживает 26 датчиков и веб-хуки</strong><br> </p><figure class=""><img src="https://habrastorage.org/getpro/habr//post_images/b78/186/c20/b78186c20abd215923f9573a6e99f68e.png" alt="polluSensWeb"><div><figcaption>polluSensWeb</figcaption></div></figure><p> С последними обновленьями polluSensWeb теперь поддерживает 26 различных датчиков и внедряет интеграцию с веб-хуками, открывая возможности для автоматизации в реальном времени, пересылки данных и внешних аналитических конвейеров. </p><p>До сих пор polluSensWeb был в основном инструментом визуализации и диагностики. Данные оставались в сессии браузера. Это было удобно для тестирования, калибровки или демонстрации, но ограничивало возможности реального применения.</p><p>При включенных веб-хуках данные датчиков могут автоматически отправляться на внешний конечный пункт в режиме реального времени.<br> Это позволяет:</p><ul><li><p>Пересылать измерения в базы данных.</p></li><li><p>Запускать оповещения или автоматизацию.</p></li><li><p>Отсылать данные в панели мониторинга, такие как Grafana.</p></li><li><p>Интегрироваться с платформами сообществ или пользовательскими API.</p></li></ul><p><a href="https://wespeakenglish.github.io/polluSensWeb/" rel="noopener noreferrer nofollow">Открытый деплоймент</a><br> <a href="https://github.com/WeSpeakEnglish/polluSensWeb" rel="noopener noreferrer nofollow">Проект на GitHub</a></p> <a href="https://habr.com/ru/posts/983668/?utm_campaign=983668&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 08 Jan 2026 17:19:19 GMT</pubDate>
    <dc:creator><![CDATA[pinelab]]></dc:creator>
      
      <category><![CDATA[javascript]]></category><category><![CDATA[browser]]></category><category><![CDATA[sensor]]></category><category><![CDATA[uart]]></category><category><![CDATA[diy]]></category><category><![CDATA[diy-проекты]]></category><category><![CDATA[diy умный дом]]></category><category><![CDATA[diy или сделай сам]]></category><category><![CDATA[web]]></category><category><![CDATA[json]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @NikolayMakhonin — JavaScript (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/981412/</guid>
    <link>https://habr.com/ru/posts/981412/?utm_campaign=981412&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как получить почти бесконечное зацикливание без использования циклов и без переполнения стека вызовов:</p><pre><code class="javascript">// Установите N = 64, и эта функция никогда не завершится  
// Количество вызовов (calls) = 2^(N+1)  
// Максимальная глубина вложенности = N

let calls = 0
const N = 18
function func(state, visited) {
  calls++
  if (calls &gt; 10_000_000) {
    throw new Error('calls: ' + calls)
  }
  if (visited.includes(state)) return

  const newVisited = [...visited, state]

  func((state + 1) % N, newVisited)
  func((state + 1) % N, newVisited)
}

func(0, [])
console.log('calls:', calls)
</code></pre><p>Почему это работает без переполнения стека?</p><pre><code>func(0, [])
├── func(1, [0])
│   ├── func(2, [0,1])
│   │   └── ... глубина растёт до N
│   │           и перебираются все возможные комбинации значений в newVisited
│   └── func(2, [0,1]) - возвращается, глубина УМЕНЬШАЕТСЯ
└── func(1, [0])       - второй вызов, стек уже освободился
</code></pre><p>А Garbage Collector (GC) при этом бесконечно удаляет созданные ранее массивы <code>newVisited</code></p><p>Стек "дышит" - достигает максимума N, потом сворачивается, потом снова растёт. Это обход огромного дерева, имеющего небольшую глубину, но очень большую ширину. Это не бесконечная рекурсия. Но при N = 64 количество вызовов будет 2^65 (примерно 10^19) - это займёт тысячи лет, и стек никогда не переполнится.</p> <a href="https://habr.com/ru/posts/981412/?utm_campaign=981412&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 29 Dec 2025 02:17:26 GMT</pubDate>
    <dc:creator><![CDATA[NikolayMakhonin]]></dc:creator>
      
      <category><![CDATA[stack overflow]]></category><category><![CDATA[recursion]]></category><category><![CDATA[cycle]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @ispmanager — Apache (+4) — 26.12.2025 18:24]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/980978/</guid>
    <link>https://habr.com/ru/posts/980978/?utm_campaign=980978&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong><em>DDoS-атаки: почему стандартные решения не спасают и как выстроить эффективную защиту. Интервью ispmanager с GreyWeb</em></strong></p><p>Рады вас приветствовать, дорогие читатели!</p><p>Тема противодействия DDoS-атакам остается одной из самых острых и актуальных в сфере IT. Атаки постоянно эволюционируют, становятся более сложными и мощными, заставляя специалистов искать новые, более изощренные методы защиты.</p><p>В ispmanager мы регулярно сталкиваемся с вопросами наших пользователей о том, как обезопасить свои серверы и проекты. Именно поэтому мы провели глубокое интервью с ведущими экспертами по кибербезопасности из компании GreyWeb, которые специализируются на профессиональной защите от DDoS.</p><p>Что мы обсудили и почему это важно для каждого, кто управляет инфраструктурой:</p><p>•&nbsp; Эволюция угроз: Как меняются DDoS-атаки и почему вчерашние методы защиты сегодня уже неэффективны.</p><p>•&nbsp; Ограничения стандартных решений: Разбор типовых ошибок и мифов, связанных с "базовой" защитой.</p><p>•&nbsp; Комплексные стратегии: Какие подходы и технологии позволяют эффективно отражать даже самые мощные и целевые атаки.</p><p>•&nbsp; Взгляд изнутри: Практический опыт GreyWeb по предотвращению и минимизации ущерба от DDoS, кейсы и рекомендации.</p><p>•&nbsp; Подготовка к атаке: Что нужно сделать заранее, чтобы быть готовым к худшему сценарию.</p><p>Это интервью — не просто набор теоретических выкладок, а концентрат практического опыта и аналитики от специалистов, которые ежедневно борются с киберугрозами. Если вы системный администратор, DevOps-инженер, разработчик или владелец сервиса, который не понаслышке знает о рисках DDoS, этот материал будет для вас крайне полезен.</p><p>Приглашаем к прочтению: ➡️</p><p><a href="https://www.ispmanager.ru/news/case-greyweb" rel="noopener noreferrer nofollow">https://www.ispmanager.ru/news/case-greyweb</a></p><p>Делитесь вашим опытом борьбы с DDoS в комментариях!</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/428/35f/107/42835f107a03cf9b078f9c6a67c99627.png" width="1600" height="900"></figure> <a href="https://habr.com/ru/posts/980978/?utm_campaign=980978&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Dec 2025 15:24:54 GMT</pubDate>
    <dc:creator><![CDATA[ispmanager]]></dc:creator>
      
      <category><![CDATA[ddos-атака]]></category><category><![CDATA[инфраструктура]]></category><category><![CDATA[информационная безопасность]]></category><category><![CDATA[интервью]]></category><category><![CDATA[информационные технологии]]></category><category><![CDATA[кейс]]></category><category><![CDATA[it-инфраструктура]]></category><category><![CDATA[кибербезопасность]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @yakvenalex — JavaScript (+3) — 26.12.2025 14:58]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/980878/</guid>
    <link>https://habr.com/ru/posts/980878/?utm_campaign=980878&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Как автоматизировать Photoshop через кодинг</p><p>Когда говорят об автоматизации, чаще всего имеют в виду Python. Но важно понимать: Photoshop не выполняет Python-код напрямую.</p><p>Зато у него есть встроенная поддержка скриптов — Photoshop умеет исполнять код на JavaScript (ExtendScript).</p><p>Это не «JS как в браузере» и не замена Python. Это родной язык автоматизации Photoshop, с прямым доступом к:</p><ul><li><p>слоям</p></li><li><p>тексту</p></li><li><p>смарт-объектам</p></li><li><p>экспорту файлов</p></li><li><p>истории документа</p></li></ul><p>Если задача — управлять самим Photoshop, то скрипты внутри Photoshop — самый надёжный путь.</p><p>Что это даёт на практике</p><p>Через код можно:</p><ul><li><p>массово менять текст в PSD</p></li><li><p>генерировать сотни изображений из одного шаблона</p></li><li><p>автоматизировать экспорт</p></li><li><p>исключить Actions и Variables с их ограничениями</p></li></ul><p>По сути, мы описываем действия, которые дизайнер делает руками, но в виде кода.</p><p>Пример задачи</p><p>Есть:</p><ul><li><p>один PSD</p></li><li><p>текстовый слой</p></li><li><p>значения 1 м → 100 м</p></li></ul><p>Нужно:</p><ul><li><p>автоматически подставить значения</p></li><li><p>сохранить 100 PNG-файлов</p></li><li><p>вернуть PSD в исходное состояние</p></li></ul><p>Пример скрипта для Photoshop (JSX)</p><pre><code class="javascript">#target photoshop

var doc = app.activeDocument;
var layerName = "1 м"; // имя текстового слоя
var outputFolder = Folder.selectDialog("Выбери папку для сохранения");

if (!outputFolder) {
    alert("Папка не выбрана");
    exit();
}

function findTextLayer(layerSet) {
    for (var i = 0; i &lt; layerSet.layers.length; i++) {
        var layer = layerSet.layers[i];
        if (layer.kind == LayerKind.TEXT &amp;&amp; layer.name == layerName) {
            return layer;
        }
        if (layer.typename == "LayerSet") {
            var found = findTextLayer(layer);
            if (found) return found;
        }
    }
    return null;
}

var textLayer = findTextLayer(doc);
if (!textLayer) {
    alert("Текстовый слой не найден");
    exit();
}

for (var i = 1; i &lt;= 100; i++) {
    textLayer.textItem.contents = i + " м";

    var file = new File(outputFolder + "/pkabel_4x2_5_" + i + "m.png");

    var opts = new PNGSaveOptions();
    opts.compression = 9;

    doc.saveAs(file, opts, true, Extension.LOWERCASE);
}

// откат без сохранения
doc.activeHistoryState = doc.historyStates[0];

alert("Готово!");
</code></pre> <a href="https://habr.com/ru/posts/980878/?utm_campaign=980878&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Fri, 26 Dec 2025 11:58:02 GMT</pubDate>
    <dc:creator><![CDATA[yakvenalex]]></dc:creator>
      
      <category><![CDATA[photoshop]]></category><category><![CDATA[автоматизация photoshop]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @myoffice_ru — Блог компании МойОфис (+4) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/companies/ncloudtech/posts/980426/</guid>
    <link>https://habr.com/ru/companies/ncloudtech/posts/980426/?utm_campaign=980426&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>Звёзды разработки и практикующие инженеры разбирают горячие темы — от FAIL до GOD. Встречайте tech-шоу «АйТир Лист» от МойОфис.</strong></p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/08c/b87/047/08cb870477a7db0cbae736a4a31d7ea6.png" width="1920" height="1080"></figure><p>В нашем шоу мы берём одну область в разработке, выбираем самые обсуждаемые технологии, практики и подходы — и раскладываем их по шкале от <strong>FAIL</strong> до <strong>GOD</strong>.<br>Формат простой: эксперты защищают свои позиции, спорят, соглашаются и не соглашаются. 14 табличек, 14 поводов для споров и честный экспертный рейтинг без попытки всем понравиться.</p><p><strong><a href="https://www.youtube.com/watch?v=u2roRMypx-M" rel="noopener noreferrer nofollow">Первый выпуск</a> — опенсорс для фронтенда</strong></p><p>Дебютный эпизод мы посвятили популярным опенсорс-решениям для фронтенда: от инструментов, которые давно пора отпускать, до стандартов индустрии.</p><p>В выпуске:</p><ul><li><p><strong>Александр Коротаев</strong> — эксперт по фронтенду и креативному кодингу</p></li></ul><ul><li><p><strong>Алексей Золотых</strong> — тимлид команды веб-редакторов <strong>МойОфис</strong></p></li></ul><ul><li><p>Ведущий — <strong>Эдгар Акопян</strong></p></li></ul><p>Обсуждаем инструменты, которые формируют повседневную фронтенд-разработку, и честно отвечаем на вопрос: что сегодня выглядит как GOD-tier, а что застряло на уровне MVP или FAIL.</p><p><strong>Смотрите выпуск:</strong> <a href="https://www.youtube.com/watch?v=u2roRMypx-M" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://rutube.ru/video/40caec8287d648b539fd22f609bed040/" rel="noopener noreferrer nofollow">RuTube</a> | <a href="https://vk.com/myofficeru?z=video-98070369_456239609%2Fvideos-98070369%2Fpl_-98070369_-2" rel="noopener noreferrer nofollow">VK</a></p><p><strong><a href="https://youtu.be/TW3zsx-onuM" rel="noopener noreferrer nofollow">Второй выпуск</a> — фичи и идиомы C++</strong></p><p>Во втором эпизоде «АйТир Листа» — уже не инструменты, а язык.<br>Мы устроили полноценную битву мнений вокруг фич и идиом C++: 14 табличек превращаются в 14 поводов для дебатов, где каждая возможность языка проходит через экспертную оценку.</p><p>В выпуске:</p><ul><li><p><strong>Данил Черепанов</strong> — архитектор редакторов <strong>МойОфис</strong></p></li></ul><ul><li><p><strong>Антон Полухин</strong> — эксперт-разработчик C++ техплатформы городских сервисов <strong>Яндекс</strong></p></li></ul><ul><li><p>Ведущий — <strong>Эдгар Акопян</strong></p></li></ul><p>Получилось много споров, неожиданных аргументов и ситуаций, где «привычно» не значит «хорошо».</p><p><strong>Смотрите и делитесь мнением:</strong> <a href="https://youtu.be/TW3zsx-onuM" rel="noopener noreferrer nofollow">YouTube</a> | <a href="https://rutube.ru/video/private/99943f363660abe6d5975c02fb352d0e/?p=AuLO7EIfMHT59wEK7EkeNw" rel="noopener noreferrer nofollow">RuTube</a> | <a href="https://vkvideo.ru/video-98070369_456239612" rel="noopener noreferrer nofollow">VK</a></p><p>В следующих выпусках продолжим разбирать технологии без скидок на хайп и «так исторически сложилось». Предлагайте темы, а если готовы к жарким спорам – становитесь участниками нашего шоу) А как стать? Пишите в комменты с какой темой бы хотели поспорить!</p><p><br></p> <a href="https://habr.com/ru/posts/980426/?utm_campaign=980426&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 25 Dec 2025 09:35:23 GMT</pubDate>
    <dc:creator><![CDATA[myoffice_ru (МойОфис)]]></dc:creator>
      
      <category><![CDATA[c++]]></category><category><![CDATA[open source]]></category><category><![CDATA[javascript]]></category><category><![CDATA[typescript]]></category><category><![CDATA[идиомы программирования]]></category><category><![CDATA[идиомы с++]]></category><category><![CDATA[фичи c++]]></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>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @winkyBrain — JavaScript (+1) — N/P]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/977964/</guid>
    <link>https://habr.com/ru/posts/977964/?utm_campaign=977964&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p><strong>React One Click Component</strong></p><p>Поделюсь самодельным расширением для VS Code, которое позволяет создавать React-компоненты в один клик.</p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/489/252/5e5/4892525e50c54e947416b02db3a21399.gif" alt="Демонстрация работы расширения" title="Демонстрация работы расширения" width="1196" height="547"><div><figcaption>Демонстрация работы расширения</figcaption></div></figure><p>Что умеет:</p><ul><li><p>гибкое именование файлов: выбор между PascalCase, camelCase, kebab-case или snake_case для генерируемых файлов;</p></li><li><p>работа с .tsx и .jsx для файлов компонентов, а также .scss, .css, .less и .sass для стилей;</p></li><li><p>редактируемые шаблоны: настройка содержимого генерируемых файлов прямо в VS Code;</p></li><li><p>опциональное создание файлов реэкспорта и стилей.</p></li></ul><p>Более подробный readme на странице <a href="https://marketplace.visualstudio.com/items?itemName=winkyBrain.react-one-click-component" rel="noopener noreferrer nofollow">расширения</a>, ссылка на исходники там же. На мой взгляд экстешнен написан таким образом, что его довольно легко переписать для любого web-фреймворка.</p><p>На всякий случай: ни с какими внешними сервисами и нейронками расширение не взаимодействует)</p> <a href="https://habr.com/ru/posts/977964/?utm_campaign=977964&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 18 Dec 2025 07:58:05 GMT</pubDate>
    <dc:creator><![CDATA[winkyBrain]]></dc:creator>
      
      <category><![CDATA[React]]></category><category><![CDATA[vscode]]></category><category><![CDATA[vscode extension]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @sajtim — HTML (+2) — 11.12.2025 22:19]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/975900/</guid>
    <link>https://habr.com/ru/posts/975900/?utm_campaign=975900&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Доброго всем. Первая публикация, прошу не особо...</p><p>Не стану растекаться мыслью по древу, пост - следствие поиска по запросам типа "как лучше вставить и анимировать SVG иконки", и подобным в том же ключе. Так как самыми релевантными ответами поиска не удовлетворён, решил написать свой, во-первых, чтобы услышать сообщество. Мало ли, возможно технология уже вовсю применяется в фреймворках, и на поиск все забили "всё и так слишком очевидно". <br>Во-вторых, сам до сих пор копаюсь в ванильном, поэтому, если старшие товарищи найдут сей вариант приемлемым, пусть пост останется как справка, вроде "а чё, так можно было?". Если же такая практика не применима по ряду пока неизученных мной причин, пост тоже пусть остаётся дополненный комментариями, как пример того "как не надо делать". В общем. </p><p>Решил упаковать спрайт в Web Components. Для примера взял отображение файловых иконок, за подопечных три распространённых файловых формата .docs, .xls, .pdf. Раз уж мне и так пришлось испытать муки отсутствия музы( вообще ни разу не художник), прошу отнестись с пониманием к внешнему виду конечного продукта. Упор был на простоту, контролируемость, компоновку. В том смысле, что косметика человеком с утончённым восприятием этого мира может быть применима отдельно. <br>Да, и ещё один аспект постарался обыграть - наличие общих свойств для всех иконок, коими выбрал подложку, и текст mime типа, и уникальные для каждой иконки элементы, ими выступили "брендовые" цвета и элементы. Так, выбор иконок файловых форматов для спрайта показался оптимальным. <br>Далее, в общем код(сокращённо, рабочий пример по  ссылке), совсем немного к нему объяснений и <a href="https://codepen.io/Axdrv/pen/GgZeJxr" rel="noopener noreferrer nofollow">ссылка на песочницу</a>.  И, само собой, ожидание комментариев. </p><pre><code class="javascript">customElements.define("wc-icon-file",
  class WC_ICON_FILE extends HTMLElement {
    constructor() {
      super();
      this.#preform = '';
      this.#mime = '';
      this.#unic = '';      
    }  
    connectedCallback() {
      this.init();
      this.innerHTML=this.#preform;
    } 
    init() {
      this._mime = this.getAttribute('data-mime');
      let availableMime = {
        xlsfile: `&lt;g class="wc-icon-${this.#mime}"&gt;
          &lt;line style="stroke-width:3;stroke-linecap:butt;" x1="13" x2="17" y1="24" y2="24"/&gt;
          &lt;line style="stroke-width:3;stroke-linecap:butt;" x1="18" x2="22" y1="24" y2="24"/&gt;
          // и т.д.
          &lt;text x="8" y="19" class="f-mime"&gt;.xls&lt;/text&gt;
          &lt;/g&gt;`,
        docfile: `&lt;g class="wc-icon-${this.#mime}"&gt;
          &lt;line style="stroke-width:1.8;stroke-linecap:round;" x1="20" x2="24" y1="23" y2="23"/&gt;
          &lt;line style="stroke-width:1.3;stroke-linecap:round;" x1="16" x2="30" y1="27" y2="27"/&gt;
          // и т.д.
          &lt;text x="8" y="19" class="f-mime"&gt;.doc&lt;/text&gt;
        &lt;/g&gt;`,
          pdffile: `&lt;path class="wc-icon-${this.#mime}" d="m 21.963376,23.938571 // и т.д. /&gt;
          &lt;text x="8" y="19" class="f-mime"&gt;.pdf&lt;/text&gt;` 
        }      
        this.#unic = availableMime[this.#mime];
        this.#preform = `&lt;svg class="wc-icon-file" viewBox="0 0 48 48"&gt;
           &lt;path class="${this.#mime}" d="M13.528 3.087 30 3l8 9-.316 28.075c-.035 3.151-1.09 
            4.143-3.716 4.11h-20.44 c-2.303.095-3.676-.718-3.716-4.11V7.197c-.03-2.459
            1.504-4.198 3.716-4.11z"/&gt;
            ${this.#unic}
            &lt;/svg&gt;`
  }; 
});
let wcIconFile = document.createElement('wc-icon-file');
// export {wcIconFile} по необходимости</code></pre><p>Сам компонент на странице объявляется как обычно:</p><pre><code class="xml">&lt;wc-icon-file data-mime="xlsfile"&gt;&lt;/wc-icon-file&gt;
&lt;wc-icon-file data-mime="docfile"&gt;&lt;/wc-icon-file&gt;
&lt;wc-icon-file data-mime="pdffile"&gt;&lt;/wc-icon-file&gt;    </code></pre><p>Код прокомментирую на предмет того, что в <code>init()</code> пришлось соблюсти порядок объявления переменных. Для определения схожих классов с разными "модификаторами" сначала брался атрибут в компоненте. По нему же делалась выборка <code>this.#unic</code> впоследствии вставляемая  в <code>this.#preform</code> . Стили здесь не привожу, отмечу лишь, что настройки :hover и анимации там вполне работают.</p><p>Благодарю, что уделили время.</p> <a href="https://habr.com/ru/posts/975900/?utm_campaign=975900&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Thu, 11 Dec 2025 19:19:38 GMT</pubDate>
    <dc:creator><![CDATA[sajtim]]></dc:creator>
      
      <category><![CDATA[svg]]></category><category><![CDATA[web components]]></category><category><![CDATA[спрайты]]></category><category><![CDATA[иконки]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Post @aymericzip — JavaScript (+2) — 23.11.2025 15:33]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/969342/</guid>
    <link>https://habr.com/ru/posts/969342/?utm_campaign=969342&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Я часто вижу, как разработчики испытывают трудности с i18next. И действительно, это технология интернационализации, которую нелегко освоить.</p><p>Несмотря на это, i18next остаётся решением по умолчанию, которое ChatGPT рекомендует для внедрения i18n. Мы слишком часто попадаемся на удочку страниц «Get Started» (да, оно работает, но действительно ли это сделано правильно?).</p><p>На практике я замечаю, что многие проекты пропускают самые критичные аспекты интернационализации, особенно связанные с SEO: перевод метаданных, теги hreflang, локализация ссылок, настройка sitemap и robots.txt.</p><p>Что ещё хуже, почти половина проектов, использующих i18next (особенно после роста популярности ИИ), не структурируют контент по неймспейсам или же загружают все неймспейсы при каждом запросе.</p><p>Последствия? Вы можете заставлять каждого пользователя загружать контент всех страниц на всех языках, даже если он посещает только одну страницу. Например: при 10 страницах и 10 языках 99% загружаемого контента никогда не будет использовано. Совет: используйте анализатор бандла, чтобы выявить это.</p><p>Чтобы решить проблему, я подготовил руководство о том, как правильно интернационализировать приложение Next.js 16 с i18next в 2025 году.</p><p>Вот ссылка: <a href="https://intlayer.org/ru/blog/nextjs-internationalization-using-next-i18next" rel="noopener noreferrer nofollow">https://intlayer.org/ru/blog/nextjs-internationalization-using-next-i18next</a></p> <a href="https://habr.com/ru/posts/969342/?utm_campaign=969342&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Sun, 23 Nov 2025 12:33:59 GMT</pubDate>
    <dc:creator><![CDATA[aymericzip]]></dc:creator>
      
      <category><![CDATA[i18n]]></category><category><![CDATA[i18next]]></category><category><![CDATA[bundle]]></category><category><![CDATA[seo]]></category>
  </item>
  

	
  

  

  

    

  

  
  <item>
    <title><![CDATA[Пост @denis-19 — Веб-разработка (+4) — 17.11.2025 10:38]]></title>
    <guid isPermaLink="true">https://habr.com/ru/posts/967082/</guid>
    <link>https://habr.com/ru/posts/967082/?utm_campaign=967082&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
    <description><![CDATA[<p>Представлен открытый проект <a href="https://minivac.greg.technology/" rel="noopener noreferrer nofollow">релейного компьютера 1961 года Minivac 601</a>, работающий в браузере (<a href="https://github.com/gregsadetsky/minivac" rel="noopener noreferrer nofollow">код на GitHub</a>). До появления микрочипов компьютеры строились на основе механических реле. Это рабочая модель Minivac 601, образовательного компьютера, разработанного Клодом Шенноном. </p><figure class="full-width "><img src="https://habrastorage.org/getpro/habr/upload_files/4cc/63b/4af/4cc63b4af2e2684c7e807a48a75bb9d9.png" width="1294" height="874"></figure> <a href="https://habr.com/ru/posts/967082/?utm_campaign=967082&amp;utm_source=habrahabr&amp;utm_medium=rss">Читать дальше &rarr;</a>]]></description>
      
    <pubDate>Mon, 17 Nov 2025 07:38:15 GMT</pubDate>
    <dc:creator><![CDATA[denis-19]]></dc:creator>
      
      <category><![CDATA[minivac 601]]></category>
  </item>
  

	
  

  

  

      

      

      

    
  </channel>
</rss>
