Обновить
256K+

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

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

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

HTML и CSS помогут вам сделать ужасный интерфейс для пользователя

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

Привет, Хабр!

Я часто вам рассказываю, как HTML и CSS помогают улучшить пользовательский опыт в наших веб-интерфейсах. Мне это наскучило. Сегодня я хочу поговорить с вами о практиках, которые заставляют пользователей очень сильно ругать разработчиков.

Мы рассмотрим примеры, когда только использование HTML и CSS может привести к замешательству людей. Многие же думают, что эти технологии безопасны и не могут принести вреда. Вот и проверим это.

Давайте посмотрим, что я вам подготовил.

Читать далее

Новости

Возвращаем трассировку логов Quartz-задач после перехода на Spring Boot 3+

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

Привет! Меня зовут Александр Каненков, я backend-разработчик в компании Домклик.

После перевода сервиса со второго Spring Boot на третий (а у кого-то уже и на четвёртый) мы с командой заметили следующую картину: HTTP-запрос журналируется с traceId, цепочка собирается в трейсе, но стоит сработать задаче Quartz — в журналах worker-потока гордо красуется [NoTrace, NoSpan]. Задача исполняется «в никуда» — без единого идентификатора, вне какого-либо трейса, и связать её с запросом, который её запланировал, невозможно.

Давайте разберём по шагам, почему это случилось и как починить так, чтобы работало и с RAM (in-memory), и с JDBC job store.

Читать далее

Согласие на обработку ПДн требуется гораздо реже, чем думает бизнес

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

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

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

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

Каталог всех оснований мы уже разбирали в отдельной статье. А теперь о другом: почему бизнес собирает согласия там, где они не нужны, и во что ему это обходится.

Читать далее

Сделал сыну тренажёр слепой печати, потому что существующие показались ему скучными

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

Этой осенью сын пошёл в пятый класс, и я заметил странную вещь: со смартфоном он на «ты», а за обычной клавиатурой теряется. Мы попробовали несколько тренажёров слепой печати, но ему быстро стало скучно — и я решил сделать свой.

В итоге простая идея превратилась в React‑проект с анимированными руками, анализом слабых клавиш и персональными тренировками. Расскажу, как устроил логику, почему больше всего времени заняли руки и что показало тестирование на главном пользователе.

Читать далее

Экономика клиентской разработки с AI

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

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

Сейчас значительную часть такой работы можно сделать намного дешевле. AI снимает вагон рутинной работы, и маленькие кастомные решения перестали быть чем‑то вроде «ну нет, это полдня печатать код и ещё день на отладку». Там, где раньше приходилось подгонять задачу под готовый инструмент, теперь чаще можно подогнать инструмент под задачу.

Читать далее

10 браузерных API, заменяющих библиотеки, которые я раньше все время устанавливал

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

10 браузерных API, заменяющих пакеты NPM и плагины jQuery: dialog, popover, переходы отображения (view transitions), structuredClone, groupBy и Temporal с заметками о поддержке.

Читать далее

Книга из переписки без сервера: canvas, jsPDF и брошюра для печати прямо в браузере

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

Мы делаем пет‑проект «Чатограмма», который считает статистику переписки: кто пишет первым, кто быстрее отвечает, в какие часы вы на связи. С первого дня у него одно жёсткое правило: файл с перепиской не уходит на сервер. Всё считается в браузере пользователя, а сервер не видит ни одного сообщения — не потому, что обещает не смотреть, а потому, что сообщения до него физически не доходят.

Потом понадобилась подарочная книга: PDF формата A5, где самые яркие моменты переписки собраны по главам — с чего всё началось, первое «мы с тобой», лучшие моменты каждого года, общий словарь, квиз «Кто это написал?». Плюс вариант для печати дома брошюрой: A4, сложить пополам, скрепить степлером.

И здесь правило «ничего на сервер» перестаёт быть бесплатным. Книгу обычно верстают на сервере: headless Chrome, LaTeX, что угодно с нормальными шрифтами и без ограничений по памяти. У нас всё это должно работать на телефоне, в том числе на iPhone, в том числе во встроенном браузере мессенджера. Ниже — как это устроено и на какие грабли мы наступили.

Читать далее

Мой бесплатный сервис чуть не стал сканером портов для всего интернета

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

Я сделал бесплатную проверку сайтов на нарушения 152-ФЗ: вводишь адрес, получаешь список проблем. Первая версия умела ещё кое-что, чего я в неё не закладывал. Подставляешь чужой хост и порт, и по тексту ошибки видно, открыт порт или закрыт. Бесплатный сканер портов для всего интернета, причём запросы идут с адресов Cloudflare.

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

