Инструменты пользователя

Инструменты сайта



// Почему разработчики драйверов для Linux могут ненавидеть дистрибутивы подобные CentOS?

Короткое исследование недавней проблемы.

Пока на моём корявом английском: Why may Linux driver developers hate distros like CentOS? (или кликаем кнопочку перевода)

// Делим длинную строку в консоли

Открыл для себя утилиту fold:

$ echo "Я помню чудное мгновенье, передо мной явилась ты, как мимолётное видение, как гений чистой красоты" | fold -s -w80
Я помню чудное мгновенье, передо мной 
явилась ты, как мимолётное видение, как 
гений чистой красоты

-s - делить по пробельным символам, -wXXX - ширина вывода. За подробностями в man 1 fold.

// QtC crashed in master

Давеча обновил QtC из транка и словил:

terminate called after throwing an instance of 'Sqlite::StatementHasError'
ConnectionServer error: "QLocalSocket: Remote closed" "/tmp/QtCreator-NVcPQb/ClangBackEnd-15319"

Аварийный останов (стек памяти сброшен на диск)

Ключевое: Sqlite::StatementHasError

Не стал глубоко разбираться, чуточку gdb и strace и просто удалил старую базу индексации clang-плагина:

rm $HOME/.config/QtProject/qtcreator/symbol-experimental-v1.db

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

// Хотели как лучше...

Это прекрасно:

png.c: In function ‘png_get_libpng_ver’:
png.c:700:17: warning: the comparison will always evaluate as ‘true’ for the address of ‘png_ptr’ will never be NULL [-Waddress]
    if (&png_ptr != NULL)  /* silence compiler warning about unused png_ptr */
                 ^

«Хочешь забыть эту боль?..» © Майор Пейн

// errno(1)

No comments…

$ sudo pacman -S moreutils
 
$ errno -l
errno -l
EPERM 1 Операция не позволена
ENOENT 2 Нет такого файла или каталога
ESRCH 3 Нет такого процесса
EINTR 4 Прерван системный вызов
 
$ errno EAGAIN
EAGAIN 11 Ресурс временно недоступен
 
$ errno 39
ENOTEMPTY 39 Каталог не пуст

По желанию добавляется env LANG=C.

На Ubuntu:

sudo apt install moreutils

// ThinkPad T530: делаем из кнопки Launch1 - SysRq

Он же Print Screen. От которого в неудобном месте мы уже избавились: Thinkpad T530: клавиатура

// Manjaro: ядро 4.16 и bluetooth мышка

После обновления и установки ядра 4.16 обнаружилась неприятная и странная вещь, проявляющаяся в том, что мышка временами подвисает.

// Totalphase Data Center на Manjaro

С недавнего времени сия софтина перестала запускаться с сетованием на следующуют проблему:

 error: unable to execute application

Что-то подсказывает, что дело в библиотеках: основные (как и само ядро в виде libruntime.so) лежат в каталоге /lib/ дистрибутива. Но что-то, судя по всему, пытается браться из системы и там оно перестало существовать, что не удивительно для быстроменяющихся дистрибутивов типа Arch, Manjaro или Solus.

// Падение Xorg после выхода из suspend

Замечено на ядрах 4.15. Проявляется не всегда.

В логах замечено следующее, накануне сего события:

