Hatred's Log Place

DON'T PANIC!

Mar 24, 2025 - 3 minute read - Programming

C++: заметки на полях про ref-qualified методы

Самостоятельное осмысление навеянное https://t.me/grokaemcpp/627.

Не задумывался над сценариями использования, хотя они есть с C++11.

Раньше была возможность использовать квалификатор const:

struct Foo {
  void method();        // (1)
  void method() const;  // (2)
};

Тут вроде логично, когда какой метод будет вызван.

C++11 добавил возможность пометить метод квалификатором ссылочности: ref-qualified:

  • &
  • const&
  • &&
  • const&& - хотят это сценарий очень странный.

Первое, что нужно отметить, что если хотя бы один из них определён, то он кофликтует с (1) и (2). Т.е. у вас или ref-qualified или non-ref-qualified:

struct Foo {
#if 0
  void method();        // (1)
  void method() const;  // (2)
#else
  void method() &;        // (3)
  void method() const&;   // (4)
  void method() &&;       // (5)
  void method() const&&;  // (6)
#endif
};

Второе: что и когда вызывается (или - ниже обозначает, два случая, для сравнения: когда использует и когда не используется ref-квалификация ):

Foo foo;
foo.method();           // (а) вызовется или (1) или (3), либо ОШИБКА, если перегрузка не указана

const Foo const_foo;
const_foo.method()      // (б) вызовется или (2) или (4), либо ОШИБКА, если перегрузка не указана

Foo{}.method();         // (в) вызовется или (1) или (5), либо (4), если перегрузка не указана
(const Foo){}.method(); // (г) вызовется или (2) или (6), либо (4), если перегрузка не указана

Тут логика такая: есть имя - вызовется &, нет имени - вызовется &&. И стоит внимательно посмотреть кейсы (в) и (г) для “старого” поведения и нового, но когда перегрузка по && не указана.

Третье: перегрузки могут быть помечены delete: удалённые функции тоже используются в поиске перегрузок и, если наиболее подходящая перегрузка удалена - будет ошибка компиляции.

Ну и для чего может быть нужно: оптимизации и защита. К примеру, если мы вызвали && метод, то мы точно знаем, что мы - временный объект. поэтому, мы можем сделать не просто возврат чего-то, а сделать этому std::move(), пометить метод delete и запретить вызваться или вернуть копию, а не ссылку или указатель.

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

struct Bar {
    std::string _val;
#if 0
    std::string_view get() const { return _val; }    // (7)
#else
    std::string_view get() const& { return _val; }   // (8)
    std::string      get() &&     { return _val; }   // (9) - можно и std::move(_val), но зависит от
endif
};

Тут вместо std::string_view может быть const std::string&, но со string_view можно проще отловить ситуацию с доступом к уничтоженному объекту:

// как помощиник
Bar request() {
  return Bar{};
}
...
auto sv = request().get(); // (д)
some_function(sv);         // (е)

Здесь без ref-qualified методов в (д) будет вызван (7), что приведёт в (е) и дальше по коду к обращению к уничтоженному объекту Bar::_val.

При использовании перегрузок по ref-qualified, будет вызван (9) и мы вернём копию строки (или более оптимально, если через std::move(_val)).

Отсюда, имхо, основное применение: если возвращаем некий референс (ссылку, view/span) на внутреннюю структуру класса, то имеет смысл использовать указание ссылочных квалификаторов, причём обоих: & и && - второй будет уточнять поведение для временного объекта. Если уточнения по поведение не нужно, то использование ссылочных квалификаторов избыточно (но смотреть кейсы кейсы (в) и (г)) .

Mar 5, 2025 - 1 minute read - Linux

LocalSend: отправка файлов между устройсвами внутри LAN

На правах мемориза.

LocalSend ( официальный сайт) - удобный инструмент для обмена файлами между устройствами в локальной сети без подготовленной инфраструктуры. Что примечательно - open source.

Мне потребовалось что бы быстро перекидывать файлы между несколькими андроидами и ноутбуком на Linux. Для своих персональных устройств я использую давно KDE Connect, но привязывать “левые” устройства и потом каждый раз отвязывать - не добно. А вот LocalSend решает.

Для полноты картины, обсуждение на 4PDA:

На андроид можно поставить их Google Play, F-Droid и ручками APK. На Manjaro - есть в AUR.

Jan 24, 2025 - 1 minute read - Linux Programming

Туннелирование TCP в AnyDesk

Просто заметка по версиям.

В AnyDesk есть возможность туннелирования TCP. Да, вот прям как в SSH. Очень удобно для использования в “чужом” или неподготовленном окружении. Использовал, например, для удалённой отладки кода на устройствах очень сильно далеко от меня (вплоть до другого континента)

Доступна в бесплатной версии, но с нюансом:

  • до версии 6.2.1 включительно оно доступно из коробки
  • после, доступно только после регистрации аккаунта (?)

При этом версия 6.2.1 пока работает. FYI.

Ну и сразу. Есть RustDesk. Возможности форвардинга есть. Плюс можно свой сервер разворачивать. В реальных условиях пока не проверял.

Jan 21, 2025 - 1 minute read - Programming Linux

QtCreator Remote Linux Debug session does not start

