Обновить
512K+

Веб-разработка *

Делаем веб лучше

359,52
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Широкий вход, узкий выход: Vue 3 внутри jQuery‑формы без бесконечных циклов

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели8.5K

Добавить на страницу новые функции, не трогая саму страницу, звучит как противоречие. Но альтернативу мы посчитали командой: полное переписывание заняло бы год, в течение которого страница не получила бы ни одной новой функции. Мост между старым кодом и новым занял два месяца, и строил его уже я один. Расскажу, как этот мост устроен, почему получился несимметричным, где чуть не зациклился и что в нём так и осталось кривым.

Читать далее

Интеграция Asterisk с веб‑интерфейсом и управление звонками через WebSocket: кейс имплементации под ключ

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели7.2K

Привет! Меня зовут Андрей Нелюбин, я руководитель функции фронтенд-разработки.
В рамках проекта для заказчика требовалось доработать сценарий работы колл-центра: связать телефонию на Asterisk с операторским интерфейсом, где рядом со звонком доступны данные клиента, заказы, статусы и действия управления.

Для этого в 2022 году была реализована собственная прослойка поверх Asterisk: backend на Python/Django, обработка событий через Django Channels, WebSocket для передачи изменений в интерфейс и frontend на Vue. В статье расскажу, как устроили архитектуру решения, как обрабатывали события звонков, зачем понадобился BFF-слой на Django и почему в рабочей конфигурации аудио осталось в SIP-клиенте, а контекст и управление — в операторском интерфейсе

Читать далее

Внедряем Claude Code нативно в Cursor IDE. Или как 9Router позволяет платить меньше

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели6.5K

Думаю все, кто начинал использовать claude code, рано или поздно ощущали на себе его недостатки. Не удобно навигироваться по чекпоинтам, не удобно смотреть, какие были внесены изменения, не удобно использовать через CLI. А что если решение есть? Я начал об этом задумываться после того, как настроил свой openclaw, он же используем мою обычную подписку на Claude, почему я не могу использовать ее сам. Тут у многих возникнет вопрос касательно безопасности, кто-то слышал что антропики против подобного использования подписки, но я исхожу из фактов. Я не слышу, чтобы всех повсеместно начали банить за это. Да и в целом если так задуматься, когда мы подключаем наш аккаунт Claude через OAuth к Claude Code, наша цель - написание кода. Так в чем проблема, если мы немного обхитрим систему и внедрим все прямо в Cursor IDE.

Я долго искал нормальное решение и уже думал сам вайбкодить что-то, но в итоге наткнулся на прекрасный инструмент 9Router. Разработчик не я, так что сразу скажу, что ответственности за его использование и в целом всю описанную схему, я на себя не беру. Я просто обозреваю возможность.

Так вот, что такое в целом 9Router. Это некий хаб, куда можно подключить десятками провайдеров нейросетей и использовать все через нужный тебе endpoint.

Читать далее

Автоматизируем первую линию диспетчерской службы на примере управляющей компании

Время на прочтение12 мин
Охват и читатели9.1K

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

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

Привет, Хабр! В этом материале делимся подробным гайдом, как собрать голосового робота и автоматизировать первую линию диспетчерской с помощью сервиса API МТС Exolve. Так срочные звонки будут мгновенно попадать на линию, а несрочные — в очередь для обработки в рабочие часы. 

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

OAuth‑сервер, который не хранит пользователей

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели7.1K

Наш OAuth-сервер не хранит профиль пользователя и практически ничего о нём не знает. Он знает только IdP-личность («вы вошли через Google под таким-то аккаунтом»), а внутренний id, роль и имя живут в продуктовом бэкенде. Сшивают их два кастомных гранта: первый вкладывает в токен подписанный профиль, не зная его содержимого, а второй разменивает основной токен на веер узких производных, по одному на аудиторию. Кроме того, в статье объясняется, почему FedCM может создавать больше проблем, чем решать, и как эти проблемы обходятся с помощью Service Worker. Если вам интересно, как всё это работает в SaaS, прошу под кат.

