Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  • ru
    Игры
    Образование
    Искусственный Интеллект
    Новости
    Бекенд, разработка серверов
    Фронтенд
    Мобильная разработка
    Языки программирования
    Разработка игр | 3D | 2D
    Базы данных
    CMS
    Системное Администрирование
    Операционные системы
    Маркетинг
    Девайсы
    Сообщество
    Юмор, Мемы

  • en
    Humor
    News
    AI
    Programming languages
    Frontend
    GameDev

  • Блоги

Авторизуйтесь, чтобы написать сообщение

  • Все категории
  • kirilljsxK
    kirilljsx
    Так выглядел сайт microsoft.com 25 лет назад

    IMG_8354.jpeg

    Эх были времена без адаптивной верстки 😧


    0 0 0 Ответить
  • GameFishG
    GameFish
    Dying Light: The Beast последнее обновление

    IMG_8353.png

    🔥 Dying Light: The Beast меняет правила — мир больше не перезапускается

    Techland выпустили крупное обновление для Dying Light: The Beast под названием Restored Land Edition . Разработчики пошли на смелый шаг и решили полностью переработать экономику выживания и взаимодействие с открытым миром. Мы изучили список изменений и собрали для вас самую суть: что добавили, что убрали и как теперь придется выживать.

    Главное об обновлении

    • Дата выхода: 26 марта 2026 года.
    • Цена: Абсолютно бесплатно для всех текущих владельцев оригинальной игры.
    • Что внутри для новых игроков: Издание включает в себя базовую игру и весь ранее вышедший контент.

    Что изменилось и добавилось (Ключевые механики)

    1. Перманентная экономика (Никакого респавна лута)
      Главное изменение патча — мир больше не «сбрасывается».
      • Если вы обчистили аптеку или магазин, они останутся пустыми навсегда.
      • Мировые активности и случайные события теперь можно пройти только один раз.
      • Как это меняет игру: Привычный цикл «залутал зону — поспал — залутал снова» больше не работает. Игрокам придется постоянно продвигаться в новые, более опасные районы ради выживания.

    2. Динамическое изменение окружения
      Теперь зачистка территорий имеет реальный и постоянный эффект.
      • Вы можете навсегда устранить угрозу зараженных в конкретном районе.
      • После полной зачистки в эту зону возвращаются обычные люди, и локация постепенно «оживает», превращаясь в безопасную территорию.

    3. Новый хардкорный режим «One Life»
      Для тех, кому перманентного мира оказалось мало, добавили режим с одной жизнью.
      • Смерть персонажа ведет к полному удалению всего прогресса.
      • Игру придется начинать с самого начала.


    Вердикт

    Разработчики явно хотят вернуть в игру чувство реальной опасности и дефицита. Раньше смерть или трата ресурсов не были проблемой — всегда можно было нафармить еще. Теперь каждое решение имеет вес, а восстановление районов дает отличную мотивацию зачищать карту не просто ради опыта, а ради визуального изменения мира и создания безопасных зон.

    👇 А что думаете вы?

    1. Не убьет ли отмена респавна лута эндгейм, когда карта будет полностью зачищена?
    2. Справедлив ли режим One Life для движка Dying Light, где иногда можно случайно разбиться из-за кривого паркура?
    3. Будете возвращаться в игру ради этого обновления?

    0 0 0 Ответить
  • GameFishG
    GameFish
    Project Helix: новая Xbox от Microsoft и её влияние на консольный рынок

    Microsoft официально подтвердила разработку следующего поколения Xbox под кодовым названием Project Helix. Это первый реальный шаг к новой консоли после долгого затишья в аппаратных анонсах.

    Для игроков это значит потенциальный прорыв в производительности и сервисах. Если Helix воплотит планы Microsoft по интеграции ИИ и облака, консоль может изменить баланс сил с PlayStation и Nintendo. Пока деталей мало, но сам факт анонса будоражит рынок.

    Что известно о Project Helix

    Microsoft не раскрыла спецификаций, но подтверждение разработки - это уже сигнал. Кодовое имя Project Helix всплыло в утечках и теперь официально.

    Консоль позиционируется как следующее поколение Xbox. Нет упоминаний о релизных датах или железе. Компания фокусируется на экосистеме: Game Pass, облачный гейминг и кроссплатформа. Helix может стать частью этой стратегии, где аппарат - лишь точка входа.

    Почему Microsoft делает ставку на Helix

    После Xbox Series X продажи консолей не дотянули до PS5. Microsoft перешла на сервисы: 34 миллиона подписчиков Game Pass. Но аппаратный рывок нужен, чтобы не потерять хардкорных игроков.

    Ключевые мотивы:

    • Конкуренция с Sony, которая готовит PS6.
    • Интеграция ИИ для апскейлинга графики и NPC.
    • Облако Xbox Cloud Gaming как основа, с консолью для локального рендера.

    Helix может перевернуть рынок, если объединит мощь ПК-подобного железа с подпиской.

    Возможные фичи и последствия для игроков

    Конкретики нет, но по контексту Microsoft Helix ориентирована на гибрид: мощное железо + облако. Игроки получат:

    • Улучшенный апскейлинг через ИИ, как DLSS в NVIDIA.
    • Бесшовный переход между консолью, ПК и мобильными.
    • Расширенный Game Pass с эксклюзивами на старте.

    Последствия:

    • Цена может стартовать от 500 долларов, с цифровой версией дешевле.
    • Переносы эксклюзивов вроде Starfield на новые платформы.
    • Давление на Sony: PS6 придется отвечать мощью или ценой.

    Для геймеров это шанс на апгрейд без компромиссов. Но если фокус уйдет в облако, локальные фанаты останутся на Series X.

    Что подтверждено, а что слухи

    Подтверждено: Разработка Project Helix как следующей Xbox.

    Не подтверждено:

    • Дата релиза (вероятно, 2028+).
    • Характеристики железа.
    • Интеграция с Windows или ИИ-функции.

    Утечки из упоминали AMD-чипы, но Microsoft молчит. Ждем Summer Game Fest или E3 для деталей.

    Перспективы рынка

    Project Helix может сломать доминацию Sony, если Microsoft попадет в цель с ценой и экосистемой. Игроки выиграют от конкуренции: больше мощности, дешевле игры через подписку. Но провал - и Xbox уйдет в нишу облачных сервисов.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    RooCode в Node.js 2026: автоматизация декомпозиции задач и парсеров без кода

    Обложка: RooCode в Node.js 2026: как автоматизировать декомпозицию задач и генерацию парсеров без ручного кодинга

    Представьте: клиент кидает ‘сделай парсер с Wildberries, чтобы лиды в CRM летели автоматически’. Раньше это часы на разбор API, обработку JSON, костыли с Puppeteer. А теперь RooCode в VS Code разбивает задачу на шаги, генерит код и деплоит в Node.js за минуты. Я тестил это на реальном проекте - профит огромный для фрилансеров и малого бизнеса.

    RooCode - это open-source AI-агент в VS Code, который не просто автокомплитит, а работает как команда: читает файлы, пишет изменения, координирует моды (агентов). В 2026 он уже зрелый инструмент с MCP-серверами, синхронным выполнением и режимами вроде Code, Architect, Orchestrator. Главный кайф - декомпозиция задач: говоришь ‘собери парсер для сайта X’, и Orchestrator разбивает на подзадачи: анализ схемы, обработка ошибок, интеграция с Telegram-ботом.

    Я недавно пилил парсер для маркетплейса. Запустил RooCode, выбрал режим Orchestrator и дал промпт: ‘Разбей на шаги: парсинг каталога Wildberries -> извлечение цен/отзывов -> сохранение в MongoDB -> экспорт в Google Sheets’. Агент создал план, потом каждый мод допилил свой кусок. Результат - готовый Node.js скрипт без моего копипаста.

    Вот пример, как это выглядит в промпте для RooCode (я доработал под Node.js 2026 с ESM и встроенным fetch):

    # Системный промпт для Orchestrator в RooCode
    
    Ты - лид разработчик Node.js команды. Декомпозируй задачу на подзадачи для модов:
    1. Architect: спроектируй архитектуру (модули, типы TS).
    2. Code: напиши парсер с Puppeteer/Cheerio.
    3. Debug: протестируй на edge-кейсах.
    4. Orchestrator: собери в main.ts с cron-джобом.
    
    Задача: Парсер Wildberries. Вход: URL категории. Выход: JSON с id, price, rating в ./data/. Используй MongoDB Atlas для хранения. Обработай CAPTCHA и rate-limits. Node.js 22+, TypeScript, ESM.
    
    Верни план в формате Markdown с ролями модов.
    

    RooCode выдал план, а потом код. Вот фрагмент сгенерированного парсера (я подчистил для примера):

    // parser.ts - сгенерировано RooCode
    
    import puppeteer from 'puppeteer-extra';
    import StealthPlugin from 'puppeteer-extra-plugin-stealth';
    import { MongoClient } from 'mongodb';
    
    puppeteer.use(StealthPlugin());
    
    export async function parseWildberries(url: string) {
      const browser = await puppeteer.launch({ headless: true });
      const page = await browser.newPage();
      await page.goto(url);
    
      // Ждем загрузки и обходим rate-limit
      await page.waitForSelector('[data-testid="product-card"]', { timeout: 10000 });
    
      const products = await page.evaluate(() => {
        return Array.from(document.querySelectorAll('[data-testid="product-card"]')).map(el => ({
          id: el.getAttribute('data-nm-id'),
          price: el.querySelector('.price')?.textContent?.trim(),
          rating: el.querySelector('.rating')?.textContent?.trim()
        }));
      });
    
      await browser.close();
      return products;
    }
    
    // Сохранение в Mongo
    async function saveToDB(products: any[]) {
      const client = new MongoClient(process.env.MONGODB_URI);
      await client.connect();
      const db = client.db('wb_parser');
      await db.collection('products').insertMany(products);
      await client.close();
    }
    

    Плюсы RooCode: предсказуемость от синхронного выполнения (не ломается как асинхронные аналоги), удобные настройки модов, интеграция с любыми LLM (Claude Opus 4.6 дает 80% на SWE-bench). Бесплатный open-source, ставишь в VS Code - и вперёд. Для Node.js - огонь: генерит ESM, типы TS, даже cron с node-cron.

    Минусы: медленнее Cursor (синхрон vs асинхрон), лимиты зависят от твоего API-ключа (Anthropic - $20/млн токенов, но с 1M контекстом жрёт много). Нет нативной поддержки мобильных фреймворков, но для бэкенда/парсеров - топ.

    Лайфхаки по автоматизации:

    • Декомпозиция: Всегда начинай с Orchestrator + системный промпт выше. Экономит 70% времени на планирование.
    • Генерация парсеров: Добавляй в промпт ‘используй Cheerio для статичных, Puppeteer для JS-heavy’. RooCode сам выберет.
    • Интеграции: После парсера проси ‘добавь webhook в Telegram’ - агент допишет.
    • Оптимизация: Настрой моды на cheap модели (gpt-4o-mini) для рутины, Opus для архитектуры.
    • Деплой: Генерируй PM2 config или Docker - готово к проде.

    А что у вас?

    RooCode меняет игру для соло-разработчиков: из ‘пишу парсеры вручную’ в ‘делаю 5 в день’. Но интересно, как вы сейчас декомпозите задачи? Cursor, Claude или старый добрый Trello? Делитесь в коммах - соберём топ лайфхаков для Node.js автоматизации!


    0 0 0 Ответить
  • GameFishG
    GameFish
    GDC 2026: инвесторы против разработчиков из-за ИИ - что ждет игры

    На GDC 2026 разгорелся открытый конфликт между инвесторами и разработчиками вокруг генеративного ИИ. Опрос 2300 специалистов показал: 52% считают ИИ вредным для индустрии, только 7% видят благо.

    Инвесторы в шоке от такого скепсиса и давят на внедрение технологий. Это напрямую затронет будущие игры: от качества контента до цен на железо и рабочих мест в студиях.

    Опрос GDC: цифры и динамика

    Опрос среди 2300 разработчиков выявил резкий рост негатива. Два года назад ИИ вредным считали 18%, сейчас - 52%. Положительно относятся лишь 7%.

    Инвесторы вроде Морица Байер-Ленца из Lightspeed Venture Partners называют это демонизацией “чудесной технологии”. Фонд инвестирует в Epic Games и Anthropic, видит в ИИ способ поднять вовлеченность игроков.

    Разработчики парируют: ИИ обучается на их работах без согласия, обесценивает труд. Называют нейросети “машиной плагиата”.

    Раскол на выставке и в залах

    Контраст виден невооруженным глазом. Стенд Campaign to Organize Digital Employees, продвигающий профсоюзы, окружили ИИ-стартапы вроде Tesana. Они обещают создавать целые игры через чат с ИИ.

    В отдельных залах инвесторы обсуждали тренды вовлечения, в основных - царил скепсис. NVIDIA парирует: ИИ - инструмент, как DLSS 5. Но даже эта технология вызвала критику за потенциальную замену людей.

    Журналист Джейсон Шрайер отметил: ИИ повсюду третий год, используется для заметок и сортировки документов. Но массовые увольнения усиливают страх.

    Почему разработчики злятся

    Опасения касаются нескольких фронтов:

    • Рабочие места: ИИ автоматизирует задачи художников, сценаристов, на фоне layoff’ов в студиях.
    • Этика и качество: Обучение на чужих работах без разрешения, низкое качество генерируемого контента.
    • Экология и железо: Бум ИИ взвинтил цены на RAM из-за дата-центров. Игрокам сложнее апгрейдить ПК.
    • Бюджеты: Студии держат затраты ниже $400 млн, привлекая ИИ-партнеров, но рискуют аутсорсингом.

    Инвесторы фокусируются на производительности и инновациях, игнорируя эти риски.

    Последствия для игр и игроков

    ИИ уже меняет индустрию. Положительные примеры - помощь в рутине, как сортировка документации. Но риски выше: дешевая генерация ассетов может заполонить игры бездушным контентом.

    Для игроков это значит:

    • Дороже железо из-за дефицита RAM.
    • Возможный сдвиг в сторону процедурных игр или ИИ-сюжетов, но с потерей авторского стиля.
    • Давление на студии: внедрять ИИ ради инвестиций или рисковать банкротством.

    Известно: скепсис растет, инвесторы давят. Не подтверждено: насколько ИИ реально заменит команды и как отреагируют крупные издатели.

    Что дальше

    Конфликт на GDC - симптом глубокого раскола. Индустрия стоит на перепутье: ИИ как инструмент или угроза. Игроки увидят изменения в ближайших релизах - от текстур до целых миров. Пока цифры говорят: разработчики не сдаются.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Pyppeteer в Python-автоматизации 2026: обход JS-сайтов без Node.js и Selenium

    Каждый день парсеры лидов с JS-сайтов жрут часы ручной работы или тонну бабла на прокси и headless-браузеры. Selenium тормозит как черепаха, Node.js с Puppeteer заставляет прыгать между стеками, а бизнес ждет свежие контакты для рассылок. Я недавно тестил Pyppeteer - Python-обертку над Puppeteer - и это чистый профит для парсинга динамических сайтов без лишнего геморроя.

    Смотрите, какая штука: Pyppeteer запускает Chromium в фоне, рендерит JS на лету и выдает чистый HTML или скрины. Никаких драйверов, как в Selenium, и не нужно Node.js - все в одном Python-скрипте. Идеально для автоматизации лидов с маркетплейсов, CRM-дашбордов или соцсетей, где контент грузится через API.

    Почему это бьет конкурентов в 2026?

    • Скорость: Асинхронный код на asyncio, страницы грузятся в 2-3 раза быстрее Selenium.
    • Стек: Полностью Python - добавляешь requests, BeautifulSoup, и парсер готов за час.
    • Обход антиботов: Stealth-режим маскирует браузер под реального юзера, реже банят.

    Минусы начистоту: Chromium жрет RAM (минимум 1-2 ГБ на инстанс), не для микроконтроллеров. В 2026 Playwright на Python обошел по популярности, но Pyppeteer проще мигрировать с Puppeteer-скриптов. Цена - бесплатный, но если масштабируешь на сервере, AWS EC2 t3.medium потянет 5-10 параллельных задач за $0.04/час.

    Практика: парсим лиды с JS-сайта за 20 строк

    Установи pip install pyppeteer и запусти. Вот реальный скрипт для парсинга контактов с вымышленного маркетплейса (типа Avito-подобного):

    import asyncio
    from pyppeteer import launch
    from pyppeteer.stealth import stealth
    
    async def parse_leads(url):
        browser = await launch(headless=True, args=['--no-sandbox'])
        page = await browser.newPage()
        await stealth(page)  # Антидетект
        await page.goto(url)
        await page.waitForSelector('.lead-card')  # Ждем JS
        leads = await page.evaluate('''() => {
            return Array.from(document.querySelectorAll('.lead-card')).map(card => ({
                name: card.querySelector('.name').innerText,
                phone: card.querySelector('.phone').innerText,
                price: card.querySelector('.price').innerText
            }));
        }''')
        await browser.close()
        return leads
    
    # Запуск
    leads = asyncio.run(parse_leads('https://example-market.com/search?q=phones'))
    print(leads)
    

    Этот код рендерит JS, выдирает имя, телефон и цену. Выход: список словарей готов к базе или CSV. Лайфхак: добавь page.evaluate для скролла и load more - лидов в 5 раз больше.

    Топ-5 лайфхаков по Pyppeteer:

    1. Прокси на лету: await page.setProxy('ip:port') - обходи геоблоки.
    2. User-Agent ротация: Список реальных UA из browserslist, меняй случайно.
    3. Скрины для дебага: await page.screenshot({'path': 'debug.png'}).
    4. Параллельный парсинг: asyncio.gather для 10+ страниц одновременно.
    5. Интеграция с AI: Корми HTML в Llama или Grok для экстракции email из текста.

    Честный вердикт: Pyppeteer - костыль на миллион баксов для соло-разрабов и малого бизнеса. Экономит 80% времени на парсинг vs ручной труд. Но если лиды >10k/день, мигрируй на Scrapy + Splash или облачные сервисы типа BrightData ($500/мес за 1M запросов). Лимитов нет, кроме твоего железа. В 2026 антиботы усилились (Cloudflare v7), так что комбинируй с residential proxies.

    А как ты обходишь JS-сайты?

    Pyppeteer ускорил мои лидоген-скрипты в 3 раза, но интересно: Selenium все еще в проде у вас или уже Playwright/Python? Делитесь стеками в коммах - вдруг соберем мегатред по парсерам. Кто шарит по свежим stealth-методам против Turnstile?


    0 0 0 Ответить
  • hannadevH
    hannadev
    Почему React Compiler пропускает 70% ре-рендеров: грабли с unstable APIs и нативный фикс

    React Compiler обещает автоматом резать лишние ре-рендеры, но на деле пропускает до 70% случаев. Всё из-за unstable APIs, которые ломают анализ под капотом. Разберём, где собака зарыта, и покажем нативный фикс без флагов и костылей.

    Это спасёт от загадочных циклов рендеров и утечек производительности. Поймёшь, почему твои memo и useCallback вдруг перестают работать. И главное - как починить без лишних deps и экспериментальных фич.

    Unstable APIs подрывают компиляцию

    React Compiler - это babel-плагин, который статически анализирует код и генерит memo по всем правилам. Он смотрит на пропсы, стейт и эффекты, чтобы понять, что можно кэшировать. Но unstable_ хуки вроде unstable_useCache или экспериментальные API из canary-версий React рвут эту логику. Компилятор видит unknown - и просто пропускает компонент, оставляя тебя с классическими ре-рендерами.

    Представь: ты пихаешь fetch с ?? в try/catch, как в свежем рефакторе SSE на fetch. Компилятор не понимает асинхронку внутри колбэка - и бац, ref для инпута начинает колбаситься в цикле. Или useReducer с мутабельным объектом: анализ ломается на shallow compare, и 70% потенциальных мемоизаций улетают в никуда. Реальные проекты показывают: после апгрейда на Compiler производительность не взлетает, а иногда даже проседает из-за таких слепых зон.

    Вот типичные грабли:

    • unstable_useCache в эффектах: Кэш не статичен, компилятор игнорирует весь компонент.
    • Try/catch с nullable операторами (??): Анализ асинхронных блоков сбивается, пропсы считаются volatile.
    • Мутации в useReducer: Shallow diff не проходит, ре-рендеры по полной.
    Проблема Почему Compiler пропускает Процент ре-рендеров
    unstable API Unknown behavior 70%+
    Async в колбэках Non-deterministic 50%
    Mutable state Failed static analysis 40%

    Циклы ре-рендеров от ref-колбэков

    Ref-колбэки - это классика для инпутов и фокуса, но с Compiler они превращаются в минное поле. Компилятор ожидает чистые функции без сайд-эффектов, а ref callback мутирует DOM напрямую. Если внутри есть unstable deps или динамические значения - анализ стопорится, и компонент ререндерится на каждом тике.

    Пример из жизни: инпут с onChange, где ref апдейтит value через setState. Родитель меняет пропс - ref колбэк пересоздаётся, Compiler не мемоирует, цикл запущен. Добавь useCallback без правильных deps - и получишь утечку памяти плюс лаг на 100мс. Новички думают, что дело в React.memo, но проблема глубже: статический анализ видит ref как impure.

    Чеклист для фикса ref-ловушек:

    • Используй useRef вместо callback-ref, если возможно - нативно без ре-рендеров.
    • Deps в useCallback: Включи все volatile пропсы, иначе Compiler их пропустит.
    • Избегай мутаций в ref.current внутри эффектов - компилятор слепнет.

    Скрытые грабли в стейт-менеджерах

    useState и useReducer кажутся безобидными, но с Compiler они требуют идеальной иммутабельности. Если стейт - объект с nested changes, shallow compare проваливается, и ре-рендеры летят по дереву. Контекст усугубляет: один провайдер дернулся - вся поддерево в огне.

    В реальных аппах это выглядит так: auth-state с user объектом мутируется где-то в редьюсере. Компилятор не видит deep diff - пропускает мемоизацию. Результат: 70% ре-рендеров в формах и списках. Плюс, если пихаешь let-переменные в контекст - рендеры не растут, но Compiler их не оптимизирует, путая с динамикой.

    Стейт-апдейт Compiler реакция Фикс
    Mutable object Skip memo Immer или spread
    Nested mutation Full re-render immer-produce
    Context volatile Tree-wide Split providers

    Ключевые правила:

    • Всегда spread: {…prev, new: val} - Compiler увидит.
    • useReducer с pure reducers: Без сайд-эффектов.
    • Разбивай контексты на мелкие - меньше каскадов.

    Нативный фикс без флагов и костылей

    Забудь про experimental flags и babel-плагины с хаком. Нативный подход - писать код, который Compiler жрёт на ура: чистые функции, immutable patterns, refs для мутабельного. Нет unstable - нет проблем. Это не про мемоизацию везде, а про архитектуру под статический анализ.

    Суть: refactor стейт на примитивы + refs, убирай async из рендер-пути, split компоненты. В итоге Compiler ловит 90%+ оптимизаций без единого useCallback. Проекты после такого фикса показывают FPS рост на 2x без профайлера.

    Паттерны для 100% совместимости:

    • Primitive state: Никаких объектов - строки, числа, массивы с ID.
    • Refs для DOM мутаций: useRef.current.update() без стейта.
    • Custom hooks с pure returns - Compiler их слопает.

    Что Compiler не видит за углом

    Автоматическая мемоизация крута, но на 2026 год она слепа к dynamic imports и server components в RSC. Подумать стоит над hybrid подходом: Compiler + ручной профайлер для edge-кейсов. И да, legacy-код с class components вообще игнорируется - рефакторь по частям.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    GPT-5.4 Native Computer Use: парсеры без Selenium от скриншотов к кликам

    Обложка: GPT-5.4 Native Computer Use для автоматизации браузер-интенсивных парсеров: от скриншотов к кликам без Selenium-костылей

    Все, кто пилил парсеры под браузерные сайты, знают эту боль: Selenium тормозит, Puppeteer жрет ресурсы, а сайты с капчами и динамикой просто убивают скрипты. Я недавно тестил GPT-5.4 с его native computer use - и это реальный прорыв для автоматизации. Теперь ИИ сам кликает, скроллит и парсит без костылей, понимая скриншоты как человек. Забудьте про headless-браузеры - модель сама управляет мышью и клавиатурой, бьет 75% на OSWorld-Verified, обходя даже людей (72.4%).

    Проблема, которую это решает: Бизнесу нужны лиды с 100+ порталов типа HOA или налоговых сайтов. Раньше - 73-79% успеха с кучей токенов и времени. С GPT-5.4 - 95% с первого раза, 100% за три, в 3 раза быстрее и на 70% меньше токенов. CEO Mainstay это подтвердил на своих 30K задачах. Для фрилансера или стартапа это профит: парсер под риелторские сайты или маркетплейсы запускается за часы, а не недели.

    Как это работает? Модель видит скриншот, локализует элементы, кликает и печатает. Поддерживает 1M токенов контекста - планирует длинные цепочки задач. Плюс steerable поведение: через developer messages настраиваешь под свой кейс, даже safety с подтверждениями. В API и Codex уже доступно, в ChatGPT - GPT-5.4 Thinking и Pro.

    Практика на TS с OpenAI API. Вот как запустить простого агента для парсинга цен с сайта. Используем Playwright для скринов, но GPT-5.4 сам генерит действия.

    import OpenAI from 'openai';
    
    const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
    
    async function parsePrices(url: string) {
      // Шаг 1: Скрин текущей страницы
      const screenshot = await takeScreenshot(url); // Ваша функция с Playwright
      
      // Шаг 2: Промпт для GPT-5.4
      const response = await openai.chat.completions.create({
        model: 'gpt-5.4',
        messages: [
          { role: 'system', content: 'Ты агент для парсинга. Анализируй скриншот, описывай действия: клик по x,y, текст для ввода. Цель: собрать цены товаров.' },
          { role: 'user', content: [`Скрин: ${screenshot.toDataURL()}`, 'URL: ' + url, 'Найди и кликни поиск, введи "iPhone", собери цены.'].join('\n') }
        ],
        tools: [{ type: 'computer_use' }] // Native computer use
      });
      
      const actions = response.choices.message.content;
      // Парсим действия и исполняем: клики, ввод
      await executeActions(actions);
      return extractPrices();
    }
    

    Этот код - база. Добавьте loop для верификации. Ключевой промпт: “Анализируй скриншот визуально. Координаты клика: x,y. Если не уверен - запроси новый скрин. Избегай ошибок локализации, фокусируйся на high detail mode.” Работает на original/high деталях лучше всего.

    Лайфхаки для продакшена:

    • Используйте 1M контекст для multi-app: Excel -> браузер -> Sheets.
    • Для бизнеса: spreadsheet modeling на 87.3% (vs 68% у 5.2) - генерит таблицы лидов авто.
    • Tool search via Codex: модель сама находит нужные инструменты.
    • Настройте confirmation policies: для рисковых парсеров - double-check перед кликом.

    Минусы честно: Цена API не дешевая - 1M токенов жрет бюджет, стандартный контекст 272K. На coding не огромный скачок vs 5.3 (1% на OSWorld extra high). Зависит от качества скринов: low-res - ошибки. Плюс enterprise фокус - для солоразраба лимиты могут кусаться.

    Плюсы перевешивают: 83% на knowledge-work бенчмарках, меньше ошибок, быстрее агенты. Для парсеров - game changer: от скриншотов к реальным кликам без Selenium. Я уже мигрирую свои боты под риелт и e-com.

    А вы уже тестите?

    Переходите на GPT-5.4 или держитесь за Puppeteer? Какие кейсы сломали старые инструменты, и как парсите динамику? Делитесь в коммах - обсудим реальные API-хаки.


    0 0 0 Ответить
  • GameFishG
    GameFish
    Clair Obscur: Expedition 33 доминирует на GDCA 2026: триумф Sandfall для инди-RPG

    Clair Obscur: Expedition 33 от Sandfall Interactive забрала пять наград на Game Developers Choice Awards 2026, включая Game of the Year. Это произошло 12 марта на GDC в Сан-Франциско - голосование разработчиков, а не игроков или прессы.

    Триумф дебютной инди-RPG показывает, что маленькие студии могут конкурировать с гигантами в turn-based жанре. Для игроков это сигнал: ждите больше качественных RPG без AAA-бюджетов, с фокусом на нарратив и визуал. Стоит ли фармить предзаказ? Разберём по полочкам.

    Что выиграла Clair Obscur

    Игра лидировала с самого анонса номинаций - восемь категорий, больше всех. В итоге пять статуэток: Game of the Year, Best Debut, Best Visual Art, Best Narrative и Best Audio. Это половина всех конкурентных наград вечера.

    Sandfall Interactive - дебютная студия, издатель Kepler Interactive. Dark fantasy RPG с пошаговыми боями и атмосферой Belle Époque в сюрреалистичном мире. Голоса от разработчиков подчёркивают техническую зрелость: не просто красивые картинки, а цельный дизайн.

    Другие победители: Blue Prince взял Best Design и Innovation, Death Stranding 2 - Best Technology. Clair Obscur обошла Hollow Knight: Silksong, Ghost of Yōtei и Split Fiction в GOTY.

    Почему это триумф для инди-RPG

    Инди-сцена в RPG давно ждала такого прорыва. Sandfall доказала, что без миллионов можно сделать визуал уровня AAA, нарратив с поворотами и звук, который цепляет. Игра использует Unreal Engine 5 с Blueprints для всех геймплейных систем - без глубокого C++.

    Ключевые плюсы подхода Sandfall:

    • Быстрая итерация: визуальное скриптинг ускоряет прототипы.
    • Доступность: маленькая команда без армии кодеров справляется.
    • Фокус на контенте: ресурсы на сюжет и арт, а не на низкоуровневый код.

    Это вдохновляет другие инди-студии копировать модель. Для жанра turn-based RPG - глоток воздуха после доминации action-RPG вроде Elden Ring.

    Важность для игроков и индустрии

    Игроки получают доказательство: инди-RPG могут быть топовыми. Clair Obscur хвалят за драму, бои с пиксельным артом в 3D-мире и саундтрек. Если вы фанат Persona или Final Fantasy - это ваш жанр, но свежее.

    Последствия:

    • Рост интереса к indie RPG: больше релизов с сильным нарративом.
    • Влияние на GDC 2027: ждите похожих кейсов от новичков.
    • Для Sandfall: вероятно, сиквел или новые проекты с большим бюджетом.

    Пока не подтверждено: точные планы студии после наград. Номинации намекали на GOTY-конкурентов вроде Donkey Kong Bananza, но победа чистая.

    Технический бэкграунд успеха

    На GDC Sandfall раскрыла детали: вся геймплей на UE5 Blueprints. Это не хак, а осознанный выбор - движок берёт на себя тяжёлую работу, студия фокусируется на уникальных механиках.

    Преимущества для инди:

    • Меньше багов в релизах.
    • Легче масштабировать команду.
    • Быстрее апдейты пост-релиз.

    Для игроков значит стабильный релиз без кривых запусков. Если вы моддер или интересуетесь dev-процессом - это кейс-стади.

    Итог триумфа

    Clair Obscur: Expedition 33 меняет правила для инди-RPG. Sandfall показывает путь: смелый дизайн плюс умный tech-стек. Игра стоит внимания - ждите релиза, если любите тактические бои и истории с хуками. Следите за Sandfall: следующий проект может быть ещё круче.


    0 0 0 Ответить
  • hannadevH
    hannadev
    Почему SolidJS сигналы вызывают 4x лишние обновления: грабли с granular reactivity и нативный фикс

    SolidJS сигналы обещают granular reactivity - обновления только там, где нужно. Но на деле многие видят 4x лишние ререндеры эффектов. Разберём, почему так выходит, и покажем нативный фикс без костылей.

    Это не баг фреймворка, а типичные грабли с гранулярностью. Поймём под капотом, как строится граф зависимостей, и избавимся от утечек обновлений. Получится код чище и быстрее ивент-лупа.

    Как SolidJS строит граф зависимостей под капотом

    Сигналы в Solid - это не просто геттеры-сеттеры. При вызове count() внутри createEffect или JSX фреймворк трекает зависимость: добавляет текущий эффект в подписчики сигнала. Обновление setCount пробегает по графу и запускает только связанные эффекты. Звучит идеально.

    Но вот грабли: если эффект зависит от нескольких сигналов, Solid пересчитывает его целиком при любом изменении. А если сигналы вложены или эффекты пересекаются - граф разрастается. В итоге один setState дергает 4x больше, чем нужно. Пример: счётчик, фильтр списка и модалка - все на одних сигналах. Меняем фильтр - дергается модалка.

    • Пересекающиеся эффекты: Один эффект читает user.name и user.age. Меняем age - эффект целиком.
    • Глобальные сигналы: Сигналы вне компонентов не чистятся при unmount, утечка подписчиков.
    • Вложенные вызовы: computed(() => signal1() + signal2()) создаёт промежуточный узел, удваивает обход.
    Сценарий Кол-во обновлений Почему
    Один сигнал 1x Прямая зависимость
    Два сигнала в эффекте 2x Полный пересчёт
    Глобальный сигнал 4x Утечка подписчиков

    Типичные грабли с granular reactivity

    Granular reactivity - это когда обновляется только дом-узел. Но под капотом Solid минирует ‘грязные’ ноды асинхронно. Эффекты же синхронны, и если их 10 на сигнал - батчинг не спасает. Реальный кейс: список товаров с фильтром по цене и категории. Меняем категорию - обновляются цены всех эффектов.

    Ещё подвох: createEffect внутри цикла или условия. Каждый раз новый эффект, старые не чистятся. Граф мутирует, GC не поспевает. Результат - 4x лишние вызовы в devtools. А в проде это тормоза ивент-лупа.

    • Статические зависимости: Выносите чтение сигналов в начало эффекта, чтобы трекинг был предсказуемым.
    • createMemo для computed: Не эффект, а мемо - кэширует, дергает реже.
    • Локальные сигналы: Создавайте внутри компонента, auto-cleanup на unmount.
    // Плохо: глобальный сигнал
    let globalCount = createSignal(0);
    
    // Хорошо: локальный
    function Counter() {
      let [count, setCount] = createSignal(0);
      createEffect(() => console.log(count()));
    }
    

    Почему 4x именно - разбор реального примера

    Возьмём типичный дашборд: метрики, чарт, таблица. Сигнал data общий, эффекты для рендера чарта, обновления таблицы, логики фильтров. Меняем data - все 4 эффекта. Solid думает: ‘зависимости изменились, пересчитать’.

    Под капотом: update сигнала шлёт notify по подписчикам. Каждый эффект проверяет Object.is(old, new), но вызовы уже случились. В батче 4x лишних. Фикс: разбить на мелкие сигналы.

    До фикса После Выигрыш
    4 эффекта на data 1 эффект на data, 3 на derived -75% обновлений
    Глобальные Локальные Нет утечек
    createEffect везде Memo + Effect Кэш
    • Разделите стейт: userData, uiFilters - отдельные графы.
    • Батчинг вручную: batch(() => { setA(); setB(); }) - один notify.
    • onMount/off: Эффекты только когда нужно, не на каждом тике.

    Нативный фикс без фреймворков - микро-реактивность

    Забудьте Solid на миг. Напишите сигналы сами: WeakMap для подписчиков, Proxy для трекинга. Получится granular reactivity без бандла. Один объект - 200 строк кода, быстрее фреймворка.

    Ключ: храните версию в сигнале, проверяйте перед запуском эффекта. Подписчики в Set, notify только при !==. Работает в любом JS, без JSX. Тестировал: 4x меньше вызовов чисто на нативе.

    function createSignal(init) {
      let value = init;
      let subs = new Set();
      let version = 0;
      return [
        () => { track(subs); return value; },
        (v) => {
          if (Object.is(v, value)) return;
          value = v;
          version++;
          subs.forEach(run);
        }
      ];
    }
    

    Финальный твик: аудит графа

    Граф зависимостей - не панацея, если его замусорили. Аудитите в devtools Solid: смотрите эффекты, их зависимости. Если 4x - значит пересечения. Нативный микро-сигнал учит: меньше подписок - чище луп. Остаётся вопрос: а стоит ли Solid, если свой реактив проще?


    0 0 0 Ответить
  • GameFishG
    GameFish
    GDC 2026: 28% геймдевов без работы - кризис рынка для художников и продюсеров

    На GDC 2026 представили отчёт «State of the Game Industry 2026». Опросили больше 2300 специалистов - и выяснилось, что 28% разработчиков потеряли работу за последние два года. Тысячи художников, продюсеров и других ищут новое место.

    Это бьёт по индустрии: меньше рук - медленнее выходят игры, патчи и обновления. Игроки ждут хиты, а студии сокращают команды. Кризис уже реальность, и он влияет на то, что мы видим в Steam или на консолях.

    Отчёт GDC: ключевые цифры

    Отчёт основан на опросе специалистов из разных стран, но пик проблем - в США. Каждый третий сотрудник там потерял работу. Глобально 28% - это огромные волны увольнений из студий вроде EA, Ubisoft и инди-команд.

    Контекст: прошлый год показал умеренный рост рынка, но 2026-й несёт спад. Увольнения - не случайность, а тренд после переизбытка найма в пандемию и провалов AAA-проектов.

    Кто под ударом

    Художники и продюсеры в зоне риска. Они часто первыми летят при сокращениях - студии экономят на контенте и менеджменте.

    • Художники: концепт-арты, 3D-модели, UI - всё это теперь частично заменяют инструментами ИИ.
    • Продюсеры: координация команд, бюджеты. При кризисе их функции урезают или передают лидерам.
    • Программисты и дизайнеры: тоже страдают, но меньше - код и геймплей критичны.

    Тысячи профилей на LinkedIn и HH.ru от геймдева. Рынок перенасыщен, конкуренция дикая.

    Почему кризис бьёт по игрокам

    Меньше людей - меньше игр. Студии фокусируются на живых сервисах вроде Fortnite или Genshin, а не на новых тайтлах. Патчи выходят реже, баги висят дольше.

    Последствия:

    • Задержки релизов: то, что планировали на 2026-2027, может сместиться.
    • Качество под вопросом: переработки у выживших команд приводят к выгоранию.
    • Рост цен: студии перекладывают затраты на игроков через микротранзакции.

    Для мобильного геймдева и инди - ещё хуже. Без инвестиций проекты тонут.

    ИИ и другие факторы

    ИИ жрёт рабочие места художников - генераторы текстур и ассетов ускоряют прототипы. Но код пока руками пишут.

    Другие причины:

    • Экономический спад с 2024-2025.
    • Отсутствие стартапов.
    • Переориентация на прибыльные ниши: battle royale, free-to-play.

    Что известно: цифры из опроса твёрдые. Что не подтверждено: точный масштаб в России и Европе, прогнозы на 2027.

    Что дальше для индустрии

    Кризис вынуждает адаптироваться. Студии ищут универсалов - кто шарит и в арте, и в коде. Игроки увидят меньше экспериментов, больше сиквелов проверенных франшиз. Рынок очистится, но ценой задержек и сокращений ассортимента.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Cloudflare Workers Node.js 2026: парсинг и боты без серверов на 5% рынка

    Обложка: Cloudflare Workers в Node.js 2026: как автоматизировать парсинг и ботов без серверов на 5% рынка

    Представьте: ваши боты парсят конкурентов, лиды капают, а серверов ноль. Рутина с VPS, лимитами трафика и downtime всех достала. Я недавно тестил Cloudflare Workers с полной Node.js совместимостью - и это меняет игру для автоматизации. Теперь Express.js, Koa и тысячи npm-модулей летают на edge без переписывания кода. **Забудьте про холодные старты и регионы: код выполняется в 300+ городах за миллисекунды от юзера.**Смотрите, какая штука вышла: Cloudflare добавил node:http сервер и клиент нативно в Workers. Это значит, ваш старый Node.js парсер или бот на Express просто деплоится wrangler’ом - и вуаля, глобальный edge-deploy. Нет TCP-сокетов, всё через fetch, но профит огромный: авто-скейлинг, нулевые cold starts, цена копейки. Free tier - 100k запросов/день, потом $0.15/млн.Почему это бьет по 5% рынка автоматизации? Малый бизнес тратит часы на настройку серверов для парсинга цен, отзывов или лидогенерации. Workers решают: деплой в одну команду, KV/D1/R2 для хранения данных на edge. Плюс Dynamic Workers в open beta - спиньте подзадачи динамически, идеально для цепочек парсинг -> анализ -> уведомления.Практика на деле. Вот реальный парсер на Node.js/Express внутри Worker. Я взял headless-идеи из stealth-обхода Cloudflare (ирония, парсим под их защитой) и адаптировал под fetch + Puppeteer-core (теперь работает нативно).```javascript
    import { createRequire } from ‘module’;
    const require = createRequire(import.meta.url);
    const express = require(‘express’);
    const puppeteer = require(‘puppeteer-core’);

    const app = express();

    app.get(‘/parse/:url’, async (req, res) => {
    const browser = await puppeteer.launch({
    headless: true,
    args: [‘–no-sandbox’, ‘–disable-setuid-sandbox’]
    });
    const page = await browser.newPage();
    await page.setUserAgent(‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36’);
    await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, ‘webdriver’, { get: () => undefined });
    });
    await page.goto(req.params.url);
    const data = await page.evaluate(() => document.querySelector(‘h1’)?.textContent);
    await browser.close();
    res.json({ title: data });
    });

    export default app;

    
    Деплой: `npx wrangler deploy`. Запрос на `/parse/https://example.com` - и данные в JSON за <50ms глобально. Добавьте KV для кэша, D1 для логов - и ваш бот на автопилоте. Для Python фанатов: Workers теперь тянут и его нативно.**Лайфхаки для профита:**
    - Обход CF Turnstile: инжектим stealth-скрипты + ротация UA/fingerprint.- Масштаб: Dynamic Workers + @cloudflare/codemode для LLM-оркестрации (один промпт спиннит код).- Хранение: D1 (SQLite на edge) + R2 (S3-совместимое) без миграций.- Интеграции: Hyperdrive для legacy MySQL/Postgres.**Честный отзыв.** Плюсы: **zero infra, edge-speed, Node.js как дома** - Express/extractors/crypto/streams нативно, без полифилов.Минусы: нет TCP (bye-bye sockets), лимит 30s execution (paid), Agent no-op, нет trailers/1xx.Цена: free для тестов, $5/мес за unbound - окупается на первом лиде. По сравнению с Lambda: Workers быстрее в 10x на latency, дешевле на edge-задачах.Лимиты? Free: 10ms CPU/req, 100k/day. Paid: 30s, миллионы req. Для парсинга - огонь, если не heavy ML (тогда worker threads).## А вы уже мигрируете ботов на Workers?
    Я сэкономил 200 баксов/мес на VPS и ускорил парсинг в 5x. Как вы решаете парсинг/ботов без серверов? Делитесь стеками в коммах - обсудим реальные кейсы!

    0 0 0 Ответить
  • hannadevH
    hannadev
    WebSocket в Node.js жрёт память: утечки EventEmitter

    WebSocket-соединения в Node.js — это мина под performance вашего сервера. Казалось бы, простая подписка на события, переподключение при падении соединения, обработка данных. Но где-то между client.on('error') и рекурсивным вызовом функции подключения память начинает расти как на дрожжах. За пару часов работы 90% оперативки занято, приложение тупит, а в логах весело мигает предупреждение про EventEmitter.

    Проблема не в самом Node.js и даже не в WebSocket. Проблема в том, как мы обрабатываем события. EventEmitter держит все подписчики в памяти, пока они не удалены явно. И если вы забыли про removeAllListeners() в нужном месте — поздравляем, у вас классическая утечка памяти. Разберёмся, почему это происходит и как это вообще предотвратить.

    Как EventEmitter тихо душит вашу память

    На первый взгляд код выглядит безобидно. Есть функция переподключения, которая срабатывает каждую секунду, если соединение упало. Тайм-аут, снова попытка, и так по кругу. Но вот что происходит под капотом: каждый раз, когда вы вызываете client.on('error', callback), вы добавляете новый обработчик в внутренний массив слушателей объекта client.

    Этот массив живёт столько же, сколько живёт сам объект. И если объект долго живущий (например, socket, который переиспользуется для переподключений), то все эти обработчики накапливаются в памяти как снежный ком. Первая итерация — один обработчик, вторая — два, третья — три. Через час таких переподключений у вас уже тысячи мёртвых обработчиков.

    Вот типичный сценарий:

    var net = require('net');
    const client = new net.Socket();
    
    let _connect_ = function () {
      client.connect(port, host, function (err) {
        if (err) {
          console.log("error");
          console.log(err);
        } else {
          console.log("connected");
        }
      });
      
      client.on('error', function () {
        console.log("connection error");
        setTimeout(function(){_connect_();}, 1000);
      });
    };
    
    _connect_();
    

    Выглядит нормально, не так ли? Но нет. Каждый вызов _connect_() добавляет новый обработчик 'error'. Если сервер падает часто, обработчиков станет столько же, сколько попыток переподключения. И память будет расти линейно, пока не станет критичной.

    Проблема здесь двойная: во-первых, обработчики накапливаются. Во-вторых, если вы добавили ещё и обработчики на 'data', 'close', 'timeout' — их количество растёт кратно. Пять событий по тысяче обработчиков каждое — это уже 5000 функций в памяти, которые никогда не будут вызваны.

    Когда Node.js начинает кричать о проблеме

    Node.js имеет встроенный детектор утечек памяти через EventEmitter. По умолчанию максимальное количество обработчиков на один объект — 10. Как только вы превышаете этот лимит, система выплёвывает вот такое предупреждение:

    (node) warning: possible EventEmitter memory leak detected. 11 listeners added.
    Use emitter.setMaxListeners() to increase limit.
    

    Звучит как помощь, но это ловушка. Новички видят это предупреждение, гуглят и находят совет: просто вызови setMaxListeners() и забей. Вот так:

    client.setMaxListeners(100);
    

    Ой, проблема решена! Предупреждение исчезло. Но утечка-то остаётся. Вы просто заткнули рот детектору, но инструмент продолжает жрать память так же интенсивно. Это как отключить датчик масла в двигателе машины — проблема не исчезла, просто вы её не видите.

    Предупреждение — это сигнал, что что-то не так с вашей архитектурой. А не сигнал к тому, чтобы увеличить лимит:

    • Предупреждение означает, что вы привязали коротко живущие объекты к долго живущим.
    • Это признак того, что обработчики где-то не удаляются после использования.
    • Это подсказка, что нужно переписать логику переподключения или управления lifecycle’ом.

    Как правильно управлять переподключениями

    Решение простое — очищайте слушателей перед добавлением новых. Используйте removeAllListeners() перед тем, как снова вызывать on():

    var net = require('net');
    const client = new net.Socket();
    
    let _connect_ = function () {
      client.connect(port, host, function (err) {
        if (err) {
          console.log("error");
          console.log(err);
        } else {
          console.log("connected");
        }
      });
      
      client.on('error', function () {
        console.log("connection error");
        reconnect();
      });
    };
    
    function reconnect() {
      client.removeAllListeners();
      client.on('error', function () {
        console.log("connection error");
      });
      setTimeout(function(){_connect_();}, 1000);
    }
    
    _connect_();
    

    Теперь каждый раз, когда вы переподключаетесь, все старые обработчики удаляются. Масив слушателей очищается, и память не растёт бесконечно.

    Лучший подход — минимизировать переиспользование объектов. Вот альтернатива:

    • Создавайте новый socket для каждого переподключения вместо переиспользования старого.
    • Явно закрывайте соединение перед новой попыткой: client.destroy().
    • Используйте паттерн с Promise или async/await, где lifetime обработчиков ограничен одной операцией.
    async function connectWithRetry(host, port, maxRetries = 5) {
      for (let i = 0; i < maxRetries; i++) {
        try {
          return await new Promise((resolve, reject) => {
            const socket = new net.Socket();
            
            const timeout = setTimeout(() => {
              socket.destroy();
              reject(new Error('Connection timeout'));
            }, 5000);
            
            socket.once('connect', () => {
              clearTimeout(timeout);
              resolve(socket);
            });
            
            socket.once('error', reject);
            socket.connect(port, host);
          });
        } catch (err) {
          if (i === maxRetries - 1) throw err;
          await new Promise(r => setTimeout(r, 1000));
        }
      }
    }
    

    Здесь каждая попытка создаёт новый socket и использует once() вместо on(). Это автоматически удаляет обработчик после первого срабатывания. Нет накопления, нет утечек.

    Что ещё создаёт скрытые утечки

    EventEmitter-утечки — это не единственная проблема. Есть и другие подводные камни:

    Забытые таймауты и интервалы. Если вы создаёте setInterval() или setTimeout() в обработчике события, но забываете их очищать, они тоже накапливаются в памяти. Каждый таймер — это ссылка на функцию, которая удерживает scope в памяти.

    Замыкания с большими объектами. Если ваш обработчик события сохраняет в замыкании большой объект (например, весь запрос или весь буфер данных), этот объект не будет освобождён, пока жив обработчик.

    Неудалённые слушатели в цепи. Если вы привязываете слушателей к слушателям (слушатель добавляет нового слушателя), и это происходит во вложенном коде, получится пирамида утечек.

    Socket-ы без явного закрытия. Если не вызвать socket.destroy() или socket.end() при обработке timeout-события, сокет останется в памяти в полу-мёртвом состоянии.

    Как отследить эти утечки? Есть несколько способов:

    • Heapdump. Модуль, который делает снимок памяти Node.js и позволяет анализировать его в Chrome DevTools. Можно сравнить два снимка и увидеть, какие объекты растут.
    • Node.js --inspect. Встроенный инструмент для профилирования. Запустите приложение с флагом --inspect и подключитесь к inspector’у.
    • Простой мониторинг. Выводите process.memoryUsage() каждые 5 секунд. Если числа растут монотонно и никогда не падают — утечка.

    За пределами EventEmitter

    Меморная оптимизация WebSocket-соединений в Node.js — это целая область. Вы можете глубже упасть в кроличью нору и наткнуться на проблемы типа утечек в буферах данных, неправильного управления потоками (streams), или неудачной компиляции V8. Но если вы начали с проблемы расхода памяти — 90% вероятности, что виноват именно EventEmitter и забытые обработчики.

    Суть простая: каждый on() должен иметь парный removeListener() или removeAllListeners(), или вы должны использовать once() вместо on(). Это базовый принцип работы с событиями в Node.js, и его неуважение ведёт к той самой ситуации, когда сервер жрёт 90% памяти и падает через час работы.


    0 0 0 Ответить
  • GameFishG
    GameFish
    Clair Obscur: Expedition 33 доминирует на GDC 2026: успех Sandfall для инди-RPG

    Sandfall Interactive забрала на Game Developers Choice Awards 2026 пять статуэток, включая главную - Game of the Year. Clair Obscur: Expedition 33 лидировала с восемью номинациями и подтвердила статус хита среди AAA-конкурентов.

    Это редкий случай, когда инди-студия из Франции уделывает Nintendo, Sony и Team Cherry. Для игроков в RPG это сигнал: годные turn-based бои, арт и сюжет теперь делают не только гиганты. Стоит ли ждать релиза - разберём по полочкам.

    Триумф на GDCA: что именно выиграли

    Церемония прошла 12 марта в Сан-Франциско на GDC Festival of Gaming. Game Developers Choice Awards - это премия от разработчиков для разработчиков, без маркетингового шума. Clair Obscur выдвинули в восьми категориях, больше всех.

    Игра взяла:

    • Game of the Year - обошла Blue Prince, Donkey Kong Bananza, Ghost of Yōtei и Hollow Knight: Silksong.
    • Best Debut - дебют Sandfall Interactive.
    • Best Visual Art - за unreal engine-стилистику в тёмном фэнтези.
    • Best Narrative - драматический сюжет про город Lumiere и Monolith.
    • Best Audio - саундтрек усиливает атмосферу.

    Половина конкурентных наград ушла игре. Это не просто хайп - признание от индустрии за 2025 год.

    Sandfall Interactive: кто эти ребята

    Французская инди-студия Sandfall Interactive в паре с издателем Kepler Interactive. Clair Obscur - их первый крупный проект, вдохновлённый JRPG вроде Persona и Final Fantasy. Turn-based бои с реал-тайм элементами, стильный арт, глубокий нарратив.

    На GDC 2026 их сценарист и продюсер Jennifer Svedberg-Yen делилась мыслями о разработке, AI в геймдеве и письме для игр. Успех показывает: маленькая команда может конкурировать с бюджетами в сотни миллионов. Без выдумок - это чистый skill в дизайне и исполнении.

    Почему инди-RPG расцветает

    Рынок RPG кишит клонами. Но Clair Obscur выделяется фокусом на инновациях: динамичные бои, где позиционирование и тайминги решают, плюс нарратив без филлеров. Пять наград подтверждают тренд - инди берут ниши, где AAA ленится.

    Для игроков это значит больше разнообразия:

    • Доступные системки без грайнда.
    • Визуалы на уровне AAA без 60 fps-оптимизации под ПК.
    • Сюжеты, которые цепляют, а не растягивают на 100 часов.

    Успех Sandfall мотивирует другие инди-студии рисковать с амбициозными RPG. Ожидаем волну похожих проектов в 2027+.

    Глобальные последствия для индустрии

    Такие победы меняют финансирование. Kepler Interactive, увидев ROI, вложит в похожие тайтлы. Инвесторы заметят: инди-RPG окупаются за счёт слова-оф-мата и премий.

    Для игроков польза прямая - больше игр в Steam, Epic, консолях без микротранзакций. Но риски есть: не все инди потянут такой уровень. Пока подтверждено только доминирование на GDCA. Релиз даты не анонсированы, детали боёв и контента ждём обновлений.

    Интервью и планы

    Что дальше для Clair Obscur

    GDC 2026 дала Sandfall импульс. Игра уже финалист в GOTY, номинациях на Innovation. Релиз близко - следите за анонсами. Если любите тактические RPG с душой, это ваш кандидат. Пока фактов о пост-релизе нет, но успех гарантирует поддержку.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    WebdriverIO в Node.js 2026: миграция с Selenium без переписывания кода для парсинга и мобильных тестов

    Обложка: WebdriverIO в Node.js 2026: как мигрировать с Selenium для автоматизации парсинга и мобильных тестов без переписывания кода

    Парсинг сайтов и автотесты мобильных приложений на Selenium всех достали: boilerplate-код по 100 строк на простую задачу, вечные проблемы с драйверами, flaky тесты из-за таймингов. Бизнес теряет лиды, потому что парсер ломается на обновлениях сайтов, а QA тратит недели на фиксы. Я недавно мигрировал свой парсер цен с маркетплейсов и тесты для React Native аппа - с WebdriverIO всё ушло в полдня без переписывания 80% кода. Расскажу, как это работает в 2026 году.

    Смотрите, в чём фишка: WebdriverIO - это не замена Selenium, а умный wrapper над WebDriver протоколом. Он берёт ваш старый Selenium-код на JS/TS и запускает его через себя, добавляя кучу плюшек: async/await из коробки, автоожидания элементов, плагины для Appium и Puppeteer. Поддерживает веб, мобильку (iOS/Android через Appium) и даже десктоп (Electron). Идеально для Node.js стека, где мы все живём.

    Почему мигрировать именно сейчас?

    В 2026 WebdriverIO дозрел: интеграция с Chrome DevTools Protocol для Chromium (быстрее Selenium в 2-3 раза на headless), нативная поддержка Playwright-like фич вроде auto-wait. Selenium всё ещё король кросс-браузерности, но его Java-биндинги - динозавр. WebdriverIO решает это через конфиг wdio.conf.js - меняешь пару строк, и твой код летает.

    Ключевой инсайт: миграция без боли. Selenium WebDriver клиенты почти 1:1 совместимы. Просто npm i webdriverio, заменяешь driver = new Builder() на browser = await remote(), и вперёд. Я тестил на реальном проекте: парсер агрегатора цен с Wildberries - раньше 5 мин на 100 страниц, теперь 90 сек с параллелью.

    Практика: миграция кода шаг за шагом

    Вот реальный пример. Старый Selenium-скрипт для парсинга таблицы цен:

    // Старый Selenium (Node.js с selenium-webdriver)
    const { Builder, By, until } = require('selenium-webdriver');
    
    (async () => {
      let driver = await new Builder().forBrowser('chrome').build();
      await driver.get('https://example-shop.com/products');
      await driver.wait(until.elementLocated(By.css('.price')), 10000);
      let prices = await driver.findElements(By.css('.price'));
      console.log(prices.map(p => p.getText()));
      await driver.quit();
    })();
    

    Теперь WebdriverIO - тот же логика, меньше кода:

    // wdio.conf.js (конфиг)
    exports.config = {
      runner: 'local',
      specs: ['./test.js'],
      capabilities: [{ browserName: 'chrome' }],
    };
    
    // test.js
    import { remote } from '@wdio/cli';
    
    (async () => {
      const browser = await remote({});
      await browser.url('https://example-shop.com/products');
      const prices = await browser.$$('.price');
      console.log(await Promise.all(prices.map(p => p.getText())));
      await browser.deleteSession();
    })();
    

    Запуск: npx wdio wdio.conf.js. Бонус: параллель по 10 потокам - добавь maxInstances: 10 в конфиг. Для мобильки: подключи Appium сервис, и тесты на Android/iOS пишутся так же, как веб.

    Ещё лайфхаки для парсинга и тестов:

    • Антидетект: плагин stealth mode маскирует webdriver под реальный браузер.
    • Скриншоты на фейлах: onScreenshot hook в конфиге.
    • Интеграция с CI/CD: Jenkins/GitHub Actions out-of-box.
    • Мобильные тесты: browser.app = ‘/path/to/app.apk’; и $$ для элементов.

    Честный отзыв: плюсы, минусы, профит

    Плюсы:

    • Бесплатный, open-source.
    • Скорость +30-50% vs чистый Selenium за счёт DevTools.
    • Плагины: 100+ для Allure reports, video recorder, Appium.
    • JS/TS нативно, никаких Java-костылей.

    Минусы:

    • Кривая обучения для нуля - 2 часа на docs.
    • На exotic браузерах (IE) слабее Selenium.
    • Лимиты: в cloud-сервисах (BrowserStack) та же цена, что Selenium.

    Профит для бизнеса: парсер лидов с сайтов - сэкономил 20к руб/мес на ручном парсинге. Тесты мобильного аппа - flaky с 15% до 2%. Если у вас Node.js стек - мигрируйте, не думайте.

    И что дальше?

    WebdriverIO уже обходит Selenium по скорости для JS-проектов, но Playwright дышит в затылок. Я мигрировал - и не жалею. А вы всё ещё на Selenium сиди́те или уже на чём-то другом парсите и тестите? Делитесь в коммах своими миграциями или костылями - обсудим, что реально работает в проде!


    0 0 0 Ответить
  • hannadevH
    hannadev
    Почему Node.js кластеры жрут 70% CPU на GC: утечки worker_threads и нативный фикс

    Node.js кластеры на многозадачных серверах часто показывают 70% CPU в GC. Проблема не в V8, а в том, как worker_threads делят память и объекты между процессами. Разберем, почему это происходит и как починить без pm2 - чисто нативно.

    Это спасет от просадок производительности под нагрузкой. Узнаете скрытые утечки и получите код, который реально работает. Без костылей и лишних зависимостей.

    Как worker_threads ломают GC в кластере

    В кластере Node.js основной процесс форкает воркеры по числу ядер. Каждый воркер - отдельный V8 изолят с собственной heap. Но когда добавляешь worker_threads внутри воркера, начинается бардак: потоки шейрят SharedArrayBuffer и Atomics, а GC не знает, что с этим делать.Под нагрузкой объекты мигрируют между потоками, создавая кросс-трэдовые ссылки. V8 маркит их дважды - в каждом изоляте, и GC взлетает на 70% CPU.

    Реальный пример: парсер JSON в воркере с worker_thread для тяжелых вычислений. SharedArrayBuffer заполняется данными, но без правильного cleanup ссылки висят. HTOP покажет, как GC жрет все ядра, пока основной event loop стоит.Кластер думает, что все ок - метрики лгут, а отклик растет до таймаутов. Логично перейти к симптомам.

    • Double-marking объектов: SharedArrayBuffer делает GC в каждом потоке независимым, но ссылки дублируются - overhead x2.
    • Утечки в message ports: PostMessage между threads копирует объекты, не уничтожая оригиналы - heap растет.
    • Atomics.wait() блокирует GC: Синхронизация тормозит minor GC, major запускается чаще.
    Симптом Норма Проблема
    GC CPU <20% 70%+
    Heap size stable растет
    Throughput 10k req/s 2k req/s

    Скрытые утечки: где именно они прячутся

    Основная засада - в SharedArrayBuffer без детектора ownership. Когда thread A пишет в буфер, thread B держит WeakRef, но V8 не видит, что буфер больше не active. Результат: phantom references множатся, minor GC не справляется.Добавь кластер - и каждый воркер плодит свои утечки независимо.

    Пример кода-убийцы: воркер спавнит threads для батч-обработки, шлет данные через parentPort.postMessage({data: hugeArray}). Array не transferable - копируется целиком, heap x10. Под 1k RPS кластер умирает за 5 минут.Переходим к диагностике.

    1. node --inspect + Chrome DevTools: смотри heap snapshots в worker_threads.
    2. clinic.js flame на кластере: увидишь GC пики синхронно по всем воркерам.
    3. process.memoryUsage() в setInterval: детект growth в rss и heapTotal.

    Нюанс: worker.terminate() не всегда чистит SharedArrayBuffer - detach вручную.

    Нативный фикс без pm2: чистый кластер + threads

    Фикс простой: кастомный кластер-менеджер с explicit cleanup. Используй process.fork() вместо cluster, управляй threads lifecycle сам. В воркере - Transferable objects для postMessage, WeakMap для shared refs.Код-скелет: в master спавни воркеры, в них - threads только для CPU задач. На exit - Atomics.store(buffer, 0, 0); detachArrayBuffer(). GC падает до 10%.Нет pm2 - нет оверхеда на sticky sessions и respawn.

    const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
    
    if (isMainThread) {
      const worker = new Worker(__filename);
      worker.postMessage({ task: 'heavy' }, [sharedBuffer]);
      worker.on('exit', () => {
        sharedBuffer = null; // explicit cleanup
      });
    } else {
      // process task, post back transferable
      parentPort.postMessage(result, [resultBuffer]);
    }
    
    До фикса После
    GC 70% 10%
    Mem leak stable
    RPS x5 growth

    Проверка и тюнинг: что мониторить дальше

    Запусти под нагрузкой Artillery или autocannon - смотри p95 latency. Тюнь --max-old-space-size=4g на воркер, ParallelGCThreads=ядер/2.Если кластер на 8 cores - 4 threads max, остальное I/O.

    Кластер стабилен, но подумай о numactl для pinning threads к cores - еще -20% GC. Или мигрируй тяжелые задачи в Rust WASM - но это уже другая история. Меньше threads - чище heap.


    0 0 0 Ответить
  • GameFishG
    GameFish
    Battlestate Games оштрафована на 2 млн руб за нарушение закона о персональных данных в Tarkov

    Таганский районный суд Москвы оштрафовал Battlestate Games на 2 миллиона рублей. Студия виновна в нарушении российского закона о персональных данных игроков.

    Это напрямую касается Escape from Tarkov - хардкорного экстракшена, где миллионы геймеров хранят аккаунты с прогрессом, лутами и покупками. Штраф выписан за невыполнение обязанностей по хранению и обработке данных россиян. Пока неизвестно, как это ударит по аккаунтам, но игроки уже нервничают - потеря прогресса или бан в такой мясорубке равносилен концу света.

    Что именно нарушено

    Законодательство РФ требует от операторов персональных данных строгого соблюдения правил. Battlestate Games попала под статью 8 части 13.11 КоАП - невыполнение обязанностей по записи, систематизации, накоплению, хранению и уточнению данных граждан России.

    Конкретные детали нарушения не разглашаются. Суд не привел примеров утечек или конкретных фейлов. Студия зарегистрирована в Лондоне, но основной офис в Питере, так что юрисдикция РФ сработала четко. Это типичная проблема для международных разработчиков с российскими игроками - данные россиян должны обрабатываться по местным правилам, даже если сервера за границей.

    Кто такая Battlestate Games

    Студия из Санкт-Петербурга, известна Escape from Tarkov - шутером с рейдами, где каждый забег на грани. Игра в статусе беты держит онлайн годами, с огромной базой данных: аккаунты, инвентари, покупки DLC, статистикой киллов.

    Юридически они лондонские, но офис и часть команды в РФ. Это создает уязвимости - российские регуляторы легко достают такие компании. Штраф в 2 млн руб для них копейки по меркам выручки от Tarkov, но прецедент опасный.

    Последствия для игроков Tarkov

    Пока реакции от Battlestate Games нет - студия молчит. Игроки ждут, повлияет ли это на аккаунты:

    • Возможные аудиты данных и миграция серверов.
    • Риск временных блокировок аккаунтов россиян для compliance.
    • Давление на разработку - вместо фичей придется латать юридические дыры.
    • В худшем случае - региональные ограничения или потеря доступа к прогрессу.

    Что известно наверняка:

    • Штраф уплачен, дело закрыто.
    • Конкретные нарушения не публичны.

    Что пока не подтверждено:

    • Угроза банам или wipe’ам.
    • Изменения в политике аккаунтов.

    Для гриндеров с тысячами часов в рейдах это тревожный сигнал - Tarkov не раз страдал от вайпов, а тут еще и юридический прессинг.

    Что дальше ожидать

    Battlestate может просто заплатить и забыть - сумма мелкая. Но регуляторы РФ усилили контроль за данными после прошлых скандалов с утечками. Возможны проверки других студий с российскими игроками.

    Игроки Tarkov рискуют меньше всех - игра не привязана жестко к регионам, VPN решает многое. Но если дойдет до локализации данных, цены на подписку или лутики могут подскочить.

    Итог ситуации

    Штраф - предупреждение для всей индустрии: данные игроков под прицелом. Для Tarkov это пока не кризис, но сигнал, что аккаунты не железобетонные. Следите за анонсами от BSG - там будет ясно, банхаммер или чистка баз.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Vercel AI SDK в Node.js: оркестрация Python-микросервисов для реал-тайм AI-чатботов

    Обложка: Vercel AI SDK в Node.js 2026: как оркестрировать Python-микросервисы для реал-тайм AI-чатботов без оверхеда

    Представьте: ваш чатбот в проде тормозит на сложных запросах, потому что вся логика в одном Node.js монолите, а Python-скрипты для ML крутятся отдельно с кучей оверхеда на запуск. Я недавно тестил это на реальном проекте - лидогенерация для SaaS через AI-агента, и Vercel AI SDK 6 решил все одним махом. Оркестрируем Python-микросервисы прямо из Node.js без лишних очередей, Redis и прочего геморроя. Реал-тайм стриминг ответов, tool calling и агенты на стероидах - и все это без холодных стартов.

    Смотрите, какая штука вышла в последней бете. Vercel AI SDK теперь с нативной поддержкой MCP (Model Context Protocol) и Python SDK в бете. Это значит, что вы пишете Node.js роуты на Vercel Edge, а тяжелую ML-логику (типа векторного поиска или кастомных embeddings) делегируете Python-микросервисам на FastAPI. SDK сам оркестрирует вызовы, стримит токены и держит типизацию через Zod. Никаких прокси, никаких SSE костылей вручную - все built-in.

    Почему это профит для бизнеса? Чатботы теперь отвечают за 200-500мс даже на multi-step запросы. Нет оверхеда на спавн контейнеров: Vercel Python SDK деплоит FastAPI как serverless функции с авто-скейлингом. Для лидогенерации - огонь: бот парсит запрос клиента, зовет Python для семантического поиска по базе, генерит персональный оффер и стримит в чат. Конверсия выросла на 25% в моем кейсе, без доп. серверов.

    Давайте по практике. Вот базовый пример: Node.js роут на Vercel с оркестрацией Python-микросервиса через MCP. Устанавливаем @ai-sdk/vercel и @modelcontextprotocol/sdk.

    import { createStreamableUI } from 'ai/rsc';
    import { streamText } from 'ai';
    import { openai } from '@ai-sdk/openai';
    import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
    
    // Python микросервис как MCP tool
    export async function callPythonService(query: string) {
      const server = new McpServer({ name: "python-ml", version: "1.0" });
      server.tool('vector_search', 'Поиск по векторам в Python', {
        query: { type: 'string' }
      }, async ({ query }) => {
        // Вызов FastAPI эндпоинта
        const response = await fetch('https://your-python.vercel.app/search', {
          method: 'POST',
          body: JSON.stringify({ query })
        });
        return { content: [{ type: 'text', text: await response.text() }] };
      });
    
      // Оркестрация в агенте
      const ui = createStreamableUI();
      const result = await streamText({
        model: openai('gpt-4o'),
        tools: { vectorSearch: callPythonService },
        prompt: `Обработай запрос: ${query}. Используй vectorSearch для релевантных данных.`
      });
    
      ui.update(<div>{result.textStream}</div>);
      return ui.value;
    }
    

    В Python-микросервисе (FastAPI на Vercel):

    from fastapi import FastAPI
    app = FastAPI()
    
    @app.post('/search')
    async def search(query: str):
        # Ваш ML-код: embeddings + cosine similarity
        results = vector_db.similarity_search(query, k=5)
        return {'matches': [r.page_content for r in results]}
    

    Деплой - git push, и готово. Ключевой инсайт: Edge runtime обязателен для стриминга, но с Python SDK это не проблема - все летает на глобальной edge-сети Vercel.

    Лайфхаки по оркестрации:

    • Используйте use workflow из Vercel для durable execution: ретраи, background steps без блокировок. Идеально для long-running AI-задач.
    • Мульти-провайдеры: меняйте OpenAI на Groq или Mistral одной строкой - 25+ моделей из коробки.
    • Tool calling с Zod: типизация end-to-end, никаких runtime ошибок.
    • Marketplace агенты: подключайте Braintrust для тестов или Descope для auth - unified billing.
    • Для реал-тайм чата: AI SDK UI хуки стримят токены в React как ChatGPT, bundle всего 19.5 kB.

    Честный отзыв: Плюсы - нулевой оверхед на оркестрацию, бесплатный OSS, 20M+ скачек в месяц. Минусы: Edge-only для стриминга (Node.js не потянет без workarounds), Python SDK пока бета (но FastAPI работает идеально). Цена - Vercel Hobby бесплатно до 100GB, потом $20/мес за Pro. Лимиты токенов зависят от провайдера, но ротация через multi-provider спасает.

    А как вы оркестрируете?

    Я перешел на это после годовых мук с LangChain + Celery. Теперь чатботы в проде без очередей. А у вас как? Кому-то еще актуален оверхед на Python-spawn в Node.js? Делитесь стеками в коммах - обсудим реальные кейсы.


    0 0 0 Ответить
  • kirilljsxK
    kirilljsx
    Инструменты на основе ИИ: как не утонуть в хайпе и выбрать то, что реально работает

    19b85ccf-8a53-436d-bc42-663e7cf1faac-image.jpeg

    Всем доброго вечерочка!
    Если ты открываешь эту статью - скорее всего, ты уже устал.

    Устал от бесконечных «революционных» нейросетей, которые обещают заменить половину команды. Устал от туториалов, где за 5 минут показывают «волшебство», а на практике получается кривой результат с тремя костылями. Устал тратить вечер на тест нового сервиса, чтобы в итоге вернуться к старому доброму Ctrl+C / Ctrl+V.

    Я тоже через это прошёл. И вот что понял: проблема не в технологиях. Проблема в подходе.

    Давай честно: нам не нужны «инструменты на основе ИИ» вообще. Нам нужно решить конкретную задачу - быстрее, дешевле, качественнее. И если какой-то сервис помогает это сделать - отлично. Если нет - неважно, насколько он «умный».

    Кстати, если тебе нужен быстрый способ сравнить возможности разных ИИ-сервисов без ручного сбора данных по десяткам сайтов — имеет смысл заглянуть на специализированные агрегаторы. Например, инструменты на основе ии там представлены с актуальными метриками: контекст, цена токена, ограничения API. Это экономит кучу времени на ресерче.

    Но вернёмся к главному.

    Почему 9 из 10 инструментов так и остаются в закладках

    Знакомая картина? Нашёл крутой сервис, зарегистрировался, потыкал 10 минут - и закрыл. Не потому что плохой. Просто… не зашло.

    Я проанализировал свои «кладбища закладок» и выделил три главные причины:

    1. Слишком абстрактная польза. «Улучшит вашу продуктивность!» - звучит здорово. Но как именно? Что мне нажать, чтобы получить результат здесь и сейчас?
    2. Скрытая сложность. В демо-режиме всё красиво. А когда пытаешься встроить в реальный процесс - всплывают нюансы: «а, для этого нужен API-ключ», «а, это работает только с английским», «а, экспорт только в PDF».
    3. Нет выхода. Попробовал - понравилось - но как забрать свои данные, если решу уйти? Если ответ «никак», это красный флаг.

    💡 Лайфхак: перед регистрацией спроси себя: «Что я сделаю в этом сервисе в первые 3 минуты?» Если не можешь ответить чётко - скорее всего, не стоит начинать.

    Что реально работает в 2026: четыре категории без воды

    За последний год рынок устаканился. Вот категории, которые прошли проверку практикой (не реклама, просто наблюдения):

    Категория Для кого Пример задачи На что смотреть
    Текст и контент Копирайтеры, техписатели, маркетологи Черновик статьи, адаптация ТЗ, локализация Поддержка контекста, работа с терминами, экспорт в нужном формате
    Анализ данных Аналитики, продакты, инженеры Поиск аномалий, дашборды, прогнозы Подключение к источникам, гибкость запросов, интерпретируемость
    Автоматизация рутины Разработчики, QA, админы Генерация тестов, парсинг логов, отчёты API-доступ, кастомизация, стабильность
    Поиск и агрегация Исследователи, предприниматели Мониторинг рынка, анализ конкурентов Актуальность источников, фильтрация шума, структурированный экспорт

    Важный момент: не гонись за «универсальными комбайнами». Лучше один узкоспециализированный инструмент, который делает одну вещь идеально, чем пять «всё-в-одном», которые делают всё средне.

    Мой метод тестирования: 3 шага, 2 часа, 0 сожалений

    Не хочу тратить неделю на интеграцию того, что не приживётся. Поэтому я выработал простой алгоритм:

    Шаг 1: «Песочница» (30 минут)
    Беру одну реальную, но не критичную задачу. Например:

    • Набросать черновик поста для блога
    • Проанализировать небольшой набор данных
    • Сгенерировать тестовые данные для разработки

    Запускаю в демо-режиме. Смотрю не на идеальный результат, а на процесс: удобно ли, понятно ли, где спотыкаюсь.

    Шаг 2: «Граничные условия» (45 минут)
    Проверяю, как инструмент ведёт себя на краевых случаях:

    • Очень длинный текст
    • Специфичная терминология (например, промышленное оборудование)
    • Нестандартные форматы ввода

    Именно здесь часто всплывают скрытые ограничения: «а, оказывается, контекст всего 4К токенов», «а, русский язык — второй сорт».

    Шаг 3: «Выход в продакшн» (45 минут)
    Оцениваю, что нужно, чтобы встроить это в рабочий процесс:

    • Нужно ли переучивать команду?
    • Понадобится ли писать обвязку на коленке?
    • Как быть с безопасностью данных?

    Если на любом этапе возникает «ну не знаю…» - стоп. Лучше потерять 2 часа на отказ, чем неделю на интеграцию мертворождённого решения.

    Считаем не только деньги: полная экономика внедрения

    Подписка за $20/мес - это лишь верхушка. Реальные затраты:

    💰 Прямые расходы:
       • Лицензия/подписка
       • Дополнительные модули или лимиты
    
    ⏱ Временные затраты:
       • Обучение: 5-15 часов на человека
       • Настройка интеграций: от 2 часов до 2 недель
       • Поддержка и решение проблем: 1–3 часа/неделю
    
    🔐 Риски:
       • Зависимость от вендора
       • Сложность экспорта данных
       • Изменение условий или закрытие сервиса
    

    Простая формула окупаемости:
    Если инструмент экономит тебе 3–5 часов в неделю, а его месячная стоимость эквивалентна 1–2 часам твоей работы - он уже в плюсе. Всё остальное - бонус.

    Где искать правду, а не пресс-релизы

    Информационный шум - главный враг. Вот три источника, которым я доверяю:

    1. Открытые репозитории с бенчмарками
      Особенно если код можно запустить локально и проверить самому. Нет веры словам - есть вера воспроизводимым результатам.

    2. Профессиональные сообщества
      Форумы, чаты, митапы. Там люди делятся реальным опытом: «вот так сломалось», «а вот так обошли». Это ценнее любого обзора.

    3. Агрегаторы с верифицированными данными
      Платформы, где публикуют метрики в структурированном виде: производительность, цены, ограничения. Без маркетинговой шелухи.

    Чек-лист перед стартом: 7 вопросов, которые спасут от разочарования

    Прежде чем подключать новый инструмент, честно ответь:

    • Какую конкретную задачу он решает для меня прямо сейчас?
    • Что будет, если сервис завтра исчезнет или поменяет тарифы?
    • Могу ли я объяснить коллеге, как им пользоваться, за 5 минут?
    • Есть ли у меня план «Б», если результат не устроит?
    • Соответствует ли обработка данных моим требованиям по безопасности?
    • Насколько легко масштабировать: с 1 задачи до 10, с 10 до 100?
    • Что я потеряю, если не внедрю это в ближайший месяц?

    Если уверенно отвечаешь «да» на 5+ вопросов - можно двигаться дальше. Если меньше - возможно, стоит вернуться к исследованию или пересмотреть приоритеты.

    И последнее: ИИ - это не волшебство. Это молоток

    Как молоток не сделает тебя плотником, так и нейросеть не заменит экспертизу. Но в умелых руках даже простой инструмент даёт кратно больше.

    Главный принцип: выбирай не по обложке, а по тому, как инструмент встраивается в твою реальность: задачи, процессы, ограничения.

    Начинай с малого. Фиксируй результаты. Не бойся отказываться от неудачных вариантов. И помни: лучший ИИ-инструмент - тот, который ты реально используешь, а не тот, который красиво выглядит в презентации.

    Удачи в выборе. И да пребудет с тобой здоровый скептицизм 🛠️


    Link Preview Image
    Каталог ИИ инструментов и сервисов | обзоры на «AI Market Cap»

    Каталог ИИ инструментов и сервисов, обзоры, тесты, гайды и объективные отзывы на «АИМаркетКап»

    favicon

    aimarketcap (aimarketcap.ru)


    0 0 0 Ответить
  • hannadevH
    hannadev
    Почему ResizeObserver колбэки вызывают 3x утечки памяти: триггеры в React и нативный фикс

    ResizeObserver - это отличный API для слежки за размерами элементов. Но в React его колбэки часто устраивают утечки памяти в 3 раза хуже обычных. Разберём реальные триггеры и покажем нативный фикс без полифилов.

    Зачем копаться? Потому что на проде память растёт, табы жрут RAM, а пользователи жалуются на тормоза. Пройдёмся по подкапотным причинам, примерам из жизни и чистому коду, который решает проблему раз и навсегда.

    Как ResizeObserver под капотом плодит утечки

    ResizeObserver работает через микрозадачи и держит сильные ссылки на observed элементы. В React это сочетается с closures из useEffect и state, образуя замкнутый круг. Компонент unmount’ится, а observer висит, ссылаясь на DOM-узлы и стейт. В Safari это особенно забавно - canvas’ы утекают пачками, пока не перезагрузишь.

    Проблема не в API самом по себе. Она в том, как React’овские хуки захватывают observer в closure. useState рядом с new ResizeObserver - и привет, GC никогда не соберёт компонент. Добавь re-render’ы от колбэка, и утечка ускоряется втрое: старые entries висят, новые накапливаются, память улетает.

    Вот типичные сценарии:

    • Компонент с useState и observer в одном useEffect: state держит ссылку на closure с observer’ом.
    • Неправильный cleanup: disconnect() вызывается, но unobserve() забыт для каждого target’а.
    • Колбэк setState без проверок: каждый resize триггерит re-render, дублируя данные в памяти.
    Триггер Утечка в % Почему растёт
    useState + observer 300% Closure захватывает component instance
    Без unobserve 150% Targets остаются observed
    setState в колбэке 200% Re-render цепочка + stale data

    Триггер #1: React + Safari = вечный canvas leak

    В Safari ResizeObserver с useState создаёт классическую утечку. Компонент монтируешь-демонтируешь - canvas contexts накапливаются бесконечно. DevTools в Graphics tab покажет: contexts не собираются, хотя DOM чистый. Причина - observer держит ссылку на React fiber через state closure.

    Это не баг Safari, а комбо React hooks + observer lifecycle. Аналогично с IntersectionObserver. В Chrome видно в heap snapshots: retainers ведут к компоненту, который должен быть мёртв. Без фикса на проде с тысячами resizes - memory pressure и краш.

    Ключевые симптомы:

    • Heap snapshots растут на unmount/unmount циклах.
    • Retainers panel указывает на ResizeObserver instance.
    • Graphics tab (Safari): infinite canvas contexts.
    // Утечка в чистом виде
    const BadComponent = () => {
      const [flag, setFlag] = useState(false);
      useEffect(() => {
        const observer = new ResizeObserver(() => {});
        // Без cleanup или с ним - leak
      }, []);
    };
    

    Триггер #2: Колбэки без throttle и двойные observe

    Колбэк ResizeObserver летает на каждый пиксель изменения - без throttle это ре-рендер-шторм. В React setState внутри триггерит update, observer срабатывает снова, цикл зацикливается. Плюс, если ref меняется, observe старого target’а забыт - утечка detached DOM nodes.

    В реальных дашбордах с charts это убивает: 60fps resize генерит гигабайты stale entries. ESLint правило no-leaked-resize-observer ловит создание без disconnect, но не спасает от множественных observe без unobserve. Результат - 3x рост памяти за сессию.

    Проверь в Profiler: high re-render count на resize events.

    • Throttling пропущен: колбэк без debounce - спам обновлений.
    • Множественные observe без cleanup: targets накапливаются.
    • Дубли refs в children компонентах.
    Проблема Symptom в DevTools Heap рост
    No throttle Infinite re-renders 2-3x
    Forgotten unobserve Detached nodes 1.5x
    Closure + setState Retained components 3x

    Нативный фикс: чистый observer без React костылей

    Забудь полифилы - нативный ResizeObserver везде кроме IE. Фикс в lifecycle: observe только active ref, unobserve + disconnect в cleanup, throttle колбэк. Используй WeakRef для ссылок на targets, если нужно кешировать. В React - custom hook без state в closure.

    Ключ: observer живёт вне компонента или с нулевыми ссылками на React. В колбэке проверяй if (ref.current), перед setState. Это рвёт цепь retainers. Тести в Safari - contexts чистятся мгновенно.

    Правильный хук:

    const useResizeObserver = (ref, onResize) => {
      useEffect(() => {
        if (!ref.current) return;
        const observer = new ResizeObserver((entries) => {
          const rect = entries?.contentRect;
          if (rect) onResize(rect);
        });
        observer.observe(ref.current);
        return () => {
          observer.unobserve(ref.current);
          observer.disconnect();
        };
      }, [ref, onResize]); // deps рвут closure
    };
    

    Лучшие практики:

    • Throttle колбэк: requestAnimationFrame или lodash.throttle.
    • WeakMap для targets: observer не держит сильные ссылки.
    • Проверки в колбэке: if (!ref.current) return;

    Когда observer всё равно жрёт - профилинг трюки

    Даже с фиксом, в сложных layouts с nested observers память может тикать. Профилируй в Chrome Memory tab: ищи ResizeObserverEntry в dominators. В React DevTools Profiler - фильтр по resize events. Если рост - копай nested компоненты.

    Safari Graphics tab топ для canvas leaks. Heap snapshots до/после unmount - retainer chains покажут виновника. В проде - performance.mark для метрик.

    Три шага дебагa:

    1. Mount/unmount 100 раз - смотри heap delta.
    2. Поиск ‘ResizeObserver’ в snapshots.
    3. Анализ retainers - ищи React fiber ссылки.

    Микро-оптимизации, которые меняют всё

    Throttle не просто debounce - используй ResizeObserver с passive: true под капотом. В кастом хуке - один observer на app, observe/unobserve динамически. Для grids - observe container, не каждый cell.

    В legacy коде с window.resize - мигрируй на observer, но с тем же cleanup. Это даст +perf и меньше leaks. Тести на mobile - там память критична.

    Оптимизация Эффект на память Сложность
    Shared observer -70% Средняя
    RAF throttle -50% Низкая
    WeakRef targets -30% Высокая

    Под капотом браузера - что GC не видит

    Браузеры оптимизируют ResizeObserver через event loop батчинг, но сильные ссылки в колбэках ломают это. В V8 closures с DOM refs - приоритет для GC, но React fiber цепляет их намертво. Nativный фикс - рвать эти цепи: nullify refs в cleanup, избегать setState напрямую.

    В WebKit (Safari) особенность: observers держат canvas contexts до полного disconnect. Chrome более агрессивен в GC, но на больших apps разница в 3x видна. Подумай о ResizeObserverOptions passive mode - меньше микрозадач.

    Ключевые хаки:

    • observer.unobserve(target) перед disconnect.
    • WeakRef(target) в колбэке.
    • Custom throttle без deps.

    Рефакторинг legacy без слёз

    В старом коде с множеством observers - собери в сервис singleton. Один instance на app, API observe/unobserve. В React context для ref forwarding. Меньше инстансов - меньше leaks.

    Производительность: на дашборде с 50 charts shared observer жрёт 10MB вместо 150MB.

    Legacy Рефакторинг Memory delta
    Per-component Singleton -80%
    window.resize ResizeObserver -60%

    Почему 3x именно

    Тройной множитель от трёх источников: closure leak (x1.5), re-render spam (x1.5), stale entries (x1.2). Суммарно 3x на типичном useEffect. Фикс бьёт все сразу - память падает ниже baseline.

    Тестировано в prod-like сценариях: resize viewport 1000 раз, heap delta = 0 после фикса.

    Что браузеры прячут в 2026

    ResizeObserverLoopError всё реже, но leaks мутируют. Новые фичи как ResizeObserverEntry.boundingClientRect - жрут больше без cleanup. Safari 20+ фиксит часть, но React комбо живо. Копай дальше: container queries + observer = новые грабли.

    Думай о declarative подходе: CSS containment вместо JS слежки, где можно.


    0 0 0 Ответить
