Заметки разработчика
462 subscribers
738 photos
4 videos
1.22K links
Заметки о Frontend, Backend и немного DevOps. В основном о #PHP, #Laravel, #JavaScript, #HTML, #CSS, тестировании и настройке серверов.

https://www.dev-notes.ru

@snakenf
Download Telegram
👩‍💻 Директива location в Nginx: Полное руководство с примерами

Эффективная и безопасная конфигурация веб-сервера требует чёткого понимания принципов работы директивы location в Nginx. В новом материале представлено полное руководство, охватывающее ключевые аспекты:

Синтаксис модификаторов и алгоритм выбора блоков
Практическое различие между директивами root и alias
Готовые конфигурации для веб-приложений, API и балансировки нагрузки

Руководство также актуально для пользователей Angie, сохраняя полную совместимость конфигураций.

🖥 Читать статью

📱 @dev_notes_ru

#Nginx #Angie #location #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
👩‍💻 Совет по JavaScript: matchMedia()

Знаешь, как в JavaScript проверить, соответствует ли текущий viewport мобильному виду?

Не нужно городить window.innerWidth и слушать resize вручную.

Используй matchMedia — тот же самый медиа-запрос, что и в CSS:

const mq = matchMedia('(max-width: 550px)');

// Текущее состояние
console.log(mq.matches); // true / false

// Реагируем на изменения
mq.addEventListener('change', e => {
console.log('Мобильный?', e.matches);
});


Работает синхронно
Использует те же условия, что и в стилях
Не нужно самому отслеживать ресайз

📱 @dev_notes_ru

#JavaScript #CSS #Frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Вышла новая версия PHPStan 2.1.38

Этот релиз продолжает курс проекта на постоянное повышение производительности и приносит очередное значительное ускорение анализа.

🔥 Главная новость: еще быстрее!

Разработчикам удалось добиться еще 5–10% прироста скорости работы статического анализатора. Это улучшение — результат масштабной работы по оптимизации, которая ведется уже несколько релизов.

Основные изменения

Исправления ошибок:

Исправлена обработка экранированного символа # в регулярных выражениях в расширенном режиме.
Устранена ошибка в определении типов (type inference) для замыканий (closures), связанная с сокращенными именами функций (Function Normalization and Shortening Rule, FNSR).

Улучшения:

Убрано ограничение на версию PHP для правил, проверяющих атрибут #[\Override].
Улучшен анализ для выражений с New_ при использовании StaticMethodParameterClosureTypeExtension.
Улучшен вывод типов при сравнении результатов двух функций (FuncCall === FuncCall).
Теперь array_merge() не теряет информацию о типах известных ключей (offset-types) массивов.

Оптимизация производительности (основная часть работы):

Большинство изменений в этом выпуске направлены на повышение скорости. Были оптимизированы:

Наследование phpDoc-комментариев (теперь используется рефлексия).
Работа с шаблонными типами (TemplateTypeHelper), постоянными массивами (ConstantArrayType) и пересечениями типов (IntersectionType).
Логика в ImpossibleCheckTypeHelper, CombinationHelper и MutatingScope.
Кэширование результатов для предотвращения повторных вычислений.

Прочие правки:

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

Скачать обновление и увидеть все изменения можно как обычно на GitHub.

Обновляйтесь и наслаждайтесь еще более быстрым анализом кода! Если вы заметили какие-либо проблемы, сообщайте о них в трекере проекта.

📱 @dev_notes_ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
CSS может убивать.

📱 @dev_notes_ru

#CSS #Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤣3😁2
Британский код

📱 @dev_notes_ru

#React #Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
👩‍💻 Усиление безопасности Docker: Практическое руководство

Знаете, что чаще всего приводит к взлому Docker-контейнеров? Не 0-day уязвимости, а запуск от root и забытые секреты в образах. В статье рассматривается 11 практических шагов для реального усиления безопасности:

Запуск без прав суперпользователя
Сканирование образов на уязвимости
Файловая система в режиме «только для чтения»
Жёсткие ограничения на ресурсы

В статье — готовые примеры Dockerfile, команды и контрольный список перед деплоем.

🖥 Читать статью

📱 @dev_notes_ru

#Docker #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
👩‍💻 Современный JavaScript: группировка данных

