суббота, 12 июля 2025 г.

Java программа не видит переменных окружения с точкой в имени

 Столкнулся с интересной проблемой когда внедрял сборку контейнеров под ARM64 процессоры. Есть программа на Java контейнер которой использовал образ "eclipse-temurin:17-jre-alpine" в качестве базового. Для этого базового образа отсутствует вариант для платформы linux/arm64 и стоял вопрос что безопаснее сделать:

  • перейти на "eclipse-temurin:17-jre-noble" который использует Ubuntu вместо Alpine
  • перейти на "eclipse-temurin:21-jre-alpine" который влечёт обновление Java с 17 на 21

Разработчик выбрал первый вариант (перейти на "eclipse-temurin:17-jre-noble"), т.к. обновление версии Java выглядит рискованным (может повлечь неожиданные эффекты в какой-либо из библиотек) и требует полного цикла тестирования которое провести сейчас нет возможности.

Я также считал что замена Alpine на Ubuntu при сохранении версии Java является менее рискованным, хотя и повлечёт увеличение размера образа контейнера и возможные риски из-за замены musl на libc (хотя я не особо верю в вероятность таких неприятностей). Забегая вперёд, мы потратили несколько часов разбираясь почему программа перестала запускаться.

четверг, 10 июля 2025 г.

Рассинхронизация звука и видео в LibreELEC 12

 Какое-то время назад обновил домашние HTPC с LibreELEC 9.x на 12.x ради возможности смотреть YouTube на большом экране (отправляю ссылку с телефона на нужный HTPC через Kore). Сейчас в строю два HTPC - один собран на базе Gigabyte BRIX, а второй был на базе Raspberry PI 3B. Вот на втором из них и начались проблемы с синхронизацией звука и видео - спустя 10 минут звук начинал спешить, а через пол-часа уже невозможно смотреть.

Я пробовал менять настройки вывода звука, но заметного эффекта это не дало. Нагрузка на процессор была около 40% это не выглядело как нехватка ресурсов. В логе Kodi никаких интересных записей не нашлось.

На прошедших выходных занялся этой проблемой и заменил Raspberry PI 3B, на Raspberry PI 4. Насколько я могу судить по нескольким дням использования, проблема с синхронизацией больше не проявлялась.

среда, 9 июля 2025 г.

Держатель аккумуляторов для Zoyi ZT-DQ02

Для измерения внутреннего сопротивления аккумуляторов или иных источников питания Zoyi ZT-DQ02 комплектуется зажимами в виде крокодилов. Их удобно использовать для измерения выводных источников питания (например аккумулятор 18650 с приваренными лепестками). Если стоит задача быстро проверить десяток обычных ячеек, то гораздо быстрее будет использовать специализированный держатель.

Разъём для измерения внутреннего сопротивления у ZT-DQ02 это авиационный XS10-4P. Назначение пинов XS10-4P взял от штатного провода с крокодилами:

  1. положительный вывод
  2. положительный вывод
  3. отрицательный вывод
  4. отрицательный вывод

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

воскресенье, 6 июля 2025 г.

Исправление ошибки QIDIStudio при отправке на печать

Если отправить модель на печать напрямую из QIDIStudio, то программа аварийно завершится.

Чтобы этого не случалось QIDI рекомендует добавить несколько переменных окружения

$ export WEBKIT_DISABLE_COMPOSITING_MODE=0
$ export WEBKIT_DISABLE_DMABUF_RENDERER=0
$ ./QIDIStudio_1.10.02.76_Linux_Ubuntu_20.AppImage

В описании этого способа указано что будет работать только в Ubuntu 24, но на самом деле отлично работает в Debian 12.

Альтернативный варианты:

  • добавить в адрес принтера порт 7125, но перестанет работать подключение к Fluidd из QIDIStudio.
  • Сохранять файл gcode на флешку и запускать печать с принтера.

суббота, 5 июля 2025 г.

Загрузка модуля ядра в LibreELEC

 Чтобы node_exporter мог считывать показания оборотов вентилятора в HTPC системе на базе Gigabyte Brix и дистрибутива LibreELEC нужно загрузить дополнительный модуль ядра it87.

# echo it87 >> /storage/.config/modules-load.d/sensors.conf

После перезагрузки станут доступны новые метрики

# wget -qO- localhost:9100/metrics | grep ^node_hwmon_fan_rpm
node_hwmon_fan_rpm{chip="platform_it87_2592",sensor="fan1"} 0
node_hwmon_fan_rpm{chip="platform_it87_2592",sensor="fan2"} 2848
node_hwmon_fan_rpm{chip="platform_it87_2592",sensor="fan3"} 0

пятница, 4 июля 2025 г.

Неожиданная цена за простую плату

 Заказывал сегодня мелкие платки у NextPCB и столкнулся с неожиданно высокой стоимостью изготовления. Раньше при заказе двухслойной платы размером до 100х100 мм они стоили 5$ за 10 шт, но в моём случае насчитало около 20$ за плату размером 35х20 мм.

На отдельной странице стал экспериментировать с параметрами заказа без загрузки гербера и выяснилось что если размер платы меньше 30х30 мм, то 5$ превращаются в 13$. А отдельные 7$ мне накинуло за шелкографию на нижней стороне.

В итоге растянул плату до 35х30 мм и перенёс шелкографию на верхний слой.

При оформлении заказа ещё накинуло 13% налога, которого не было при прошлом заказе, но это уже мелочи.

четверг, 3 июля 2025 г.

Точные резисторы для калибровки

 В ветке форума EEVblog, посвящённой измерителю LCR Zoyi ZT-DQ02, обсуждали версию прошивки 1.0.8 и упоминалось что после обновления на эту версию потребует калибровки некоторых значений сопротивления.

В инструкции на измеритель указаны необходимые номиналы сопротивлений, требуемых для полной калибровки (их можно калибровать по отдельности):

  • для измерительного моста: 0Ω, 10mΩ, 100mΩ, 1Ω, 10Ω, 100Ω, 1kΩ, 10kΩ, 100kΩ, 1MΩ, 10MΩ
  • для измерителя внутреннего сопротивления: 0Ω, 1mΩ,10mΩ, 100mΩ, 1Ω, 10Ω, 100Ω, 1kΩ

 В сумме требуется 12 различных номиналов: 0Ω, 1mΩ, 10mΩ, 100mΩ, 1Ω, 10Ω, 100Ω, 1kΩ, 10kΩ, 100kΩ, 1MΩ, 10MΩ. Точность нужна не хуже 0.1% и очень желательно выбирать резисторы с низким ТКС (Температурный Коэффициент Сопротивления). Такие резисторы редко бывают в наличии и стоят в разы дороже обычных.

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