msavin – Telegram
msavin
640 subscribers
21 photos
1 video
1 file
36 links
Пишу про пыху и backend разработку. Менторю, смотри закреп
ЛС - msavin_dev
Download Telegram
CTF

Приняли участие в CTF (capture the flag) от T-bank с @aldardeb и @tsym_tima

На данный момент мы аж на 1205 месте). Это оказалось еще сложнее, чем предыдущий gamethon😅

На выбор есть множество заданий, одно из простейших - на первом скрине. У Вас есть магазин, 100 монет, а надо купить флаг за 1337. Чуть покопавшись, нашли, что количество капитокенов передается в jwt в cookies.
Правда токен не токен - пользовательская информация в header, не указан алгоритм шифрования, тело вообще по всей видимости являлось бинарным обозначением движения средств (скрин 2)

Логично было бы подменить токен.
Сначала попробовали прописать "alg": "none" флаг, шоб обойти проверку.
Вторым вариантом было подобрать секрет из логичных вариантов (ctf, название команды, uuid команды и прочее).
Потом попробовали забрутфорсить секрет. Спустя часа 2 мы дошли только до 7-символьных секретов, что оч долго (скрин 3)
Таким образом наши идеи кончились

Я пересмотрел кучу видосов по прохождению машин, но ума мне это не прибавило)

Может кто-то из вас уже решал подобные задачи?
🤮48🔥10
AI + opensource

В opensource проектах стали появляться просьбы не использовать написанные AI PRs.

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

