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

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


Command unknown: plugin_bookcreator_addtobook


// 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 валом запчастей и в пределы производительности я ещё не упирался.

// Thinkpad T530: клавиатура

Уже были стоны и жалобы от меня по поводу несколько убогой клавиатуры, точнее раскладки, точнее расположению PrtScr кнопки. Но… или жри кактус или исправляй. Я, обычно, выбираю второй вариант.

Если коротко, команда ниже забиндит PrtScr и сделает из неё Menu (aka Compose) клиавишу:

sudo setkeycodes b7 127

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

Эту команду помещаем в /etc/rc.local или в аналогичный.

Кому нужно подробностей и альтернативных вариантов - смотрим под катом.

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

Собственно все инструкции описаны в:

less /lib/udev/hwdb.d/60-keyboard.hwdb

Вот выдержки, которых достаточно для настройки:

#  - AT keyboard DMI data matches:
#      evdev:atkbd:dmi:bvn*:bvr*:bd*:svn<vendor>:pn<product>:pvr*
#    <vendor> and <product> are the firmware-provided strings
#    exported by the kernel DMI modalias.

Эта часть описывает шаблон выбора для AT клавиатур. Да, встроенная клавиатура в T530 это AT клавиатура. Привет NKRO из коробки :) Но об этом дальше.

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

# To update this file, create a new file
#   /etc/udev/hwdb.d/70-keyboard.hwdb
# and add your rules there. To load the new rules execute (as root):
#   udevadm hwdb --update
#   udevadm trigger /dev/input/eventXX
# where /dev/input/eventXX is the keyboard in question. If in
# doubt, simply use /dev/input/event* to reload all input rules.

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

...
[    2.282100] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input3
...

С вероятностью 147% оно всегда будет так. Запоминаем (особенно последнюю цифру):

/devices/platform/i8042/serio0/input/input3

Теперь определяем сканкод клавиши (подставляем цифру в конце, которую запомнили выше, т.е. input3event3):

sudo evtest /dev/input/event3

Получаем такой выхлоп:

...
Event: time 1487483975.506795, type 4 (EV_MSC), code 4 (MSC_SCAN), value b7
Event: time 1487483975.506795, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1487483975.506795, -------------- SYN_REPORT ------------

Смотрим строку с MSC_SCAN, значение сканкода поле value - b7 искомый сканкод.

Кстати, клавиша определяется как KEY_SYSRQ, но работает только как PrtScr. Для SysRq функциональностью ThinkPad T530: доступ к Break, Pause, Scroll Lock и SysReq.

Далее нам нужно имя клавиши (и код заодно), которые используются внтри ядра. Смотрим в

/usr/include/linux/input-event-codes.h

нужную клавишу. Имя для udev - нижним регистром имя макроопределения, без префикса KEY_. Для setkeycodes - dec значение.

Клавиша меню это:

#define KEY_COMPOSE             127

Имеем:

  1. Имя для udev: compose
  2. Код для setkeycodes: 127

Пишем правило для udev (/etc/udev/hwdb.d/70-thinkpath-t530-keyboard.hwdb):

70-thinkpath-t530-keyboard.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
  KEYBOARD_KEY_6b=compose                    # map PrtScr to Menu

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

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*T530*:pvr*
  KEYBOARD_KEY_6b=compose

Изменения примутся после перезагрузки, так как я не нашёл способ переприменить правила к встроенной клавиатуре. Реаттачатся все, кроме неё (по инструкции из 60-keyboard.hwdb).

Что бы применить сразу:

sudo setkeycodes b7 127

тут всё понятно: b7 - узнанный сканкод. 127 - числовое значение KEY_COMPOSE.

После этого, всё, что использует драйвер evdev, будет воспринимать кнопку PrtScr как Menu. Трюк с setkeycodes будет работать везде, где используется evdev. Стоит отметить, что сканкод платформо-специфичен. Под платформой понимается: AT PS/2, USB HID и т.п. Об этом планирую в другой статье рассказать.

Естественно после всех манипуляций выше вы лишаетесь кнопки Print Screen, но его функциональность в части снятия скриншотов это просто условность и можно настроить окружение так, что бы работала другая комбинация. А можно переназначить другую клавишу аналогичным способом. К примеру, F12. Лично я её использую очень редко. В терминале она вообще эмулируется Shift+F2 (для F11 - Shift+F1)

Полезные ссылки на тему:

  1. man 8 setkeycodes
  2. man 1 loadkeys - если хочется магии в консоли.

// Пидан: взгляд с другого ракурса или кольцо Ойры

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

Но вот новогодние каникулы закончились. Незаметно пролетела первая рабочая неделя и первые выходные. Желание куда-то выгрестись обрело форму рассылки писем с предложением сходить хоть куда-то хоть на сколько. В результате собралась компания: я, Коля, Кирилл. На один день решается сходить Спайдер (он же Лёха) с женой. Сам после перелома и для него выход — чисто проверить возможности. Он же предлагает забрасываться на его пепелаце. Обратно планируем выбираться уже на электричке.

Маршрут на 21-22 января, по итогу, получился таким:

// Qt Creator, CMake: отображение всех файлов в стоковом плагине

Немного в сторону от CMakeProjectManager2, в направлении стокового плагина.

Дискуссия на LOR навела на мысль. Ради спортивного интереса попробовал реализовать и… получилось! :)

За подробностями под кат.

// CMakeProjectManager2: теперь и с Server Mode

Вот и прошло почти два месяца с последних изменений.

