Заметки

Categories: Компьютеры, Linux, Железо, Игры, Программирование

Про C++

Современный C++ всё-таки странная штука.
Как было в девяностые? Когда-то я выучил основу BASIC, прочитав книжку за вечер. Потом Pascal, прочитав книжку день-два. C и самые необходимые основные функции библиотеки - тоже за пару дней (спасибо отличной книжке от K & R). На C++ перешёл, осилив книжку "От C к C++" за пару подходов. Delphi - зная Pascal и C++, просто сразу начал писать и разбираться по ходу дела.
Вчера я с помощью сначала всех интернетов, а потом нескольких вопросов к ChatGPT 4 (она тоже с первого раза правильно не подсказала), два часа сначала ваял такой фрагмент, а потом разбирался, что тут написано и почему именно так. И эта конструкция функционально ничего не делает, она просто замедляет компиляцию приложения и позволяет избежать копипасты и сэкономить букв (возможно, меньше, чем она сама длиной). В общем, я на освоение малополезной фичи потратил столько времени, сколько раньше было нужно на половину языка. И я даже не напишу второй раз то же самое с первой попытки без шпаргалки.

template<typename Func, typename Obj, typename Arg, typename = void>
struct is_callable_with_arg : std::false_type {};
template<typename Func, typename Obj, typename Arg>
struct is_callable_with_arg<Func, Obj, Arg, std::void_t<decltype((std::declval<Obj>().*std::declval<Func>())(std::declval<Arg>()))>> : std::true_type {};
void call_impl(VAR_TYPE arg, std::true_type) { (clz_->*sig_)(arg); }
void call_impl(VAR_TYPE, std::false_type) { (clz_->*sig_)(); }
...
call_impl(var_, std::integral_constant<bool, is_callable_with_arg<MEMBER, CLASS, VAR>::value>{});

Устранение тормозов и 100% зажора CPU Linux/VMWare Player на Intel Core i7

Симптомы - с определённой периодичностью виртуальная машина съедает на несколько минут 100% от каждого выданного ей процессора (т.е. на 4 ядра - загрузка 400% и т.п.), при этом хост притормаживает, а виртуалка вообще неуправляема, т.к. даже движения мышки отрабатываются с огромной задержкой. В это время внутри виртуалки нет процессов, занимающих столько CPU. При этом, на хостах AMD такой проблемы нет. После долгих мучений, рабочий ответ, наконец, найден тут:

This actually is an IOMMU issue and the solution involves enabling it at the kernel command line. Enabling VT-d (the Intel IOMMU kernel driver) in the firmware isn't enough and tinkering with compaction_proactiveness and swappiness only constrain this behavior without addressing the underlying cause.
...
So, for GRUB, edit /etc/default/grub to add the above string to GRUB_CMDLINE_LINUX_DEFAULT, e.g.,

GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"

Save and close the file, then run:

# update-grub

Reboot to take effect.

https://unix.stackexchange.com/a/713470/415520

Ловим процессы, которые шарятся по винту (Linux)

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

iotop

Если ввод-вывод активный и идёт прямо сейчас, достаточно просто посмотреть на sudo iotop -o
Если ввод-вывод идёт небольшими порциями, то используем: sudo iotop -bktoqqq -d .5
Пояснение: -b - пакетный режим вывода, -k - килобайты, -t - показывать время, -o - показывать только потоки, которые занимаются вводом-выводом, -qqq - отключить заголовки, -d 0.5 - период обновления в секундах.
Поймав, какой процесс занимается работой с диском, можно посмотреть на его открытые файлы: lsof -p $PID (замените $PID на номер интересующего процесса).

fatrace

Это намного более удобный способ для отслеживания редких операций (программа есть в репозитории Убунты). Сразу печатает кто, в какой файл лазит и какой доступ (чтение или запись).
cd /mnt/каталог_куда_смонтирован_винт
sudo fatrace -c -t

P.S. Типичные злодеи - индексаторы файловой системы, их можно выпилить так: sudo apt remove locate mlocate plocate. См. askubuntu. Также постоянным желанием писать на диск страдает Yandex.Disk - демона синхронизации можно гасить, когда он не нужен.

Файлы webp с расширением jpg из ВК (Linux/bash)

ВК перешёл на фотографии в формате webp в мобильном клиенте, но когда вы их сохраняете в галерею он пишет их с разрешением jpg. В результате, некоторые программы работают с этими файлами неправильно. Вот этот небольшой скриптик позволяет рекурсивно пройти каталог с такими неправильно названными файлами и переименовать их правильно:

·· [Read more · Читать дальше] ·· »»»

Перенос корневой файловой системы на новый диск (Linux, Ubuntu)

Это не универсальная инструкция, просто шпаргалка для себя. Мог что-то упустить :)

  1. Форматируем новый винт. Записываем (копируем в текстовый редактор и т.п.) UUID будущего корневого раздела. Делаем этот раздел загрузочным (активным) (включаем флаг "boot").
  2. Монтируем его, например, в /mnt/tmp.
  3. Копируем файлы: cd /mnt/tmp && sudo cp -apxuR /* .
    Можно добавить -v для печати имён файлов в процессе работы, но это сильно замедляет копирование.
  4. Правим /mnt/tmp/fstab (заменяем UUID для "/" на новый).
  5. Правим /mnt/tmp/boot/grub/grub.cfg (заменяем UUID корневого диска на новый).
  6. Проецируем системные каталоги в /mnt/tmp, чтобы сделать chroot:
    sudo mount -o bind /dev/ /mnt/tmp/dev
    sudo mount -t proc none /mnt/tmp/proc
    sudo mount -t sysfs none /mnt/tmp/sys
  7. sudo chroot /mnt/tmp
  8. sudo grub-install /dev/sdXXXX (Имя устройства, а не раздела!) Примечание: на некоторых машинах grub-install может занять несколько минут, а то и полчаса. Прерывать его не нужно, дайте доработать.

После этого перезагружаемся, выбирая при необходимости новый диск в качестве стартового в BIOS. Если всё ОК, можно отключать или форматировать и переиспользовать старый диск.

Archives

                                                                                                                                                                                                                                                                   


© Sergey A. Galin, 1998-2021 sageshome.net/blog/