Apr 13 21:56:33 localhost kernel: Restarting tasks ... done.
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_orphan_add:2819: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: PM: suspend exit
...
Apr 13 21:56:35 localhost kernel: WARNING: CPU: 2 PID: 688 at fs/buffer.c:1108 mark_buffer_dirty+0xe9/0x100
Apr 13 21:56:35 localhost kernel: Modules linked in: veth hid_generic uhid hid algif_hash algif_skcipher af_alg cmac rfcomm ccm ipt_MASQUERADE nf_nat_masquerade_ipv4 nf_conntrack_netlink nfnetlink xfrm_user xfrm_algo iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 xt_addrtype iptable_filter xt_conntrack nf_nat nf_conntrack libcrc32c crc32c_generic br_netfilter bridge stp llc overlay bnep btusb btrtl intel_rapl btbcm btintel x86_pkg_temp_thermal intel_powerclamp bluetooth ecdh_generic kvm_intel uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev kvm media tun irqbypass snd_hda_codec_realtek crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_codec_generic coretemp pcbc aesni_intel aes_x86_64 crypto_simd joydev glue_helper mousedev cryptd msr iTCO_wdt mei_wdt intel_cstate intel_uncore
Apr 13 21:56:35 localhost kernel:  arc4 iwldvm tpm_tis tpm_tis_core mac80211 tpm intel_rapl_perf iwlwifi iTCO_vendor_support wmi_bmof snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm e1000e cfg80211 mei_me psmouse i2c_i801 thinkpad_acpi shpchp snd_timer ptp mei lpc_ich pps_core nvram rfkill fuse battery input_leds snd ac rtc_cmos wmi soundcore evdev mac_hid vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) acpi_call(O) parport_pc ppdev lp parport sg crypto_user ip_tables x_tables ext4 crc16 mbcache jbd2 fscrypto sr_mod cdrom sd_mod serio_raw atkbd libps2 ahci sdhci_pci xhci_pci libahci ehci_pci sdhci xhci_hcd ehci_hcd libata crc32c_intel led_class scsi_mod mmc_core usbcore usb_common i8042 serio i915 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm intel_agp intel_gtt agpgart
Apr 13 21:56:35 localhost kernel: CPU: 2 PID: 688 Comm: jbd2/sda6-8 Tainted: G           O     4.15.14-1-MANJARO #1
Apr 13 21:56:35 localhost kernel: Hardware name: LENOVO 2392AQU/2392AQU, BIOS G4ETB0WW (2.70 ) 09/26/2017
Apr 13 21:56:35 localhost kernel: RIP: 0010:mark_buffer_dirty+0xe9/0x100
Apr 13 21:56:35 localhost kernel: RSP: 0018:ffffb4a18215bcd8 EFLAGS: 00010246
Apr 13 21:56:35 localhost kernel: RAX: 0000000000a20828 RBX: ffffa300bfd02750 RCX: ffffa2fea42ed8e8
Apr 13 21:56:35 localhost kernel: RDX: ffffa300bfd02750 RSI: ffffa2fea42edf00 RDI: ffffa300bfd02750
Apr 13 21:56:35 localhost kernel: RBP: ffffa300bfd02750 R08: 0000000000000000 R09: ffffa300ad083fc0
Apr 13 21:56:35 localhost kernel: R10: 0000000000000000 R11: 0000000000000228 R12: ffffa300bcdfd388
Apr 13 21:56:35 localhost kernel: R13: ffffa2fea42ed780 R14: ffffa300a9361e00 R15: ffffa300bfd02752
Apr 13 21:56:35 localhost kernel: FS:  0000000000000000(0000) GS:ffffa300de280000(0000) knlGS:0000000000000000
Apr 13 21:56:35 localhost kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Apr 13 21:56:35 localhost kernel: CR2: 00007f4688041160 CR3: 00000002de00a005 CR4: 00000000001606e0
Apr 13 21:56:35 localhost kernel: Call Trace:
Apr 13 21:56:35 localhost kernel:  __jbd2_journal_refile_buffer+0xa3/0xc0 [jbd2]
Apr 13 21:56:35 localhost kernel:  jbd2_journal_commit_transaction+0x128e/0x18b0 [jbd2]
Apr 13 21:56:35 localhost kernel:  ? sched_clock_cpu+0xe/0xd0
Apr 13 21:56:35 localhost kernel:  ? kjournald2+0xc0/0x270 [jbd2]
Apr 13 21:56:35 localhost kernel:  kjournald2+0xc0/0x270 [jbd2]
Apr 13 21:56:35 localhost kernel:  ? wait_woken+0x80/0x80
Apr 13 21:56:35 localhost kernel:  ? commit_timeout+0x10/0x10 [jbd2]
Apr 13 21:56:35 localhost kernel:  kthread+0x113/0x130
Apr 13 21:56:35 localhost kernel:  ? kthread_create_on_node+0x70/0x70
Apr 13 21:56:35 localhost kernel:  ret_from_fork+0x35/0x40
Apr 13 21:56:35 localhost kernel: Code: c0 48 89 c5 74 2c 48 89 c6 48 89 df 31 d2 e8 7f fd ff ff 48 89 df e8 07 77 fb ff 48 8b 7d 00 be 04 00 00 00 5b 5d e9 67 7d ff ff <0f> 0b e9 25 ff ff ff 48 89 df eb bb 90 66 2e 0f 1f 84 00 00 00 
Apr 13 21:56:35 localhost kernel: ---[ end trace c1b2e1f90bb5b2b0 ]---

Погуглив по строке __jbd2_journal_refile_buffer+0xa3/0xc0 [jbd2] обнаружил:

Рекомендуемый WA: установить параметр scan для модуля scsi_mod в значение sync.

Чревато: увеличение времени выхода из сна, примерно на секунду. Для меня не критично.

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

Если модуль вкомпилирован в ядро:

  • в параметры ядра нужно передать из загрузчика: scsi_mod.scan=sync
  • например, через grub (grub2):
    • редактируем /etc/default/grub
    • исправляем строку:
      GRUB_CMDLINE_LINUX_DEFAULT="... scsi_mod.scan=sync ..."
    • сохраняем и выполняем update-grub
    • перезагружаемся

Если модуль отдельно, то

  • создаём файл /etc/modprobe.d/scsi_mod.conf
  • в него помещаем:
    # WA:                                                                                                                                                                                         
    # - https://bugzilla.redhat.com/show_bug.cgi?id=1562982
    # - https://bugzilla.redhat.com/show_bug.cgi?id=1553979
    options scsi_mod scan=sync
  • и сразу на рабочей системе исправляем параметры налету:
    echo sync > /sys/module/scsi_mod/parameters/scan
    # или
    echo sync | sudo tee /sys/module/scsi_mod/parameters/scan

Перезагружаться не обязательно.

И ждём исправления в апстриме.

// Однострочник для изменения времени создания файла