Устали вручную группировать массивы? Теперь это встроенная функция! Object.groupBy() — ваш новый лучший друг для сортировки данных по любому строковому свойству.

const tasks = [
{ description: 'Task 1', tag: 'Tag 1', project: 'Project A' },
{ description: 'Task 2', tag: 'Tag 1', project: 'Project B' },
{ description: 'Task 3', tag: 'Tag 2', project: 'Project A' },
];

const tasksByProject = Object.groupBy(tasks, (task) => task.project);
console.log(tasksByProject);


Результат:

{
'Project A': [
{ description: 'Task 1', tag: 'Tag 1', project: 'Project A' },
{ description: 'Task 3', tag: 'Tag 2', project: 'Project A' },
],
'Project B': [
{ description: 'Task 2', tag: 'Tag 1', project: 'Project B' },
]
}


Поддержка: Все современные браузеры и JS-окружения поддерживают этот метод с марта 2024 года.
Для старых платформ доступен полифил через core-js.

🔑 Ключи любого типа: Если нужно использовать в качестве ключа не только строки, но и объекты, числа и другие типы — используйте Map.groupBy().

📱 @dev_notes_ru

#JavaScript #WebDev #Frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
В Laravel предложили стандартизировать PHP-атрибуты

Тейлор Отвелл выступил с инициативой сделать код Laravel более единообразным и современным. В рамках нового PR (Pull Request) предлагается повсеместно внедрить использование PHP 8 атрибутов в качестве основного способа конфигурации вместо свойств класса.

Что это значит?

Раньше для настройки, например, модели или задачи в очереди, использовались свойства класса (properties). Теперь для этого предлагаются нативные PHP-атрибуты, что делает код чище и современнее.

Что можно будет настраивать через атрибуты?

Eloquent-модели: #[Table('users')], #[PrimaryKey('user_id')], #[Hidden(['password'])]
Задачи в очереди (Jobs): #[Connection('redis')], #[Queue('podcasts')], #[Tries(3)]
Консольные команды: #[Signature('mail:send {user}')]
Form Request, Resources, Factories и другие компоненты.

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

Это предложение — важный шаг к единообразию кодовой базы Laravel и полноценному использованию возможностей PHP 8.

Attributes #58578

📱 @dev_notes_ru

#Laravel #PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Ошибки безопасности VPS и как их исправить

Знаешь, сколько времени нужно ботам, чтобы начать атаковать новый сервер? Меньше минуты. А дальше — сотни попыток подбора паролей и сканирования портов.

Если ты администрируешь VPS, эта статья — обязательный минимум. Здесь нет теории, только конкретные шаги:

Настройка SSH-ключей и запрет root-доступа
Установка Fail2ban и фаервола UFW
Настройка автономных бэкапов

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

🖥 Читать статью

📱 @dev_notes_ru

#DevOps #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Семантическая диффузия

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

Это явление — семантическая диффузия.

Эрик Эванс описал её для DDD (Domain-Driven Design). Концепция "ограниченного контекста" стала трактоваться как просто модуль, а "вездесущий язык" — как глоссарий. Суть терминов теряется.

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

Создатели термина не могут контролировать его использование. Можно попытаться защитить определение через книги и статьи, но это лишь замедляет процесс.

Диффузия имеет два последствия:

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

Полезный термин может быть утерян. Иногда его можно вернуть, настойчиво используя в первоначальном смысле и поправляя других. Иногда приходится находить новые слова для старой идеи (например, "рефакторинг (в оригинальном смысле)").

Важно помнить: когда термины становятся модными, их исходное значение часто размывается.

📱 @dev_notes_ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Лицензионный аудит зависимостей

А вы знаете, что безобидная сторонняя библиотека может заставить открыть исходный код всего вашего SaaS? Лицензионные риски в PHP-зависимостях — это не юридическая абстракция, а реальная угроза проекту.

В новой статье разбираем:


• Как автоматически находить «опасные» лицензии (GPL, AGPL, SSPL)
• Готовый скрипт для интеграции проверки в GitHub Actions
• Пошаговый план внедрения политики за один день

🖥 Читать статью

📱 @dev_notes_ru

#PHP #License
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Как автоматически генерировать сообщения коммитов с помощью Claude

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

