dd

Автор: dd

  • PostgreSQL против MySQL на практике

    На днях ходил на собеседование и меня спросили почему я выбираю postgresql вместо mysql, на что я ответил следующее:
    1. в постгресе есть схемы, которые позволяют лучше группировать таблицы по смыслу
    2. структурные изменения (редактирование/удаление таблиц и прочее) являются транзакционными
    И вроде бы всё, но для меня даже этих доводов достаточно, чтобы никогда не глядеть в сторону мускула, несмотря на его размер и быстродействие
    А сегодня, работая над старым проектом проявилась ещё одна "потрясающая" особенность:
    оказалось, что в мускуле существует неявное приведение типов, поэтому поиск пользователей по id со значением "834d885862330efee5e414bcda2b145b" внезапно выдал мне пользователя с id = 843
    Я сначала думал это orm такое творит, потому подумал на pdo, но запрос из phpmyadmin развеял все сомнения
    Да, наверняка, в конфиге или в connection string можно указать настройку, чтобы такого не происходило, но я не помню когда последний раз лазал в настройки базы, потому что из коробки всё отлично работает

  • $object::class в PHP 8

    Я как-то в списке изменений php8 пропустил это, но теперь наконец-то можно делать $object::class, а не get_class($object)
    https://php.watch/versions/8.0/class-constant-on-objects

  • Ночное вдохновение кодить

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

  • Транзакционная файловая система на PHP

    меня всегда волновал вопрос транзакционности файловой системы: почему в базах данных поддержка есть, а в ОС нет? (ну, есть конечно, но этим надо отдельно заниматься и устанавливать)
    в работе пару раз сталкивался с ситуациями, когда такой функционал был бы крайне полезен, но в итоге обходился блоками try-catch и чисткой ресурсов при ошибках
    а вот около двух недель назад понял, что уже не маленький и наверное смогу сам что-то подобное в жизнь претворить
    тут как раз были майские, поэтому я плотно засел за этот проект и вот что вышло: https://github.com/ddruganov/php-transactional-filesystem
    в readme и тестах есть руководство по пользованию, но если кратко, то:
    1. создаётся экземпляр транзакционной файловой системы
    2. работаем с ней как с обычной файловой системой (есть все crud-операции)
    3. по итогу зовём commit() (или `rollback()`)
    4. готово
    пакет поддерживает операции только с простыми файлами и папками, без символических ссылок
    тестовые сценарии для коммита будут потихоньку добавляться по мере использования пакета, сейчас там описаны простые частые случаи
    кстати, именно тут нашли применение типизированные массивы и пока работал над этим проектом, то нашёл несколько недочётов и исправил их
    пошёл дальше заниматься разработкой экосистемы своих сервисов, сейчас со свежей головой можно к ним вернуться наконец-то

  • Пакет для типизированных массивов в PHP

    при разработке одного из домашних проектов очень понадобились типизированные массивы
    я не теряю надежду, что когда-нибудь в пхп завезут дженерики, но пока остаётся только писать какие-то заместители
    поэтому, представляю вам простецкий пакет для создания типизированных массивов: https://github.com/ddruganov/php-typed-array
    с композера тоже можно поставить, инструкция в репе
    как говорит packagist.com, такие пакеты уже есть (у одного даже почти такая же имплементация), но мне пофиг, это был хорошая разминка для мозга на часик в выходной вечер 🙂

  • Пакет PHPVerbalExpressions

    обнаружил вот такой замечательный пакет для упрощения написания регулярных выражений:
    https://github.com/VerbalExpressions/PHPVerbalExpressions
    в бою пока не использовал, но выглядит очень интересно

  • Комментарий про выборку из Oracle

    нашёл такой замечательный комментарий в коде, который обращается к базе oracle и вытаскивает только одну страницу выборки 😀

  • Пакет yii2-api-essentials

    И раз уж начал писать про свои пакеты, то вот ещё один, тоже для yii2: https://github.com/ddruganov/yii2-api-essentials
    Его суть в том, что при разработке апи постоянно нужны одни и те же повторяющиеся элементы, без которых уже совсем неудобно работать и которые из раза в раз доказывают свою полезность. Среди них, кстати, есть и вышеупомянутый ExecutionResult 🙂 а так же всякие сильно недостающие исключения типа NotImplementedException.
    Пакет небольшой, но пока работал над системой авторизации появилось много мыслей по доработке, потихоньку буду допиливать

  • Пакет единой авторизации для Yii2

    Наконец-то закончил доделывать систему единой авторизации для всех своих текущих и будущих сервисов.
    Все пакеты, которые в этом деле участвуют, написаны для yii2 на php8.1.
    1. https://github.com/ddruganov/yii2-api-auth
    Это основной пакет и он управляет основным сервером авторизации. На этот сервер вы отправляете пользователей логиниться/регистрироваться, а в дальнейшем на этом сервере проверяете и обновляете токены авторизации. На этот же сервер уходит запрос для выхода из аккаунта.
    Так же, вся работа по определению доступа пользователей к ресурсам производится на этом же сервере через rbac. Каждое разрешение пользователя привязано к определённому приложению из заданного реестра. Кстати, сам учёт приложений в вашей сети ведётся здесь же.
    2. https://github.com/ddruganov/yii2-api-auth-proxy
    Этот пакет проксирует все вызовы авторизации и проверки прав на основной сервер авторизации. Здесь дублируются все экшены из первого пакета, так что при желании можно заменить один пакет другим за минимальное время не теряя в функционале.
    Планируется этот пакет перенести на c#, так это будет делом простым, а пощупать разработку апи на шарпе хочется уже слишком давно.

    Так как я только закончил работу над пакетами, то многие моменты там оставляют желать лучшего, из самых ярких: readme, тесты и эндпоинты создания ролей/разрешений/приложений. В ближайшую неделю постараюсь с этим разобраться, пока главное, что это всё работает)

  • Скриншот бота для водоканала

    А вот и сам скриншот. Почему-то в прошлом сообщение ограничение по символам не дало прикрепить