LINUX.ORG.RU

Сообщения KivApple

 

Анимация загрузки «как в Windows»

Форум — General

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

Имеется Arch Linux с systemd-boot и plymouth, установленный в UEFI режиме. Так вот, обнаружил в возможных настройках systemd-boot с недавних пор опцию «console-mode keep». С ней получается следующее поведение: при запуске дисплейного менеджера (SDDM в моём случае) анимация plymouth исчезает и на секунду появляется логотип от UEFI и уже на его фоне появляется указатель мыши, а затем всё это сменяется запустившимся SDDM. То есть получается, что systemd-boot сохранил экран от UEFI при запуске ядра, а ядро умудрилось не затереть его содержимое и даже подсунуть дисплейному менеджеру в качестве начального содержимого экрана.

Иксы стартуют на tty1. Если переключиться на tty2, то также можно успеть заметить логотип UEFI, пока systemd не запустит getty и он не очистит консоль. При переключении на остальные консоли данный эффект уже не повторяется (возможно, getty запускается слишком быстро).

Раз пошло такое дело, то хочется заставить plymouth рисовать анимацию поверх логотипа UEFI, как это делает офтопик. Техническая возможность со стороны ядра точно есть, иначе бы этот логотип не мерцал при старте SDDM. Нужно как-то создать прозрачную тему plymouth или что-то вроде этого.

Кстати, если убрать опцию splash из параметров ядра, то логотип UEFI не появляется ни разу за всё время загрузки. Если переключиться в текстовую консоль с помощью Esc при работе plymouth, то там будут обычные информационные строчки на чёрном фоне.

 , ,

KivApple
()

Переписать SQL-запрос

Форум — Development

Для одного запроса требуется иметь временную таблицу с числами из некоторого промежутка (чисел не больше нескольких десятков). Я могу это сделать через WITH:

WITH days AS (SELECT :startDay AS d UNION ALL SELECT d + 1 FROM days WHERE d + 1 < :stopDay) 
SELECT ... FROM days, ...

Вроде всё работает, но есть одна проблема - этот запрос находится внутри Android-приложения и использует встроенный SQLite. И на старых версиях Android конструкция WITH почему-то не работает. Нужно как-то переписать без использования конструкции WITH.

Если что, я могу сгенерировать последовательность чисел в коде приложения и передать в запрос уже её). Подставится в виде:

5, 6, 7, 8, 9, ...

Но надо как-то из этого сделать in-memory таблицу из одной колонки, существующую только 1 SELECT.

В тред приглашаются SQL-гуру.

UPD: Если сделать запрос типа:

select * from (VALUES (1), (2), (3)) AS t;

То мы получим временную таблицу с 3 строчками и одним полем. Но есть одна проблема - Android Room может делать (1, 2, 3), но не (1), (2), (3). То есть вместо строк получаются столбцы.

 , ,

KivApple
()

Заставить работать Avahi

Форум — Linux-hardware

Подключил к домашней сети принтер со встроенным Wi-Fi (Epson WF-2750). Столкнулся с проблемой, что смог настроить принтер только указав фиксированный IP, но не по Avahi-имени принтера (EPSON90BD7F.local), хотя автоматически CUPS пытался именно так (пришлось ручками прописывать IPP адрес с явным указанием IP). Мне это кажется некрасивым (либо надо прописывать на роутере статический IP принтеру, либо он рано или поздно принтер пробудет отключенным слишком долго и в следующий раз ему дадут другой IP), тем более что принтер умеет в протокол Avahi.

Принтер видится через avahi-browse, но простейший пинг выдаёт, что хост не найден (пингуется только по IP). А хочу, чтобы нормально ресолвил имя.

Подправил nsswitch.conf, теперь там напротив hosts такая строчка (я просто дописал mdns4_minimal [NOTFOUND=return] перед resolve, всё остальное там уже было):

hosts: files mymachines myhostname mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns

Однако это не помогло.

Если что systemd-сервисы avahi-daemon и avahi-dnsconfd запущены.

Что ещё можно сделать?

 ,

KivApple
()

Скопировать подключение NetworkManager

Форум — Admin

Собираю систему с помощью buildroot. Внутри будет NetworkManager. Нужно предустановить создание точки доступа Wi-Fi.

Скопировал с аналогичной системы файлик (точнее сделал пакет buildroot, который кладёт соответствующий файл по пути /etc/NetworkManager/system-connections) и удалил строчку mac-address (ведь Wi-Fi адаптер может отличаться, также пробовал ставить вместо MAC звёздочку):

[connection]
id=WirelessConnection
uuid=01220444-5692-4b6c-9001-4e959b25a200
type=wifi
autoconnect=true
permissions=

[wifi]
mac-address-blacklist=
mode=ap
ssid=OrangePI

[wifi-security]
group=ccmp;
key-mgmt=wpa-psk
pairwise=ccmp;
proto=rsn;
psk=00000000

[ipv4]
dns-search=
method=shared

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=ignore

Не работает. То есть nmcli connection show не показывает это подключение, nmcli connection up WirelessConnection сообщает, что не знает такое подключение. Но файлик точно лежит - проверял cat'ом из-под запущенной системы.

 

KivApple
()

Сборка buildroot для Orange Pi PC

Форум — Development

Хочу собрать buildroot для Orange Pi PC. Скачал версию RC1 (сначала пробовал LTS-версию с абсолютно тем же результатом).

Распаковываю, выполняю:

$ make orangepi_pc_defconfig
$ make

Оно собирается какое-то время, а потом выдаёт ошибку:

freadahead.c: In function 'freadahead':
freadahead.c:92:3: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
  #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
   ^~~~~
make[4]: *** [Makefile:1915: freadahead.o] Error 1
make[4]: *** Waiting for unfinished jobs....
fseeko.c: In function 'rpl_fseeko':
fseeko.c:110:4: error: #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
   #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
    ^~~~~
make[4]: *** [Makefile:1915: fseeko.o] Error 1

Хост-система: Arch Linux.

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

 ,

KivApple
()

Передача видео по сети с низкой задержкой

Форум — Development

Имеется вебкамера, одноплатник orange pi (сначала был raspberry pi, но один аппаратный USB на всё приводит к куче проблем) и wifi-свисток. Требуется передавать видео 640х480 30fps на смартфон под управлением ОС Android. Важный момент - минимальная задержка (не больше 200 миллисекунд), пока это физически возможно (потом можно терять кадры). Со стороны одноплатника может быть как стандартное ПО (какой-нибудь ffmpeg), так и самописное, со стороны Android самописное (передача видео не единственная функция), но, конечно же, можно использовать библиотеки.

В какую сторону копать?

Пока сделал свой велосипед - захватываю кадры с камеры с помощью V4L2, жму с помощью libjpeg-turbo, разбиваю на части по несколько сотен байт, шлю по UDP (при этом шлю куски JPEG по мере их появления по мере сжатия). С другого конца принимаю пакеты, собираю JPEG (в каждом пакете передаётся его порядковый номер, полный размер JPEG и смещение - каждый кадр собирается в независимом буфере, как только собирается целый кадр, он отображается, а все несобранные кадры с меньшим порядковым номером отбрасываются и в будущем игнорируются), распаковываю и вывожу через OpenGL.

Между одноплатником и ноутбуком работает отлично и задержка низкая. А вот между одноплатником и смартфоном работает очень нестабильно. Изредка бывает 30fps, но обычно чуть ли не половина кадров теряется. Пробовал как подключать одноплатник и смартфон к готовой точке доступа (и даже подключать одноплатник к точке доступа по кабелю), так и делать точку доступа из одноплатника. Смартфон спокойно играет через Интернет Full HD YouTube, так что ресурсов у него и сети хватает (конечно, YouTube пожат лучше, чем JPEG, но сильно большее разрешение компенсирует и битрейт должен быть не меньше).