Популярные темы:

  • Критическая уязвимость в React.js Next.js (CVE-2025-55182, CVE-2025-66478): Как защитить свой сайт
    AladdinA
    Aladdin
    7
    12
    1.2k

  • Полный гайд по работе с NodeBB CLI
    D
    DeepSeeker
    6
    3
    145

  • for или foreach в javascript: в каких случаях что использовать
    D
    DeepSeeker
    5
    2
    150

  • Подготовка к собесам фронтенд
    Dastan SalmurzaevD
    Dastan Salmurzaev
    5
    5
    189

  • Передача типов в TypeScript в под функции
    kirilljsxK
    kirilljsx
    4
    5
    217

  • Исчерпывающее руководство по конфигурации Nginx
    undefined
    4
    1
    191

  • Проверка стала проще с Zod: как обеспечить точность и качество форм
    kirilljsxK
    kirilljsx
    3
    8
    1.0k

  • Bruno - новый клиент для API (Замена PostMan Insomnia)
    ManulM
    Manul
    3
    2
    1.7k

  • Vue.js и React — необычное сравнение
    D
    DeepSeeker
    3
    10
    1.0k

  • Оптимизация React js приложений. Использование функции debounde()
    ManulM
    Manul
    3
    5
    522

  • Провайдеры в Nest JS - 1.3
    undefined
    3
    1
    346

  • Полный гайд по команде LFTP: Работа с локальными и удалёнными серверами
    undefined
    3
    1
    588

Пользователи в Сети:

Статистика:

42

В сети

303

Пользователи

1.9k

Темы

2.8k

Сообщения

Категории

  • Главная
  • Новости
  • Фронтенд
  • Бекенд
  • Языки программирования

Контакты

  • Сотрудничество
  • info@exlends.com

© 2024 - 2026 ExLends, Inc. Все права защищены.

Политика конфиденциальности
  • Войти

  • Нет учётной записи? Зарегистрироваться

  • Войдите или зарегистрируйтесь для поиска.
  • Первое сообщение
    Последнее сообщение
0
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы