Обновить
512K+

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

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

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

Проблемы поддержания анонимности платформы в 2026

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

MyPrepod — крупнейший портал отзывов о преподавателях российских ВУЗов. Он стал таким не только за счет того, что даже на момент MVP 2017 года он был UX‑удобнее для студентов, чем СтудИзба или professorrating, но и за счет полной анонимности.

Переписали анонимный портал отзывов на преподавателей с PHP 5.4 на современный стек. Сайт грузился 15 секунд, рекламодатели не шли, хостинги блокировали без предупреждения в 2 ночи. Разбираем, как выстроить инфраструктуру, которая переезжает на новый сервер за одну команду и выживает, когда всё вокруг пытается тебя снести.

Чуть подробнее

Race Condition в веб-приложениях: три типа уязвимости и как их находить

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

Для начала разберёмся, что такое Race Condition и почему эта уязвимость заслуживает внимания.

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

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

Перейдём к тому, какие виды этой уязвимости вообще бывают.

Можно выделить 3 вида:

Читать далее

verified by n8n: Как мы сгенерировали ноду из OpenAPI и почему пришлось выбросить рукописную версию

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

Привет, Хабр! Меня зовут Андрей и я развиваю портал для разработчиков в корпоративном мессенджере Пачка. Эта статья про то, как мы превратили рукописную ноду для n8n в артефакт, который генерируется из одного файла спецификации, и как она прошла официальную верификацию и встала в каталог n8n со статусом verified by n8n.

По дороге мы выбросили целиком первую версию ноды и перевели всю документацию API на новый процесс генерации. Ниже — как это устроено внутри, с кодом и граблями.

Если коротко, что получилось: правка в одном .tsp-файле автоматически расходится в документацию, CLI, SDK и n8n-ноду, а CI публикует всё по реестрам. Нода больше не может отстать от API, потому что собирается из того же источника.

Читать далее

Вебхуки оплаты ЮKassa, IP-check, event log, idempotency и аварийный capture

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

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

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

В одном из проектов этот узел был собран так, первый платеж создается с capture=False, входящий webhook проверяется по IP, каждое событие сначала пишется в журнал, потом маршрутизируется в обработчик, capture подтверждается стабильным idempotence key, успешный платеж валидируется по сумме, валюте и metadata, а на случай расхождения остается отдельный ручной confirm, который умеет дочитать фактический статус из ЮKassa и синхронизировать локальную базу.

То есть задача тут не просто принять webhook, а построить платежный контур, которому можно верить.

Читать далее

Как выжать из HTML/CSS динамику, или создание IRC клиента без JS

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

Когда возникает идея создать браузерный IRC-клиент без JavaScript, приходится сталкиваться с классической проблемой фронтенда: все насколько привыкли гнать динамику через JavaScript, что перестали замечать возможности HTML/CSS с щепоткой серверной магии по реализации многих фич. HTTP Streaming существует с давних времён, а CSS эволюционировал настолько, что может справиться с логикой состояний — но мы упорно продолжаем грузить мегабайты JavaScript (и иногда даже WebAssembly) для решений, которые вполне можно реализовать иначе.

Идея создать IRC клиент без JavaScript не совсем нова (хоть это и выяснилось уже после создания такого :) ). Ещё в нулевых появился CGI:IRC — настоящий IRC клиент, который может работать полностью без JavaScript, позволяя людям общаться в реальном времени через браузер, даже если JavaScript по каким-то причинам не работал. Но это было в эру table-layouts, и когда CSS не был так развит, как сейчас. Сегодня возможностей больше, и мы воспользуемся ими, чтобы навернуть функциональность, которая не видана CGI:IRC.

Результат можно глянуть (хоть и с дополнительной стилизацией и изменениями, которые не так важны для статьи) здесь, а ещё на GitHub

Читать далее

Повторная обработка сообщений в Kafka Consumer

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

Привет! Меня зовут Дмитрий Михеев, я ведущий разработчик в MAGNIT OMNI — бизнес-группе ритейлера «Магнит», которая отвечает за развитие омниканального опыта для клиентов.

