LINUX.ORG.RU

Сообщения Xintrea

 

Не могу запустить WiFi на USB-свистке ZyXEL NWD2105 в чистой консоли

Пытаюсь получить WiFi-сеть, использую ZyXEL NWD2105. Сеть надо получить в консоли на очень слабом железе без этих ваших NetworkManager и WiCd, чтобы в памяти ничего лишнего не болталось и процессорное время не выжиралось (Intel Celeron M processor 630MHz, RAM 512Mb).

Вот какие действия я совершаю:

> # Что увидело ядро
> dmesg | grep -i phy
[   34.915284] ieee80211 phy0: rt2x00_set_rt: Info - RT chipset 3070, rev 0201 detected
[   34.945194] ieee80211 phy0: rt2x00_set_rf: Info - RF chipset 0005 detected
[   34.945612] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'


> # Что на шине USB
> lsusb | grep -i wireless
Bus 001 Device 002: ID 0586:341e ZyXEL Communications Corp. NWD2105 802.11bgn Wireless Adapter [Ralink RT3070]


> # Заблокировано ли устройство
> rfkill list
0: eeepc-wlan: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: phy0: Wireless LAN
        Soft blocked: yes
        Hard blocked: no

        
> # Разблокировка устройства
> rfkill unblock 1
> rfkill list
0: eeepc-wlan: Wireless LAN
        Soft blocked: yes
        Hard blocked: no
1: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no

        
> # Состояние линка wlan0
> ip link show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,DYNAMIC,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
    link/ether fc:f5:28:fb:f8:a6 brd ff:ff:ff:ff:ff:ff

    
> # Поднятие интерфейса wlan0 (ошибок нет, интерфейс не поднимается)
> ip link set wlan0 up
> ip link show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,DYNAMIC,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
    link/ether fc:f5:28:fb:f8:a6 brd ff:ff:ff:ff:ff:ff

    
> # Вывод информации о WiFi устройствах
> iw dev
phy#0
        Interface wlan0
                ifindex 3
                wdev 0x1
                addr fc:f5:28:fb:f8:a6
                type managed
                txpower 20.00 dBm


> # Просмотр списка WiFi сетей
> iw wlan0 scan | grep SSID
        SSID: RT-GPON-07B9
        SSID: RT-GPON-6E8F
        SSID: Pipetka
        SSID: TP-Link_14B3
        SSID: Borsh
        SSID: RT-GPON-2180
        SSID: TP-Link_B140
        SSID: MikroTik-Xi
        SSID: Cher
        SSID: KV91
        SSID: 
        SSID: tanushenok
        SSID: 249

        
> # Установка параметров поключения к WiFi сети (выполняется без ошибок)
> iwconfig wlan0 essid MikroTik-Xi key s:ТутМойПароль


> # Снова попытка поднять интерфейс (выполняется без ошибок, интерфейс не поднимается)
> ip link set wlan0 down
> ip link set wlan0 up


> # Состояние линка
> ip link show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,DYNAMIC,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
    link/ether fc:f5:28:fb:f8:a6 brd ff:ff:ff:ff:ff:ff

    
> # Состояние TCP/IP
> ip addr show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,DYNAMIC,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
    link/ether fc:f5:28:fb:f8:a6 brd ff:ff:ff:ff:ff:ff

То есть, устройство работает с радиоканалом, видит WiFi сети, но подключиться не может. Почему-то не поднимается сетевой интерфейс.

Если что, то соединение предполагается по DHCP. Содержимое /etc/network/interfaces следующее:
auto lo
iface lo inet loopback

allow-hotplug ens3
iface ens3 inet dhcp

allow-hotplug wlan0
iface wlan inet dhcp

