LINUX.ORG.RU

Сообщения question4

 

Засада от XML

 , ,

Поставил в однострочнике, разгребающем HTML, простую последовательность: sn = root.xpath(...); sn = sn[0] if sn else None; print(sn[0].text if sn else '') Работает. Но если поиск xpath что-то находит, получаю предупреждение:

FutureWarning: Truth-testing of elements was a source of confusion and will always return True in future versions. Use specific ‘len(elem)’ or ‘elem is not None’ test instead.

Полчаса гугления дали ответ. Для Python 3.13 и lxml 6.1.1 выражение 1 if sn else 0 вернёт 0, если sn существует, НО НЕ ИМЕЕТ ДЕТЕЙ. Спасибо, что вставили предупреждение.

question4
()

Nomacs и MC с MPV друг другу мешают

 , , , ,

Обнаружил довольно странный баг. Если в MC сменить ассоциированный видеоплеер на Open=mpv %f, запустить из командной строки nomacs path/to/image/file &, затем запустить из MC проигрывание видео, то переключение картинок в Nomacs застрянет через несколько десятков файлов. Причём, если у файлов изображений неверные расширения, застрянет раза в 3 быстрее. При выключении MPV заработает нормально.

Да, это похоже на известную историю про звук в «Star Control 2» :)

Эксперименты показали, что число просмотренных до зависания файлов не зависит от проигрываемого видео и размера изображений. Оно определяется только форматом изображений: 100 WebP, 160 JPEG, 160 PNG, 60 JPEG с неверным расширением. При этом на каждый файл в консоль выводится соответственно 177, 112, 112 и 287 байт. То есть когда MPV монопольно держит консоль, Nomacs виснет после того, как отправит в неё около 18 000 байт текста. И висит, пока MPV консоль не отпустит. Если слать 1 и 2 в /dev/null, баг не проявляется.

Вопросы:

  • Откуда это ограничение в 18 килобайт?
  • Которая из программ себя неправильно ведёт?
question4
()

Kate, Klipper, D-Bus и Python

 , , ,

Много работаю с историей буфера обмена, там десятки фрагментов, которые быстрее найти и вставить, чем набирать. Но история быстро забивается фрагментами, нужными всего 1 раз. В родном интерфейсе Klipper (история буфера обмена KDE) легко удалить не то, но долго удалять, если много копировал. Поэтому пытаюсь сделать скрипт, который через D-Bus из Питона откроет в редакторе всю историю для ненпаряжного редактирования, затем по сигналу удалит из истории всё, что отсутствует в редакторе.

Пока получилось следующее:

import subprocess
import dbus
bus = dbus.SessionBus()
# Известно, что запущен 1 экземпляр Kate
kate_name = [name for name in bus.list_names() if name.startswith('org.kde.kate')][0]
kate_main = bus.get_object(kate_name, '/MainApplication')
klipper_o = bus.get_object('org.kde.klipper', '/klipper')
history_joined = '\n'.join(_ for _ in klipper_o.get_dbus_method('getClipboardHistoryMenu')())
kate_main.get_dbus_method('openInput', 'org.kde.Kate.Application')(history_joined, '')
print('В Kate удали ненужное из истории. Закончив, нажми Ctrl-A, вернись в скрипт, нажми Enter.')
input()
edited = subprocess.getoutput('xclip -out -selection primary')
history_array = klipper_o.get_dbus_method('getClipboardHistoryMenu')()
history_array = [_ for _ in history_array if _ in edited]
if len(history_array) == 0:
    print('В истории пусто. Если действительно хочешь всё удалить, очисть историю из Klipper.')
else:
    klipper_o.get_dbus_method('clearClipboardHistory', 'org.kde.klipper.klipper')()
    for n, element in enumerate(history_array[-1::-1]):
        klipper_o.get_dbus_method('setClipboardContents', 'org.kde.klipper.klipper')(element)