В своих сервисах для межсервисных коммуникаций помимо gRPC-запросов мы используем брокер сообщений Kafka. Если описывать его в двух словах, Kafka — это распределённый журнал событий (event log), через который сервисы обмениваются данными в реальном времени.

Не буду подробно останавливаться на устройстве Kafka — это хорошо описано в документации. В этой статье хочу подсветить один неочевидный момент, который может привести к проблемам при работе с consumer’ами — повторную обработку сообщений (retry).

Читать далее

Управление сайтами, мультисайтовость и структура проектов в Matomo

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

Сегодня я подробно разберу раздел Websites в opensource системе аналитики Matomo. Как Matomo хранит сайты внутри системы, чем различаются Website, Mobile App и Roll-Up, как правильно строить архитектуру аналитики, какие ошибки почти все совершают при масштабировании Matomo.

Читать далее

Бум ИИ — это твой шанс стать тем, кем ты хочешь

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

Наступило время, когда рынок ИТ-специалистов начал чётко разделяться на суперпрофессионалов и вечных джунов. Промежуточного звена больше не будет.

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

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

Каково ваше место за этим столом? Давайте разбираться вместе.

Читать далее

Как мы делаем онлайн звонки: Введение в WebRTC и LiveKit

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

Хотим рассказать о том, как мы делаем платформу для онлайн звонков и видео конференций с ИИ, но чтобы не слишком сложно было. Начнем с самого низкого уровня - с механизма передачи данных между клиентами в созвоне. В этой статье мы расскажем про WebRTC, NAT, STUN/TURN и немного про LiveKit

Читать далее

NoiR Code: QR-код из мира мрачной ночной романтики

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

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

Это NoiR Code. Он кодирует текст в изображение, которое читается как чёрно-белый нуар-кадр: полутоновый силуэт города, луна, штрихованные тени. Наводишь камеру в специальном приложении или веб-сервисе, созданном для поддержки этого формата, и получаешь своё сообщение обратно. Попробовать можно здесь: noir-code.suncake.xyz

Распутать дело

Пауза, двойственная по природе: контракт хука и протокол воркера

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

Предположим, вы пишете интерпретатор машины Тьюринга, запущенный в Web Worker’е. UI должен показывать трейс — как машина шагает от состояния к состоянию, что пишется на ленту, как двигается каретка. Чтобы пользователь успевал считывать изменения в UI, между итерациями движка нужна короткая задержка — миллисекунды, регулярно, на каждом шаге. Это приостановка движка между итерациями — регулярная и предсказуемая, не «пауза» в смысле UI-кнопки «Пауза» (та останавливает машину до клика «Продолжить»).

Возникает вопрос: где именно в цикле итерации воркеру нужно реализовать приостановку? Кандидатов два, и выбор между ними фиксирует сразу два контракта: хуков движка и протокола между воркером и основным потоком. Выбрать точку — это спроектировать обе стороны сразу; промахнуться — испортить обе. Эта статья — про этот выбор.

Где живёт пауза

Всё о Supabase: установка, примеры, аналоги

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

Шесть лет назад, в начале 2020 года, группа разработчиков оглянулась на Firebase и подумала: «А давайте сделаем то же самое, но открытым кодом и на SQL!» Так родился Supabase: проект с искренней целью дать разработчикам контроль над данными и избавить от проприетарных заморочек.

А с распространением Vibe Coding, когда нейросети удобнее работать с API, а не писать логику для СУБД, взлёт Supabase пошел по экспоненте.

Читать далее

CSR для SSL: разбор частых ошибок в SAN и wildcard

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

Большинство проблем с SSL-сертификатами возникает не при настройке TLS, а на этапе создания CSR: забытые SAN-домены, неправильные ожидания от wildcard, ручные ошибки в openssl.cnf. Разбираем, почему с сокращением срока действия сертификатов до 47 дней к 2029 году ручной выпуск перестаёт быть жизнеспособным, и какие инструменты приходят ему на замену.