Попытка подключиться через dhclient выглядит так:
> dhclient -v wlan0
Internet Systems Consortium DHCP Client 4.4.3-P1
Copyright 2004-2022 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/fc:f5:28:fb:f8:a6
Sending on   LPF/wlan0/fc:f5:28:fb:f8:a6
Sending on   Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 11
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 11
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 17
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 15
No DHCPOFFERS received.
No working leases in persistent database - sleeping.

Видимо, соединяться по DHCP не имеет смысла, пока status DOWN. Но как сделать status UP я не пойму.

Еще момент: в компьютере есть набортное WiFi устройство ath5k, которое раньше хотя бы определялось ядром, но видимо когда был всунут USB-донгл, ядро его по какой-то причине видеть перестало. Я с этим устройством повозился, но бросил, потому что в Интернетах под Linux ему никто ума дать не смог (в Windows, естественно, работает). Виделось оно вот так:
[  262.434122] ath5k 0000:01:00.0: enabling device (0000 -> 0002)
[  262.434540] ath5k 0000:01:00.0: registered as 'phy0'
[  262.956818] ath: EEPROM regdomain: 0x60
[  262.956837] ath: EEPROM indicates we should expect a direct regpair map
[  262.956847] ath: Country alpha2 being used: 00
[  262.956853] ath: Regpair used: 0x60
[  262.956948] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
[  263.026299] ath5k: phy0: Atheros AR2425 chip found (MAC: 0xe2, PHY: 0x70)

А теперь этих строк в загрузке ядра не видно, хотя никаких специальных действий для его отключения не делал. Я про этот AR2425 говорю для полноты картины.

ЗЫ: Кастую mky.

 , , ,

Xintrea
()

Где найти документацию на формат вывода команды ip addr?

Читаю man ip, читаю man ip-address, читаю ip addr help.

Нигде не написано, какие конкретно данные показывает утилита IP и в каком формате. Вот например:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff

Вначале идет номер интерфейса, нумерация с единицы. Это можно понять.

Затем имя интерфейса.

Затем нечто в угловых скобках «<...>». То ли то ли это текущее состояние интерфейса, то ли это возможные состояния интерфейса, то ли там намешаны и возможные «флаги», и текущие. В общем что это? Где найти описание всех возможных значений, применяемых в угловых скобках?

Далее идет поток каких-то ключевых слов. Есть подозрение, что они организованы в пары (имя значение), но подтверждения этой теории в документации не нашел. И даже если это ключ-значение, то что они значат? Возможное (настроенное) состояние? Текущее состояние? Все вперемешку? Где официально найти что значат сами параметры, их описание и возможные значения (mtu, qdisc, state, group, qlen, может еще что)?

Вот, например, имеются строки:
"<LOOPBACK,UP,LOWER_UP> ... state UNKNOWN"
или
"<BROADCAST,MULTICAST,UP,LOWER_UP> ... state DOWN

Что сие значит? Интерфейс поднят или нет? В угловых скобках есть и UP и какой-то LOWER_UP, но в state написано UNKNOWN или DOWN. Как это понимать?

 , , ,

Xintrea
()

Что вы думаете об этой фантазии?

Концепции и размышления о новой современной операционной системе:

https://habr.com/ru/articles/840072/

Там автор даже про идейно верный, с его точки зрения, шелл рассказывает. Как по мне, так чувствуется передоз упорином.

 

Xintrea
()

Исчезновение текущего каталога в пути к файлу в Bash-скрипте

Пытаюсь перевести библиотеку звуковых файлов в WAV-формат. Для этого написал простой скрипт:

#!/bin/bash
     
find \( -name \*.mp3 \
     -or -name \*.MP3 \
     -or -name \*.Mp3 \
     -or -name \*.ogg \
     \) -print0 \
     | while IFS= read -r -d '' file; 
do
    fileWithoutExt="${file%.*}"
    command="ffmpeg -loglevel quiet -i \"${file}\" -y -ar 44100 \"${fileWithoutExt}.wav\""
    echo "Команда: ${command}"
done