Процесс работы

🔹 Скрипт получает изменения (git diff) для индексированных файлов.
🔹 Дифф передается в API Claude (через Anthropic SDK) с запросом создать краткое, информативное сообщение коммита в conventional commits стиле.
🔹 Полученный ответ используется для выполнения коммита.

Пример скрипта на Python

import subprocess
import anthropic
import os

# 1. Получить дифф
diff_output = subprocess.run(
["git", "diff", "--cached"],
capture_output=True,
text=True
).stdout

# 2. Создать промт и отправить в Claude
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

message = client.messages.create(
model="claude-3-haiku-20240307",
max_tokens=100,
temperature=0,
system="Сгенерируй краткое, информативное сообщение коммита на основе git diff. Используй формат conventional commits (например, feat:, fix:, chore:).",
messages=[
{"role": "user", "content": f"Создай сообщение коммита для этого diff:\n\n{diff_output}"}
]
)

commit_message = message.content[0].text.strip()

# 3. Выполнить коммит
subprocess.run(["git", "commit", "-m", commit_message])
print(f"Коммит создан: {commit_message}")


Ключевые моменты

🔹 Используйте переменную окружения ANTHROPIC_API_KEY.
🔹 Модель claude-3-haiku быстрая и недорогая для этой задачи.
🔹 Промт инструктирует Claude придерживаться формата conventional commits.

Процесс автоматизирует рутинную работу, оставляя пользователю финальный контроль.

Альтернативный подход: Husky + скрипт


Для запуска генерации перед каждым коммитом можно использовать хуки Git (например, через Husky).

🔹 Установите Husky: npm install husky --save-dev.
🔹 Активируйте хуки: npx husky install.
🔹 Создайте хук prepare-commit-msg:

#!/bin/bash
# .husky/prepare-commit-msg

# Выполнить скрипт генерации и записать сообщение в файл
python generate_commit_message.py > "$1"


Использование Claude для генерации сообщений коммитов экономит время и улучшает их качество. Локальный скрипт или интеграция с хуками Git делают процесс seamless. Всегда проверяйте сгенерированные сообщения перед отправкой коммита.

📱 @dev_notes_ru

#Git #Commit
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Шпаргалка по Git: все команды для работы с ветками и репозиториями

Знаете, какая самая частая ошибка у тех, кто только начинает работать с Git? Не путать merge с rebase, а… просто не знать, как быстро откатить последний коммит или временно спрятать изменения.

Мы обновили нашу большую шпаргалку по Git — теперь там:

Все основные и продвинутые команды с примерами
Разделы по веткам, истории, удалённым репозиториям и работе в команде
Ссылки на подробные статьи, если нужно глубже разобраться в теме

Сохраните себе в закладки — это тот файл, который спасёт вас в дедлайн.

🖥 Читать статью

📱 @dev_notes_ru

#Git #Сheatsheet #Шпаргалка
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1🔥1
Вышел Laravel 12.50.0

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

🚀 Ключевые изменения и новые возможности

Эти обновления добавят гибкости и надежности проектам.

