Мой web-dev
55 subscribers
62 photos
1 video
66 links
Привет, я php-бэкендер, делюсь своими мыслями и наработками
Download Telegram
господи дай мне сил
с отпуском меня!
до свидания программирование и привет дача!

p.s. а еще нас уже 50😊
🎉10
Локальное окружение в кубере с k3s

Когда я пришел в ферале на текущую работу, то все окружение разворачивалось в minikube.

Я уж не знаю какие именно проблемы с ним были (я их не заметил), но мой, на тот момент, тимлид принял решение переезжать на k3s, подсмотрев удачный опыт у одного из разрабов в компании.

Мне тогда было поручено локально поставить k3s и попробовать развернуть в нем пару сервисов, попутно обновив в них readme.

Собственно, с задачей я справился. Вот только выбранное решение было очень кривым, да еще и ломало dns при включенном корпоративном впне из-за того, что приходилось ставить dnsmasq. Зачем? На тот момент я думал, что общаться между сервисами очень надо через домены вида service-name.dev.loc (просто потому что по-другому я не знал как, а все примеры обращений из гугла не работали). И dnsmasq позволял это делать и оно даже работало в подах кубера. Но, как у любой задачи типа “было бы прикольно”, приоритет выполнения был минимальный и потому она быстро затерялась в недрах личного бэклога.

Прошло полгода, у меня честно говоря от кривости работы локального окружения уже порядком горела жопа. Более того, ко мне приходили разрабы и спрашивали - как вы локально разворачиваетесь? У вас то куча репозиториев с docker-compose’ами, то какой-то кубер, то еще что. И вот случился отпуск, а значит шанс снести к чертям собачим всю систему и начать с нуля.

В этот раз я решил вообще не использовать ничего, кроме самого k3s. И это помогло. Из коробки по прошлой инструкции у меня вообще не работал dns - из пода даже в гугл сходить нельзя было. Я начал копать и понял, что не использовал важную (в моем случае) опцию при установке k3s. А именно - --flannel-backend=wireguard-native . После указания опции все заработало. В гугл теперь можно было ходить, а самое главное - теперь поды могли общаться друг с другом просто через свои имена. Например, my-service-name.application.

Мне и в голову не приходило, что в кубере может быть удобный способ для общения между подами, как в docker compose, например (там можно обращаться к контейнеру по его имени внутри одной сети). Нет, я конечно видел и читал про CoreDNS, даже в конфиги какие-то лазил. Но почему-то в голове выключатель не щелкал.

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

Итого, я вроде как меньше стал бояться кубера. Теперь этот зверь кажется более-менее дружелюбным и начинает закрепляться реальное понимание того как там все работает.
Пересел на 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
Это что было?

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

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

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

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

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

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

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

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

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

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

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. молодец, но: а нет, пока все нормально, можешь выдохнуть

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

до заявленных 500 конечно не дотягивает, но в целом я доволен
🔥1
ну что, новая неделя - новая работа?

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

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

постов по техничке пока вообще не ожидается, все было какое-то рутинное последнее время, а ближайшие пару месяцев будет просто онбординг
единственное что я щас пересел на винду 11; в целом ощущение, что поставил какой-то очень модный дистрибутив линукс; wsl2 радует очень сильно однако
ну и в гта4 можно поиграть без помощи рантайма стима)
👍5🔥3😁1
К новому году готов!
🔥6🎄1
Мало кто знает, но оказывается, Ubuntu написана на php!
😭1
Фронт на дейлике выдал:
«Там можно поправить руками, но через жопу, поэтому сегодня весь день ковыряемся в жопе»
🤝3
так, эпопея бугурта про вставку подписи в pdf уже была
в этот раз у нас в меню "шаблонизация docx html'ом"
для справки: используется пакет PhpOffice\PhpWord

прикол в том, что с самого начала начинаются странности - чтобы импортнуть надо создать объект таблицы со строкой и ячейкой и вот уже только ячейку можно наталкивать хтмлом (скрин 1)
на этом вроде бы можно успокоиться, потому что оно в целом работает
но тебе пишут и говорят, что при добавлении отступов они в доке теряются, просто пропадают

