es
Feedback
WebDev+ | Веб-разработка

WebDev+ | Веб-разработка

Ir al canal en Telegram

Присоединяйтесь к нашему каналу и погрузитесь в мир веб-разработки Связь: @devmangx

Mostrar más
8 066
Suscriptores
-124 horas
-247 días
-11030 días
Archivo de publicaciones
Встроенные хелперы тестов, хоть и удобны, добавляют когнитивную нагрузку: логика подготовки вынесена за пределы теста, и прих
+1
Встроенные хелперы тестов, хоть и удобны, добавляют когнитивную нагрузку: логика подготовки вынесена за пределы теста, и приходится прокручивать к началу/концу файла, чтобы понять, что именно настраивается для прохождения теста. Первый тест выглядит читаемым, но всё важное скрыто: что на самом деле создаёт makeIncompleteProfile()? Какие поля пусты? Что настраивает makeImportService()? Чему должен соответствовать замокированный lookup? Если классы или модели должны быть в определённом состоянии для группы тестов, читателю гораздо легче понять, как создаётся объект, через фабрики и фейки, а не через уникальные вынесенные функции, разбросанные по каждому тесту. Это, конечно, приводит к дублированию логики подготовки в каждом тесте (виден компромисс), но читать каждый тест по отдельности значительно проще, потому что весь его контекст изолирован — не нужно выходить за пределы теста в несколько мест, чтобы полностью понять, как всё настроено. Хочу также обратить внимание на границы скриншотов (они намеренные). Они показывают, сколько контекста можно реально охватить за раз при чтении одного теста. Когда подготовка спрятана за хелперами, тест может выглядеть чище, но читателю приходится выходить за пределы видимой области, чтобы понять состояние, которое проверяется, а затем возвращаться обратно в тест, иногда по нескольку раз. Это разрушает ясность, которая была бы, если бы нужно было просто скроллить по вертикали, как при чтении книги. @WebDev_Plus

Хороший UX + меньший показатель отказов. Беспроигрышный вариант. 📈 @WebDev_Plus
Хороший UX + меньший показатель отказов. Беспроигрышный вариант. 📈 @WebDev_Plus

Представляем effect-typed-id. Это напоминание, что ID — это UI. https://github.com/just-be-dev/effect-typed-id @WebDev_Plus
Представляем effect-typed-id. Это напоминание, что ID — это UI. https://github.com/just-be-dev/effect-typed-id @WebDev_Plus

PHP не перекомпилирует твой regex при каждом вызове preg_match. Внутри ext/pcre живёт LRU-кэш на 4096 паттернов. Первый раз:
PHP не перекомпилирует твой regex при каждом вызове preg_match. Внутри ext/pcre живёт LRU-кэш на 4096 паттернов. Первый раз: pcre2_compile + pcre2_jit_compile. Все следующие — прямой указатель. Поэтому один и тот же regex в цикле работает со скоростью нативного кода. JIT-паттерн уже в кэше. Не генерируй паттерны динамически на лету, если можно этого избежать. Иначе кэш слетает. @WebDev_Plus

20 законов разработки, которые должен знать каждый инженер 1. Закон Галла: Работающая сложная система вырастает из работающей
20 законов разработки, которые должен знать каждый инженер 1. Закон Галла: Работающая сложная система вырастает из работающей простой. 2. KISS: Делай проще. Всё остальное — оверхеад. 3. Закон Конвея: Компании проектируют системы, которые повторяют структуру их коммуникаций. 4. Закон Хайрума: У достаточно большого API уже неважно, что ты обещал в контракте. Кто-нибудь уже зависит от каждого observable-поведения твоей системы. 5. CAP-теорема: Выбери два: консистентность, доступность, устойчивость к разделению. 6. Закон Завински: Любая программа разрастается до тех пор, пока не научится читать почту. 7. Закон Брукса: Добавление людей в опаздывающий проект делает его ещё более поздним. 8. Эффект Рингельмана: Производительность каждого участника группы падает с ростом группы. 9. Закон Прайса: Половину работы делают квадратный корень от всех людей. 10. Эффект Даннинга — Крюгера: Новички переоценивают свои способности, эксперты — недооценивают. 11. Закон Хофштадтера: Всё занимает больше времени, чем ты планируешь, даже с учётом этого закона. 12. Закон Паркинсона: Работа расширяется, чтобы заполнить всё отведённое на неё время. 13. Закон Гудхарта: Когда метрика становится целью, она перестаёт быть хорошей метрикой. 14. Закон Гилба: Измерять неточно лучше, чем не измерять вообще. 15. Принцип Кнута: Забудь о микрооптимизациях в 97% случаев. Преждевременная оптимизация — корень всех зол. 16. Закон Амдала: Ускорение одной части системы ограничено долей времени, которое эта часть реально используется. 17. Закон Мёрфи: Если что-то может пойти не так, оно пойдёт не так. 18. Закон Постела: Будь консервативен в том, что отправляешь, и либерален в том, что принимаешь. 19. Закон Стерджена: 90% всего на свете — фигня. 20. Закон Каннингема: Лучший способ получить правильный ответ в интернете — не задать вопрос, а написать неправильный ответ. @WebDev_Plus

