dd

О разработке, работе руками и сношении с машиной


  • ну что, новая неделя — новая работа?

    2 недели назад написал заявление, сегодня вышел на новую
    сфера интересная — электронно-торговая площадка; в 23м году уже работал на подобном проекте, было интересно; тут тоже скучно не будет — команда молодая, веселая, проект огромный (9 гигов репа весит)

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

    постов по техничке пока вообще не ожидается, все было какое-то рутинное последнее время, а ближайшие пару месяцев будет просто онбординг
    единственное что я щас пересел на винду 11; в целом ощущение, что поставил какой-то очень модный дистрибутив линукс; wsl2 радует очень сильно однако
    ну и в гта4 можно поиграть без помощи рантайма стима)


  • Прощание с дачей до весны

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


  • Утепление двери и окна

    Ездил сегодня завершал "утепление"
    В первую очередь сделал обрамление двери изнутри — проложил все джутом и прижал досками. Из двери наконец-то дуть перестало
    Нашел еще дыру около окна, ее тоже джутом заделал, вроде тоже перестало
    Привез вентилятор и сделал самопальную теплопушку. В целом очень даже сносно — через два часа прогрева я уже ходил без кофты и попивал чай на диване. Диван правда так и остался холодный
    Скважина на удивление до сих пор работает, интересно когда перестанет


  • Гигабитный порт роутера на 100 Мбит

    вот вроде бы в наше время все должно быть максимально просто
    ты подключил себе интернет на 500 мбит, купил роутер, который такие скорости поддерживает
    воткнул кабель в первый попавшийся порт (роутер же гигабитный, какая разница?) и пошел работу работать
    а потом сидишь и думаешь — а кого хера такой интернет медленный? speedtest показывает жалкие 30 мбит/с
    начинаешь разбираться, грешишь на ОС и железо, правишь конфиги и вроде становится лучше (аж 40 мбит), но все равно херня
    а потом лезешь в настройки роутера, долго там лазаешь, проверяя все что можно и натыкаешься на веселое меню, которое тебе говорит, что порт, в который ты воткнул lan-кабель держитв всего лишь 100мбит
    идешь перетыкаешь в соседний и вуаля! все начинает просто летать!
    и даже в кс1.6 наконец-то пинг не 90, чудеса какие-то!

    до заявленных 500 конечно не дотягивает, но в целом я доволен


  • Первый снег и радиаторы

    Сегодня были на даче — пока что еще смогли проехать)
    Почистили снег немного, обкатали лопату
    Купил и привез 2 масляных радиатора — очень надеюсь, что их хватит на отопление. Вроде как расчет должен быть 200 ватт на 1 квадрат, а у меня суммарно 4 киловатта, то есть в два раза больше, чем надо
    Фоток пока нет, в следующий раз)


  • Простите, не мог не поделиться

    извините, не могу не поделиться)


  • Надпись на PDF: путь через костыли

    Как добавить динамически формиремую надпись на первой странице пдф файла с помощью пхп?

    1. берем пхп, берем mpdf, импортируем пдф файл, формируем нужный хтмл, вставляем, рендерим — готово!
    2. молодец, но: пользователь загрузил модный пдф файл версии 1.7, mpdf поддерживает версии до 1.4
    3. ставим в контейнер ghostscript, через shell_exec перегоняем пдф в версию 1.4, дальше как прежде — готово!
    4. молодец, но: пользователь загрузил пдф с каким-то странным изображением, которое пропадает при прогоне через mpdf
    5. убираем импорт через mpdf, с помощью него просто в отдельный файл формируем пдф с отрендеренным хтмл, ставим в контейнер pdftk, а стоп он не поддерживается в alpine ставим в контейнер qpdf, через shell_exec накладываем файл с надписью на загруженный пдф (qpdf --overlay)
    6. молодец, но: пользователь загрузил пдф в котором сканы доков, поэтому формат пдф — А0 и вставленная надпись оказывается милипизерной, еще и не в том месте
    7. забираем мета-данные загруженного пдф-файла через qpdf --json, находим размеры первой страницы, формируем надпись на формате А4 указывая в хтмл размеры в миллиметрах, через ghostscript меняем размер файла с сохранением всех пропорций до размера загруженного пдф, производим наложение — готово!
    8. молодец, но: а нет, пока все нормально, можешь выдохнуть

    АААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААААА


  • Найди ошибку: CASE_LOWER против MB_CASE_LOWER

    Начинаем нашу суперигру "найди ошибку"!

    Ошибка в том, что константа CASE_LOWER (равняется 0) используется для функции array_change_key_case, а не для mb_convert_case
    Для mb_convert_case в свою очередь есть константа MB_CASE_LOWER (равняется 1)
    Таким образом, получаем, что по коду читается, что строка приводится к нижнему регистру, а на самом деле к верхнему (0 интепретируется как MB_CASE_UPPER) 😂


  • 600 запросов вместо одного

    Сколько по-вашему нужно сделать запросов в базу для получения данных для списка (некоторые поля основной сущности + данные из смежных сущностей, где-то с агрегациями) с учетом фильтров?
    10? 20? 50? Как насчет 600?)
    Именно так и "работало" апи одного из сервисов на подработке
    Сначала тянулись все отфильтрованные сущности, потом по каждой сущности отдельно собирался набор данных из кучи методов, в каждом по 1-2 запроса в базу
    Работало это все ваще прекрасно: выгрузка из 50 сущностей занимала 7 секунд и делала те самые 600 запросов
    Индексов на таблицах было ровно 0)

    В целом, наверное, можно было бы забить на это. Да, грязно, криво и работает медленно, но ведь работает же. Большинству людей, которые этим фильтром пользуются, вообще до лампочки — 7 секунд оно выполняется или 0.5, это все-таки не диспетчерская МЧС.
    Но есть и меньшинство, которому очень надо делать выгрузку этих отфильтрованных списков в эксель. А это уже совсем другая песня. Вот тут нас и поджидала жопа
    Оказывается, иногда выгрузить нужно вообще все строки таблицы (+- 3к). Зачем и почему — опустим, нам не за это деньги платят
    Факт в том, что выгрузка в эксель полностью основывается на фильтре. Это удобно и позволяет избежать ненужного дублирования кода
    Теперь вспоминаем, что 50 сущностей выгружается за 7 секунд, значит 3000 выгрузится за сколько? Неправильно, не за 420, потому что время выполнения выгрузки растет совсем не линейно

    Варианты решения были космические! Давайте прикрутим центрифугу и кролика, чтобы в фоне задачи выполнять и отправлять результат на клиент! Давайте сделаем отдельную страницу с выгрузками, чтобы за ними можно было следить в реалтайме!
    Угадайте какой из вариантов был мой 😀
    Задача из-за обсуждений лежала спокойно в беклоге, а однажды я просто сидел пил кофе и на меня снизошло откровение — а с какого хрена вообще выгрузка такого малого количества записей занимает так много времени?

    Из этого получился максимально простой выход — выполнять как можно больше работы за 1 запрос, тем самым максимально снижая время общения с базой. Сам по себе в приложении код очень простой, там экономить нечего
    Но тут я немного схитрил: если сейчас запросов 600, то сильно будет разница, если их станет 1 или 2? Я по итогу разделил процесс выгрузки на 2 этапа: поиск идентификаторов сущностей с учетом фильтров и собственно сам сбор данных, используя найденные идентификаторы. Примерно как ведется работа с эластиком

    Сам запрос на сбор данных это простецкий селект с под-селектами, в том числе с агрегацией в json-объекты
    Если вы из тех людей, которые до сих пор считают, что под-селекты и джсон в постгре это медленно и тупо, то … может быть вы и правы, но в данном случае это не имеет значения, тут все-таки не хайлоад

    По итогу получаем очень даже хороший прирост. Выгрузка 50 сущностей стала занимать 0.9-1с, а экспорт в эксель 700 записей около 2 секунд
    Да, не горы свернули, но базе и пользователям жизнь облегчили)