Этот скрипт выдает следующую последовательность команд, и эти команды правильные:
Команда: ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav"
Команда: ffmpeg -loglevel quiet -i "./WindJam/Minus 4.mp3" -y -ar 44100 "./WindJam/Minus 4.wav"
Команда: ffmpeg -loglevel quiet -i "./WindJam/Minus 3.mp3" -y -ar 44100 "./WindJam/Minus 3.wav"
Команда: ffmpeg -loglevel quiet -i "./WindJam/Minus 2.mp3" -y -ar 44100 "./WindJam/Minus 2.wav"
Команда: ffmpeg -loglevel quiet -i "./WindJam/Minus 1.mp3" -y -ar 44100 "./WindJam/Minus 1.wav"
Команда: ffmpeg -loglevel quiet -i "./Thrash-electronics JAM.mp3" -y -ar 44100 "./Thrash-electronics JAM.wav"
Команда: ffmpeg -loglevel quiet -i "./Jingle Bells - Backing Track.mp3" -y -ar 44100 "./Jingle Bells - Backing Track.wav"
Команда: ffmpeg -loglevel quiet -i "./Road  Jam minus2.mp3" -y -ar 44100 "./Road  Jam minus2.wav"
Команда: ffmpeg -loglevel quiet -i "./Chamba Jam/1.ogg" -y -ar 44100 "./Chamba Jam/1.wav"
Команда: ffmpeg -loglevel quiet -i "./Chamba Jam/5.ogg" -y -ar 44100 "./Chamba Jam/5.wav"
...

Осталось дело за малым: выполнить эти команды. Добавляю в конец цикла строку:
eval "${command}"

И наблюдаю такую дичь:
Команда: ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav"
Команда: ffmpeg -loglevel quiet -i "WindJam/Minus 4.mp3" -y -ar 44100 "WindJam/Minus 4.wav"
Команда: ffmpeg -loglevel quiet -i "/WindJam/Minus 3.mp3" -y -ar 44100 "/WindJam/Minus 3.wav"
Команда: ffmpeg -loglevel quiet -i "./WindJam/Minus 2.mp3" -y -ar 44100 "./WindJam/Minus 2.wav"
Команда: ffmpeg -loglevel quiet -i "/WindJam/Minus 1.mp3" -y -ar 44100 "/WindJam/Minus 1.wav"
Команда: ffmpeg -loglevel quiet -i "./Thrash-electronics JAM.mp3" -y -ar 44100 "./Thrash-electronics JAM.wav"
Команда: ffmpeg -loglevel quiet -i "/Jingle Bells - Backing Track.mp3" -y -ar 44100 "/Jingle Bells - Backing Track.wav"
Команда: ffmpeg -loglevel quiet -i "./Road  Jam minus2.mp3" -y -ar 44100 "./Road  Jam minus2.wav"
Команда: ffmpeg -loglevel quiet -i "/Chamba Jam/1.ogg" -y -ar 44100 "/Chamba Jam/1.wav"
Команда: ffmpeg -loglevel quiet -i "./Chamba Jam/5.ogg" -y -ar 44100 "./Chamba Jam/5.wav"
...

Тут видно, что по неизвестным причинам в командных строках перед именем файла, вместо ожидаемых символов "./", могут быть следующие варианты:

- "./"
- «/»
- «»

Соответственно, обрабатываются не только лишь все файлы.

Я пробовал вместо eval и такие варианты для выполнения сконструированной команды:
"${command}"
и
${command}

Но тогда вообще другая дичь происходит: в первом варианте лезут ошибки (запускал с set -x):
Команда: ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav"
+ 'ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav"'
./soundConvert05.sh: строка 22: ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav": Нет такого файла или каталога

А во втором варианте команда вроде как выполняется, никакой ошибки не показывается, но WAV-файла не появляется:
Команда: ffmpeg -loglevel quiet -i "./Last love jam.mp3" -y -ar 44100 "./Last love jam.wav"
+ ffmpeg -loglevel quiet -i '"./Last' love 'jam.mp3"' -y -ar 44100 '"./Last' love 'jam.wav"'