я опущу все 5 часов моих страданий, но финальный алгоритм сводится к следующему (скрин 2):
1. оборачиваем пришедший хтмл в <body>
2. импортим через таблицу
3. обернутый хтмл толкаем в DOMDocument и вырезаем все элементы, которые из себя представляют просто символ новой строки
3. проходимся по каждому импортируемому элементу, сопоставляем с нодами в DOMDocument (это на самом деле просто, потому что порядковые индексы элементов совпадают)
4. ищем в нодах стиль вида /padding-(\w+): (\d+)px/
5. выставляем отступ элементу ворда, но не прямым импортом, неееееет; в ворде один таб это 708 попугаев; конвертируйте из пикселей сами)
6. на всякий случай, если не указан отступ, то выставляем насильно 0
7. импортим в шаблон документа

и все это только потому, что ворд не поддерживает хтмл-стиль padding)

скрины в комментах
время подвести итоги

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

много чего случилось в этом году:
1. трудоустройство; в феврале сократили, устроился в микрозаймы, в октябре для прикола устроился в своем городе на работу по совместительству (ничего толкового не вышло, но по факту за 4 часа работы заплатили 80к :D, уволился от скуки), в декабре из микрозаймов ушел на электронно-торговую площадку для закупок
2. под самый конец года успел избавиться от всех кредитов, потратив на это кучу времени и денег, зато теперь осталась только ипотека; ну, а при нынешних ставках закрывать свою раньше я не планирую
3. по сравнению с концом 23го года вырастил себе зарплату в 2 раза; доволен как слон, но из-за пункта 2 денег по-прежнему 0 :D
4. по документам стал "сеньером", на некоторое время даже лидом; такой себе опыт, понял, что менеджмент это не ко мне; щас сижу и радуюсь позиции обычного разраба)
5. канал вырос с 37 человек до 49; судя по сайту tgstat.ru, посты читает куда больше 49 человек; не знаю с чем это связано, потому что я нигде не даю рекламы и вообще особо не рассказываю никому про канал; возможно это я просто слишком часто проверяю как там посты поживают :D
6. успел поработать в съемном офисе, круто было, но дома все равно сильно лучше

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

всем в новом году желаю психического здоровья, любимой работы и побольше приятных моментов!
4🍾3🔥2
я привык видеть такую картину (несколько стейджей, отдельно билд, отдельно линтеры, деплой по кнопке и тд) на работах, где были отдельные админы/девопсы, которые настраивали пайплайны и деплой за разрабов, оставляя нам только написание самих шагов в стейджах

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

однако в эти каникулы мне пришлось плотно засесть за эту тему и по сути с нуля переделать весь ci/cd; все в связи с тем, что на некоторые проекты придется отдать на техподдержку и их надо будет очень жестко контролить

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

более подробно распишу позже)
🔥6
Кстати, где-то как раз в первых числах января 2015го года я впервые сел за код

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

Прогать начал с джавы и первое что пришло в голову это калькулятор координат ада в майнкрафте
Потом решил делать игру про зомби - 2д рпг с видом сверху
Я иногда вспоминаю какой там был код и это был прям трешак трешачовый. Самое запоминающееся - не мог понять почему спавнится один зомби, а не 10, хотя я циклом проходил. Потом дошло, что наверное классы надо инстанциировать, а не 10 раз перезаписывать статические переменные😃 это было прям очень крутое откровение

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

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

10 лет, получается, дальше больше

Всем удачного начала рабочего года)
🔥7
Мой web-dev
я привык видеть такую картину (несколько стейджей, отдельно билд, отдельно линтеры, деплой по кнопке и тд) на работах, где были отдельные админы/девопсы, которые настраивали пайплайны и деплой за разрабов, оставляя нам только написание самих шагов в стейджах…
сегодня закончил перевозить последнее приложение на такую схему деплоя
ощущения просто бомбические

за месяц испытаний эта схема прям очень хорошо себя показала; да, есть косяки, но без них никуда

