dd

Автор: dd

  • Как-то все слишком просто

    Чем больше вожусь с raspberry pi, тем больше понимаю, что весь процесс разворачивания базовой инфраструктуры все больше аналогичен простому запуску exe-файла инсталлятора на винде. Да, есть нюансы вроде настройки реверс прокси и прокидывания портов, но в целом ситуация следующая:
    — Надо мониторинг? Вот тебе docker-compose файл графаны с прометеусом
    — Надо гитлаб? Вот тебе docker-compose файл, запускай и поехали

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

    Дальше у меня по плану развернуть на малине раннеры для ci/cd, но я это уже делал на других машинах и процесс по факту сводится к запуску одной команды

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

  • Продолжаем веселье

    Оооооуууу ееее!
    Всего полтора часа работы и накатил графану на малину; буду теперь постоянно мониторить ее состояние
    Вообще, это оказалось далеко не так сложно, как я думал. Конечно, пришлось на гитхабе на каком-то проекте подглядеть как именно организовать связь между графаном, прометеусом и нодэкспортером, но в целом все достаточно прямолинейно.

    Вот только почему-то пока этим занимался, малина перестала пинговаться через dd-rpi.local. Не понос, так золотуха)

  • Ни минуты покоя

    Купил себе еще на новый год Raspberry Pi 5, но пришла только на днях
    Сел разбираться как ее теперь включить, не имея ни монитора, на клавиатуры, ни мыши — максимальный headless
    Казалось бы, ну это же RPI, самый известный и раскрученный одноплатник. Там все должно работать просто по щелчку пальца и вообще без боли, но нет :)))

    Я два часа провел, пытаясь бутнуть ее с внешнего ссд. Вроде бы образ прожег, креды для wifi и ssh в конфиге верные, подключаю к питанию — горит зеленым и моргает; даже пингуется!*
    На форумах прочитал, что первый раз она грузится долго, подождал минут 15 — без успеха
    Залез даже на морду роутера, чтобы смотреть кто сейчас подключен к wifi, но малины там не было

    В итоге оказалось, что малина сначала горит красным, потом моргает один раз долго и один раз коротко. Что это значит? Правильно! Мой блок питания по ее мнению — говно. Ей подавай только заморский за 2к + доcтавка + налоги + на пиво.
    Что еще интереснее так это то, что где-то в недрах потного форума обладателей малинок есть тред в котором говорится, что там где-то в неведомых краях в мануале черным по белому написано, что если блок питания не родной, то надо после сигнала малины прожать кнопку питания и все заведется.

    И ведь завелось! Теперь дело за малым — сделать как-то ее видимой из внешней сети, настроить реверс-прокси и начать пилить потихоньку пет-проекты 🙂

    * на самом деле, при прожиге образа я указал имя малины как ddruganov — ровно такое же, как и у компа, с которого пытался тыкаться по ssh; счастливо делая ping ddruganov.local я видел, что малина пингуется, а вот ssh почему-то не работает, не открыт 22 порт; ответ простой — я пинговал сам себя, думая что пингую малину; стоило пережечь образ и указать ей имя как dd-rpi, как она сразу же перестала пинговаться 😀

  • Сегодня я узнал

    … что при поимке исключения сливать в логи getTraceAsString() это далеко не самое лучшее, что можно сделать

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

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

  • Магия сиквела

    Или "почему я раньше об этом не знал?"

    У всех у нас есть грешок иногда хранить в базе массив данных в виде json и проект на подработке не стал исключением

    Сегодня потребовалось найти такие строки в таблице, среди которых есть совпадение с элементами массива
    Например, есть строка адреса с названием "Ленина" и массивом домов [1, 12, 123]
    На входе принимаем "12" в качестве поиска и должны выдать "Ленина, 12" и "Ленина, 123"

    Можно конечно сделать like на строковом представлении json'а, но мы тогда получим всю строку и придется в коде вручную выбирать подходящие значения

    Но я обнаружил очень интересную конструкцию в потсгре — lateral, и запрос стал выглядеть так:
    select street_name,
    house_number::int
    from address,
    lateral jsonb_array_elements_text(house_numbers) as house_number
    where street_name = 'Ленина'
    and house_number like '12'
    По факту мы получаем какое-то виртуальное представление, где каждая строка с адресом разрослась столькими копиями, сколько есть вхождений в массивах и каждое это значение можно вытянуть, обратившись к house_number
    На выходе естественно имеем две записи, как и требовалось!

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

  • Пакетные менеджеры и их приколы

    Речь пойдет об устаревшей тулзе, во второй версии которой надеюсь такое поправили

    Ставил я значит сегодня зависимости через composer на старом проекте, и по словам утилиты все прошло отлично, но вот беда — проект лежит и валит меня ошибками о том, что не может найти файл в одном из пакетов
    Полез смотреть — вижу, что пакет вообще не установился.

    Ну раз при общей сборке не поставился, значит надо ставить в частном порядке.
    Однако, при запуске команды получаем fatal error о превышении использования памяти.
    Поднимаем до двух гигов — ситуация повторяется. Чисто для прикола пробуем 4 и все завелось!

    В логах операций обнаруживаем удивительно смешную запись: As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.
    СУКА!
    Кто тебе мешал сказать мне, что тебе пакеты распаковывать нечем?
    Зачем насиловать мне мозг и оперативу?
    Зачем вообще для этого использовать пхп в качестве фолбэка???

    Ну да ладно, и не с таким жили. После кружечки кофе отпустило, идем дальше работать🌝

  • Говно с дымом!

    Первый год, когда сложно подвести итоги, потому что дома просто атас
    У нас по факту с новым годом празднуется и новоселье, поэтому толпа родственников с радостным гулом сейчас играет в мафию, я естественно с ними)
    Кратко итоги года:
    1. Вас стало 37, это +25 с прошлого нового года🥳
    2. Поменял 2 работы, щас наконец-то прям всем доволен🥳
    3. Переехал 🥳
    За год чисто по техническим моментам была куча изменений и новшеств, поэтому сложно все упомнить
    Я каждый год думаю, что стал умнее, но в конце года каждый раз осознаю как был глуп; звучит грустно, но я этому рад😃
    Всех с новым годом! Спасибо, что остаетесь со мной и читаете! В новом году желаю сумасшедшего роста всем, как карьерного, так и личностного!❤️

  • Очередная статья против микросервисов

    К сожалению, пока не за моим авторством

    https://habr.com/ru/articles/779362/

    Почему-то с каждым разом как про них заходит разговор, мне все меньше хочется с ними работать. Звучит как дроч и решение зачастую несуществующих проблем
    Хотя нет, работать с ними хочется — обычно там платят много😃

  • О важности автогенерации документации вашего api

    Tl;dr: дока только через автоген, а чтобы этого достичь иногда можно и нужно срать на стандарты

    Как-то меня последний год обходила стороной необходимость вручную писать доку. Сначала был graphql, где доку вообще делать не надо, а потом перешёл на проект на симфони, где дока генерится при деплое исходя из аннотаций на экшене контроллера.
    Я даже и не подозревал, во-первых, насколько это удобно, а во-вторых, насколько это важно для скорости разработки и главное для желания вообще хоть что-нибудь разрабывать и менять.
    Извечная проблема программистов в том, что программу постоянно надо менять и чем легче это делать, тем нам проще.
    Так вот я все это к чему: на подработке используется yii2 и еще мои собственные наработки, максимально облегчающие разработку апи, НО! совершенно не трогающие момент с документацией. Из-за этого приходилось руками писать доку на аннотациях в пхп, следя, не забыл ли я случайно где-то параметр или тот ли я указал тип. Это жопа. Это трудоемко, это пустая трата времени.
    Плюнул, потратил 3 часа на полную переработку подхода и в итоге получил автогенерацию доки при деплое, прямо как на основной работе. Вдовесок к этому получил полную типизацию всех возвращаемых значений при обработке данных. Двойной выигрыш.
    Есть очевидный минус — в классе, производящем обработку данных, мы теперь имеем аннотации, относящиеся к документации апихи, о которых класс знать не должен вообще. Плохо ли это? Очень! Но мне абсолютно все равно🤣 В конце концов, код выполняет свою цель, не сильно при этом засираясь. Более того, такой подход куда практичнее, чем многоуровневый маппинг с "запросов" на "команды", а потом на "ответы".
    Но давайте я все же подчеркну основную мысль — это не энтерпрайз и это не команда из 10 человек, я тут один. Тут срать все хотели на подобные мелочи, заказчику важен результат здесь и сейчас. Соответственно, и подходы мной выбираются исходя из этого.
    Писать чистый совершенный код невозможно, абсолютно в любой ситуации придется чем-то жертвовать и уж лучше это будет небольшое нарушение разделения зон ответственности, чем мое время и нервы

  • Рабочее место и кошка

    Вот кстати и само рабочее место, а еще кошка, которая из-за стресса из-за переезда теперь от меня не отходит и даже спит со мной, хотя раньше даже подумать бы не мог о таком ❤️