dd

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

  • Пофигизм в коде

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

  • Трагедия рефакторинга в трёх актах

    трагедия в трех актах

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

  • Канал друга про ИИ

    хороший друг создал свой канал с новостями по ИИ, подпишитесь, если интересно)
    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) — если где-то есть косячный кусок кода деплоя, то править его придется во всех местах
    к счастью, это делается неспешно, можно с любой задачей эти правки затаскивать
    тут конечно вообще идеальным был бы вариант выносить все что связано с деплоем в отдельную репу и править только в одном месте; дорастем, надеюсь

    больше сказать пока нечего, маленькими шажками идем к светлому будущему!

  • 10 лет в программировании

    Кстати, где-то как раз в первых числах января 2015го года я впервые сел за код

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

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

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

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

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

    Всем удачного начала рабочего года)

  • С нуля переделал CI/CD

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

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

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

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

    более подробно распишу позже)

  • время подвести итоги

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

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

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

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

  • Шаблонизация DOCX через HTML

    так, эпопея бугурта про вставку подписи в 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)

    скрины в комментах

  • Фронтендер про жопу

    Фронт на дейлике выдал:
    «Там можно поправить руками, но через жопу, поэтому сегодня весь день ковыряемся в жопе»