из плюсов:
1. дополнительный шаг билда образа позволяет заранее выявить, соберется ли вообще приложение на деве/проде; локально может оно все и отработает, но всякое бывает и лучше перестраховаться + такой подход потихоньку приближает нас к переезду в кубер; реджистри используется пока что локальный
2. прогон линтеров и тестов отдельными шагами в абсолютно изолированном окружении здорово помогает выявить косяки в настройке окружений, конфигах стилей, линтеров, а самое главное - тестах; нет ничего лучше узнать, что оказывается твои тесты валятся налево и направо, если поставить проект с нуля
сюда же к плюсам можно отнести отсутствие необходимости держать тестовые базы в основной базе, которая используется для реальных приложений, так как база сейчас поднимается для каждого пайпа своя и потом грохается со всеми потрохами
3. деплой по кнопке заслуживает отдельных восторгов
мне больше не надо ничего деплоить!
мое дело теперь простое - написать/исправить функционал, протестировать локально, запушить в отдельную ветку и сдать это все QA вместе со ссылками на пайп для раскатки на тестовый контур и МР в мастер; все! я спокойно живу дальше, куа сама раскатывает в дев, тестит и при прохождении тестирования сама прожимает "мерж" и функционал улетает на прод
херовый подход? может быть, но как и всегда главное то, что этот подход работает и работает весьма хорошо, если вы доверяете работу не макакам
4. креды больше не хранятся в чистом виде в репе
теперь все необходимые для ci/cd переменные заводятся через переменные в гитлабе, это здорово упрощает жизнь
конечно, перменные гитлабы лучше, чем репа, но лучше бы это вообще был vault
5. жизнеспособность
недавно взяли новый проект, с нуля, хостится он не у нас (уже раскатали дев-версию), там ровно такая же схема ci/cd и оно очень даже хорошо работает, при том что все было сделано посредством ctrl+c/ctrl+v из соседнего проекта, только креды ssh поменяли в переменных в гитлабе

из минусов:
1. мы теперь делаем билд для каждой ветки каждого проекта
это сжирает просто тонну места; я об этом сразу не подумал, а после перевода нескольких приложений на билды на следующий день гитлаб просто лег и не поднимался. потому что места на серваке на осталось
пришлось в экстренном темпе изучать способы зачистки места на серваке - от очистки прометеуса гитлаба до полного сброса билд-кеша докера (спойлер - это оказалось самым эффективным, очистилось 70гб)
2. ждать выкатки на дев щас приходится конечно чуть подольше
однако это решается тем, что это больше не моя забота, я только ссылки на пайпы для раскатки отдаю :D
3. это оказалось сложнее, чем предполагалось
когда ты что-то делаешь в первый раз, то море по колено, но море оказалось примерно на уровне жопы
приложений много (штук 10 или 11) - если где-то есть косячный кусок кода деплоя, то править его придется во всех местах
к счастью, это делается неспешно, можно с любой задачей эти правки затаскивать
тут конечно вообще идеальным был бы вариант выносить все что связано с деплоем в отдельную репу и править только в одном месте; дорастем, надеюсь

больше сказать пока нечего, маленькими шажками идем к светлому будущему!
🔥2
сегодня я превзошел сам себя
из всех максимально тупых случаев в программировании сегодня выдался особенный

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

и все бы хорошо, но внезапно перезапуск импорта через интерфейс стал отваливаться с ошибками мол файл не найден
да как не найден-то? я его вот своими глазами вижу - ls показывает, что файл есть, через less я прекрасно вижу содержимое
самое интересное, что заходим в логи супервизора, который гоняет джобы по импорту и не видим логов!
а еще лучше - на самом деле иногда-то логи видим, но там как получится
а еще лучше - в интерфейсе почему-то в обработке висит два импорта, хотя инстанс супервизора у нас один
а еще лучше - в ошибках импорта (в базе отдельная колонка) текст из кода, который час назад уже выпилен был
то есть кто-то помимо дев-контура берет джобы в работу и плюется ошибками

я прошел все стадии гнева и агонии - от полного покрытия логами куска кода, который открывает файл до полной переработки конфига супервизора

еще круче стало, когда я отказался от супервизора в пользу крона (ну вдруг супервизор сошел с ума)
вырубаешь таску в кроне, смотришь ps aux - глухо, ни одного запущенного процесса в кроне
а джобы все равно обрабатываются и валятся с ошибкой!

и знаете какой ответ у этого всего?
этот кто-то - я, но локальный и у которого коннект к базе на деве, а очередь джоб как раз лежит в табличке)

🙄
😁1🤔1👀1😨1
хороший друг создал свой канал с новостями по ИИ, подпишитесь, если интересно)
https://t.me/ashfeeds
🔥1