Читать далее

Хотела создавать продукт, а теперь моделирую гусиные яйца: 3D-тамагочи в Yet Another English

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

Про свой тренажёр английского Yet Another English я уже писала. Там можно собирать слова, заниматься, повторять забытое. Но мне захотелось ещё геймифицировать это все. Чтобы начинаешь с яйца, учишь слова, получаешь плюшки и постепенно выращиваешь себе персонажа. Ну то есть тамагочи, только кормить его надо своими занятиями.

Начала с Claude Opus 5.0, подключённого к Blender через MCP, потом продолжила через GPT. Ушла примерно неделя по два часа в день, то есть около 14 часов и 100 баксов за Астру.

Покажу, с чего начинала, какие версии пришлось переделать и сколько всё это весит. Если тоже хотите добавить 3D-персонажа в свой проект, возможно, сэкономлю вам пару переделок.

Читать далее

Pony ORM: толстая пачка фич и улучшений

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

DISCLAIMER: Это неофициальный форк. Но, по моим сведениям, и в официальный pony эти фичи скоро подъедут в каком‑то виде.

Некоторое время назад, я решил испробовать программирование с помощью ИИ‑агентов и решил выбрать pony в качестве пет‑проекта. О pony я уже писал в предыдущей статье. Теперь хочу поделиться результатами своего недельного спринта.

В pony добавилось:
— поддержка асинхронности
— поддержка миграций
— разные улучшения из серии quality‑of‑life

Так что, фреймворк pony теперь чрезвычайно важен и сердит — что можно понять по этой картинке. Всё — благодаря DeepSeek 4.1 Flash и Kimi K3 (последняя — умная, но дорогая — она делала ревью).

Читать далее

Почему SAML ломают снова и снова: пять фатальных изъянов протокола аутентификации

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

SAML больше двадцати лет обеспечивает единый вход (SSO) в корпоративной и академической среде. Но протокол прогибается под тяжестью собственной сложности, и ему пора на пенсию. Разбираемся, как SAML появился, почему его раз за разом ломают исследователи безопасности и почему на смену ему должен прийти OpenID Connect (OIDC).

Читать далее

Что внутри ИИ-ассистента BILLmanager: LLM, SSE через POST и инкрементальный Markdown

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

Всем привет! Меня зовут Денис, я фронтенд-разработчик в ISPsystem. В этой статье расскажу, как мы разработали и встроили модуль ИИ-ассистента в BILLmanager.

Разберём, как устроен ИИ-консультант, почему выбрали такие решения, с какими сложностями столкнулись и как всё это реализовали — внутри много кода и деталей.

Читать далее

Кризис идентичности, или как Vue-разработчик мигрировал enterprise-проект на Angular 18

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

Всем привет! Меня зовут Павел Барсуков, я frontend-разработчик в компании «Программный Продукт».

Основной мой стек – Vue, Nuxt и все рядом лежащее. Angular до недавнего времени я видел в основном в курсах на Youtube, пару раз на фрилансе, где особо с ним не взаимодействовал, и в мемах про исключительность Angular разработчиков и очень частые обновления версий. И тем не менее, мне была поставлена задача мигрировать проект со старой версии на более новую, и я взялся за это.

Погружаемся

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

Как мы научили LLMCOD собирать базу знаний не только из HTML, но и из SPA и открытых API

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

Обычно задача «создать базу знаний из сайта» звучит просто: взять HTML, извлечь текст, разбить его на фрагменты, построить embeddings и отправить всё в RAG.

На современных сайтах этот подход всё чаще перестаёт работать.

Главная причина — сайт может практически не содержать данных в исходном HTML. Пользователь открывает страницу, браузер загружает JavaScript, JavaScript обращается к API, а уже API возвращает услуги, товары, объекты, статьи, цены и другие данные.

Именно с такой проблемой мы столкнулись при разработке новой возможности в LLMCOD.

Теперь система умеет работать не только с обычными страницами, но и с SPA-сайтами и доступными открытыми API.

В этой статье расскажу, как мы это сделали, какие проблемы встретили по дороге и почему одного vector search для такой задачи оказалось недостаточно.

Читать далее

Next.js без Vercel: деплой на один VPS с переключением без простоя и откатом за секунды

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