Не стартует удалённая отладка. Причём без какого-то фидбека. Если включить логи: export QT_LOGGING_RULES='*=true;qt.*=false;qtc.*=true;qtc.clang*=true' и запустить сессию QtC, то при запуске отладки можно увидеть что-то вроде: qtc.utils.process: Process 162 starting (non blocking, main thread): --multi :10000 qtc.utils.process: Process 162 finished: result=3, ex=255, 0 bytes stdout: "", 0 bytes stderr: "", 0 ms elapsed Суть проблемы в том, что на удалённой стороне просто не установлен gdbserver. Соответственно нужно его установить и всё починится.

Nov 29, 2024 - 3 minute read - Electronic Programming

easyeda2kicad

Веб-сервисы вещь хорошая и удобная… Пока их не блокируют. Поэтому предпочитаю для своих домашний поделок использовать KiCAD. Естественно, что не всегда хватает какого-то символа, посадочного места или 3D вида компонента. При этом в той же EasyEDA есть куча оных уже в готовом виде. Если не вдаваться в подробности соответствия каким-то стандартам, то было бы неплохо, стащить оную и использовать у себя.

Первым тулом, которым я пользовался был (да и останется на всякий случай) - lc2kicad поставить, пока, можно из AUR:

yay -S lc2kicad

но репозиторий уже в архиве, а автор отписался, что проект всё.

И вот сегодня открыл для себя новый проект: easyeda2kicad.

И основная его фишка в том, что по указанному ID он может скачать сразу символ, посадочное место и 3D модель. Положить это в единое место к которому можно настроить пути и потом пользоваться централизованно.

Oct 29, 2024 - 2 minute read - Linux

Очень мелкая печать из Inkscape

Столкнулся с проблемой: при печати из Inkscape изображения получаются очень мелкими.

Гуглинг навёл на то, что это проблема с xdg-desktop-portal-kde. Парень из форма создал Bug Report в котором есть возможный WA. И там же есть отсылка на репорт в самом проекте Inkscape.

Если коротко: xdg-desktop-portal это некая сущность (или сучность?) которая позволяет приложениям на различных тулкитах более бесшовно интегрироваться в “неродные” окружения рабочего стола: Gtk в окружение KDE и Qt в окружения на базе Gtk (Gnome, Cinnamon, Mate & etc). Интеграция по большей части затрагивает только переиспользование стандартных системных диалогов, типа диалогов открытия файлов, сохранения, вывода окон предупреждений, диалогов печати (тут отдельный акцент). В общем, все те вещи, которые вроде более приятны глазу, но жить без них можно (“вам шашечки или ехать?”). Но и дополнительный слой абстракции, который сам по себе может нести баги.

Собственно проблема как раз и заключается в стыке разных сред при использовании диалога печати. Причём сначала поддержку Desktop Portal реализовали в Inkscape и сразу же это вызвало проблемы.

Ладно, теперь к сути. Мне ехать нужно. Решение в лоб это общесистемно заявить:

export GTK_USE_PORTAL=0

Собственно после чего все приложения Gtk в окружении KDE станут использовать Gtk диалоги. Как оказалось, если использовать в массе, так себе. К визуалу тоже быстро привыкаешь :)

Поэтому достаточно сделать следующее:

  1. Меню
  2. Находим Inkscape
  3. ПКМ → Изменить приложение…
  4. Вкладка Приложение
  5. В поле “Переменные окружения” вставляем GTK_USE_PORTAL=0
  6. OK

Теперь:

  1. если открыть Inkscape через меню или быстрый запуск, он запустится с этим значением
  2. если открыть SVG файл через Dolphin, то он тоже откроется с этим флагом

Если открывать через терминал ручками: inkscape file.svg, то имеет смысл завести alias с установкой переменной окружения в нужное значение. Если в скриптах (хммм), то указать явно в скрипте.

Oct 13, 2024 - 2 minute read - Туризм

Капитанский мостик по хребту

Когда ходили нонстоп после нефтебазы немного не туда сунулись по пути на Капитанский мостик, но возникло жаление по осени прогуляться тут с сыном, просто посмотреть, куда идут дороги. Сентябрь пришёл, время реализовывать планы. Что бы долго не тянуть выбрали 7 сентября.

map.webp

Oct 12, 2024 - 5 minute read - Туризм

Внезапный Лысый Дед

Внезапный поход на вершину, которую ещё не доводилось сходить. Сходили 17-18 августа, но руки написать дошли только сейчас.

map.webp

Sep 12, 2024 - 1 minute read - Programming Life

256

$ date +%j                    
256

С праздником всех причастных!

Sep 12, 2024 - 1 minute read - Linux

Команда timeout

Век живи, век учись, а дураком помрёшь.

Открыл для себя чудную утилиту timeout из состава coreutils.

Делает ровно то, что описывает её название: запускает команду, переданную как аргумент, на заданное время в секундах (s), минутах (m), часах (h) или днях (d):

timeout 10s ping ya.ru
sudo timeout 10s tcpdump -i wlan0 -Q in -A udp 

Обратите внимание: если команда должна быть выполнена под sudo, то sudo должно стоять перед timeout.

По истечении таймаута передаётся сигнал TERM в дочерний процесс. Если нужен другой, то укажите его через аргумент -s SIGNAL. Утилита дополнительно может послать сигнал KILL, если команда не отреагировала на сигнал TERM по истечении таймаута, указанного через параметр -k TIMEOUT. Прочие вкусности смотреть через --help, хотя их там, по большей части, и нет.