Хотя опять же, если ручками выделить команду и выполнить ее в консоли, она выполнится правильно и WAV-файл будет сгенерирован.

Вопрос: как в этих ваших линуксах просто выполнить сконструированную команду, которая лежит в переменной?

 , , ,

Xintrea
()

Почему не доступен файл /sys/bus/usb/drivers/usb/bind (unbind) ?

Мне нужно временно включить/выключить USB-устройство.
Я пытаюсь воспользоваться вот этим решением:

https://superuser.com/questions/1707773/how-to-turn-usb-connected-device-on-a...

Однако файлы /sys/bus/usb/drivers/usb/bind и unbind невозможно использовать, хотя они есть и запись в них разрешена. Вот пример:

root@comp:~# ls -la /sys/bus/usb/drivers/usb/bind
--w------- 1 root root 4096 авг 22 10:17 /sys/bus/usb/drivers/usb/bind

root@comp:~# echo '3-13' |tee /sys/bus/usb/drivers/usb/bind
3-13
tee: /sys/bus/usb/drivers/usb/bind: Нет такого устройства

Вопрос: почему так? Что блокирует возможность записи в эти файлы?


Перемещено hobbit из general

 , ,

Xintrea
()

Чем перевести документ в направлении EN-RU на 150 000 символов?

Имеется автосгенерированный текст на 150 000 символов (~25 000 строк).

Его нужно перевести в направлении EN-RU. Google Translate ограничен 5 000 символов. Yandex Translate вроде дает 10 000 символов, но это тоже мало.

Вопрос: каким методом можно бесплатно без СМС автоматически перевести текст такого объема?

 , ,

Xintrea
()

Обработка имен файлов с пробелами, полученных от команды find - оно работает, но странно глючит

Наконец-то я почти нашел относительно адекватное решение старого вопроса: как в цикле правильно перебрать имена файлов, полученных от команды find, причем в именах файлов могут встречаться пробелы?

Решение такое:

find -name \*.mp3 -or -name \*.MP3 -or -name \*.Mp3 -or -name \*.ogg -print0 | while IFS= read -r -d '' file; 
do

    echo "Processing ${file}"
 
done

Однако есть проблема. Если в заданном каталоге вручную в консоли вызвать одну команду find, то она, как и положено, найдет все мои ~300 файлов:
find -name \*.mp3 -or -name \*.MP3 -or -name \*.Mp3 -or -name \*.ogg
./Last love jam.mp3
./WindJam/Minus 4.mp3
./WindJam/Minus 3.mp3
./WindJam/Minus 2.mp3
./WindJam/Minus 1.mp3
./Thrash-electronics JAM.mp3
... 300 файлов ...

Если же в этом же каталоге запустить полный вышеуказанный скрипт, то он найдет только *.ogg файлы.

Почему так? Что в скрипте еще надо исправить, что бы обрабатывались все файлы?

 , , , ,

Xintrea
()

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

Имеется следующий XML-код, сгенерированный некой программой с закрытыми исходниками:

<?xml version="1.0" encoding="utf-8"?>
<preparedreport>
    <b1 t="0">
        <m1 u="Период: 01.01.2024..08.08.2024"/>
    </b1>
    <b7 t="80.25201">
        <m53 u="Таблица"/>
    </b7>
    <b5 t="178.92919">
        <m33 u="09.01.2024"/>
        <m38 u="1"/>
        <m40 u="00:06"/>
    </b5>
    <b5 t="196.92919">
        <m33 u="10.01.2024"/>
        <m38 u="1"/>
        <m40 u="00:22"/>
    </b5>
</preparedreport>

Необходимо через XPath выбрать значения атрибута u для всех элементов, имя которых начинается на m.

