barbitoff programmer`s blog

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

вторник, 11 февраля 2020 г.

Windows 10 и несколько мониторов: отображение на таскбаре каждого монитора только находящихся на нем окон

Задача

Есть машина с Windows 10 и несколькими мониторами. Хочется, чтобы на каждом мониторе был таскбар, и на каждом таскбаре отображались иконки только тех окон, которые действительно находятся на этом мониторе.

Решение

Долгие годы для этих целей использовал замечательную программу DisplayFusion, честно купленную на Steam. Но только сегодня выяснил, что подобное поведение можно настроить в Windows "из коробки": идем в Settings -> Taskbat settings и там устанавливаем:

вторник, 4 февраля 2020 г.

Docker Desktop: рассинхронизация времени в контейнерах и у хоста

Проблема

Неожиданно обнаружилось, что все контейнеры, работающие в Docker Desktop, видят время, отстающее от времени хоста аж на 6 с лишним дней.

Решение

Корень проблемы не ясен, но рестарт Docker Desktop помог.

пятница, 31 января 2020 г.

bash: ожидание, пока не будет открыт порт

Задача

В bash-скрипте нужно подождать, пока не станет доступен определенный tcp-порт, но ждать нужно не более определенного времени.

Решение
for ((i=0;  i< 10; i++)) do if(nc -q0 localhost 8080 < /dev/null > /dev/null 2>&1) then break; fi; echo "sleeping"; sleep 2; done

Раз в 2 секунды проверяем открытость localhost:8080, но не более 10 проверок. Такой вариант работает в Ubuntu 18.04, а вот с CentOS пришлось убрать -q0 опцию, т.к. она там не поддерживается.

вторник, 28 января 2020 г.

Grafana в Kubernetes: автоматизация развертывания дашбордов

Задача 

Есть JSON/YAML-описания дашбордов для графаны, выкладываемые разработчиками в gitlab. Необходимо в CI/CD-пайплайне автоматизировать развертывание этих дашборд на окружении при условии, что графана установлена внутри Kubernetes.

Решение

На тему автоматизации развертывания дашбордов в случае, когда Grafana работает в Kubernetes, есть отличная статья: https://medium.com/@chris_linguine/how-to-monitor-your-kubernetes-cluster-with-prometheus-and-grafana-2d5704187fc8. В целом, сценарий выглядит следующим образом:
  1. Описания дашбордов пакуем внутрь ConfigMap-объектов Kubernetes и разворачиваем эти объекты в кластере (делаем kubectl apply -f ... внутри нашего CI/CD pipeline)
  2. Графану конфигурируем (путем установки необходимых значений в helm) таким образом, чтобы она разворачивалась с сайдкаром, который будет мониторить наличие ConfigMap-объектов с описаниям дашбордов и "скармливать" эти описания работающей графане.

понедельник, 20 января 2020 г.

bash: echo без перевода строки в конце

Задача

Выполнить echo таким образом, чтобы в конце строки не был добавлен символ line feed. Это бывает нужно, к примеру, если результат echo отправляется куда-то дальше, скажем, в base64, и важно, чтобы в принимающую команду вывод echo пришел в неизменном виде, без лишних переводов строк в конце.

Решение

echo -e "somestring\c"
т.е. включаем обработку управляющих символов, и используем \c, чтобы оставить каретку на текущей строке (см. https://www.opennet.ru/man.shtml?topic=echo&category=1).

пятница, 17 января 2020 г.

GitLab CI cache: WARNING: /home/usr1/.m2/repository/: no matching files

Проблема

Пытаюсь закэшировать репозиторий мавена для GitLab CI/CD пайплайна. Настраиваю:
  cache:
    key: m2_repo
    paths:
      - /home/usr1/.m2/repository/
    policy: pull-push
Однако, при сборке получаю:
WARNING: /root/.m2/repository/: no matching files
Причина 

Кэширование работает только для директорий внутри сборочной директории. Поэтому необходимо сделать так, чтобы репозиторий мавен размещался внутри неё (через -Dmaven.repo.local).