Почему JPEG? Потому что я наученный горьким опытом сжатия видео на одноплатников - это единственный известный мне «кодек», который приемлемо грузит ARM-одноплатники. На всё остальное просто не хватает ресурсов на сжатие.

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

Я не прошу готового решения, только направление.

 , , ,

KivApple
()

Plasma и монтирование устройств

Форум — Desktop

Поставил на чистый Arch Linux плазму. Всё хорошо, но ни соответствующий плазмоид, ни Dolphin не показывают и не монтируют флешки. Пользователь добавлен в группу wheel:

$ id
uid=1000(kiv) gid=985(users) группы=985(users),3(sys),50(games),987(uucp),998(wheel)

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

UPD: Обнаружилось, что с другими флешками проблем нет (они отображаются и монтируются). А особенность этой была в том, что единственный раздел на ней имел тип EFI System. KDE посчитал, что такие разделы надо скрывать по дефолту.

 , ,

KivApple
()

Двустронняя связь приложений

Форум — General

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

ls | grep foo | less

А можно ли как-то средствами шелла связать два процесса двунаправленно? Чтобы stdout первого уходил на stdin второго, а stdout второго уходил на stdin первого.

 ,

KivApple
()

Android и геймпад

Форум — Development

Имеется смартфон на Android и Bluetooth геймпад с 4 аналоговыми осями (2 стика) и 2 цифровыми (кнопки вверх-вниз-вправо-влево, «крестовина») + ещё кнопки.

Я считываю кнопки с помощью переопределения dispatchKeyEvent и оси с помощью dispatchGenericMotionEvent у Activity. И у меня 2 проблемы:

1) Мне удалось считать только 2 аналоговых оси из 4 с помощью ev.getAxisValue(MotionEvent.AXIS_X) и ev.getAxisValue(MotionEvent.AXIS_Y). Я не могу разобраться, как считать ещё две оси, хотя ОС их точно чувствует - движения второго стика тоже вызывают dispatchGenericMotionEvent.

2) Движения первого стика эмулирует «крестовину». То есть я получаю события о нажатии кнопок вверх-вниз-вправо-влево и при их реальном нажатии, и при движении первого стика. А я так не хочу. Я хочу иметь возможность различать эти события. Как?

 ,

KivApple
()

Ищу одноплатник

Форум — Linux-hardware

Требования:

1) Хотя бы один USB-порт. Но такой, чтобы он был полноценным и к нему не было подключена куча устройств через хаб (как у малины через один USB заведён Wi-Fi, Ehternet и ещё 4 порта через хаб). К этому порту будет подключена одна специфическая железка, которая требует высокую пропускную способность и практически не работает, если через этот же порт идёт активный обмен с другими устройствами (например, Wi-Fi).

2) Wi-Fi. Можно без него, но тогда +1 USB порт, удовлетворяющий пункту 1 (то есть Wi-Fi и специфическая железа должны быть подключены к физически разным портам).

3) Хотя бы один UART. Можно без него, но тогда +1 USB порт, удовлетворяющий пункту 1. Возможно, нормально будет совместить USB-UART и Wi-Fi через хаб, ибо поток по UART идёт достаточно слабый.

4) Очень приветствуется поддержка mainline kernel, потому что чем новее ядро, тем допиленнее там драйвера на железку из пункта 1. При этом поддержка всего кроме вышеперечисленного не интересует (то есть неработающий звук, графика, GPIO кроме UART - не волнуют).

5) Производительность. Тут могу только относительные цифры предоставить. Cubieboard2 (Allwinner A20) немного не дотягивает по производительности до нужной. Raspberry Pi 3 имеет запас по производительности раза в 2 (но там огромные проблемы из-за того, что его упоротые разработчики подключили почти всю периферию через один USB порт).

