В PHP 8.4 появились array_find(), array_find_key(), array_any() и array_all().
Вместо:
foreach ($users as $user) {
if ($user->isAdmin()) {
$admin = $user;
break;
}
}
можно написать:
$admin = array_find($users, fn($user) => $user->isAdmin());
Мелочь, но код сразу читается как то, что именно мы хотим найти, а не как инструкция для обхода массива.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👏3🤔2👾2❤1
❤️ — 1
🔥 — 2
👍 — 12
👾 — Fatal error
Причём return внутри finally перезаписывает результат, который должен был вернуть try.
⚠️ Ловушка на собесе: если убрать return 2 из finally, функция вернёт 1.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41❤13👍7🤔4
🔐 ramsey/uuid — UUID без самописного кода
Библиотека помогает генерировать, парсить и валидировать UUID, а также работать с ними как с объектами.
Подходит, когда UUID активно используются в проекте и хочется вынести всю работу с ними в готовый инструмент.
🔗 GitHub
🐸 Библиотека пхпшника
Библиотека помогает генерировать, парсить и валидировать UUID, а также работать с ними как с объектами.
use Ramsey\Uuid\Uuid;
$id = Uuid::uuid4();
echo $id->toString();
Подходит, когда UUID активно используются в проекте и хочется вынести всю работу с ними в готовый инструмент.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🌚4❤1🔥1
Http::preventStrayRequests() запрещает тестам обращаться к реальным API.
Например:
Http::preventStrayRequests();
Http::fake([
'example.com/*' => Http::response('ok'),
]);
Http::get('https://example.com/users'); // ✅ ok
Http::get('https://proglib.io'); // ❌ исключение
Так тесты не зависят от доступности внешних сервисов и не отправляют неожиданные запросы в CI.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21
AI уже пишет код. Теперь важнее научиться встраивать его в разработку так, чтобы он действительно экономил время.
На курсе «ИИ для разработчиков» собираете AI-workflow на своём проекте: от задачи и планирования до тестов, ревью и PR🤩
Разберёте AI-агентов, MCP, контекст проекта, безопасность и контроль расходов на модели.
Промокод:
LastcallAIPlease open Telegram to view this post
VIEW IN TELEGRAM
🥱2
Следующий шаг — AI-агенты. Они не просто отвечают на запросы, а сами работают с данными, инструментами и выполняют цепочки действий.
На курсе «Разработка ИИ-агентов» разбираем всё, что нужно для этого уровня:
Курс полностью в записи — проходите материалы в своём темпе, без привязки к расписанию.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱12
Forwarded from Библиотека Go-разработчика | Golang
Перенос MiniJinja с Rust на Go силами Opus и Codex
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
Около десяти часов работы агента и примерно 45 минут активного участия автора. Так Армин Ронахер оценивает основной перенос MiniJinja с Rust на Go. MiniJinja собирает текст по шаблонам.
Он начал с Opus 4.5 внутри Pi, а оставшиеся исправления тестов передал GPT-5.2 Codex. Рабочая среда оставалась той же; Go-реализацию сверяли с сохранёнными результатами тестов Rust-версии.
По ходу работы агент отказался от проверок, в которых программа должна завершаться ошибкой: текст сообщений не совпадал дословно. Ронахер вмешался и сохранил эти тесты, изменив способ сравнения сообщений.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека Go-разработчика | Golang
Поделитесь своим подходом к работе с нейросетями:
Anonymous Poll
61%
Пользуюсь только чем-то одним для всего подряд
16%
Под каждую задачу подбираю свой инструмент
11%
Сравниваю, что на один и тот же вопрос ответят разные модели
8%
Пока вообще не пользуюсь ИИ
3%
Другое (напишу в комментариях)
Forwarded from Библиотека программиста
Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?
Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.
В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.
Please open Telegram to view this post
VIEW IN TELEGRAM
Clockwork: куда ушло время PHP-запроса
Страница тормозит, а в логах только общий ответ? Clockwork собирает данные о выполнении приложения: запросы к БД, логи, события и timeline. В Laravel интеграция устанавливается через
Свои этапы тоже можно пометить событиями. На карточке — реальная учебная timeline: у
По умолчанию сбор активен в debug-режиме. Для команд и queue jobs нужны настройки. Данные диагностики могут содержать чувствительные значения, поэтому не открывайте интерфейс и метаданные всем пользователям приложения.
Документация и установка Clockwork
Библиотека пхпшника
Страница тормозит, а в логах только общий ответ? Clockwork собирает данные о выполнении приложения: запросы к БД, логи, события и timeline. В Laravel интеграция устанавливается через
composer require itsgoingd/clockwork, собранные запросы можно смотреть на /clockwork.Свои этапы тоже можно пометить событиями. На карточке — реальная учебная timeline: у
import задана задержка, normalize преобразует одну строку. Это помогает отделить этапы, а не гадать по общему времени.По умолчанию сбор активен в debug-режиме. Для команд и queue jobs нужны настройки. Данные диагностики могут содержать чувствительные значения, поэтому не открывайте интерфейс и метаданные всем пользователям приложения.
Документация и установка Clockwork
Библиотека пхпшника
👍4
Forwarded from Типичный программист
Общая папка для работы Claude Code и Codex
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так:
Папка хранит исходные материалы и решения
↓
Индекс указывает, где искать данные для задачи
↓
Claude Code планирует работу
↓
Codex выполняет задачи по его вызову
В описании этого рабочего процесса Бушар объясняет, зачем даёт агенту сведения для конкретной задачи. Начать предлагает с общей папки, короткого индекса и одного повторно используемого скилла.
#ии #инструменты
Forwarded from Типичный программист
Типичный программист
Общая папка для работы Claude Code и Codex Луи-Франсуа Бушар собрал заметки, инструкции-скиллы, скрипты и итоги встреч в Obsidian. Его связка устроена так: Папка хранит исходные материалы и решения ↓ Индекс указывает, где искать данные для задачи ↓ Claude…
Приходится ли вам копипастить данные и какие именно, когда переходите из одной нейросети в другую?
Anonymous Poll
17%
Код
28%
Описание задачи
14%
Документацию
17%
Результаты работы
20%
Настройки и контекст: историю чатов, промпты, скиллы
50%
Ничего, использую один инструмент
❤1
Forwarded from Типичный программист
🧑💻 Какие навыки помогают вам в разработке в 2026 году?
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
Что вы чаще используете в работе? В каких задачах помогает ИИ, а где проще справиться самостоятельно?
Мы решили собрать портрет современного разработчика — и приглашаем вас поделиться своим опытом. Расскажите, какие навыки вам пригодились и как вы используете ИИ. Если обходите его стороной, нам тоже интересно узнать почему.
Опрос анонимный и займёт около 5 минут. Результаты опубликуем в общем большом исследовании.
👉 Пройти опрос
Лимит запросов в Symfony: где хранится запас токенов
Token bucket допускает всплеск запросов, пока есть токены, а затем пополняет запас с заданной частотой. В локальном примере запас равен двум: первые два запроса разрешены, третий отклонён. Через 1,1 секунды появился новый токен.
Но настройка лимита — только половина дела. Остаток хранится в состоянии лимитера. В Symfony по умолчанию это
Компонент начинает работать после запуска PHP и Symfony. Защиту от DoS нужно ставить раньше, на сервере или прокси. Учебный тест на карточке последовательный, он не проверяет распределённую конкуренцию.
Политики, хранилище и locks
Библиотека пхпшника
Token bucket допускает всплеск запросов, пока есть токены, а затем пополняет запас с заданной частотой. В локальном примере запас равен двум: первые два запроса разрешены, третий отклонён. Через 1,1 секунды появился новый токен.
Но настройка лимита — только половина дела. Остаток хранится в состоянии лимитера. В Symfony по умолчанию это
cache.rate_limiter: очистка кеша сбрасывает лимиты. Для нескольких процессов нужны общее хранилище и согласованный механизм блокировок, иначе параллельные запросы могут обойти ограничение.Компонент начинает работать после запуска PHP и Symfony. Защиту от DoS нужно ставить раньше, на сервере или прокси. Учебный тест на карточке последовательный, он не проверяет распределённую конкуренцию.
Политики, хранилище и locks
Библиотека пхпшника
json_validate перед json_decode: один JSON разбирается дважды
Если данные сразу понадобятся в PHP, не нужно сначала вызывать
В проверенном примере
Когда использовать json_validate
Библиотека пхпшника
Если данные сразу понадобятся в PHP, не нужно сначала вызывать
json_validate. json_decode сам проверяет строку при разборе. С JSON_THROW_ON_ERROR невалидный JSON даст JsonException.json_validate полезен, когда нужен только ответ «это корректный JSON?», а массив или объект создавать не нужно. Функция доступна с PHP 8.3 и в таком сценарии требует меньше памяти, чем декодирование.В проверенном примере
{"port":8080} валиден, {"port":} — нет. При декодировании первого получаем значение 8080, второго — исключение. Валидная строка null тоже проходит проверку: синтаксис JSON ещё не гарантирует нужную вам структуру данных.Когда использовать json_validate
Библиотека пхпшника
Подпись защищает URL от подмены. Но сама по себе не мешает открыть одну ссылку несколько раз до истечения срока.
В разрабатываемом Symfony 8.2 у UriSigner появляется дополнительный аргумент $version. Он участвует в подписи, но не добавляется в URL.
Для сброса пароля версией может стать текущий хеш пароля:
$url = $uriSigner->sign(
$resetUrl,
new \DateInterval('PT30M'),
$user->getPassword(),
);
// При обработке ссылки:
$uriSigner->verify($request, $user->getPassword());
После сохранения нового пароля хеш изменится. Проверка старой ссылки с новым значением версии завершится исключением UnverifiedSignedUriException.
Важная деталь: verify() не погашает ссылку
Она остаётся действительной, пока состояние, выбранное в качестве версии, не изменилось. Поэтому нельзя считать такой механизм атомарной защитой от двух одновременных запросов: конкурентное выполнение нужно учитывать отдельно.
Возможность относится к будущему Symfony 8.2. Для текущего проекта сначала проверьте версию компонента.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: Single-Use and Safer Signed URLs (Symfony Blog)
Symfony 8.2 lets you create single-use signed URLs and allows adding extra signed parameters to login links.
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱3👾1
Приложение работает, тесты зелёные — пока не меняется движок базы данных.
В Pinkary первичный ключ questions.id был UUID. А поля parent_id и root_id создали через foreignId(), то есть как целочисленные столбцы:
$table->foreignId('parent_id');Гибкая типизация SQLite позволяла хранить там строки UUID. При переходе на MySQL несоответствие стало проблемой: тип столбца должен соответствовать реальным значениям и связанному ключу.
Здесь легко сделать слишком широкий вывод. Проблема была именно в явных вызовах foreignId('parent_id') и foreignId('root_id'). Метод foreignIdFor() умеет определять UUID-тип по модели — это другой случай.
Что проверить до переезда
Запустите миграции и характерные запросы на том движке, который будет в рабочей среде. Помимо типов, могут отличаться правила группировки, сравнения строк и порядок результатов при одинаковых временных метках.
ORM делает запросы удобнее, но не делает SQLite и MySQL взаимозаменяемыми во всех деталях.
Please open Telegram to view this post
VIEW IN TELEGRAM
Laravel
Migrating Pinkary from Laravel Forge to Laravel Cloud: An engineering playbook | Laravel - The clean stack for Artisans and agents
Pinkary's move from Laravel Forge to Laravel Cloud exposed SQLite and MySQL differences, query assumptions, and local-storage coupling. Here is the code-backed...
API получает userId. Проверить, что это строка, недостаточно: пользователь с таким идентификатором может не существовать.
В будущем Symfony 8.2 для этой задачи появится ограничение EntityExists из Doctrine Bridge:
use App\Entity\User;
use Symfony\Bridge\Doctrine\Validator\Constraints\EntityExists;
use Symfony\Component\Validator\Constraints as Assert;
final class AssignOrderCommand
{
#[Assert\NotBlank]
#[EntityExists(entityClass: User::class)]
public string $userId;
}
По умолчанию поиск идёт по идентификатору сущности. Можно выбрать другое поле через identifierField или задать собственный метод репозитория.
Зачем рядом NotBlank
EntityExists считает null и пустую строку допустимыми. Если поле обязательно, это отдельное правило.
Есть ещё две границы. Существование записи не означает, что текущему пользователю разрешено с ней работать. И успешная проверка не гарантирует, что запись не удалят до сохранения операции.
Поэтому авторизацию и ограничения целостности базы такая валидация не заменяет.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: EntityExists, Cron and Audio Constraints (Symfony Blog)
Symfony 8.2 adds new constraints to validate Doctrine entity references, cron expressions and audio files.
❤1