Есть пачка файлов фотографий, сделанных телефоном вида:

2018-03-11 09-49-26.JPG
2018-03-15 19-34-06.MP4

В один прекрасный момент слетело время доступа к файлам. В самом имени файла эта информация и так зашита, так что используем однострочник:

ls | while read line; do echo -n "$line: "; dt=$(echo $line | sed 's|\..*$||' | sed 's|_.*$||'); echo $dt; time=$(echo $dt | sed 's|-| |g' | awk '{printf("%s%s%s%s%s.%s", $1, $2, $3, $4, $5, $6)}'); touch -t "$time" "$line"; done

// Проверка целостности AUR пакетов после обновления

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

// Внезапно про xf86-video-intel от Debian

Сылка:

Цитата:

Пакет: xserver-xorg-video-intel (2:2.99.917+git20171229-1 и другие)

Не рекомендуется использование данного драйвера с видеокартами, выпущенными позднее 2007 года: вместо этого удалите его, и графический сервер будет использовать встроенный драйвер установки режимов.

Не рекомендуется.

Замена: Xorg драйвер modesetting, встроенный драйвер, работающий со всеми KMS совместимыми драйверами в ядре.

По мотивам:

При этом мнения по поводу адекватности замены расходятся (на правах заметок по разным источникам из сети):

  • По данным тестов Phoronix, ускорение Glamor существенно проигрывает SNA от Intel в производительности и примерно сопоставимо с UXA в части 2D. При этом единогласно сходятся, что SNA до сих пор глючная и бажная, а путь современных графических библиотек в использование 3D:
  • Нашёл ровно одно утверждения без подтверждения фактами, что Glamor может выедать больше батарейки (кстати, этот режим ускорения можно включить и в драйвере Intel). Реальных сравнений у меня нет.
  • Стабильность и реальная скорость обоих драйверов (и трёх вариантов ускорения на драйвере Intel) разнится от железки к железке.
  • Исправлений для старых карт в драйвере Intel почти нет, хотя и рекомендуется к использованию как раз для старых карт.

Ссылки:

    • Тут хорошая табличка по поколениям графики и соответствующим архитектурам. Ivy Bridge, это HD4000 и Gen7. Debian рекомендует modesetting новее 2007 года, Gentoo говорит более конкретно (по ссылке выше): Gen 4+.

// Linux утилиты для стресс-тестирования системы

Будет пополняться. В контексте изучения проблемы:

CPU

GPU

Наблюдения

К слову сказать, пока никаких реакций на стресс система не даёт. Судя по всему проблемы в интегрированном видео от Intel и не способностью правильно ходить между стейтами энергопотребления (pstates). Т.е. возможно нужно генерировать переменную нагрузку на видеоподсистему, что бы добиться воспроизведения проблемы.

// PlantUML редакторы

В первую очередь для рабочего стола, не для WEB.

На текущий момент мне понравилось три решения, которые могут работать с отдельными файлами без создания проектов и так далее:

  • PlantUML QEditor
  • Расширение для Visual Studio Code - PlantUML
  • Плагин для NetBeans

В первом не хватает подсветки синтаксиса. Третий достаточно тяжеловат (всё же сам NetBeans сам по себе - IDE), так что второй вариант - пока мой выбор. Раньше Visual Studio Code не использовал, и сейчас он больше для редактирования PlatnUML с предпросмотром, но со своими задачами справляется достойно. Не хватает, правда, Assistant, как в PlantUML QEditor.

PS в IDEA есть достаточно удобный плагин, особенно если в рамках проекта нужно диаграммы думать. Мне же больше по душе запуск без IDE проекта, дабы не отвлекаться. PPS для WEB: www.plantuml.com/plantuml/form быстро сгенерить или посмотреть.

// FFmpeg: генерация синусоиды на N каналов

На два канала:

ffmpeg -f lavfi -i "sine=f=1000:sample_rate=48000" -filter_complex "[0][0]amerge" -c:a pcm_s24le -f alsa "hw:1,0"

для увеличения: добавляем [0] перед amerge

Можно генерировать и разные синусы по кадому каналу, просто увеличиваем число lavfi входов:

ffmpeg -f lavfi -i "sine=f=1000:sample_rate=48000" \
       -f lavfi -i "sine=f=400:sample_rate=48000" 
       --filter_complex "[0][1]amerge" \
       --c:a pcm_s24le -f alsa "hw:1,0"

и не забываем в этом случае менять номера входов для amerge

// PlantUML: временные диаграммы

Как-то пропустил сей момент, но в PlantUML появились Временные диаграммы (Timing Diagram):

Жаль, что когда они были ооооочень нужны (сейчас не так), удобного инструмента я не нашёл.

// USB 3.0, USB 3.1 Gen1 и USB 3.1 Gen2

Возникает путаница иногда что где и когда. Коротко:

  1. USB 3.0 == USB 3.1 Gen1 (SuperSpeed), скорость до 5 ГБит/с. По сути - ребрендинг и переименование.
  2. USB 3.1 == USB 3.1 Gen2 (SuperSpeed+), скорость до 10 ГБит/с.