Читать далее

Отпечатки браузера: что это такое и как работает? Переосмысление технологии

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели8.1K

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

Отпечаток браузера не возник недавно — о нем знали уже тогда, когда мессенджеры еще не ловили на парковке, а сахар был слаще, трава зеленее и вода мокрее. В далеком 2020 году были робкие попытки препарировать это понятие и рассказать окружающим, как там все устроено. 

Много воды с тех пор утекло, как и много нового добавилось в понятие «отпечаток устройства». Ну а где, как не в блоге антидетект‑браузера, разобрать, что такое фингерпринт, почему он важен для цифровой гигиены и куда движется антифрод в вопросах отслеживания нас с вами в сети? Давайте разбираться!

Читать про отпечаток браузера

Модель исполнения JavaScript по спецификации ECMAScript: call stack, контексты, окружения и замыкания

Уровень сложностиСложный
Время на прочтение23 мин
Охват и читатели7K

Я довольно долго был уверен, что понимаю, как работает call stack.

Ну а что там понимать? Положил кадр, снял кадр, LIFO.

Потом открыл спецификацию. Оказалось, за «стеком вызовов» стоит каркас из пяти сущностей, а половина привычных объяснений просто не совпадает с текстом стандарта.

Замыкание — не фича языка, а побочный эффект того, что окружение живёт отдельно от кадра. «Область видимости» — вообще не сущность: такого термина там нет. А слов event loop, microtask и task queue в ECMA-262 ровно ноль. Проверяется грепом за минуту.

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

Разобрать по спецификации

Книга аутентификации

Уровень сложностиСредний
Время на прочтение47 мин
Охват и читатели8.6K

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

Как следует из названия, эта книга в значительной степени посвящена системе аутентификации и авторизации для веб-приложений. Более общие вопросы безопасности см. в серии “Шпаргалки OWASP” .

Если у вас возникнут какие-либо вопросы, не стесняйтесь задавать их на сервере Discord или в обсуждениях на GitHub.

Разработано и поддерживается Pilcrow. Исходный код доступен на GitHub.

Читать далее

Excel в HTML: сервер для публикации Excel‑отчётов

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели9.7K

Excel удобен не только тем, что показывает данные. В нём можно самостоятельно менять формулы, добавлять расчёты, перестраивать таблицы, фильтровать строки и проверять гипотезы. Поэтому, несмотря на большое количество специализированных систем, Excel продолжают использовать практически везде.

Когда я работал в крупном банке, среди руководителей периодически возникала идея запретить Excel. Предполагалось, что сотрудники должны работать только в корпоративных и специализированных приложениях.

Но сотрудники всё равно продолжали пользоваться Excel.

Причина довольно простая: корпоративные системы хорошо решают заранее предусмотренные задачи, а Excel позволяет быстро сделать то, чего в них нет. Построить дополнительный расчёт, проверить данные, объединить несколько выгрузок или посмотреть на показатель под другим углом.

При этом у Excel есть проблема, которая особенно заметна в момент, когда результат работы нужно показать другим людям.

Читать далее

Click to Pray: один if — и ты ошибся

Время на прочтение6 мин
Охват и читатели12K

Интернет приписывает Джейсону Стейтему фразу «Одна ошибка — и ты ошибся!». В случае этой истории она почему‑то сама собой переиначилась в вариант из заголовка. Уж очень всё оказалось из серии «никогда так не делай».

24 июля исследователь BobDaHacker опубликовал разбор Click to Pray — официального приложения Всемирной сети молитвы Папы Римского.

В сервисе на тот момент было 719 517 зарегистрированных аккаунтов. У пользователей были последовательные числовые ID, а API позволяло запросить профиль по ID:

Читать далее

Атомарность в реактивных системах

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели10K

Ранее мы говорили о чрезвычайных ситуациях при вычислении инвариантов. Однако они также могут возникать и во время одновременных изменений нескольких исходных состояний. Давайте посмотрим, какие тут есть варианты поведения..

Читать транзакцию