6) Доступность в РФ (AliExpress не подойдёт, потому что в будущем этот проект будет тиражировать фирма-заказчик проекта и ей нужно будет делать закупки с чеками, договорами и т. д.). Цена не более 5к. В экстренном случае можно подумать о 7-8к.

Что может посоветовать ЛОР? Подойдут не только ARM-одноплатники, но и компьютеры-стики на x86. Лишь бы удовлетворяло вышеуказанным условиям.

 

KivApple
()

Передача данных по сети с низкой задержкой

Форум — Development

Допустим, необходимо передавать поток данных примерно на 700 кбайт/сек по Wi-Fi между двумя устройствами (условия более-менее благоприятные в виде отсутствия обилия сетей вокруг и использования не самых китайских Wi-Fi модулей). При этом допускается иногда терять часть данных, зато первоочередным моментом является низкая задержка (менее 100 мс).

Как следует подходить к данной задаче? Вероятно, использовать UDP. А какой размер пакета? Ограничиться безопасными с точки зрения MTU 1200 байтами? Или передавать больше, забив на фрагментацию? Может быть есть какие-то особые настройки ядра (передающая система полностью под моим контролем, принимающая нет) и конкретных сокетов для уменьшения задержки?

Я кое-что сделал и у меня получилась задержка 150-200 мс в сети (то есть от первого send до последнего recv). Хочу её уменьшить и мне интересно в какую сторону копать.

 ,

KivApple
()

Где Gnome Shell хранит свои внутренние JS?

Форум — Desktop

Не знаю, проявляется ли это у всех или только у меня, но в какой-то момент Gnome Shell начинает сильно тормозить и спамит в логи ошибкой в модуле tweener.js. Я загуглил полный текст ошибки и обнаружил, что она уже давно известна.

Более того, есть два Pull Request вроде как исправляющие её:

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/4

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/11

Второй PR является предельно простым (тупо меняет 2 строчки в одном скрипте местами) и по комментариям решает мою проблему, но его закрыли в пользу первого, поскольку первый теоретически должен решать больше проблем, а не только один частный случай. Только вот с тем более сложным патчем они уже больше 5 месяцев не могут договориться, что с ним делать «а вдруг он вызовет другие регрессии» и т. д.

То есть простой патч они не приняли, потому что «есть патч лучше», а «патч лучше» они не приняли, потому что у них никак не дойдут руки в нём разобраться. А пользователи как обычно страдают, да. Раз у них нет сил/времени/желания разбираться сейчас со сложным патчем, могли бы принять простой, с учётом того, что какого-то явного быдло-кода он не содержит, а потом бы уже разбираться со сложным. Но нет, у них же интерпрайз, так нельзя ни в коем случае!

В общем, мне лениво пересобирать gnome-shell. Не могу ли я найти в уже установленном в системе заветный файлик и пропатчить его ручками? JS по идее не должен компилироваться, так что должен лежать на ФС в исходном виде. Да, мне придётся вносить изменения после каждого обновления пакета, но я это автоматизирую скриптом, так что меня вполне это устраивает. Главное чтобы работало.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/11/diffs

Куда попадает при установке файл js/ui/tweener.js?

 ,

KivApple
()

Plymouth висит в фоне и жрёт CPU

Форум — Desktop

Arch Linux. Gnome 3. GDM. Plymouth.

После входа в систему в top видно процесс:

@usr/bin/plymouthd --mode=boot --pid-file=/run/plymouth/pid --attach-to-session

Который жрёт стабильно 2% CPU. Это не так много, но не даёт уснуть процессору при бездействии и влияет на энергопотребление.

Если не следовать арчевики и не включать сервис gdm-plymouth вместо gdm, то процесс висеть не остаётся. Однако тогда gdm категорически не хочет стартовать в wayland-режиме (и не только сам не стартует, но и запустить основной сеанс в этом режиме не даёт), а при старте самого gdm происходит смена видеорежима (при запуске через gdm-plymouth такого не происходит и происходит плавный переход от анимации загрузки к gdm).

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

 , ,