Вопросы:

  1. Возможно ли менее костыльное решение? Чтобы скрипт читал текст из редактора напрямую, без временного файла или буфера среднего пальца.
  2. Существует ли документация на доступные через D-Bus API Kate и Klipper (история буфера обмена KDE)?
  3. Где смотреть определения форматов, выдаваемые Introspection? https://www.freedesktop.org/software/systemd/man/latest/sd_bus_message_read.html — здесь?
  4. Когда qdbus6 показывает несколько методов с одним именем, но разными сигнатурами, как использовать из Питона метод с меньшим числом переменных? Например, есть method QString org.kde.Kate.Application.tokenOpenUrl(QString url, QString encoding) и method QString org.kde.Kate.Application.tokenOpenUrl(QString url, QString encoding, bool isTempFile), но с 2 переменными выдаёт ошибку.
  5. Что дают многочисленные методы activate и Activate? Все, что пробовал, ничего не делали.
  6. Правда ли, что функции для чтения текста из Kate удалили, как сложные для поддержки? Или прочитать текст из активного документа можно?
question4
()

Как работает Keepalive?

 , keepalive,

В очередной раз столкнувшись с зависанием табов Firefox, когда перестаёт работать клавиатура, я узнал от Гугло-ИИ про «молчаливое бесконечное зависание сокетов» и сообщения KeepAlive. Поискал информацию в других местах, и вопросов стало ещё больше:

  1. Правильно ли я понимаю, что
    1.1. при плохой связи или намеренном удушении трафика до моей машины не доходят сообщения об обрыве связи,
    1.2. поэтому программа может вечно висеть и считать себя работающей, ничего не скачивая/не передавая,
    1.3. поэтому придумали отправку сигнала KeepAlive,
    1.4. и при плохой связи имеет смысл увеличить частоту запросов и уменьшить время до нескольких минут?

  2. Если по умолчанию tcp_keepalive_time — 2 часа, а затем 9 (tcp_keepalive_probes) попыток с интервалом 75 с (tcp_keepalive_intvl), почему curl, браузеры, FTP-сервера и другие программы могут висеть, ничего не скачивая, гораздо дольше 2 часов 12 минут? Считать ли способность не работать и не выдавать ошибку дольше 2 часов 12 минут багом сетевой программы?

  3. Где об этом стоит прочитать? Помимо man sysctl, man sysctl.conf и man tcp.

  4. Можно ли глобально прибить все подвисшие соединения на уровне ядра?

  5. Пытался ли кто-нибудь решить проблему мёртвого зависания при плохой связи глобально? Можно ли, например, при таймауте на уровне TCP долго пытаться восстановить связь, а не рвать окончательно?

  6. Можно ли настраивать параметры keepalive для браузеров в Андроиде без рута?

question4
()

leave, как сказать, что ответ человека известен заранее, не нарушая правил?

 

https://www.linux.org.ru/forum/science/18377421?cid=18380655

Человек — известный специалист, хорошо разбирается в обсуждаемом вопросе. Свою политическую ориентацию не скрывает. Своё отношение к отечественным разработкам, дублирующим иностранные, неоднократно высказывал — не нужны. Как сказать, что его ответ предсказуем, не нарываясь на 5.3? @leave, объясни, как положено говорить об импортозамещении в науке?

Обсуждаемая программа — на Фортране-90, под отечественный Линукс, работает на кластере в наукограде.

question4
()

OpenRGB достигла версии 1.0

 , , ,

Группа Hardware and Drivers

Тихо и незаметно вышла версия 1.0 программы для управления светодиодами на материнской плате, картах расширения и прочем оборудовании и периферии. Судя по упоминаниям на ЛОРе, ею пользуются, в основном, для отключения раздражающей подсветки, и с задачей она справляется.

Основные отличия от релиз-кандидатов, которыми пользовались последние полтора года — окончательный отказ от Qt5 и переход на свой собственный форк HIDAPI — библиотеки для USB HID class (устройств USB и Bluetooth для взаимодействия с человеком — клавиатур, мышей, игровых контроллеров).

( читать дальше... )

>>> Списки изменений (codeberg.org)

question4
()

Ламповый компьютер

 

https://www.thetubecomputer.com/
https://www.securitylab.ru/news/577108.php