Astro — лучшее, что случалось с веб-разработкой за последнее время. И только вышла седьмая версия. Из нового: Vite 8 с Rolldo
Astro — лучшее, что случалось с веб-разработкой за последнее время. И только вышла седьмая версия. Из нового: Vite 8 с Rolldown, компилятор на Rust, сборка до 61% быстрее, улучшения для AI-агентов. > pnpm create astro @WebDev_Plus

Ты создаёшь отдельные роуты под вебхуки от каждого внешнего сервиса? Сколько бы сервисов ни слали webhook-события, тебе нужен
Ты создаёшь отдельные роуты под вебхуки от каждого внешнего сервиса? Сколько бы сервисов ни слали webhook-события, тебе нужен один роут, один контроллер и один менеджер вебхуков. @WebDev_Plus

Мой племянник учится на втором курсе программной инженерии. Позвонил недавно, попросил помочь с поиском стажировки. И среди п
Мой племянник учится на втором курсе программной инженерии. Позвонил недавно, попросил помочь с поиском стажировки. И среди прочего спросил, где лучше разобраться с Git. Я удивился. На втором курсе студенты всё ещё обходят Git стороной. А потом это бьёт по ним на собеседованиях. Я посоветовал ему отличный гайд от Beej. Он перезвонил сегодня. Полный восторга. Делился впечатлениями. Так что вот, снова рекомендую. Для всех студентов и всех, кто только начинает знакомство с Git. https://beej.us/guide/bggit/ @WebDev_Plus

CSS Tip: Автоматически помечайте внешние ссылки Если ссылка открывается в новой вкладке через target="_blank", можно добавить
CSS Tip: Автоматически помечайте внешние ссылки Если ссылка открывается в новой вкладке через target="_blank", можно добавить к ней визуальный индикатор с помощью CSS.
a[target="_blank"]::after {
    content: " ↗️";
}
Преимущества: ✅ Пользователь сразу видит, что ссылка откроется в новой вкладке ✅ Улучшается UX без изменения HTML-разметки ✅ Работает автоматически для всех внешних ссылок с target="_blank" ✅ Не нужно вручную добавлять иконки в каждую ссылку Небольшая деталь, которая делает интерфейс более понятным. #CSS #Frontend #WebDev #UIDesign @WebDev_Plus

Anime.js 4.5 уже вышел — и релиз получился интересным. Представлен адаптер для Three.js 🎉 До 50% меньше кода для создания 3D-анимаций API для 3D-объектов в стиле CSS-трансформаций (rotate, skew и др.) Более простая анимация цветов материалов Удобная анимация инстансированных мешей (Instanced Mesh) Поддержка Stagger 3D И это далеко не всё. На видео показан пример анимации сцены Three.js через новый адаптер Anime.js. Благодаря ему можно анимировать объекты почти так же просто, как DOM-элементы в браузере, но уже в 3D-пространстве. демо: https://codepen.io/editor/juliangarnier/pen/019ef018-43bb-7333-a6aa-2360a6d0e59b доки: https://animejs.com/documentation/adapters/threejs-adapter/ чейнджлог: https://github.com/juliangarnier/anime/releases/tag/v4.5.0 @WebDev_Plus

Создал Telegram-бота и получил токен. Установил: laravel/ai nutgram/laravel Собрал SupportAgent с парой инструментов. И бац —
Создал Telegram-бота и получил токен. Установил: laravel/ai nutgram/laravel Собрал SupportAgent с парой инструментов. И бац — пользователи уже получают реально полезную AI-поддержку прямо в Telegram. Ребята, как это вообще может быть настолько просто. Не игнорируйте laravel/ai @WebDev_Plus

Вот open-source веб-фреймворки в разных языках 😎👇
Вот open-source веб-фреймворки в разных языках 😎👇

Для Chrome вышло расширение Caveman, которое помогает сокращать количество токенов при работе с ИИ-моделями. Расширение поддерживает ChatGPT, Claude, Gemini и другие сервисы. Оно автоматически переписывает промпты и ответы, убирая лишние слова без потери основного смысла. По словам первопроходцев, это позволяет сократить расход выходных токенов до 75%, а ответы сделать более краткими и содержательными. @WebDev_Plus