То есть, в данном случае для элементов m1, m53, m33, m38, m40. А циферки в реальном XML-документе могут быть непредсказуемы, то бишь совершенно разные.

Вопрос: как через XPath выбирать элементы, имя которых начинается на m?

И вопрос со звездочкой: как через XPath выбрать элементы, имя которых начинается на m, после чего в имени идут только цифры?

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



Перемещено hobbit из general

 ,

Xintrea
()

GitHub стал показывать профиль рекурсивно

На основной странице показывает ошибку:

Uh oh!
There was an error in loading the activity feed. Reload this page.

А на странице профиля - профиль, потом с отступом ниже тот же профиль, потом с отступом еще один и так до бесконечности.

Браузер Firefox 86.0.1.

Если уменьшить шрифты, то выглядит вот так:

https://ibb.co/gFFNV3F

 

Xintrea
()

Как пользоваться ByeDPI для Android? Раззамедление YouTube

Наконец-то и мой провайдер стал резать YouTube. В поисках бесплатных OpenSource альтернатив VPN, я нашел такое:

Способ есть, протестил лично на своих девайсах:
(Работает по той же технологии, что и на пк GoodbyeDPI)

1. Качаете программу ByeDPI с гитхаба
https://github.com/dovecoteescapee/ByeDPIAndroid

2. Устанавливаем, включаем (при включении она запросит подключение впн). Ютуб работает. Вот так вот просто.

⚡️ Гайд, как пофиксить ютуб на Windows: https://t.me/modden_yt/1521

P.S. Ясное дело, есть впн, но бесплатный впн некачественный, а платный стоит денег. Так что, вот ответ тем, кто напишет про впн.


Ну окей. Поставил Obtainium, а через него ByeDPI for Android. Запускаю, нажимаю Connect. Пишет Connected. В Termux через ifconfig вижу, что создался интерфейс tun0. И дальше что?

Каким образом траффик Youtube должен завернуться на этот интерфейс?

Андроид, если что, не рутованный.

Искал-искал что где надо настраивать, везде в интернетах какая-то жесть. Наконец нашел следующее:

https://androidow.com/program/internet/3084-byedpi-ubiraem-zamedlenija-youtub...

Там написано:

Откройте ByeDPI после установки и перейдите к настройкам. Поменяйте VPN на Proxy. Альтернатива нажмите на шестерёнку в правом верхнем углу, во вкладке General выберите Mode и нажмите Proxy.

Активизация ByeDPI

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

Проверка работы

Запустите YouTube на вашем Android TV или Google TV и оцените улучшение скорости воспроизведения видео. ByeDPI должен устранить все замедления и обеспечить плавный просмотр.


То есть, надо вместо режима VPN включить режим Proxy. Переключаю. Туннель пропадает. ByeDPI пишет что «Proxy is up 127.0.0.1:1080».

И дальше что делать?

Как траффик клиента YouTube завернуть на этот прокси?

UPD: Решение здесь: Настройки ByeDPI for Android для восстановления работы YouTube

 ,

Xintrea
()

Понимание других людей: что обозначает иконка?

Я давно уже перестал понимать людей из инторнета.

Вот, например, иконка на всем доступном сервисе:

https://ibb.co/WKDGVPg

Что она обозначает? Только я не понимаю?

UPD: Я даже дам подсказку: это как-то связано с иностранными языками.

 ,

Xintrea
()

Не могу правильно вставить рекламный блок Yandex 220x300 (коряво в Firefox)

Здравствуйте, уважаемые веб-мастера.

Не могу нормально вставить рекламный блок Yandex размером 220x300.

Вот как выглядит вставленный блок:
https://ibb.co/ykGKmBC

Сама страница здесь:
https://webhamster.ru/mytetrashare/index/mtb0/340

Код такой:

