My Notes

Сниппет для сэмплинга пользователей или A/B тестирования (Java)

Допустим, у нас есть стабильный идентификатор пользователя userId. С помощью этой функции мы превращаем строковый идентификатор в псевдослучайное число:

int userNumber = stringIdToSamplingMillis(userId);

Теперь мы можем использовать это число так:

if (userNumber < 50) ... // Пользователь попал в 5% тестовую выборку
if (userNumber < 500) ... // Пользователь попал в категорию A
else ... // Пользователь попал в категорию B

Функция:

    // Генерирует по строке псевдослучайное число от 0 до 999 включительно.
    private static int stringIdToSamplingMillis(final String str) {
        // Используем MD5 в качестве генератора псевдослучайного числа на базе строки
        final MessageDigest hasher = MessageDigest.getInstance("MD5");
        final byte[] data = str.getBytes();
        hasher.update(data, 0, data.length);
        // Получим MD5 в виде длинного целого числа
        final BigInteger bigInt = (new BigInteger(hasher.digest())).abs();
        // Получим хвост длинного целого в виде обычного int-а [0..999]
        return bigInt.mod(BigInteger.valueOf(1000)).intValue();
    }

Параметры звуковой катушки динамика ГДМ-0,5 (0,5 ГД) ЗИК

Нигде в интернетах информации не нашёл, поэтому решил закинуть, заодно сам не потеряю.
Параметры катушки динамика абонентского громкоговорителя (радиоточки) ГДМ-0,5 (иногда "0,5 ГД") ЗИК (Ленинград, 1945-1951), сняты с разорванного трупа катушки, поэтому всё может быть маленько не точно:

Rdc ~ 13 Ом - т.е. номинальное сопротивление, скорее всего, около 16 Ом, что не типично для громкоговорителей.
Rвнеш ~ 26.3 мм.
Rвнутр ~ 25.4 мм.
Высота всей катушки ~ 14 мм (считая вклеенную в диффузор часть).
Толщина ~ 0,45 мм.
Слоёв намотки - 2.
Провод в эмали ~ 0,09-0,1 мм.
Высота намотки ~ 7-8 мм.
От горла диффузора до намотки ~3 мм.
От горла диффузора до дальнего края намотки ~ 11 мм.
От горла диффузора до середины намотки ~ 7 мм.

Можно заменить на катушку от 20ГДС1-8 или 20ГДС1-16 (16-омная намного ближе по параметрам). Катушка overhang, поэтому нужно сохранить положение центра намотки (7 мм). Каркас от 20ГДС немного толще, поэтому горловину диффузора придётся надрезать и немножко раскрыть или наоборот сжать и одеть новый каркас снаружи.

Linux + 4K + Firefox & Chrome - размер шрифтов в меню и на вкладках

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

1) Вычисляем коэффициент, на который нужно умножить разрешение. У моего нового монитора 162x161 PPI (xdpyinfo | grep dots), а проги считают, что 96 PPI. Делим ((162+161)/2)/96 = 1.6822916(6). То есть примерно 1.68. Можно не округлять, можно округлить до 1.7, по вкусу.

2) Google Chrome. Добавляем в ярлык параметр запуска:
sudo gedit /usr/share/applications/google-chrome.desktop
Находим строчку:
Exec=/usr/bin/google-chrome-stable %U
Меняем на:
exec=/usr/bin/google-chrome-stable --force-device-scale-factor=1.68 %U
Если есть копия ярлыка на панели запуска или рабочем столе то её правим аналогично.
Перезапускаем Chrome поправленным ярлыком.
Минус - если Chrome не был запущен и запускается из командной строки без этого параметра, то чуда опять не произойдёт. Впрочем, он почти всегда висит запущенный, поэтому и ладно.

3) Firefox, Thunderbird и другие GTK-приложения. Добавляем в ~/.bash_profile или ~/.profile (какой у вас используется, или в оба):
export GDK_DPI_SCALE=1.68
Перелогиниваемся.

P.S. Почему в 2020 году ведущие мировые приложения не умеют читать реальный PPI экрана мне неведомо.

P.P.S. Фикс для Zoom: в ~/.config/zoomus.conf - исправляем значение scaleFactor.
Sweet Home 3D: в /usr/share/sweethome3d/sweethome3d.sh - добавляем параметр -Dcom.eteks.sweethome3d.resolutionScale=1.68.

Super useful articles on how to configure VNC server on Linux

How to Install and Configure VNC on Ubuntu 18.04

Hint: after each editing /etc/systemd/system/vncserver@.service do both commands:

sudo systemctl daemon-reload
sudo systemctl restart vncserver@1.service

A hint for applying your .profile in the VNC server (make sure to set xstartup interpeter to /usr/bin/bash).

Also, a handy VNC client list.

Шпаргалка по настройке Octoprint / OctoPi + TouchUI

  • Берём кит Raspberry Pi 3 B+ с 3.5" тачскрином, например.
  • Скачиваем и прошиваем на microSD образ OctoPi. Согласно инструкции настраиваем сетевое подключение. Вставляем карту в Pi. В принципе, OctoPi уже работает и можно подключать принтер, заходить на веб-интерфейс и пользоваться.
  • Заходим на Пирожок по SSH и устанавливаем драйвер дисплея и тачскрина. Сначала стоит апнуть всё с помощью apt. Для поиска драйвера нужно использовать информацию, написанную на задней стороне экрана, т.к. много производителей делают аналогичные экраны и драйвера от не того экрана скорее всего не подойдут. В приведённом выше случае, нужен вот этот драйвер (см. SPI_128M_60Hz). На Пирожке распаковываем архив и выполняем sudo ./LCD35_show. После перезагрузки дисплей должен начать работать.
  • Устанавливаем плагин TouchUI в веб-интерфейсе OctoPi.
  • Чтобы на экране Pi после загрузки сразу показывался TouchUI, настраиваем boot to browser. После этого шага, у меня перестали запускаться Иксы, как выяснилось, проблема в конфигурационном файле для тача 99-..., который скрипт установки TouchUI создал в /usr/share/X11 на этом шаге. Его нужно удалить и снова перезагрузить Pi.
  • Отключаем гашение экрана (оно всё равно бесполезно с этим экраном, т.к. он не умеет отключать подсветку), в /etc/xdg/lxsession/LXDE-pi/autostart:
    @lxpanel --profile LXDE-pi
    @pcmanfm --desktop --profile LXDE-pi
    # Эту строчку нужно закомментировать:
    # @xscreensaver -no-splash
    # Эти строчки нужно добавить:
    @xset s off
    @xset -dpms
    @xset s noblank
    @unclutter

Примечание: есть странный баг - иногда случайным образом блокировка скринсейвера не отрабатывает и экран всё же гаснет.
Полезное видео по установке TouchUI.

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/