Время было потрачено:

  1. для ожидания некоторой стабилизации апстрима, так как, по сути, они требовали писать абсолютно новый код для реализации текущего функционала, а в условиях сильных и фатальных изменений, переписывать свой код на каждый чих… у меня столько времени нет.
  2. была предпринята неудачная попытка продвинуть код в апстрим.
  3. ну и изучался новый код, когда выпадало время, плюс раздумья - как применить функциональность и для серверного режима работы CMake.

Так как код отвергли, а это, по сути, написанная с нуля реализация старого функционала, то он был взят за основу новых изменений. Ну как основу - 99%.

Есть и изменения. Малой кровью была создана обёртка поверх Server Mode Reader'а, которая предоставляет всего его внутренние профиты за исключением классического вида дерева файлов.

Соответственно изменения, сделанные для старого ридера (Tealeaf Reader), который используется для версий CMake младше 3.7, в части отображения всех файлов, добавления, удаления и переименования теперь применимы и для Server Mode Reader.

Сразу же был найден и первый баг: неправильно обрабатываются дефайны из CMAke (add_definition()). Патч уже отослан, у себя в коде изменений делать не буду, подожду, пока попадёт в апстрим, потом засинхронизируюсь.

Функциональность же передачи Toolchain файлов выла дропнута. Можно делать настройки через Kit или же вручную создать параметр CMAKE_TOOLCHAIN_FILE и задать нужный. Главное не забудьте сделать Build → Clear CMake Configuration после этого. Ну и будьте готовы, что парсер C++ вас перестанет понимать, как минимум, частично.

Пакеты для Ubuntu 14.04 и 16.04 и производных уже доступны через PPA. Не забываем внимательно читать описание репозитория.

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

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

Ну и с ошибками и предложениями: https://github.com/h4tr3d/cmakeprojectmanager2/issues

// ThinkPad T530: доступ к Break, Pause, Scroll Lock и SysReq

Начиная с Tx30 Lenovo дропнули старую клавиатуру на ноутбуках серии ThinkPad, что очень грустно, так как новая в части предоставляемой раскладки просто не выдерживает критики. Одно расположение клавиши Print Screen чего только стоит - ощущение, что клавиатура для ярых скриншотеров, не меньше. С другой стороны, расположение PgUp/PgUp значительно более удобнее, нежели на классике.

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

Клавиша Комбинация
Break Fn+B
SysRq Fn+S
Scroll Lock Fn+K
Pause Fn+P

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

Собственно вопрос, а чего бы эти значения не нанести на сами клавиши?

Ииии важное замечение, как работать с SysRq в Linux:

  1. Нажимаем Alt
  2. Нажимаем Fn
  3. Нажимаем S
  4. Отпускаем S
  5. Отпускаем Fn
  6. Нажимаем нужно командную клавишу (например S для синхронизации дисковых буферов, P - для распечатки регистров или C для паники :)
  7. Отпускаем нажатые клавиши в любом порядке или, не отпуская Alt, нажимаем следующую командную клавишу

ВАЖНО: простое нажатие Alt+Fn+S+буква ни к чему не приведут.

// CMakeProjectManager2 возвращается

В продолжение Qt Creator, CMake и судьба CMakeProjectManager2.

Ревью https://codereview.qt-project.org/#/c/180827/ расставило точки над i: "Project View == Build System View", билд система не может отображать все файлы проекта? Значит не будем показывать. Билд система не предоставляет возможности добавлять, переименовывать и удалять файлы в проекте? Значит не будем даже пытаться предоставить возможность это делать. Не удобно? Ничего, целостность концепции важнее.

Хотя… мне одному кажется, что абстракции тут текут? Ведь Project View сам по себе подразумевает именно проект?

Да, моё решение тоже не верх совершенства, даже так - костыль. Но он же реально помогает в условиях отсутствия более приличной альтернативы…

Ну и обоснование всего одно: «Я боюсь баг-репортов».

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

В любом случае, сейчас будет перезагрузка кода, потому как для новой кодовой базы, по сути, написан новый код. Сейчас буду думать, как наименьшей кровью в истории перенести новые изменения. Скорее всего придётся заревертить все прошлые мои изменений, привести master в состояние идентичное qtc-master, после чего просто сделать новый комит.

Ну а родной менеджер начнёт поддерживать данную функциональность, только кода CMake Server Mode сподобится на это. Удачи в ожидании :) Особенно при том условии, что конкуренты (KDevelop, Clion) это умеют делать.

// SSL на блоге

SSL Everywhere. С HTTP настроен редирект на HTTPS.

Сертификаты от Let's Encrypt, получение и обновление сертификатов через CertBot.

Работать будет с браузерами, которые умеют SNI, т.е. в пролёте древние Андроиды на 2.3.7, всякие IE6-IE8, HTTP клиенты в Java 6u45 и 7u25.

Первоначальный рейтинг C тюнился до A+ по следующим статьям:

Результат: https://www.ssllabs.com/ssltest/analyze.html?d=htrd.su&hideResults=on

Что пришлось менять и что поломалось:

  • Ссылки на банеры, в частности картинки пришлось утянуть себе, так как доступны только по HTTP
  • Воспользоваться миграционными тулами Disqus, что бы восстановить комментарии к статьям (URL Mapper, предварительно запросив текущий список и обработав его скриптом)
  • Счётчики G+ слетели. Как их чинить для новых страниц - хз.
  • Что ещё отвалилось. Иначе невозможно :)