SEO‑поиск в Next.js App Router, индексируемые landing pages из фильтров и URL

Время на прочтение10 мин
Охват и читатели7.1K

Поиск в Next.js App Router связывает несколько механизмов — Server Components, dynamic routes, searchParams, metadata и клиентские фильтры. Если в проекте одна форма и несколько результатов, состояние можно держать в useState. В каталоге или агрегаторе каждый фильтр меняет URL, набор данных и правила индексации.

В статье на примере учебного проекта EventMap — агрегатора событий, разберем, как спроектировать систему фильтрации, которая генерирует чистые, индексируемые URL для поисковых роботов и обновляет выдачу при изменении фильтров. Страницы вроде «Концерты в Москве» или «Выставки в Петербурге» могут работать как отдельные landing pages. Для них нужны серверный HTML, постоянный URL, свой title, description, h1, canonical и отдельная политика index или noindex. Произвольные запросы, сортировки и глубокая пагинация остаются частью поиска и не попадают автоматически в индекс. Поиск построен через App Router, optional catch‑all route, серверный рендер результатов и общий набор функций для URL, metadata, canonical и sitemap.

Поиск по каталогу создаёт отдельное состояние для каждой комбинации фильтров. Категория, город, дата, сортировка, поисковая строка и номер страницы попадают в URL. При десяти категориях, пятидесяти городах и пяти вариантах сортировки получается 2500 комбинаций без учёта пагинации и свободного текста. Интерфейс должен обработать все допустимые комбинации. В поисковый индекс обычно попадает только часть из них. Страница категории music, страница города london и сочетание music/london могут содержать устойчивую подборку. Запрос ?q=free+jazz+tonight, сортировка по цене и восьмая страница выдачи относятся к текущему действию пользователя. Фильтры без отдельной политики создают большое пространство URL. Google описывает эту проблему в документации по faceted navigation. Изменение каждого параметра создаёт новый адрес, краулер тратит запросы на многочисленные комбинации и позже обнаруживает, что многие из них не содержат самостоятельного материала. (Google for Developers)

Читать далее

Армия в терминале

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели10K

Как coding agents превратили разработчика в диспетчера машин — и запустили гонку оркестраторов, песочниц и ИИ‑фабрик.

Ещё недавно программист открывал один терминал и разговаривал с одним агентом. Затем терминалов стало пять, веток — семь, а главным дефицитом оказался уже не код, а человеческое внимание.

Читать далее

Ближайшие события

Платформа плагинов в Трекере, или Как мы пустили сторонний код в продукт с 600 000 пользователей

Время на прочтение12 мин
Охват и читатели13K

За последние годы аудитория Трекера выросла до 600 000 пользователей — пропорционально выросло и количество запросов на новые функции. Бэклог разросся до уровня ответов «внесли в список, но обещать ничего не можем». При этом рынок трекеров очень конкурентный, и останавливать развитие core‑продукта ради разбора кастомных запросов нельзя.

В какой‑то момент мы пришли к выводу: сколько бы ни увеличивали команду разработки, запросов от пользователей всегда будет больше. Это не проблема планирования, а скорее структурное свойство зрелого продукта с большой аудиторией. Единственный способ масштабироваться в этой точке — не делать всё своими руками. 

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

Привет, Хабр! Меня зовут Женя Успенский, я руковожу разработкой фронтенда в Яндекс Трекере и отвечаю за архитектуру платформы плагинов. Со статьёй мне помогал мой коллега Дима Куприк, который отвечает за весь проект целиком. Он расскажет, почему мы вообще решили дать возможность пользователям самим модифицировать Трекер, как плагины помогают решать специфические задачи команд и какие сценарии мы автоматизировали первыми. 

В технической части я подробно разберу, какие задачи перед нами стояли и как мы их решили: изоляция стороннего кода, разрешения, proxy для внешних API и всё, что позволяет пускать чужой код в B2B‑продукт и спать спокойно.

Читать далее

По обе стороны антибота: как я имитирую Chrome при скрейпинге и ловлю ботов по тем же сигналам

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели8.1K