Американский (судя по GeoIP для сайта) пенсионер собрал ламповый компьютер. 460 двойных триодов 6Н3П (высота 50 мм, ⌀22 мм, цена в РФ 100-400 р.), то есть 920 вентилей ИЛИ-НЕ. При включении нужно ждать 10 минут для прогрева и термостабилизации. 8 бит, 16 команд процессора, возможность проводить 128-битные операции через регистр переноса. Потребляет ~1 кВт, весит 20 кг.

Сейчас пишет под него симулятор дирижабля.

question4
()

Кто-нибудь в численном решении уравнения Эйнштейна разбирается?

 , ,

Наткнулся: https://vkvideo.ru/video-228780277_456239075 Математик (д.ф.-м.н., вроде) демонстрирует, как его программа повторяет известное решение для слияния 2 чёрных дыр.

Как его сейчас принято решать? Нужна ли ещё одна программа для его численного решения?

question4
()

JavaScript, циклы и генераторы

 

Как в Джаваскрипте сделать вызов итератора по массиву через setInterval? То есть, сделать функцию, которую бы мог по таймеру дёргать setInterval, и которая при каждом вызове бы что-то делала с очередным элементом массива.

В современных языках программирования много средств для написания простого понятного выразительного кода. Сейчас попробовал на Джаваскрипте. А нихрена. Оказалось, далеко не все массивы умеют .forEach, forEach не сочетается с yield, setInterval не принимает генераторы и т. д. В итоге пришёл к синтаксису недо-Си — имитации цикла for через if с глобальными переменными:

    let pause = 1000;
    let length = 10;
    let i = 0;
    let doRoll = null;

    function getNext() {
        console.log(array1[i]);
        i++;
        if (i >= array1.length) {
            clearInterval(doRoll);
            doRoll = null;
        }
    }

    function startRolling() {
        if (doRoll) {
            clearInterval(doRoll);
            doRoll = null;
        } else {
            i = 0;
            doRoll = setInterval(getNext, pause);
        }
    }

Как это записать покрасивее?

question4
()

Tampermonkey и NoScript

 , , ,

Много лет был уверен, что NoScript блокирует все пользовательские скрипты Greasemonkey, Tampermonkey и т.п. Сегодня наткнулся на упоминания, что всё должно работать. Вопрос: как этого добиться?

Для Greasemonkey гуглятся только советы прошлого десятилетия уровня «УМВР», для TamperMonkey Гугло-ИИ выдал подробную инструкцию, не соответствующую действительности, для Violentmonkey — закрытые баги.

Собственно скрипт (работоспособность не проверял):

// ==UserScript==
// @name         Открыть все IMG
// @match        http://flibustaongezhld6dibs2dps6vm4nvqg2kp7vgowbu76tzopgnhazqd.onion/*
// @match        http://flibusta.is/*
// @match        http://flibusta.i2p/*
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';
    console.log('Запуск открытия IMG');
    let doRoll = null;
    let pause = 5000;
    let imageN = 0;

    let images = document.getElementsByTagName('img');

    function nextURL () {
        console.log(images[imageN].src);
        // GM_openInTab(images[imageN].src);
        imageN++;
        if (imageN >= images.length) {
            clearInterval(doRoll);
            doRoll = null;
        }
    }

    function startRolling() {
        if (doRoll) {
            clearInterval(doRoll);
            doRoll = null;
        } else {
            imageN = 0;
            doRoll = setInterval(nextURL, pause);
        }
    }

    GM_registerMenuCommand("Открыть все рисунки", startRolling);
})();

По идее, он должен добавить в меню пункт, при клике на который в консоли с интервалом 5 с будет показывать URLы иллюстраций на странице. Пункт в меню не добавляется. Это вообще возможно? Или я что-то неправильно понял?

P.S. Само собой заработало.

question4
()

Зря удалили

 

Тема шрифтов исторически была очень животрепещущей для Линукса. Многих расстраивала недоступность соответствующей литературы. Тема https://www.linux.org.ru/forum/talks/18366424 сообщает о том, что положение изменилось. Слишком поздно, но кого-то порадует.

question4
()

Почему скрипт сам запускается?

 , ,

Сделал такой скрипт для TamperMonkey:

// ==UserScript==
// @name         Вниз
// @namespace    http://tampermonkey.net/
// @version      2026-08-20
// @description  Вниз
// @author       You
// @match        https://...
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';

    let makeScroll = null;
    const step = 500;
    const pause = 100; // мс

    function scrollByX() {
        if ((window.innerHeight + window.scrollY) >= document.body.scrollHeight) {
            clearInterval(makeScroll);
            makeScroll = null;
            console.log("Отмена прокрутки -- уже внизу.");
        } else {
            window.scrollBy(0, step);
            console.log("На", step, "вниз");
        }
    };

    function startRolling () {
        console.log("Запускаю прокрутку");
        if (makeScroll) {
            clearInterval(makeScroll);
            makeScroll = null;
            console.log("Отмена прокрутки -- уже шла.");
        } else {
            makeScroll = setInterval( scrollByX, pause);
            console.log("Прокрутка запущена");
        }
    }

    GM_registerMenuCommand("Прокрутить вниз", startRolling );
    window.addEventListener('keydown', function(event) {
        if (event.altKey && event.code === 'KeyZ') {
            startRolling();
            console.log("Alt-Z");
        }
    } );
})();

Он должен медленно прокрутить страницу вниз (шагами по 500 пикселов за 100 мс), чтобы отработала ленивая загрузка изображений.

Как я понимаю, при загрузке страницы makeScroll — null, и прокрутка не должна начаться, пока я не запущу скрипт из меню или не нажму Alt-Z. Тогда почему при перезагрузке страницы она сразу начинает скроллиться?

ОТВЕТ: Лишние () в GM_registerMenuCommand. Исправил.

question4
()

Тетрис отреверсили

 , ,

https://habr.com/ru/articles/1071018/
https://github.com/n0isy/original-tetris-recomp

Реконструировали исходники самого первого Тетриса. На паскале. Собирается в эмуляторе VAX в программу до бита совпадающую с оригиналом.

Довольно интересно задаются фигуры. Вместо готовой таблицы констант, каждый раз генерируются, что увеличивает программу на 13%. По мнению автора статьи — так было легче отлаживать. (А по-моему, это может быть связано с тем, что изначально хотели сделать пентамино.)

question4
()

Как вы относитесь к восьмеричным числам?

 ,

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

Однострочник на баше с арифметическими выражениями, если интересно :)

question4
()

Панель задач растягивается за экран

 , ,

На машине несколько мониторов. Для всех выставлено разрешение 1920x1080, но один (первый в списке xrandr, HDMI-0) может работать в более высоком 2560x1440. «Первичным» (primary) назначен последний в списке (DP-5), на нём выводится панель задач (таскбар).

После очередного обновления возник следующий глюк. При старте иксов включается только монитор HDMI-0, причём в максимальном доступном разрешении. На нём открываются все сохранённые окна (например, максимизированное Konsole), рисуется панель задач. Затем применяются настройки мониторов, включаются остальные мониторы, меняется разрешение, чересчур большие окна втискваются в размер экрана, панель переносится на другой экран, без изменения размера. То есть её правые 20% оказываются за экраном. Если вручную покрутить какие-то настройки панели (например, высоту) она меняет ширину на правильную.

Как это можно исправить?

Версии пакетов KDE и Plasma или 26.04.3, или 6.27.0, или 6.6.6. Gentoo. xorg-server 21.1.24.

question4
()

Не сохраняются настройки efibootmgr

 , , ,

Обновил BIOS. При этом то ли слетели настройки, то ли включение «оптимизированных настроек» сбрасывает настройки загрузки. Теперь не могу настроить загрузку efibootmgr-ом.

