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

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

трагедия в трех актах
так и умирает рефакторинг в долгоживущих проектах

хороший друг создал свой канал с новостями по ИИ, подпишитесь, если интересно)
https://t.me/ashfeeds
сегодня я превзошел сам себя
из всех максимально тупых случаев в программировании сегодня выдался особенный
на подработке активно выводим новое приложение на дев-контур
все в лучших традициях стартапа — накатываем данные, тут же ловим ошибки, тут же правим — и все по-новой
но на контуре ты никак не подебажишь импорт, а мне очень надо было
выход простой — локально подрубаемся к дев-базе и стартуем импорт
мы можем дебажить спокойно, а результат все равно окажется на деве — все довольны
и все бы хорошо, но внезапно перезапуск импорта через интерфейс стал отваливаться с ошибками мол файл не найден
да как не найден-то? я его вот своими глазами вижу — ls показывает, что файл есть, через less я прекрасно вижу содержимое
самое интересное, что заходим в логи супервизора, который гоняет джобы по импорту и не видим логов!
а еще лучше — на самом деле иногда-то логи видим, но там как получится
а еще лучше — в интерфейсе почему-то в обработке висит два импорта, хотя инстанс супервизора у нас один
а еще лучше — в ошибках импорта (в базе отдельная колонка) текст из кода, который час назад уже выпилен был
то есть кто-то помимо дев-контура берет джобы в работу и плюется ошибками
я прошел все стадии гнева и агонии — от полного покрытия логами куска кода, который открывает файл до полной переработки конфига супервизора
еще круче стало, когда я отказался от супервизора в пользу крона (ну вдруг супервизор сошел с ума)
вырубаешь таску в кроне, смотришь ps aux — глухо, ни одного запущенного процесса в кроне
а джобы все равно обрабатываются и валятся с ошибкой!
и знаете какой ответ у этого всего?
этот кто-то — я, но локальный и у которого коннект к базе на деве, а очередь джоб как раз лежит в табличке)
🙄
сегодня закончил перевозить последнее приложение на такую схему деплоя
ощущения просто бомбические
за месяц испытаний эта схема прям очень хорошо себя показала; да, есть косяки, но без них никуда
из плюсов:
1. дополнительный шаг билда образа позволяет заранее выявить, соберется ли вообще приложение на деве/проде; локально может оно все и отработает, но всякое бывает и лучше перестраховаться + такой подход потихоньку приближает нас к переезду в кубер; реджистри используется пока что локальный
2. прогон линтеров и тестов отдельными шагами в абсолютно изолированном окружении здорово помогает выявить косяки в настройке окружений, конфигах стилей, линтеров, а самое главное — тестах; нет ничего лучше узнать, что оказывается твои тесты валятся налево и направо, если поставить проект с нуля
сюда же к плюсам можно отнести отсутствие необходимости держать тестовые базы в основной базе, которая используется для реальных приложений, так как база сейчас поднимается для каждого пайпа своя и потом грохается со всеми потрохами
3. деплой по кнопке заслуживает отдельных восторгов
мне больше не надо ничего деплоить!
мое дело теперь простое — написать/исправить функционал, протестировать локально, запушить в отдельную ветку и сдать это все QA вместе со ссылками на пайп для раскатки на тестовый контур и МР в мастер; все! я спокойно живу дальше, куа сама раскатывает в дев, тестит и при прохождении тестирования сама прожимает "мерж" и функционал улетает на прод
херовый подход? может быть, но как и всегда главное то, что этот подход работает и работает весьма хорошо, если вы доверяете работу не макакам
4. креды больше не хранятся в чистом виде в репе
теперь все необходимые для ci/cd переменные заводятся через переменные в гитлабе, это здорово упрощает жизнь
конечно, перменные гитлабы лучше, чем репа, но лучше бы это вообще был vault
5. жизнеспособность
недавно взяли новый проект, с нуля, хостится он не у нас (уже раскатали дев-версию), там ровно такая же схема ci/cd и оно очень даже хорошо работает, при том что все было сделано посредством ctrl+c/ctrl+v из соседнего проекта, только креды ssh поменяли в переменных в гитлабе
из минусов:
1. мы теперь делаем билд для каждой ветки каждого проекта
это сжирает просто тонну места; я об этом сразу не подумал, а после перевода нескольких приложений на билды на следующий день гитлаб просто лег и не поднимался. потому что места на серваке на осталось
пришлось в экстренном темпе изучать способы зачистки места на серваке — от очистки прометеуса гитлаба до полного сброса билд-кеша докера (спойлер — это оказалось самым эффективным, очистилось 70гб)
2. ждать выкатки на дев щас приходится конечно чуть подольше
однако это решается тем, что это больше не моя забота, я только ссылки на пайпы для раскатки отдаю 😀
3. это оказалось сложнее, чем предполагалось
когда ты что-то делаешь в первый раз, то море по колено, но море оказалось примерно на уровне жопы
приложений много (штук 10 или 11) — если где-то есть косячный кусок кода деплоя, то править его придется во всех местах
к счастью, это делается неспешно, можно с любой задачей эти правки затаскивать
тут конечно вообще идеальным был бы вариант выносить все что связано с деплоем в отдельную репу и править только в одном месте; дорастем, надеюсь
больше сказать пока нечего, маленькими шажками идем к светлому будущему!
Кстати, где-то как раз в первых числах января 2015го года я впервые сел за код
Естественно, не сам, подтолкнул меня на это мой очень хороший друг
Я вообще тогда программистов считал лютейшими задротами и вообще не понимал как у них голова от такого количества мозга не лопается, чтобы все это понимать
Прогать начал с джавы и первое что пришло в голову это калькулятор координат ада в майнкрафте
Потом решил делать игру про зомби — 2д рпг с видом сверху
Я иногда вспоминаю какой там был код и это был прям трешак трешачовый. Самое запоминающееся — не мог понять почему спавнится один зомби, а не 10, хотя я циклом проходил. Потом дошло, что наверное классы надо инстанциировать, а не 10 раз перезаписывать статические переменные😃 это было прям очень крутое откровение
И вот с тех пор я собственно ловлю вот этот дофамин от постоянных микро-улучшений в понимании кода и программировании, так остановиться и не смог
На тот момент до первого коммерческого опыта оставалось чуть больше 5 лет и очень большую часть этого времени я потратил на разработку игр. Ну как разработку — скорее попытки понять как из говна и палок с нуля сделать свой универсальный движок. Начинаю думать, что именно сама разработка игр меня не так уж и интересовала как решение проблем по разработке движка
10 лет, получается, дальше больше
Всем удачного начала рабочего года)
я привык видеть такую картину (несколько стейджей, отдельно билд, отдельно линтеры, деплой по кнопке и тд) на работах, где были отдельные админы/девопсы, которые настраивали пайплайны и деплой за разрабов, оставляя нам только написание самих шагов в стейджах
на подработке же такого никогда не было, я вообще там по факту один за всех и ci/cd там был соответствующий, на коленке "шоб работал тока" — по ссх тыкаемся на контур, пулим с гита, гоняем миграшки, гоняем тесты и любые другие проверки — все сразу на контуре
если у вас внутри что-то от этих слов умерло, то поздравляю — вы адекватный человек
однако в эти каникулы мне пришлось плотно засесть за эту тему и по сути с нуля переделать весь ci/cd; все в связи с тем, что на некоторые проекты придется отдать на техподдержку и их надо будет очень жестко контролить
то к чему я пришел это конечно далеко не идеал, но я все равно узнал огромную кучу инфы за последние пару дней и очень мощно прокачал понимание того, как все это работает
более подробно распишу позже)

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