Я собираю афишу города в одну карту из пяти источников. Два из них — Яндекс.Афиша и afisha.ru — собирать себя не хотят. И режут не так, как ждешь: ни логина, ни капчи на входе, ни «подтвердите, что вы не робот». Мой requests.get(...) ловит 403 — даже когда заголовки скопированы из Chrome один в один.

Первая мысль была дурацкая: где-то не хватает куки или очередного sec-ch-ua. Оказалось — проблема раньше. К тому моменту, когда сервер читает мой браузерный User-Agent, он уже успел посмотреть, как именно клиент открыл защищенное соединение. Питоновский клиент палится ровно тем, как он здоровается.

Читать далее

AI-краулеры в 2026: кого пускать в robots.txt, чтобы попадать в ответы ИИ

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели9.8K

Полгода назад ко мне постучался один из будущих клиентов с вопросом, почему ChatGPT не знает про его компанию, хотя сайт в топ-3 Google по нужному запросу. Индексация была нормальной, ссылки — тоже. Проблема нашлась за пять минут в логах: в robots.txt висел Disallow: / для всех user-agent, кроме Googlebot и YandexBot. GPTBot, ClaudeBot, PerplexityBot получали 403 ещё на первом запросе. Полгода сайт был невидим для трёх из четырёх крупных AI-поисковиков, и никто об этом не знал — в Search Console и Вебмастере всё выглядело зелёным.

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

Читать далее

Симулятор дальтонизма для сайта, Figma и Chrome: как девять чисел из статьи 2009 года разошлись по четырём инструментам

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.6K

Девять чисел из научной статьи 2009 года сегодня работают у меня в четырёх местах: на HTML-странице, в canvas, в двух плагинах Figma и в чужом расширении для Chrome. Разбираю, как одна и та же матрица цветовосприятия ведёт себя в четырёх средах, где каждая среда сопротивляется по-своему — и почему честные ограничения инструмента важнее его возможностей.

Читать далее

Один файл, одна команда: как мы упростили запуск dev-окружения с помощью Runium

Время на прочтение13 мин
Охват и читатели11K

Локальный запуск dev-окружения в крупном проекте может превратиться в отдельный квест: несколько процессов, Docker-контейнеры, переменные окружения, порядок старта, ожидание готовности сервисов и отличия между ОС. Даже если у вас есть подобный опыт, это может быть неудобно, долго и утомительно. Новичку же обычно не обойтись без длинной подробной инструкции.

Привет, Хабр! На связи Сергей Зверьков, старший разработчик в «Лаборатории Касперского». Хочу рассказать, как мы решили эту проблему, написав собственный open-source-инструмент — Runium. Суть его в том, что он позволяет описать dev-окружение в JSON-файле. После этого проект можно запускать, останавливать и проверять одной командой.

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

Читать далее

То, что только что произошло с TheNumbers.com, должно нас всех обеспокоить

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели9.2K

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

Читать далее

AI‑тренер по CS2 на DeepSeek: где LLM выдумывает и почему семь недель стоили $1,45

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели7.9K

Всем привет. Я много лет играю в Counter-Strike и тренируюсь, как большинство: захожу в Deathmatch «размяться», играю три катки, тильтую, выхожу. Сервисы статистики при этом исправно сообщают, что у меня просела точность и выросло время реакции. Спасибо, а делать-то что?

Весной я решил собрать себе тренера сам. Сразу пара слов для контекста: я самоучка, в команде никогда не работал, основной опыт — десктопные утилиты и автоматизация, из веба до этого были только админки под собственные инструменты. В CS тоже звёзд с неба не хватаю, Premier в районе трёх тысяч, на FACEIT вообще первый уровень. Так что история будет не про успешный успех, а про то, где я наступил на грабли и что из этого вынес.

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

Проект мой, ссылка будет одна и в конце. Статья состоит из трёх частей: сколько это всё стоит в токенах, где модель выдумывает и как я это ловлю кодом, ну и подводные камни DeepSeek API и связки EF Core + SQLite.

Читать далее