По поводу коннектора Type-C: его появление связывают с появлением USB 3.1 Gen2. Но! Этим коннектором вполне может быть осуществлено подключение в устройствах, которые поддерживают только USB 3.1 Gen1, USB 2.x или даже USB 1.x (для 1.x и 2.x используются одинаковые дифпары независимые от режима 3.x). Иными словами, наличие Type-C коннектора не говорит о поддержки USB 3.1 Gen2, особенно, когда данный разъём используется на устройстве, а не на хосте, хотя в последнем случае тоже нужно проверять внимательно спеки на материнку или лаптоп.

По поводу коннектора Type-A: провода для USB 3.1 Gen2 никак не изменились, поэтому применение коннектора Type-A вполне себе возможно на хостах. Правда в текущем виде обычно наблюдается такая картина:

  1. чёрные коннекторы - USB 2.x
  2. синие коннекторы - USB 3.1 Gen1
  3. Type-C коннекторы - USB 3.1 Gen2

Но есть платы расширения, которые использую коннектор Type-A для USB 3.1. Gen2. Т.е. снова - нужно смотреть спецификации.

Вообще, появление Type-C это очень хорошая работа над ошибками для устранения идиотских варианта Micro Type-B (Micro-B, Mini-B выполнен вполне сносно) в варианте USB 3.1 Gen1: они отличаются большими габаритами и низкой механической прочностью: usb-connector-types.jpg

Правда установка данного типа коннектора на хост… Мне не по душе. Да, решаются две проблемы:

  1. симметричность кабеля с обеих сторон: можно подключать устройство как к хосту, так и к другому устройству, если поддерживается OTG и использовать для этого один кабель,
  2. симметричность самого коннектора как такового,

но вот его прочность (хоть маркетинговый булшит вещает иначе) значительно ниже Type-A.

Моё мнение (на которое всем, ессесно, пофиг):

  1. Type-A - оставить для хоста
  2. Type-B - оставить для устройств, где необходима повышенная механическая прочность
  3. Type-C - оставить для всех остальных устройств

// QMapShack: QMapTool

Сегодня пришло уведомление о комментарии к тикету 111:

In the meanwhile QMapShack has a new brother called QMapTool. QMapTool is for referencing maps. It's now part as a sub-repository of QMapShack.

И вот ссылка:

Если коротко: отдельная программа для привязки карт, то что было в QLandKarteGT в виде встроенного функционала, теперь в виде внешней утилиты.

Пока ещё не тестировал. В AUR mercurial версия QMapShack автоматом подтянет и QMapTool, когда будет релиз в Community - непонятно.

А так, ура!

// Соглашение о вызовах в ядре Linux (AMD64)

Просто ссылка:

Более полная подборка для x86:

И более обобщённая информация (в т.ч. ARM):

// QtC: снова Baremetal и новые GDB

В продолжение Qt Creator, Baremetal и связка GDB>=7.7.1+OpenOCD. Снова косяк и снова QtC не имеет прямого отношения к нему. Судя по всему, в самом GDB какие-то гонки.

Проблема проявляется на этот раз в том, что подобные сообщения от отсутствующем контексте исполнения появляются после попытки останова исполнения кода (для отладки), при этом, какого-то чёрта, появляются сообщения об вновь образовавшемся и тут же умершем треде. GDB не может уже потом ничего сделать, а QtC следом тоже сходит с ума, не зная, в каком состоянии что находится.

В общем, пока откатился на GDB 7.8 от Linaro: https://aur.archlinux.org/packages/arm-none-eabi-gdb-linaro, оно, по крайней мере, работает.

Связанные ссылки и обсуждения:

PS текущая связка: GDB 7.8 + OpenOCD 0.10.0

// KDE5: создание Samba-шар из Dolphin

И не только.

Для начала выполняем шаги, описанные в руководстве:

Если коротко и коспективно:

  1. Создаём директорию usershare: mkdir -p /var/lib/samba/usershare
  2. Создаём группу sambashare: groupadd sambashare
  3. Правим права доступа к директории:
    chown root:sambashare /var/lib/samba/usershare
    chmod 1770 /var/lib/samba/usershare
  4. Проверяем конфигурацию smb.conf:
    ...
    [global]
      usershare path = /var/lib/samba/usershare
      usershare max shares = 100
      usershare allow guests = yes
      usershare owner only = yes
      ...
  5. Разрешаем вашему пользователю создавать шары: usermod -a -G sambashare $USER
  6. Рестартуем демоны smbd и nmbd
  7. Перелогиниваемся в систему

Как минимум теперь вы сможете управлять пользовательскими шарами, используя командную строку:

net usershare help

Для использования этого функционала через Dolphin, потребуется поставить пакет kdenetwork-filesharing:

  pacman -S kdenetwork-filesharing

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

// KDE5, pulseaudio, индикатор громкости и qmmp

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

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

Судя по всему qmmp умудряется переопределить глобальный хук и полностью получает управление этими кнопками. До плазмоида попросту не доходят события. А так как подписка происходит при старте плазмоида, то и после выхода из qmmp обработка не возвращается на свои места.