# efibootmgr -c -L GRUB -l '\EFI\gentoo\grubx64.efi'
Timeout: 1 seconds
BootOrder: 0000
Boot0000* GRUB  HD(1,GPT,47aa9c71-d93e-4ca0-a57e-dd1806d886b9,0x800,0x918596800)/\EFI\gentoo\grubx64.efi
# efibootmgr -v
Timeout: 1 seconds
BootOrder: 0000
Boot0000* GRUB  HD(1,GPT,47aa9c71-d93e-4ca0-a57e-dd1806d886b9,0x800,0x918596800)/\EFI\gentoo\grubx64.efi
      dp: 04 01 2a 00 01 00 00 00 00 08 00 00 00 00 00 00 00 68 59 18 09 00 00 00 71 9c aa 47 3e d9 a0 4c a5 7e dd 18 06 d8 86 b9 02 02 / 04 04 34 00 5c 00 45 00 46 00 49 00 5c 00 67 00 65 00 6e 00 74 00 6f 00 6f 00 5c 00 67 00 72 00 75 00 62 00 78 00 36 00 34 00 2e 00 65 00 66 00 69 00 00 00 / 7f ff 04 00

Перезагружаюсь. Вместо GRUB получаю настройки UEFI. Вручную запускаю fs0:\EFI\gentoo\grubx64.efi. Загружаю Линукс, вижу:

# efibootmgr 
Timeout: 1 seconds
No BootOrder is set; firmware will attempt recovery

Материнская плата MSI PRO B850-P WIFI, биос AMI. Secure Boot отключил. Какие ещё настройки нужны?

ОТВЕТ: При перезагрузке сбрасывались записи с неверным разделом. Нужен был 2, по умолчанию создаётся для 1. Правильная команда: efibootmgr -c -L GRUB -d /dev/sda -p 2 -l '\EFI\gentoo\grubx64.efi'. Почему-то efibootmgr -b 0000 -L GRUB -d /dev/sda -p 2 -l '\EFI\gentoo\grubx64.efi' отрабатывает без ошибок, но номер раздела не меняет.

question4
()

Компьютер долго включается

 , , , ,

При включении или перезагрузке иногда машина надолго задумывается. Может несколько минут стоять с чёрным монитором, прежде чем появится меню GRUB. Если дошло до загрузки — какое-то время загружается без проблем.

Материнская плата: Micro-Star International PRO B850-P WIFI (MS-7E56)
Процессор: AMD Ryzen 9 9950X3D 16-Core
Видео: GeForce RTX 5090
Жёсткий диск: Seagate ST20000NM007D-3D

Вывод lshw: https://pastebin.com/fhcpTT1A

В чём может быть проблема? Куда копать?


ИТОГ:

Обновил BIOS до 2A92 от 25.06.2026 (до того был 2A75 от 10.09.2025). В результате стало подолгу задумываться после каждой перезагрузки. Включил Memory Context Restore, поставил срок использования данных «тренировки» в 30 дней. Перезагрузки ускорились.

Возникла другая проблема: то ли обновление, то ли сброс настроек в «оптимизированные» сбросили настройки загрузки и включили Secure Boot. Диски перестали грузиться. Даже для загрузки вручную fs0:\EFI\gentoo\grubx64.efi надо было отключить Secure Boot.

Не сразу разобрался, что efibootmgr по умолчанию всегда ставит загрузку с /dev/sda1 и не может эту запись изменить — только удалить и пересоздать. Для загрузки с /dev/sda2 нужно efibootmgr -c -L GRUB -d /dev/sda -p 2 -l '\EFI\gentoo\grubx64.efi'

Предположение, что удалились пункты, которые стали недоступны из-за Secure Boot, оказалось неверным — ничего не удаляется.

question4
()

Какая это может быть кодировка?

 

Есть текстовые файлы, записанные в ~1988 году. (Если запостивший их соврал, то не позднее 1998.) Большая часть символов — 7-битный ASCII. Для некоторых знаков препинания (которые можно только угадывать из контекста) используется странная кодировка:
0x8a — многоточие или тире,
0x8b — короткое тире или дефис,
0x8c — открывающая кавычка, для которой 0xb9 — закрывающая,
0xad — может быть запятая (или одинарная нижняя кавычка), тире, двоеточие, многоточие,
0xb2 — закрывающая кавычка в паре с 0xb3,
0xb3 — открывающая кавычка в паре с 0xb2,
0xb9 — апостроф или одинарная верхняя кавычка.
Неясно, одинарные кавычки или двойные; ёлочки, лапки, или что-нибудь ещё; не перепутан ли порядок кавычек; как соотносятся длины тире.