...
<td rowspan="2" style="background-color: #eae9e0; 
                       padding:0px; 
                       vertical-align: middle;" 
                       width="220px" 
                       height="300px">
 <div style="text-align: center;">
  <div style="display: inline-block;">

   <!-- Yandex.RTB R-A-259917-2 -->
   <div id="yandex_rtb_R-A-259917-2">
   ...

Как видно, этот блок отображается со странными полями сверху и снизу. При просмотре свойств элементов никаких отступов не установлено. Но рекламный блок, почему-то, обрезан сверху и снизу.

Проблема в старых и новых (102.12.0esr) Firefox.
В Chrome такая проблема не наблюдается.

Как нужно подправить свойства элементов, чтобы блок правильно выглядел?

 , ,

Xintrea
()

Что означает Default для Experimental QUIC protocol в браузере Chrome?

Ели в Chrome в строке адреса ввести команду:

chrome://flags/#enable-quic

То будет отображена страница настройки значения Experimental QUIC protocol:

Experimental QUIC protocol
Enable experimental QUIC protocol support. – Mac, Windows,
Linux, ChromeOS, Android, Fuchsia, Lacros

#enable-quic


Возможные варианты: Default, Enable, Disable.

Вопрос: как понять, что означает Default?

 ,

Xintrea
()

Загадки исходников NVIDIA

Имеется исходник:

https://github.com/NVIDIA/open-gpu-kernel-modules/blob/main/src/nvidia/genera...

И в нем не понятно, что это за конструкция в виде отдельного блока, завершаемого запятой «{...},» посреди других определений:

#if defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)
BINDATA_STORAGE_PVT kgspBinArchiveBooterLoadUcode_TU102_patch_meta_storage_pvt;
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DECL)

#if defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)
{
    12, // uncompressed data size (bytes)
    12, // compressed data size (bytes)
    kgspBinArchiveBooterLoadUcode_TU102_patch_meta_data, // compressed data pointer
    NV_FALSE, // is pData compressed?
    NV_TRUE, // contain information for file overriding?
    NV_FALSE, // is the data referenced during load? (Only valid when BINDATA_IS_MUTABLE is true)
},
#endif // defined(BINDATA_INCLUDE_STORAGE_PVT_DEFN)

#if defined(BINDATA_INCLUDE_DATA)
static BINDATA_CONST NvU8 kgspBinArchiveBooterLoadUcode_TU102_num_sigs_data[] = 
{
    0x01, 0x00, 0x00, 0x00,
};
#endif // defined(BINDATA_INCLUDE_DATA)

Эта конструкция «{...},» ничему не присваивается, то есть не участвует в инициализации, зачем она нужна? Встречается в этом файле несколько раз.

 , ,

Xintrea
()

Почему на bestfonts.pro для DejaVu Sans нет правильного начертания?

Оnкрываю страницу википедии:

https://ru.wikipedia.org/wiki/DejaVu

Внизу есть картинка, как должен выглядеть шрифт DejaVu Sans:

https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/DejaVuSans.svg/198p...

То есть это прямой шрифт обычной толщины без засечек.


Иду на сайт шрифтов, открываю страницу этого шрифта:

https://bestfonts.pro/font/dejavu-sans

И среди всех вариантов нет прямого шрифта обычной толщины без засечек.

Почему так, куда он делся?

 

Xintrea
()

Есть ли какая-то консольная утилита, способная сравнить два HTML-файла по степени похожести?

Есть два HTML-кода. В одном - статья на одном сайте, в другом - копия этой статьи на другом сайте, прошедшая некие html/xml преобразования. То есть, до и после текста статьи - все в коде разное (header/bottom), да и сам текст статьи на разных сайтах отформатирован разными тегами. И еще текст статьи тоже может немного отличаться.

Так вот, есть ли какая-то консольная утилита, которая покажет некую метрику, через которую можно (хотя бы с некоторой долей вероятности) понять, что эти два HTML-кода содержат одинаковую статью? Или что один HTML-код содержит часть статьи (достаточно крупную) с другой страницы?