Лечение простое:

  1. в настройках qmmp для плагина глобальных клавиш убрать реакцию на кнопки управления громкостью.
  2. открыть настройки трея и выключить и снова включить индикатор громкости.

PS подобное наблюдается и при использовании kmix. Более того, управления перехватывает последний запущенный механизм: или плазмоид или kmix. При закрытии одного из них, рекомендую перезагрузить оставшийся.

// KDE5: иконки в трее

На днях заметил, что часть приложений время от времени перестают рисовать свои иконки в трее. С одной стороны, xembed - deprecated, но, судя по всему, плазма как-то пытается его использовать и отображать иконки в трее для «устаревших» приложений. Но не всегда это получается (ниже чуть подробнее).

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

// Как проще проиграть звук с нескольких источников в ffplay?

Я делаю так:

ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 -c:v copy -c:a copy -f matroska - | ffplay -autoexit -f matroska -

matroska может запаковать RAW/YUV/RGB данные, поэтому она. MPEG-TS не может, поэтому не подходит.

Или не менее наркоманский вариант, используя только FFMPEG:

ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 -vcodec rawvideo -pix_fmt yuv420p -c:a copy -f sdl2 default -f alsa default

Конвертация в yuv420p нужна для SDL2.

// C++: операторы сравнения для структур

Памятка:

Т.е. используя std::tie() вполне, без труда и пыли, можно сделать операторы сравнения для сложных структур. Сложности могут возникнуть, если нужно переопределить операторы сравнения для отдельных элементов (например: критерии сравнения строк).

Почему tie, а не напрямую tuple? tie захватывает аргументы по ссылке - экономия на копировании.

// Совместное использование ALSA и PulseAudio

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

Что бы решить проблему нужна пара простых (по факту, но не по пути, которым к ним пришёл) шагов. Но для начала нужно посмотреть соответствующий раздел в вики Арчика: https://wiki.archlinux.org/index.php/PulseAudio#ALSA.2Fdmix_without_grabbing_hardware_device

Идея проста: сказать пульсе работать через dmix для воспроизведения и через dsnoop для записи.

// С днём программиста!

Собственно - сабж!

// Pacman: информация по пакетам, установленным как зависимости...

…и не нужные никакому пакету.

На случай, если что-то удалялось как pacman -R пакет вместо pacman -Rs пакет:
<ДЕЛ>

pacman -Qd | awk '{print $1}' | xargs -I{} bash -c 'cnt=$(LANG=C pacman -Qi {} | grep "Required By\|Optional For" | grep None | wc -l); (test $cnt -eq 2 && echo "{}")' | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

</ДЕЛ>

Спасибо Романычу, просто список пакетов:

pacman -Qtdq

и с описанием, как в уродстве выше (без запроса к Sync базе или AUR можно просто: pacman -Qtdqi):

pacman -Qtdq | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

pacaur используется, что бы запросить информацию для AUR пакетов.

Если какой-то пакет в этом списке уже нужен как самостоятельная единица, то можно снять пометку:

  pacman -S --asexplicit пакет

Теперь вопрос: а как проще?

ЗЫ пакеты, которые не требуются никаким другим пакетом можно получить просто выполнив pacman -Qt

// Bioshock 1, 2 Localization reverse

Вроде не делал анонс…

Серия старых скринкастов, описывающая процесс разбора формата файлов локализации игр Boishock 1 и 2, создания библиотеки для распаковки/паковки и графического кросс-платформенного архиватора.

Залито на ютуб, что бы не занимало место на диске. Плюс ценность сомнительная, что бы делать более правильный бекап ;-)

Ссыль: https://www.youtube.com/playlist?list=PLUrplWzJ_-EupzIVpgfRlarNjN0zcarpr

// Мемориз: зубчатый шпатель

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

Хорошая статья которая описывает нюансы:

// Qt Creator, Baremetal и связка GDB>=7.7.1+OpenOCD

Если коротко, то эта связка криво работает. Поймано на ARM GDB 8.0, но воспроизводится и на 7.12.1. При наличии на борту устройства какой-либо RTOS. У меня это ThreadX. Хотя, возможно, для других всё отработает нормально. Но это мало что меняет: на старом GDB 7.7.1 тот же OpenOCD работает.

Суть проблемы и способ её решения без вмешивания в код под катом.

// Проблема с зависанием при выходе из сна

Проблема на ядрах 4.12 и 4.13 в Manjaro. На ядре 4.11 проблема не наблюдается. Засыпание в память, не на диск.

Пока окончательного решения не найдено. Ниже ссылки, которые будут определять направление движения:

    • название говорит само за себя:
      • отказ от blk-mq
      • замена bfq-mq на bfq-sq
      • отказ от bfq в пользу deadline или cfq

После пары перезагрузок, включения bfq-mq на HDD вместо mq-deadline и установки не-DKMS версии virtualbox host, проблему не получается решить.