🔹 Уникальные слушатели событий в очередях (#58402): Теперь вы можете избежать дублирования задач в очереди для слушателей событий, используя метод unique(): SendOrderShippedNotification::class)->unique()->onQueue('notifications') → SendOrderShippedNotification::class)->unique()->onQueue('notifications'). Это особенно полезно для частых событий, чтобы предотвратить накопление идентичных заданий.
🔹 Элегантное управление дополнениями (appends) у моделей (#58552): Появился новый метод withoutAppends() для временного отключения глобальных дополнений (accessors/appends) при сериализации модели: $user->withoutAppends()->toArray() → $user->withoutAppends()->toArray().
🔹 Enum-поддержка в кеше (#58616): Метод Cache::get() теперь корректно работает с массивом, содержащим enum-ключи, что упрощает работу с typed-кешированием.
🔹 Метод hasMany() для коллекций (#58550): У объектов Collection появился удобный метод hasMany() для проверки, содержит ли коллекция более одного указанного элемента.
🔹 Клонирование состояния в нотификациях (#58558): Исправлено поведение, гарантирующее, что каналы доставки (via), заданные динамически в методе via(), сохраняются при отправке уведомления через sendNow().

🛠 Улучшения и исправления

🔹 Сохранение ассоциативных ключей в отношениях (#58506): При eager loading отношений ассоциативные ключи родительской коллекции теперь сохраняются, что предотвращает неожиданную переиндексацию.
🔹 Использование morphMap при сериализации моделей (#58482): При сериализации идентификаторов модели в заданиях очереди теперь автоматически учитывается глобальный morphMap, обеспечивая консистентность.
🔹 Улучшенные типы данных в коде (#58518, #58561, #58565, #58451): Продолжается работа над улучшением типизации в ядре фреймворка (хелпер Arr, миграции, команды Console, фасад Cache), что улучшает анализ кода в IDE.
🔹 Безопасность и обслуживание: Внутренние зависимости обновлены для устранения уязвимости в PHPUnit (CVE) и других проблем совместимости (#58526, #58542, #58563).

⚙️ Прочие изменения

Релиз также содержит множество других правок, улучшающих стабильность, тестирование и взаимодействие с разработчиком: улучшения в компоненте InteractsWithData для тестов (#58607, #58608), исправление двойного перевода сообщений об ошибках валидации (#58598), корректная обработка исключений при установке пакетов через Composer (#58609) и многие другие мелкие исправления и улучшения документации.

Что в итоге?

Laravel 12.50.0 — релиз, который приносит ценные практические улучшения (уникальные слушатели, управление appends, фиксы в отношениях) и продолжает курс на более строгую и предсказуемую кодовую базу. Обновление можно установить через composer update.

Полный список изменений можно найти в официальном релизе

📱 @dev_notes_ru

#Laravel #Laravel12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥51👍1
Выбор стратегии ветвления Git: анализ и практические рекомендации

Ваша команда тратит часы на разрешение конфликтов при слиянии веток? Или, может, вы только начинаете и не знаете, как организовать процесс? 🤨 Стратегия ветвления в Git — это не догма, а рабочий инструмент, и его выбор сильно влияет на скорость и качество разработки.

В свежей статье разбираем четыре основные стратегии:
• Git Flow — для строгого контроля версий
• GitHub Flow — для непрерывного развертывания
• GitLab Flow — разумный компромисс
• Trunk-Based Development — для зрелых команд с безупречной дисциплиной

Плюс практические критерии выбора: частота релизов, зрелость тестов, размер команды. Узнайте, какая модель снимет боль именно в вашем проекте.

🖥 Читать статью

📱 @dev_notes_ru

#Git #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍21
Меня никто не понимает. Может быть, я JavaScript. 🤷‍♂️

📱 @dev_notes_ru

#JavaScript #Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
Разница между TCP и UDP

📱 @dev_notes_ru

#Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👎1🤣1
Управление зависимостями PHP с Composer

Устали от конфликтов версий и «зависимого ада» в PHP-проектах? Ручное управление библиотеками — это прошлый век. В новом руководстве разбираем Composer — инструмент, который автоматизирует всю рутину и делает ваши проекты предсказуемыми.

В статье разбираем на практике:

Быстрый старт: первый проект с зависимостью за 5 минут.
Как работает «магия» автозагрузки и разрешения версий.
Ключевые команды (require, install, audit) и лучшие практики.

Готовы навести порядок в коде? Делимся практическими шагами и лучшими практиками.

🖥 Читать статью

📱 @dev_notes_ru

#PHP #Composer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Настройка Apache для Laravel: от локальной среды до продакшена

Часто ли у вас маршруты Laravel внезапно отваливаются с 404 после заливки на сервер? Корень проблемы почти всегда — в неправильной конфигурации Apache. Систематизировал весь процесс настройки от и до:

Единый принцип работы Laravel с Apache: почему DocumentRoot должен указывать строго на /public.
Настройка HTTPS с безопасными шифрами и редиректом.
Работа в поддиректории и запуск на shared-хостинге, где доступен только .htaccess.

В статье — готовые конфиги, чёткие шаги и разбор популярных проблем.

🖥 Читать статью

📱 @dev_notes_ru

#Apache #Laravel #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышел Laravel 12.51.0

Привет, Laravel-разработчики! Только что вышел новый минорный релиз — Laravel 12.51.0. Несмотря на номер, здесь собралось множество полезных и долгожданных фич, а также важные исправления для повседневной работы. Вот на что стоит обратить внимание.

🚀 Что нового и полезного

🔹 Умная валидация с whenFails() и whenPasses() (#58655)
Теперь с валидатором можно работать еще изящнее. Добавили два новых метода, которые запускают код только при определенном исходе проверки. Это гораздо чище, чем старые if-else блоки после $validator->fails().

🔹 Гибкие значения в firstOrCreate (#58639)
Классная фишка! Методы firstOrCreate и createOrFirst теперь наконец-то поддерживают замыкания для значений. Это решает давнюю проблему, когда нужно было динамически вычислить значение для создания, но нельзя было передать функцию.

🔹 Событие отмены пакетных заданий BatchCancelled (#58627)
Для тех, кто активно работает с пакетными заданиями в очередях, добавили специальное событие BatchCancelled. Теперь вы можете легко отследить и отреагировать, когда пользователь (или система) отменил выполнение целого пакета задач.

🔹 Код после отправки уведомления (afterSending) (#58654)
Уведомления обзавелись методом afterSending(). Хотите логировать факт отправки, обновлять статус в БД или запускать следующую задачу только после того, как письмо улетело? Теперь это делается в пару строчек прямо в классе нотификации.

🔹 Таймаут для запросов MySQL (#58644)
Прямо в Query Builder для MySQL добавили метод timeout(). Теперь не нужно лезть в глубокую конфигурацию соединения, чтобы задать лимит выполнения для одного конкретного тяжелого запроса. Удобно для оптимизации.

🔹 Сортировка сводной таблицы по убыванию (#58720)
В отношениях «многие-ко-многим» давно был orderByPivot(). Теперь добавили и orderByPivotDesc() для полного счастья и читаемости кода.

🛠 Важные исправления

🔹 Очереди: Исправлена критическая ошибка в подсчете заданий внутри пакета (Batch), когда используется опция deleteWhenMissingModels (#58541). Также пофиксили работу Queue::fake() — теперь он корректно сбрасывает блокировки уникальных заданий между тестами (#58718), что могло приводить к ложным успехам в тестах.

🔹 PostgreSQL: Поправили определение начального значения для sequence (автоинкремента), если вы используете нестандартные схемы или названия соединений (#58199). Баг мог приводить к конфликтам первичных ключей.

🔹 Строки: Метод Str::isUrl() больше не будет выдавать ложный сигнал об ошибке на однобуквенных доменах (#58686). А Str::substrReplace() теперь правильно работает с отрицательными значениями offset и length в крайних случаях (#58634).

⚙️ Улучшения под капотом и для разработчика

🔹 Тестирование стало лучше: Для фейковых пакетов заданий добавили метод assertJobs() (#58606). А Bus::assertBatched() теперь можно вызывать, передавая массив для проверки (#58659). Еще добавили изоляцию префиксов кеша для параллельного тестирования, чтобы тесты не мешали друг другу (#58691).

🔹 Безопасность и инфраструктура: Добавили поддержку SSL-сертификатов при дампе и загрузке схемы базы данных MySQL через Artisan-команды (#58690).

🔹 Типы и IDE: Очередная порция улучшений аннотаций PHPDoc и исправлений типов по всей кодовой базе. Особенно много правок в хелперах, валидации и HTTP-клиенте. Ваша IDE будет больше понимать и меньше ругаться.

🔹 Уведомление об устаревании: Методу Request::get() официально добавили пометку @deprecated (#58635). Пора переходить на использование свойства запроса (например, $request->name) или метода input().

💎 Что в итоге?

Laravel 12.51.0 — это тот случай, когда минорный релиз приносит мажорное удовольствие. Новые методы для валидатора и уведомлений решают реальные боли, а исправления в очередях и PostgreSQL — закрывают важные грабли. Если вы на 12.x ветке — обновляйтесь смело, благо composer update сделает всё быстро.

Полный список всех коммитов в официальном changelog: https://github.com/laravel/framework/releases/tag/v12.51.0

📱 @dev_notes_ru

#Laravel #Laravel12 #PHP #Backend
Please open Telegram to view this post
VIEW IN TELEGRAM