Читать далее

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

«Превед, медвед!» возвращается? Как мы сделали мультиконтекстный сайт на статике для 47 аудиторий быстро-дёшево-сердито

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

Мультиконтекстный сайт на статических страницах без генерации на лету. Почему мы выбрали ручную вычитку и фиксированные версии

Читать далее

Я создал два сайта через Claude, потому что не хотел мучить дизайнера и верстальщика

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

Я не программист, но я создал два сайта. Один с нуля, второй перенёс с Tilda, оба через Claude Code и с админ-панелью через Claude же. В процессе я прошёл через ИИшный газлайтинг, сотню правок уровня «перемести это выше, еще выше, теперь ниже» и получил два проекта, которыми теперь могу проще управлять.

Рассказываю, как, зачем и почему (и стоит ли так делать).

Читать далее

Server Actions без ручного API, предсказуемый useActionState для inline CRUD в Next.js

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

В Next.js формы и inline CRUD довольно быстро упираются в одну и ту же развилку. Можно пойти привычным путём и собрать ручной API: отдельный route handler, fetch из клиента, локальные флаги pending, error, success, плюс своя логика для blur, Enter, Escape и закрытия редактора. На небольшом примере это выглядит терпимо. Но как только в проекте появляются создание, переименование, удаление и несколько inline-форм на одном экране, код начинает расползаться не по бизнес-логике, а по обвязке.

Проблема в количестве промежуточных слоёв между формой и записью данных. Отдельный endpoint, отдельный клиентский submit, отдельный формат ответа, отдельные флаги состояния, отдельная синхронизация UI после успеха или ошибки. Для таких сценариев Server Actions в App Router нужны потому, что для форм и inline-редактирования дают более короткую и предсказуемую write-точку.

В проекте примере Workbench покажем на создании, переименовании и удалении проектов, секций и заметок. У формы есть action, серверная функция получает FormData, возвращает типизированное состояние, а клиент живёт вокруг одного паттерна: state, formAction, isPending. В результате форма собирается как связанный цикл, а не как набор разрозненных обработчиков.

Читать далее

Маленький файл robots.txt и большие последствия одной строки

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

Разбираемся, как работает robots.txt, почему его часто путают с инструментами индексации и какую роль он играет в эпоху ИИ-сканеров.

Читать далее

Про конструкторы сайтов с ИИ – что реально уже работает, а что только для пиара

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

Не совсем пятничное чтиво, но…

Как-то так случилось, что решил разобраться для себя лично – какие подвижки появились в вопросе внедрения искусственного интеллекта в сфере сайтостроительства. ИИ действительно показал себя неплохо в отдельных задачах, но есть у него и минусы. Всё это тема для отдельного обсуждения, но здесь – только обзор реальной картинки. Делюсь бесплатно и без SMS ))

Читать далее

Не ошибка выжившего: как я стал разработчиком в 2020-м — и как использовать мой опыт сегодня

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

Я не мечтал попасть в IT. У меня вообще не было ощущения, что это «моя история». Но в какой-то момент появилась возможность, которой я просто воспользовался, — и дальше всё закрутилось.

Меня зовут Максим Никитин, я техлид разработки в крупном банке и выпускник курса «Веб-разработчик» в Яндекс Практикуме. Хочу рассказать свою историю, проанализировать опыт и пофантазировать, что бы я посоветовал себе, если бы начинал путь в IT сегодня.

Читать далее

Ваше сообщение об ошибке читает уставший человек в два часа ночи

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

Два часа ночи, у разработчика горит релиз, он подключает ваш API — и получает в ответ голое «invalid_request». Что не так, почему, что делать — ни слова. Сорок минут гаданий и злое письмо в поддержку.

Разбираем, как сделать опыт разработчика (DX) человеческим: как переписать ошибки по стандарту RFC 9457, но для живого человека; почему время до первого успешного вызова — главная метрика онбординга; и отчего предсказуемый, «скучный» API — это комплимент. С готовым шаблоном, который можно прикрутить к себе сегодня.

Читать далее