Для отладки использую следующую методику:

  1. логин на первой консоли и:
    while true; do dmesg | tail -n 30; sleep 1; done
  2. логин на второй консоли и:
    sudo tail -f /var/log/everything | grep -v 'Tor\['
  3. логин на третьей консоли, ничего не вводим, используем как дисплей, но SysRq командой повышаем уровень логирования до максимального: Alt+SysRq+9 (для T530: Alt+Fn[press]+S[press]+S[release]+Fn[release]+9)

После чего работает в обычном режиме.

Прочее полезное:

// Онлайн парсер для USB дескрипторов и запросов

Собственно полезно при отладке и разборе:

Запросов - подразумевается SETUP. Разбирает только стандартные запросы. Специфичные для интерфейсов, даже стандартных функций - нет.

Умеет:

  • разбор дескрипторов
  • разбор SETUP запросов
  • разбор HID дескрипторов (не проверял)

Чумовой особенностью этого парсера является:

The page uses Javascript, so it must be enabled. This page can be downloaded and used offline, because it does not depend on any external or online resources.

Так что…

// OpenRC и русский в консоли

Чисто декларативная заметка.

  1. Добавляем в загрузку сервисы:
    sudo rc-update add consolefont boot
    sudo rc-update add keymaps boot
  2. Для настройки шрифта правим /etc/conf.d/consolefont, устанавливаем параметр consolefont=, остальное не трогаем:
    consolefont="UniCyr_8x16"
    • Прочие варианты шрифтов можно посмотреть:
      ls /usr/share/kbd/consolefonts
    • Поиграться с установкой шрифта можно при помощи команды sudo setfont <FontName>.
  3. Для настройки раскладки и переключателя правим /etc/conf.d/keymaps, устанавливаем параметр keymap=, остальное - по желанию:
    keymap="ruwin_cplk-UTF-8"
    • Прочие варианты раскладки можно посмотреть:
      ls /usr/share/kbd/keymaps/i386/qwerty
    • Поиграться с установкой раскладки можно при помощи команды sudo loadkeys <KeymapName>

Опционально можно перезагрузиться или запустить сервисы вручную:

sudo service consolefont restart
sudo service keymaps restart

// Тюнинг перьевой ручки

Недавно случилась беда: грохнул о бетонный пол свою Platinum Balance F. Пером. Которое сломалось. Осталась такая же ручка с пером M, которая, вроде, всем хороша, но сильно большая подача у неё.

На момент покупки превалировало желание попробовать F перо этого производителя, так как перья F того же Pilot показались слишком уж тонкими и цепкими к бумаге, поэтому вариантов ответа на вопрос: «как уменьшить подачу чернил?» особо не искал. Плюс в голове упорно витала мысль, что таких способов нет.

Но когда не стало ручки, чьё письмо меня более чем устраивало, пришлось выводить из резерва M-ку. И вопрос уменьшения подачи чернил стал очень остро.

// AUR helpers и отладочные данные

Спека PKGBUILD позволяет сделать финт ушами и автоматически сгенерировать пакет с отладочной информацией, которую можно ставить, а можно и не ставить (занимает приличное количество места в распакованном виде).

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

Всё это становится очень интересным в контексте использования с AUR. Когда я ушёл с Arch Linux, разделённые (split) пакеты в нём были роскошью. Сейчас они поддерживаются. А вот как обстоят дела с помощниками (helpers, далее по тексту: хелперы), которые собирают и устанавливают в систему?

// [Memo] Manjaro OpenRC: персистентные сетевые настройки

Можно сделать при помощи Netifrc:

Три шага:

  1. правим /etc/conf.d/net, настраиваем свой интерфейс IFACE.
  2. для нужного сетевого интерфейса (IFACE) делаем симлинк:
    ln -s /etc/init.d/net.lo /etc/init.d/net.IFACE
  3. если нужно стартовать автоматом:
    rc-update add net.IFACE default
    • вручную:
      service net.IFACE start/stop/restart

// Manjaro OpenRC: обновление elogind ломает Network Manager после выхода из сна [FIXED]

Собственно вот такое обновление:

[2017-05-28 10:33] [ALPM] upgraded libelogind (228.3-1 -> 229.3-1)
[2017-05-28 10:34] [ALPM] upgraded elogind (227.2-1 -> 229.3-1)

Самый простой вариант: откатиться. Прочие смотрятся тут:

Прицепом:

UPD: Последнее обновление (2017-06-20) починило проблему:

  • elogind → 229.6-1
  • libelogind → 229.6-1

// Идея для BadUSB

Если создать USB-устройство, которое реализует интерфейс пера или тачскрина с абсолютными координатами, задать для осей X и Y значения:

  • min = 0
  • max = 65535

и сделать (эмуляция) хотя бы одно перемещение, то, как минимум, Windows 8, 8.1 и 10 реагируют BSOD и перезагрузкой. Linux работает нормально.

// Восточный Саян, Тункинские гольцы

Поход был в прошлом году, вот немного фото:

// Номенклатура жал T12

Собственно, официальнее некуда:

Размеры, рекомендации по типовому использованию и так далее.

// Корпуса SMD компонентов

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

Вот хорошая PDF которая может помочь разобраться:

Дополнительные ссылки:

  • https://en.wikipedia.org/wiki/Surface-mount_technology - тут есть про размеры корпусов в метрических и имперских единицах (становится понятно откуда берутся обозначения типа 1206, 0805), расшифровки аббревиатур (SMD/SMA/SMT/etc)
  • http://www.smd.ru/ - можно использовать как каталог, что бы сориентироваться
  • на Али можно поискать наборы для диодов, стабилитронов, транзисторов (китайских популярных)

// C++17 Features

Пока лучший, что я нашёл, обзор новых фич C++17 с примерами и информацией о поддержке в компиляторах:

А вот обзор от команды Яндекса, которая теперь представляет РГ21 C++ Россия:

Вот и другие авторы начинают подтягиваться, в том числе - официальные источники:

// C++: алгоритмы с бинарным предикатом и значением

Или век живи - век учись.

Проблема описана здесь: https://stdcpp.ru/proposals/1386b162-0cde-49b7-a41e-90f2d9ee477c.

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

// Obexd в пользовательской сессии без systemd

Пробуем включать TransferServices плагин в Blueman и получаем что-то вроде:

Ключевое:

org.freedesktop.DBus.Error.NameHasNoOwner: Could not get owner of name 'org.bluez.obex': no such name

Исправления два:

  1. добавить в атозагрузку при логине /usr/lib/bluetooth/obexd
  2. подсказать dbus автоматически спавнить его при обращении

Собственно Bluez предоставляет сервис-файл для второго варианта, только он рассчитан на работу с systemd, и поэтому Exec указывает в /bin/false.

Gentoo нам подсказывает:

что нужно вместо /bin/false указать полный путь до obexd, т.е. /usr/lib/bluetooth/obexd. После чего передача файлов волшебным образом заработает сама.

Файл для редактирования: /usr/share/dbus-1/services/org.bluez.obex.service

ЗЫ ссылка на заметку:

ЗЗЫ неприятно что такие сервис-файлы нельзя переопределить через /etc/dbus/service/. Или я не смог?

// CMake Imported Targets

Буквально сегодня открыл для себя Imported Targets. При использовании их для модулей поиска, очень упрощает и систематизирует код.

Для примера, если вам нужно подключить ZLIB к проекту, при классическом подходе пишется что-то вроде:

cmake_minimum_required (VERSION 3.1)
project(Foo)
 
find_package(ZLIB)
 
add_definitions(${ZLIB_DEFINITIONS})
include_directories(${ZLIB_INCLUDE_DIRS})
 
add_executable(foo_target 
               main.cpp)
target_link_libraries(foo_target ${ZLIB_LIBRARIES})

Какие проблемы в коде выше?

  1. Добавляется новая библиотека, нужно не забыть добавить переменные в три места:
    1. add_definitions()
    2. include_direcrories()
    3. target_link_libraries()
  2. Мы забыли ключевое слово REQUIRED в find_package() и узнаем, что у нас нет ZLIB или на компиляции или на линковке (так как других условий и проверок нет, предполагаю: данная библиотека необходима).
  3. Область действия add_definitions() и include_directories() - глобальная (на самом деле нет: все таргеты в текущем CMakeLists.txt во всех далее включённых, но не суть) и распространяется на все таргеты. Что не есть хорошо.

Возможно что-то ещё, чего я не заметил.

Последний пункт можно обойти уже написав более навороченный код:

cmake_minimum_required (VERSION 3.1)
project(Foo)
 
find_package(ZLIB)
 
add_executable(foo_target 
               main.cpp)
target_include_directories(foo_target ${ZLIB_INCLUDE_DIRS})
target_compile_definitions(foo_target ${ZLIB_DEFINITIONS})
target_link_libraries(foo_target ${ZLIB_LIBRARIES})

От проблемы глобальности ушли, но остальные две остались.

А вот, начиная с CMake 3.1 код выше можно переписать так:

cmake_minimum_required (VERSION 3.1)
project(Foo)
 
find_package(ZLIB)
 
add_executable(foo_target 
               main.cpp)
target_link_libraries(foo_target
                      ZLIB::ZLIB)

И теперь правильно подтянутся и параметры для компиляции, причём только для указанного таргета, и параметры линковки. А кода стало меньше. Более того, если библиотека не найдена, то цели ZLIB::ZLIB существовать не будет и вызов cmake завершится с ошибкой. А чем раньше ошибка вылазит - тем лучше.

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

if (ZLIB_FOUND AND NOT TARGET ZLIB::ZLIB)
  add_library(ZLIB::ZLIB UNKNOWN IMPORTED)
  set_target_properties(ZLIB::ZLIB PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIRS}"
        INTERFACE_COMPILE_OPTIONS "${ZLIB_DEFINITIONS}"
        INTERFACE_LINK_LIBRARIES "${ZLIB_LIBRARIES}")
endif()

Код для FindZLIB.cmake на самом деле несколько другой, но общую суть он отражает.

Соглашение для таких тергетов простое:

PkgName::PkgComponent