Сразу возникает вопрос, а чем я лучше чатгпт, я тоже списываю код у других, не очень то спрашивая лицензию :(
👎21👍11💘2💯1
Export-ignore-check

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

Но у меня лично каждый раз боль глазами сравнивать структуру файлов и содержимое .gitattributes (export-ignore директива), тем более часто случается рассинхрон, в том числе и у крупных библиотек (тот же phpstorm-stubs)

В связи с этим написал либу, которая призвана проверить, что там за архив получается из вашей библиотеки (через git archive или скачав напрямую с packagist) и найти там ненужные файлы. Она покажет вам сколько вы сэкономите кБ, вдобавок автоматически может добавить рекомендуемые изменения в ваш .gitattributes.

Я прогнал топ тысячу пакетов с packagist, 470 из них могут быть оптимизированы, так шо возможно и вам пригодится
👎21👍12🔥5
Modulith

Написал туториал по этой незамысловатой архитектуре для Symfony приложений.
Не нашел норм статей, а сам каждый раз забываю, как писать все эти конфигурационные файлы, и иду рыться в старых проектах в поисках примера 😢
🤮51👎20👍92😢2💘1
Под предыдущим видео было много комментариев, шо вопросы слишком рандомные и поверхностные, поэтому сделал видос, где большую часть времени (35 минут) мы с интервьюером разбираем бизнес задачу

Мне лично нравятся собесы, где не блиц опрос по 100 темам (как это в ВК, например), а вы решаете одну крупную задачу - будь то рефакторинг кода, system design, или проектирование, как вот здесь

Надеюсь, вам тож такой собес зайдет

Ссылка 👇
https://youtu.be/4qV7G1tR21g
12👍3
Shared Memory vs Redis: микросекунды против миллисекунд

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

Привычным решением было бы использовать Redis.
Там затраты были бы около 0.10 - 0.12 ms, если не надо открывать TCP соединение заново.
Если надо - то уже около 0.30 ms (тык тык тык).
И это если Redis стоит на локалхосте, иначе затраты могли бы вырасти до 3 порядков

Подход с разделением оперативной памяти в результате испытаний по моему бенчмарку дал 27 µs (~0.03 ms) задержки на передачу данных, что в примерно в 4 раза быстрее, чем Redis с persistent connection

В php оказалось готовое API и для семафоров, и для мьютексов, и для самой shared memory:

<?php

$key = 0xDEADBEEF;
$size = 1024;

$shm = shmop_open($key, 'c', 0666, $size);
$mutex = new SyncMutex('crypto_rate_mutex');

$mutex->lock();
shmop_write($shm, $payload, 0);
$mutex->unlock();


Есть и другие варианты IPC, но показались неподходящими

Как итог, сэкономили около 0.07 ms 😅. В обычном бэкенде и подумать смешно о таких оптимизациях, но в контексте приложений, где счет идет на миллисекунды помноженные на тысячи операций в день - это профит!
🔥163👏2
А как вы относитесь к graphql?
❤️ - мне нравится, особенно типизация на фронте
💩 - мне не нравится, особенно генерация схемы на бэке
🤔 - что это?
1🤔27💩2211
Используете AAA (arrange-act-assert/given-when-then) при тестировании?
Anonymous Poll
43%
да
19%
нет
38%
не пишу тесты
Итак, по результатам опроса 44% респондентов используют AAA pattern при тестировании
Я обычно отделяю части комментариями, хотя кто-то просто пустыми строками, но периодически сам забываю, периодически команда приносит тесты с несколькими act-assert
Поэтому запилил правило для ректора на этот счет, может и вам будет полезно
🔥41
Замутил бэйджик для библиотек, которые оптимизировали свой дистрибутив для скачивания конечным пользователем
Вот инструкция, как добавить его к своему репозиторию
👍61
Правило для ректора, добавляющее именованные аргументы, теперь умеет убирать дефолтные значения из переданных аргументов, чтобы код был еще выразительнее, пробуйте 🙂
🔥10
image_2025-10-18_19-51-45.png
141.6 KB
Мне окончательно надоело, что в симфоневом профайлере нельзя посмотреть тело ответа, только заголовки. Толку то мне от заголовков..

Благо симфа и здесь легко расширяется, поэтому я быстренько навайбкодил написал бандл, позволяющий смотреть содержимое ответа. Аналогов найти я не смог(
По умолчанию работает для json- и text- подобных mime-типов, и обрезает слишком большие ответы (настраиваемо).

Если разделяете мою боль - велком
🔥15
Залил видео нового формата - что-то вроде разбора частых ошибок (если ты бородатый симфонист, то скипай). В данном случае - как валидировать реквесты в симфе. Вопрос в целом тривиальный, но постоянно вижу велосипеды, пару из них даж нашел и вставил в видос

Вдобавок закинул тех на ютуб
Была задача на ревью, поинтереснее прошлой, проектирование базы и 2 десятка теоретических вопросов по базам, пхп, архитектуре и безопасности
1👍9🔥32
Открыл PR в php-src, добавляющий для BackedEnum нативный метод values, потому что часто вижу в проектах создают трейт под это дело
RFC пока не делал, подожду реакции от internals

Если тебе кажется удобной такая фича, поставь пж 👍 на мр 🙂
👍13🔥31
Пока идет обсуждение моего RFC в пыху, узнал, что array_column может доставать не только колонки массива, как казалось бы, но и свойства объектов:


enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}

// What does self::cases() return?
var_dump(Status::cases());
// array(3) {
// [0]=> enum(Status::Active) // <- These are OBJECTS
// [1]=> enum(Status::Inactive) // <- Not arrays
// [2]=> enum(Status::Pending)
// }

// Each case object has public readonly properties:
$case = Status::Active;
echo $case->value; // "active" (string - the backing value)

// array_column can extract these properties!
$values = array_column(Status::cases(), 'value');
var_dump($values);
// array(3) {
// [0]=> string(6) "active"
// [1]=> string(8) "inactive"
// [2]=> string(7) "pending"
// }


А вы знали про такое?
👍21💯4
Вы знали, что у php-fpm можно получить вот такую статистику работы, в том числе по пуллам?

URL эндпойнта можно менять в конфиге (и в nginx'е обновлять локейшн), а формат можно менять в query параметрах (json/html/text)

Не то чтобы эта инфа очень мне помогла, но было интересно понаблюдать за своим приложением, может и вам пригодится 🙂

Дока здесь
👍12🔥5