KivApple
()

Linux и Bluetooth-мышь

Форум — Linux-hardware

Имеется трекбол Logitech MX Ergo. Хочется завести его в режиме Bluetooth, чтобы не занимать порт ноутбука ресивером. Он вполне нормально заводится, но через какое-то время начинаются лаги - курсор двигается дёрганно, либо может вообще не двигаться какое-то время после долгого неиспользования. Bluetooth-адаптер:

Bus 001 Device 002: ID 0a5c:6412 Broadcom Corp.

Что я уже сделал?

1) Включил в /etc/default/tlp USB_BLACKLIST_BTUSB=1 (отключение usb auto-suspend для Bluetooth-адаптеров).

2) Создал файл /etc/bluetooth/input.conf следующего содержания:

# Configuration file for the input service
# This section contains options which are not specific to any
# particular interface
[General]

# Set idle timeout (in minutes) before the connection will
# be disconnect (defaults to 0 for no timeout)
IdleTimeout=0

#Enable HID protocol handling in userspace input profile
#Defaults to false(hidp handled in hidp kernel module)
UserspaceHID=true

После данных манипуляций Bluetooth стал работать стабильнее (до этого мог вообще уснуть и не проснуться до перезагрузки), но проблемы сохранились.

На другом ноутбуке с Windows всё отлично работает, даже после долго бездействия нет ни малейшего лага при начале движения. Так что проблема именно в настройках/драйверах.

Ах да, если что проблема не зависит от того, работает ли ноутбук от батареи или от сети.

 ,

KivApple
()

Особая разметка диска

Форум — Linux-install

Вопрос на грани между офтопиком и онтопиком. Хочу запилить себе загрузочную флешку с Linux. Проблема в том, что помимо этого хочется таскать на ней файлы между самыми разными машинами, включая Windows. Соответственно, на ней будет два раздела - один в FAT для таскания файликов и один в ext4 с корнем Linux.

Офтопик, разумеется, ext4 не поддерживает и поэтому при обнаружении предлагает форматировать. Конечно же, это окошко можно закрыть, но раздражает + эту флешку могут втыкать в свои компьютеры другие люди и кто-нибудь да решит нажать дефолтный выбранный вариант с печальными для меня последствиями.

Задача: оформить таблицу разделов таким образом, чтобы Linux видел 2 раздела, а Windows только один. Устраивает вариант с намеренным внесением ошибок в таблицу разделов, чтобы вызвать двоякую интерпретацию её содержимого разными ОС.

Раньше было проще - офтопик не видел никакие разделы кроме первого на съёмных носителях, но в последних версиях этот старинный баг пофиксили. Нужны новые решения.

 , ,

KivApple
()

Сохранение/загрузка вещественных чисел в файл

Форум — Development

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

С целыми числами всё понятно - используем типы фиксированной разрядности (типа int32_t), также при сохранении переводим к фиксированному порядку байт (либо всегда в little-endian, либо всегда в big-endian) как это делает htonl и аналоги. По идее этого должно быть достаточно.

А что насчёт float/double? Насколько их внутреннее представление может отличаться между платформами, поддерживающими стандарт Си? Как можно максимально эффективно преобразовать их в единую форму для сохранения и обратно? (может быть есть какие-то стандартные функции или хотя бы хорошие библиотеки, либо вовсе достаточно 2-3 строчек без всяких библиотек).

 

KivApple
()

О трекболах

Форум — Linux-hardware

У меня сломалась мышь и теперь надо покупать новую. И тут я такой подумал «а не попробовать ли что-нибудь новенькое».

Что думает о трекболах lor?

Если что для меня не проблема попривыкать какое-то время, главное чтобы в итоге было нормально.