где PkgName соответствует имения пакета, которое передаётся в find_package() (или имя модуля без префикса Find и суффикса .cmake), а PkgComponent - внутренний компонент внутри модуля. Если такой компонент один, он соответствует PkgName. Примеры:

  • ZLIB::ZLIB
  • Threads::Threads
  • Qt::Widgets (см FindQt.cmake)

Кстати, вместо проверки:

if (ZLIB_FOUND)

Можно использовать:

if (TARGET ZLIB::ZLIB)

да, более многословно, но везде фигурирует только одно имя таргета.

Кроме того, эти таргеты можно использовать и совместно с target_include_directories() и target_compile_definitions().

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

ЗЫ ЕМНИП то такой синтаксис можно было использовать и до 3.1, с 3.1 оно появилось в некоторых модулях, которые поставляются с самим CMake.

// linux-tools для mainline ядер в Ubuntu

Иногда приходится использовать mainline не из основных репозиториев, а отсюда:

Причин тому может быть несколько. Начиная от желания быть на острие атаки, и заканчивая тем, что на новых ядрах решена проблема характерная для вашего железа или другого окружения. У меня, к примеру, только с 4.10 перестал уходить в тотальный перегрев процессор при использовании Turbo Boost.

Беда этих ядер, что нет полезных пакетов linux-tools, которые требуются таким приложениям как `perf` и `turbostat`. И их нужно собрать самому, причём так, что бы они соответствовали версии ядра. Рассмотрим как это сделать, на примере 4.10.

// iBus и Qt Creator

Когда в следующий раз в Qt Creator по Ctrl+Shift+U вместо поиска использования символа появится диалог iBus для ввода Unicode кода символа, вспомнить про im-config и запустить его без параметров, после чего снести использование ibus. Если только он вам не жизненно необходим. Мне - нет.

// Thinkpad T530: совмещённый порт наушников и микрофона

Модель имеет совмещённый порт для подключения наушников с микрофоном (TRRS). Ниже посмотрим, что делать когда нет такой гарнитуры.

// Линейка Thinkpad становится всё более унылой

Походу Lonovo только «кирпичиный» дизайн не трогает. А всё остальное делает всё более казуальным. Судя по:

Итак:

  • Расплодили серию. Хрен пойми чем отличаются W/T/L, а ещё, типа недобуки: X/Carbon X1/etc
  • Уход легендарного T61 и переход к линеке Txyz (первые представители T400/T500), ознаменовалось ознаменовался завершением эры 4:3 экранов на ноутбуках. Теперь и здесь засилье wide-screen 16:9. Для видео удобно. Для работы - не очень. Даже интернеты: половина сайтов оставляет уйму места по бокам. Возможно широкий экран удобен для людей работающих с таблицами с огромным числом столбцов… Не знаю. Точно, что не спрос порождает предложение, а маркетоидный бред навязывает моду. Главное накормить непотребством, но так, что бы это вызвало «ВАУ!»
  • К серии x30 (T430, T530, etc) линейка лишилась своей классической узнаваемой клавиатуры в угоду модной-молодёжной чиклектной (она же островная). Да фиг с ним, но раскладка вызывает недоумение: привет PrtScr (хоть и поборолся), при этом PgUp/PgDown стали в более удобных позициях /хотя теми же средствами что и PrnScr их можно забиндить на нужное поведение/), ряд Fx клавиш без разделения на группы.
  • В серии x40 трекпоинт лишился своих кнопок. Волна негодования была, судя по всему, такой, что в x50 их вернули. Без дублирования кнопок снизу под тачпадом (но сенсорные остались).
  • Серия x30 последняя где используется ThinkLight. Оставили только подсветку клавиатуры. Кому как, а для меня это было одной из причин выбора Thinkpad. Особенно удобно, когда рядом блокнот в котором нужно сделать пометки по ходу работы.
  • Серия x40 так же ознаменовалась ликвидацией защелки. Мне она кажется удобной. Некоторым - рудиментом… Пока маленький сын не попытается открыть :)
  • Снова клавиатура. С линейки 540 (да, касается только 15.6« модели) они вкорячили полноразмерную клавиатуру. Тем самым нарушив центровку основного поля ввода относительно экрана, ровно как и расположение тачпада. Кому так жизненно необходим цифровой блок на ноутбучной клавиатуре??? У меня на обычной он покрывается пылью, а тут просто растрата места.
  • А вот динамики при этом решили заменить на полное непотребство. Да и 530 они не ахти, но фоном послушать можно. Точно не скажу, но с какой-то модели динамик а) монофонический и б) направлен вниз, в стол! Они что, решили стол или другую рабочую поверхность использовать как резонатор? Сабвуфер?

На фоне этого выглядит забавно это (тут свежее обсуждение):

Смотрится как эдакая попытка срубить бабла с того, что уже было, но было успешно слито. Если вообще будет сделано. А если сделано, то качественно. Воистину:

- Как сделать человеку хорошо?
- Нужно должно делать плохо, а потом просто перестать.

Походу, остаётся только Dell Latitude, со своими тараканами и нечеловеческими ценами. Радует только то, что на мою текущую модель T530 валом запчастей и в пределы производительности я ещё не упирался.