Enca ничего подходящего не нашла. Перебор кодировок iconv дал ISO-IR-90 или ISO-IR-99 для 0xb9 как одинарной кавычки/апострофа и ничего подходящего для остальных. Возможно, эти файлы несколько раз перекодировали.

Как узнать, в какой кодировке были эти файлы? Просто интересно.

Если перебирать комбинации кодировок скриптом, как это лучше делать?

P.S. Текст на английском языке.

question4
()

xvfb не запускается

 ,

X Window работает на 0-м экране. Запускаю Xvfb на 1-м:

$ Xvfb -screen :1 1024x768x16 
(EE) 
Fatal server error:
(EE) Server is already active for display 0
        If this server is no longer running, remove /tmp/.X0-lock
        and start again.
(EE) 

Что ему не нравится?

В /tmp/.X0-lock — PID работающего на 0-м экране X Window. Удаление /tmp/.X0-lock и /tmp/.X11-unix/ не помогает. В dmesg ничего нет.

Gentoo, KDE, x11-base/xorg-server-21.1.24. Конфигурация подробнее: emerge –info: https://pastebin.com/ei5qKVLj, emerge -pqv: https://pastebin.com/YDWkXWUW, emerge –info xorg-server: https://pastebin.com/y4VVcmew, strace Xvfb -screen :1 1024x768x16: https://pastebin.com/83WDztjF

Дополнение:
Собственно, Xvfb понадобился для сборки Firefox с PGO — с самого начала вызывает Xvfb -displayfd 1 -screen 0 1280x1024x24 +extension RANDR и не начинает компиляцию, если Xvfb не работает.

Но после серии перезагрузок с выключением/включением в параметрах ядра 'nvidia-drm.modeset=0' и заменой 0 на 1, когда я снова загрузился со старой командной строкой и попробовал thread apply all bt full в GDB, эта команда не упала! И больше не падает.

Я даже пересобрал xorg-server с CFLAGS="-O2 -pipe -march=native" (убрав -ggdb3 и вернув native) и перезагрузился. Всё равно работает.

Теперь вопрос: что это было?

question4
()

Invalid handle. Cannot load symbol cublasLtGetVersion

 , , onnxruntime,

$ piper -m en/amy/en_US-amy-medium.onnx -i example.txt --cuda
2026-07-26 18:54:25.854206077 [W:onnxruntime:, transformer_memcpy.cc:111 ApplyImpl] 28 Memcpy nodes are added to the graph torch_jit for CUDAExecutionProvider. It might have negative impact on performance (including unable to run CUDA graph). Set session_options.log_severity_level=1 to see the detail logs before this message.
2026-07-26 18:54:25.879156117 [W:onnxruntime:, session_state.cc:1387 VerifyEachNodeIsAssignedToAnEp] Some nodes were not assigned to the preferred execution providers which may or may not have an negative impact on performance. e.g. ORT explicitly assigns shape related ops to CPU to improve perf.
2026-07-26 18:54:25.879190887 [W:onnxruntime:, session_state.cc:1389 VerifyEachNodeIsAssignedToAnEp] Rerunning with verbose output on a non-minimal build will show node assignments.
Invalid handle. Cannot load symbol cublasLtGetVersion
Аварийный останов      piper -m en/amy/en_US-amy-medium.onnx -i example.txt --cuda

Нагуглил рекомендацию поставить новый onnxruntime-gpu с поддержкой новых cuda и cudnn. pip download "onnxruntime-gpu[cuda,cudnn]" --pre --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ort-cuda-13-nightly/pypi/simple/ После этого Philip O’Brien в #python на libera.chat объяснил, что перебирать все версии до января — плохая идея. В итоге удалось поставить последнюю сборку:

pip download "onnxruntime-gpu[cuda,cudnn]==1.28.0.dev20260722004" --pre --index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ort-cuda-13-nightly/pypi/simple/ --extra-index-url https://pypi.org/simple/ --dest ./wheels
pip install wheel/*

Но это не помогло.

В чём проблема, что падает?

question4
()