Я держал проект на Next.js на Vercel почти три месяца и уехал на обычный VPS за 990 рублей в месяц. Главное, чего боялся: потерять то, за что Vercel любят. Сборка, которая не трогает живой сайт. Переключение без простоя. Откат одной кнопкой. Под катом схема, которая всё это повторяет на одном сервере без Kubernetes, Docker и прочей тяжёлой артиллерии, и список граблей, на каждую из которых я наступил.

Читать далее

Заметки в своём GitHub без сервера: как я оживил BatNoter и написал синхронизацию на Git Data API

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

Мне давно нравится идея хранить заметки обычными Markdown-файлами в своём репозитории на GitHub. Файлы остаются твоими, их можно открыть на github.com или в любом редакторе, а история изменений достаётся даром: это просто коммиты.

Был проект BatNoter, который делал ровно это, но ему нужен был собственный сервер для входа через GitHub. В конце 2022 года сервер перестал отвечать, и приложение умерло.

Я переписал его так, чтобы сервер был не нужен вовсе. Получился Notewing: браузер сам ходит в GitHub API, изменения копятся офлайн и отправляются одним коммитом, а конфликтующие правки не теряются. В статье расскажу, как устроена синхронизация через Git Data API, где были подводные камни и как всё это тестировать, не трогая настоящий GitHub.

Как устроена синхронизация

Практический GitHub Actions: полноценный CI/CD для FastAPI + PostgreSQL

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

В этой статье будет разбираться написание GitHub Actions пайплайна на основе моего стенда cicd-practice на GitHub (подробно все можно посмотреть там). Стенд состоит из FastAPI (веб API на Python) и PostgreSQL. Все сервисы разворачиваются в Docker с помощью Docker Compose (микросервисы) на VDS от Timeweb Cloud.

Для части приложения я также написал около 90 Pytest тестов, которые будут воспроизводиться в пайплайне, но об этом позже.

Backend-часть также будет разбираться, но менее подробно, для общего понимания работы.

Read more 📖

Компонент перерисовался. Почему? Пишем инструмент для Vue и трижды ломаем чужой прод

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

Есть Vue DevTools с галкой «Highlight updates». Есть react-scan в соседней экосистеме. Оба показывают одно и то же: вот этот компонент перерисовался.

Проблема в том, что знание «перерисовался» само по себе бесполезно. Ты и так видишь, что страница дёргается. Вопрос всегда другой: что именно изменилось. Какой проп, какой реф, какое поле стора. Без этого ты сидишь и комментируешь куски шаблона, пока не найдёшь виновника методом половинного деления.

В React иначе и нельзя: реактивность там на уровне «перерисовался компонент», причину приходится реконструировать диффом пропсов. А во Vue реактивность точечная — фреймворк знает, какая именно зависимость дёрнула рендер.

И он её отдаёт.

Читать далее

Теперь Яндекс показывает рекламу посетителям прямо на вашем сайте

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

На сайтах со встроенными Яндекс Картами стала появляться реклама.

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

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

Отключить её можно. Но уже за деньги. Вот такая вот фигня, собачка…

Я решила разобраться, что изменилось у Яндекса и есть ли сейчас нормальная альтернатива. И здесь неожиданно интересным оказался Конструктор карт 2ГИС.

Читать далее

Публикуйте инструменты, а не пиксели: собираем WebMCP‑магазин на React и считаем грабли

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

Представим обычный интернет-магазин. Пользователь открывает каталог, вводит «наушники» в поиск, включает фильтр наличия, задаёт цену до 10 000 рублей, открывает карточку и добавляет товар в корзину. Шесть вполне понятных действий. Если их выполняет человек, всё хорошо. Если за дело берётся AI-агент, начинается небольшой квест: прочитать страницу, найти поле, угадать назначение переключателя, нажать кнопку, проверить результат и не купить случайно кофеварку вместо наушников.

А что, если сайт сам скажет агенту: «Я умею искать товары, показывать карточку и добавлять позицию в корзину. Вот названия функций, вот параметры, вот ограничения»? Эту задачу решает WebMCP — экспериментальный браузерный API, который позволяет странице объявлять инструменты для AI-агентов прямо из JavaScript или HTML-формы. Черновик и обсуждение стандарта открыты в репозитории Web Machine Learning Community Group.

Меня зовут Денис Смирнов, я ведущий .NET-разработчик, в профессии больше пяти лет. Это не пересказ новости. Соберу небольшой магазин электроники на React, добавлю три инструмента, прогоню проверки и покажу четверо граблей, на которые наступил. Грабли оказались интереснее рабочего примера.

Читать далее
1
23 ...