🔥 Laravel Tip В Laravel есть встроенный способ защититься от дублирующихся задач в очередях — интерфейс ShouldBeUnique. Дост
🔥 Laravel Tip В Laravel есть встроенный способ защититься от дублирующихся задач в очередях — интерфейс ShouldBeUnique. Достаточно реализовать метод uniqueId() и вернуть уникальный идентификатор задачи:
class SyncUser implements ShouldQueue, ShouldBeUnique
{
    public function uniqueId(): string
    {
        return $this->userId;
    }
}
Если задача с таким идентификатором уже находится в очереди, Laravel не поставит её повторно. Меньше ручных проверок, меньше блокировок и меньше гонок данных. Особенно полезно для синхронизации пользователей, обработки вебхуков и фоновых задач, которые могут запускаться несколько раз подряд. @WebDev_Plus

В PHP 8.4 появились две небольшие функции, которых разработчикам не хватало годами: array_any() и array_all(). Теперь вместо
В PHP 8.4 появились две небольшие функции, которых разработчикам не хватало годами: array_any() и array_all(). Теперь вместо циклов вроде:
foreach ($items as $item) {
    if (...) {
        return true;
    }
}
return false;
можно написать:
return array_any($items, fn ($item) => ...);
А проверки "все элементы соответствуют условию" превращаются в:
return array_all($items, fn ($item) => ...);
Кода меньше, читается проще, намерение видно сразу. Редкий случай, когда небольшое дополнение к языку реально убирает тонны однотипного шаблонного кода. @WebDev_Plus

🔥VPS + ISPmanager со скидкой до 100% на Waicore Запускаете сайты на VPS? Сейчас самое время попробовать ISPmanager практически бесплатно. Наши акции: — 100% скидка на первый месяц лицензии ISPmanager при заказе VPS из категории «Веб-хостинг» — Скидка 60% на лицензии ISPmanager при отдельной покупке Также доступны: 🛡 SSL-сертификаты 🛡 BitNinja для защиты серверов от атак, спама и вредоносного ПО. Получаете готовый VPS с установленной панелью управления и можете сразу приступать к работе с сайтами, почтой, базами данных и другими сервисами. ⚡️Акция действует месяц. Подробнее на сайте WAICORE.

Блин... Этот open-source HTML Email Builder просто огонь Это SDK для визуальной сборки email-шаблонов через drag-and-drop. Пользователи могут создавать письма без необходимости писать HTML-код с нуля. → визуальный email-конструктор с drag-and-drop → готовые email-компоненты → настраиваемые макеты писем → экспорт в HTML, MJML или JSON Отлично подойдёт для SaaS-продуктов, e-commerce, CRM-систем, маркетинговых платформ и любых приложений, где нужно создавать email-шаблоны. Исходники : github.com/templatical/sdk @WebDev_Plus

Выводи типы из значений в TypeScript. То есть не дублируй руками union-типы вроде:
type Role = "system_admin" | "content_editor" | "guest_viewer";
Лучше задай объект один раз, а тип получи из него:
type ValueOf<T extends Record<PropertyKey, unknown>> = T[keyof T];

const USER_ROLE = {
  Admin: "system_admin",
  Editor: "content_editor",
  Viewer: "guest_viewer",
} as const satisfies Record<string, string>;

type Role = ValueOf<typeof USER_ROLE>;
Теперь Role автоматически равен:
"system_admin" | "content_editor" | "guest_viewer"
Если потом добавишь новую роль в USER_ROLE, тип обновится сам. @WebDev_Plus

Фиксация сессии в PHP: если после входа пользователя не сменить идентификатор сессии, злоумышленник может заранее навязать же
Фиксация сессии в PHP: если после входа пользователя не сменить идентификатор сессии, злоумышленник может заранее навязать жертве свой PHPSESSID, а после её авторизации получить доступ к уже аутентифицированной сессии. Исправляется одной строкой:
session_regenerate_id(true);
Вызывать её нужно сразу после успешного логина. Параметр true здесь важен: он удаляет старый файл сессии. Если вызвать просто:
session_regenerate_id();
старый идентификатор останется валидным на диске. В таком случае заранее украденный или навязанный до авторизации cookie всё ещё может использоваться для доступа к старой сессии. Большинство современных фреймворков выполняют ротацию идентификатора сессии автоматически, но при работе с чистым PHP это нужно делать самостоятельно. @WebDev_Plus

Кто сказал, что запуск больших моделей локально обязательно должен быть тяжёлым и раздутым? Shimmy — это односоставный бинарник на Rust размером всего 5 МБ, который явно бросает вызов Ollama. Что обещает проект: → один исполняемый файл размером 5 МБ → запуск примерно за 100 мс → потребление памяти около 50 МБ → 100% совместимость с OpenAI API Если Ollama кажется слишком громоздким, а запускать локальные модели всё равно хочется — стоит присмотреться к Shimmy. https://github.com/Michael-A-Kuykendall/shimmy @WebDev_Plus