Чтобы в утилите была какая-то реализация string kernels или там косинусного подобия или чего-то такого.

 , , ,

Xintrea
()

Не могу понять, что там с deprecated QFlags в Qt 5.15?

Пытался собрать старенький проект на Qt 5.15.

Он даже собирается и работает. Но при компиляции куча варнингов про всякие deprecated. Один из варнингов следующий.

Сам код:

class RecordInfoFieldsEditor : public QDialog
{
  RecordInfoFieldsEditor( QWidget * parent = nullptr, Qt::WindowFlags f = 0 ); 


Варнинг такой:
In file included from src/views/record/RecordInfoFieldsEditor.cpp:11:
src/views/record/RecordInfoFieldsEditor.h:22:75: warning: ‘constexpr QFlags<T>::QFlags(QFlags<T>::Zero) [with Enum = Qt::WindowType; QFlags<T>::Zero = int QFlags<Qt::WindowType>::Private::*]’ is deprecated: Use default constructor instead [-Wdeprecated-declarations]
   22 |   RecordInfoFieldsEditor( QWidget * parent = nullptr, Qt::WindowFlags f = 0 );
      |                                                                           ^  

В документации на конструктор QDialog ничего внятного про прекращение поддержки флагов не написано:

QDialog::QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

Constructs a dialog with parent parent.

A dialog is always a top-level widget, but if it has a parent, its default location is centered on top of the parent. It will also share the parent's taskbar entry.

The widget flags f are passed on to the QWidget constructor. If, for example, you don't want a What's This button in the title bar of the dialog, pass Qt::WindowTitleHint | Qt::WindowSystemMenuHint in f.

See also QWidget::setWindowFlags().



Да и для QWidget, от которого наследуется QDialog, тоже глухо:

QWidget::QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

Constructs a widget which is a child of parent, with widget flags set to f.

If parent is nullptr, the new widget becomes a window. If parent is another widget, this widget becomes a child window inside parent. The new widget is deleted when its parent is deleted.
The widget flags argument, f, is normally 0, but it can be set to customize the frame of a window (i.e. parent must be nullptr). To customize the frame, use a value composed from the bitwise OR of any of the window flags.

If you add a child widget to an already visible widget you must explicitly show the child to make it visible.

Note that the X11 version of Qt may not be able to deliver all combinations of style flags on all systems. This is because on X11, Qt can only ask the window manager, and the window manager can override the application's settings. On Windows, Qt can set whatever flags you want



Как исправить код, чтобы этого варнинга не было? Чего хочет Qt или компилятор? Что там с QFlags, их дальше в Qt не будет?

Достаточно ли просто убрать из прототипа и реализации параметр Qt::WindowFlags f и его установку по-умолчанию?

 , , ,

Xintrea
()

Работа с PHP DOM - как в XML заменить один тег на другой, сохраняя подчиненные элементы?

Имеется текст с XML-форматированием:

<div id="recordContent">
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</div>

Необходимо в нем заменить тег <div id=«recordContent»> на <body>, вот так:
<body>
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</body>

Для этого я написал следующий минимальный код:
<?php

$contents = <<<STR
<div id="recordContent">
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</div>
STR;

$htmlDom = new DOMDocument();
$htmlDom->loadHTML($contents);

// Поиск элемента с внутренними узлами
$element = $htmlDom->getElementById("recordContent");

if ($element) 
{
    // Создание нового элемента <body>
    $htmlBody = $htmlDom->createElement('body');

    // Копирование дочерних элементов из <div> в <body>
    foreach ($element->childNodes as $child) 
    {
        $htmlBody->appendChild($child);
    }

    // Замена элемента <div> верхнего уровня
    $element->parentNode->replaceChild($htmlBody, $element);

    // Получаем HTML-код внутри элемента
    $innerHtml = $htmlDom->saveXML();

    echo $innerHtml;
}    

?>

И этот PHP-код генерит вот такой текст:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><body>
    </body></body></html>

Вопрос: что не так, почему вместо замены одного головного элемента происходит не то что ожидается?