Стоит ли пробовать (реквестируются истории успеха и истории неуспеха, мнения теоретиков не очень интересны)? Насколько важно крутится ли шар большим пальцем или указательным? Просто приглянулся Logitech MX ergo, а там шар крутится большим пальцем, а некоторые пишут это не Ъ.

Ну и да, кончено же выбранный трекбол должен хорошо работать под linux.

 ,

KivApple
()

Рейтинг в игре - персональные данные?

Форум — Development

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

Как к этому относится российское законодательство о персональных данных? А европейское? Например, GPDR требует возможность экспорта ПД по запросу пользователя. Должен ли я давать юзеру возможность экспорта его сохранённых баллов?

Нужна ли мне политика конфиденциальности (кстати, приложение будет выложено на Google Play)?

 

KivApple
()

Хранение локализованных данных в базе данных

Форум — Web-development

Рассмотрим игрушечный пример. Допустим, я разрабатываю онлайн-магазин автомобилей (нет). У каждой марки машины есть название, мощность двигателя и описание. При этом название и мощность двигателя интернациональны, а описание должно быть разное для разных языков. И мне надо всё это сохранить в SQL базу данных (скажем, MySQL).

Я придумал такую конструкцию:

Таблица автомобилей:
    id (число)
    name (строка)
    power (число)
    description_id (число)

Таблица переводов:
    id (число)
    lang_code (строка)
    text (строка)

Соответственно, чтобы получить локализованное описание автомобиля, мы можем сделать запрос к таблице переводов, где id будет равен description_id, а lang_code будет равен нужному языку.

Особенности моей схемы: 1 таблица на все локализованные данные вообще. Можно добавить в таблицу автомобилей колонку localized_name_id, которая будет ссылаться на ту же таблицу переводов (но другую запись). Удалять автомобили тоже легко - нужно просто удалить все записи из таблицы переводов с соответствующим id. Также таблица переводов будет использоваться не только для таблицы автомобилей, но и, скажем, для таблицы кофеварок (у которых могут быть совсем другие наборы локализованных полей).

Таблица переводов, разумеется, имеет составной первичный ключ - id и lang_code (причём сначала идёт id).

А теперь два вопроса:

1) Насколько адекватно такое решение?

2) Как это уложить на ORM SQLAlchemy и Python? Если нет, то, возможно, ORM для других языков умеют такое (например, JPA в Java)? Или я хочу совсем странного?

UPD: Небольшая иллюстрация моего решения:

class Translation(db.Model):
	id = db.Column(db.Integer, primary_key=True)
	code = db.Column(db.String(2), primary_key=True)
	text = db.Column(db.Text, nullable=False)


class Car(db.Model):
	id = db.Column(db.String(64), primary_key=True)
	name_id = db.Column(db.Integer)
	name = db.relationship('Translation', primaryjoin=name_id == Translation.id, cascade='all, delete-orphan')
	description_id = db.Column(db.Integer)
	description = db.relationship('Translation', primaryjoin=description_id == Translation.id, cascade='all, delete-orphan')
	power = db.Column(db.Integer)

С загрузкой, обновлением и удалением переводов проблем быть не должно, но вот с добавлением новых непонятно что будет.

 , , ,

KivApple
()

Простейшая авторизация

Форум — Web-development

Допустим, я хочу сделать небольшое веб приложение, которым буду пользоваться только я, но которое будет торчать в глобальную сеть (чтобы я мог им воспользоваться из любого места). Так что какой то сложной системы прав доступа не требуется (один юзер с максимальными правами, гостям нельзя ничего).

Можно ли забить на авторизацию в самом приложении и просто включить авторизацию типа http basic auth в nginx, который будет выступать в роли реверс прокси для приложения? Разумеется, https настроен тоже будет.

Насколько такой вариант безопасен? Или это не Ъ и надо обязательно городить свою систему авторизации в самом приложении?

 ,

KivApple
()

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