barbitoff programmer`s blog

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

пятница, 5 мая 2023 г.

Ubuntu 20.04 + Podman: error "potentially insufficient UIDs or GIDs available in user namespace" when trying to run a container

Проблема

При попытке запустить контейнер с помощью Podman появляется ошибка:

Error: writing blob: adding layer with blob "sha256:...": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 110779:100 for /usr/local/lib/node_modules/@stoplight/spectral/node_modules/optionator/CHANGELOG.md): Check /etc/subuid and /etc/subgid: lchown /usr/local/lib/node_modules/@stoplight/spectral/node_modules/optionator/CHANGELOG.md: invalid argument

Причина

На эту тему есть отличная статья https://www.redhat.com/sysadmin/rootless-podman, в двух словах - причина в том, что UID 110779, используемый в docker-образе, не может быть смапплен в хост-ОС из-за того, что он больше, чем 65536.

Решение

Правим на хост-ОС файл /etc/subuid, заменяя для пользователя, из-под которого запускается podman, ограничение 65536 на другое, большее чем UID, фигурирующий в ошибке, например:

aspirinspb:100000:165536

Podman: WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

Проблема

При старте Podman появляется warning:

WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

Решение

sudo mount --make-rshared /

(необходимо выполнять после каждого перезапуска ОС либо добавить в какой-то из startup-скриптов) 

WSL2 + Cisco VPN: чиним доступность сети в гостевой ОС

Проблема

Хост-машина с Windows 10 + Cisco AnyConnect VPN, заворачивающим весь траффик в туннель. Под WSL1 в гостевой ОС (Ubuntu 20.04) все ок, но после миграции на WSL2 пропадает есть.

Решение

В моем случае причина была в том, что трафик заворачивался в неверный сетевой интерфейс (не в VPN), и решилась установкой для VPN-интерфейса более высокого значения метрики командой в PowerShell из-под администратора:

Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000

(имя интерфейса "Cisco AnyConnect" возможно придется заменить на актуальное имя сетевого интерфейса VPN-соединения). Команду нужно выполнять после каждой перезагрузки хост-машины либо реконнекта VPN.

вторник, 4 апреля 2023 г.

Spring Boot 3: micrometer-tracing не работает в @SpringBootTest

Проблема

Есть приложение на Spring Boot 3, использующее для трейсинга micrometer-tracing-bridge-brave и zipkin-reporter-brave. Есть @SpringBootTest, который, в числе прочего, проверяет пропагирование трейс-информации (а именно, заголовка "b3") из входящих http-запросов в исходящие http-запросы. Однако тест падает - в исходящие запросы заголовок "b3" не добавляется. Хотя если запустить приложение и выполнить "ручную" проверку - заголовок "b3" в исходящих запросах есть.

Решение

Observability-функциональность по-умолчанию отключена для @SpringBootTest. Включается аннотацией @AutoConfigureObservability на тест-классе.

понедельник, 27 марта 2023 г.

Grafana Loki: фильтрация по полю из JSON

 Если в Grafana Loki необходимо выполнить поиск по одному из полей JSON-лога, то делается это следдующим образом:

Сначала достаем поле из JSON и делаем из него лэйбл, затем добавляем фильтрацию по этому лэйблу.

вторник, 28 июня 2022 г.

Excel: преобразование времени в миллисекунды

Задача

Есть ячейка со строкой - временем в формате ЧЧ:ММ:СС.млс (например, 18:45:13.785). Необходимо преобразовать это значение в число миллисекунд.

Решение

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

=LEFT(A1; 2)*3600000 + MID(A1; 4; 2) * 60000 + MID(A1; 7; 2)*1000 + RIGHT(A1; 3)

пятница, 13 мая 2022 г.

Gradle: установка переменных окружения

 Читать переменные окружения gradle умеет:

 System.getenv("HOME")

А вот устанавливать - нет, метод а-ля System.setenv() отсутствует. Однако, в задачах, запускающих отдельный процесс, можно установить переменную окружения для этого отдельно стартующего процесса, например:

task('myTask', type:Exec) {
    environment "FOO", "bar"
    workingDir '.'
    commandLine 'cmd', '/c', 'print.bat'
}