dd

Рубрика: Разработка

  • Ubuntu на PHP, шутка

    Мало кто знает, но оказывается, Ubuntu написана на php!

  • Готов к Новому году

    К новому году готов!

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

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

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

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

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

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

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

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

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

  • Надпись на 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 секунд
    Да, не горы свернули, но базе и пользователям жизнь облегчили)

  • Это что было?

    Я на прошлой неделе прошел самое невероятное странное собеседование

    Во-первых, созвона с эйчар не было.
    Меня просто спросили, есть ли вопросы по вакансии.
    Ладно, отправил им список. На следующий деньполучил ответ.
    В целом, это ок, может просто экономят время.
    Но обычно на первичном созвоне эйчар сам должен понять, что рассказать сотрудникам о собеседуемом

    Во-вторых, технический собес состоял из часового созвона с эйчар и ответа на огромную кучу технических вопросов. То есть никакого живого взаимодействия с техническими людьми не было.
    Но это меня тоже не смутило. Скрининг это не редкое явление. Прошел, эйчар помахал ручкой и сказал, что спишемся.
    Ждем следующего этапа

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

  • Пересел на manjaro

    Выше уже писал, что в отпуске решил переставить систему
    Отчасти потому, что уже скопилась куча мусора (например, тот же забагованный k3s с dnsmasq)
    Отчасти потому, что мне приелся gnome. Да, он красивый и модный — ну и что? Я от его функционала и возможностей использую минимум. Мне надо-то всего 2 рабочих пространства, одно из которых поделено на 4 части (телеграм, терминал и 2 окна браузера). Он был очень хорош как переходное звено с mac os на линукс, но не более. Да и его ужасный встроенный инструмент для тайлинга меня иногда доводил до слез.

    Почему именно manjaro — не могу сказать. Смотрел в сторону linux mint и zorin os, но они debian-based, а на дебиане я уже сидел. Не то что бы я прям сильно понимаю в чем отличие arch от debian (кроме rolling release), видимо просто захотелось чего-то новенького.

    А вот с графическим интерфейсом все было чуть сложнее.
    По началу были мысли вообще накатить i3wm. Сделал загрузочную флешку, посидел один вечер, потыкался. В целом я понимаю почему люди этим пользуются, но у меня ума не хватило вот так нахрапом им овладеть. Я слишком привык к мышке, чтобы раз и навсегда перейти только на клавиатурный способ взаимодействия с системой. По сути это vim в мире графических оболочек. А у меня с vim туго, пусть он и является для меня теперь дефолтным редактором конфигов, где нет возможности использовать phpstorm/vscode.

    Посидел, подумал еще — kde я уже пробовал, мне не зашло, от gnome пытаюсь уйти, i3wm сложно. Поэтому начал смотреть в сторону xfce. Опыт с ним у меня уже был, когда я накатывал zorin os себе на ноут. У меня были только максимально положительные впечатления от этого опыта.
    Меня смущала пара моментов с привычными мне горячими клавишами, но как оказалось — все системные горячие клавиши можно снести, что я и сделал. Добавил пару новых, накатил темную тему и все! Я как будто дома оказался.
    Сказать, что комп летает и все плавно — ничего не сказать. И дефолтный функционал тайлинга работает как часы.
    Да, нет красивых менюшек и круглых краев у всех окон — ну и ладно. Меня и так уже потихоньку начинает настигать дизайнерский аскетизм.

    Так что я прямо очень советую поставить manjaro + xfce, если хочется чего-то свежего и простого

    i use arch btw