 , , ,

Xintrea
()

psycopg2 не имеет элемент sql?

Использую Astra Linux 1.6

Установлен пакет python3-psycopg2 версии 2.6.2-1.

Пишу минимальный код:

#!/usr/bin/python3

import sys
import enum

from psycopg2 import connect
from psycopg2 import sql

И при запуске вижу ошибку:
Traceback (most recent call last):
  File "./sample_import.py", line 7, in <module>
    from psycopg2 import sql
ImportError: cannot import name 'sql'

То есть, connect импортируется нормально, а sql - нет.

Это потому что кривая (старая) библиотека, как у этого товарища: https://github.com/OCA/openupgradelib/issues/193
Похоже, что SQL string composition появилось только в версии 2.7?

А как же тогда раньше генерировали безопасные запросы, которые имеют динамические имена объектов БД? (Имеется в виду именно динамические имена объектов БД а не представление данных, пишущихся в БД).

Получается, что все что написано здесь:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
и здесь:
https://www.psycopg.org/docs/sql.html
в моем случае неприменимо, т. к. система сертифицирована и замена пакетов не допускается.

Получается, что технотролли здесь:
psycopg2 генерирует неправильные команды для комментариев и схем
и здесь
psycopg2 не может работать со схемой «validate»
зря выплясывали, потому что я даже не могу увидеть то о чем идет речь, не говоря уже о том чтобы воспользоваться.

 , , ,

Xintrea
()

psycopg2 генерирует неправильные команды для комментариев и схем

Продолжаю пытаться использовать библиотеку psycopg2. Проблема подкралась откуда не ждали.

Итак, код написан в соответствии с документацией:

https://www.psycopg.org/docs/usage.html

В которой сказано, что psycopg2 в методе execute() сама делает подстановки в SQL-запрос из переданного кортежа, и делает это правильно. Однако, по факту оказалось, что это не так.

Следующие ошибки демонстрируют, что psycopg2 не понимает где пользовательские данные, а где обращение к объектам. Она просто все подстановки анализирует на переданный базовый Python-тип, и вставляет данные соответственно этому типу. Если это строка - то она будет заключена в одинарные кавычки. Если целое число - будет вставлено число без кавычек.

А что делать, если в кортеже передано имя объекта БД, значение которого не нужно заключать в кавычки? Об этом авторы документации ничего не говорят.

Поэтому, например при использовании комментариев к таблице или при работе со схемами возникают ошибки:

Команды:

cursor.execute( "COMMENT ON TABLE %s IS 'version=%s';", (tableName, tableVersion) )

cursor.execute("CREATE SCHEMA IF NOT EXISTS %s;", (dbSchema,) )


Ошибки:

File "./sample.py", line 205, in setTableVersion
    cursor.execute( "COMMENT ON TABLE %s IS 'version=%s';", (tableName, tableVersion) )
psycopg2.ProgrammingError: ОШИБКА: ошибка синтаксиса at or near "'devices'
LINE 1: COMMENT ON TABLE 'devices' IS 'version=12';
                         ^

File "./sample.py", line 89, in connect
    cursor.execute("CREATE SCHEMA IF NOT EXISTS %s;", (dbSchema,) )
psycopg2.ProgrammingError: ОШИБКА: ошибка синтаксиса at or near "'service'
LINE 1: CREATE SCHEMA IF NOT EXISTS 'service';
                                    ^

В этих командах значения devices и service не должны заключаться в кавычки. Но они заключаются, чем и ломают саму команду.

Вопрос: а как же правильно передавать значения в execute() ?

 , , , ,

Xintrea
()

RSS подписка на новые темы