• Как исправить ошибку с OpenCV и C++?

    Nipheris
    @Nipheris Куратор тега C++
    set(CMAKE_CXX_STANDARD 17)
    Это нужно ставить ДО создания таргета, т.к. установка этой переменной выставляет дефолт для НОВЫХ таргетов.

    А ещё лучше выставить проперти CXX_STANDARD с помощью set_target_properties.
    Ответ написан
  • Как настроить CMake на установку пакетов?

    Nipheris
    @Nipheris Куратор тега C++
    Какой пакетный менеджер лучше взять?

    Conan или vcpkg, чё тут думать. Рекомендую Conan, но vcpkg тоже уже созревшее решение, сейчас они оба захватывают рынок.
    Или "взрослое" решение пишется без пакетного менеджера?

    А вы пилите библиотеку или законченное приложение? Опишите подробнее что у вас за программное средство. Требования сильно разные. Например:
    • если это C++ библиотека - то я бы выбрал один из пакетных менеджеров и подготовил бы библиотеку для работы с ним. Например в случае Conan это значит написать conan-рецепт (который conanfile.py), который и будет "точкой входа" в вашу библиотеку: с помощью рецепта Conan узнаёт, как собирать библиотеку, какие у неё зависимости, как упаковывать в бинарный пакет, какие архитектуры и ОС поддерживаются и ещё кучу полезной информации, которую без ПМ обычно описывают ручками в README
    • если это сетевой-сервис, например HTTP-бэкенд для чего-либо - ну тут стандартом индустрии является Docker/OCI-образ. Собираете образ под нужные комбинации архитектуры и ОС (см. multiplatform builds), заливаете в registry, и любой желающий запустит контейнер из вашего образа в своей инфраструктуре, или использует ваш образ как базовый для сборки своего
    • если это десктопное приложение, неважно GUI или CLI - ну тогда обычно ожидается инсталляционный пакет под поддерживаемую ОС. Для Линуха это deb/rpm/flatpak/snap, для Венды - msix или exe, для Мака - dmg. Далее либо выкладываете для скачивания где-то на сайте, либо публикуетесь в магазинах типа Microsoft Store или Snapcraft


    Опишите точнее ваш случай, я лучше посоветую что вам взять.
    Ответ написан
    3 комментария
  • Насколько хороша такая политика обновления библиотеки?

    Постепенно я дополняю её патчами.

    Непонятно какую схему вы планируете для разных unstable-версий. major.new_minor.patch-unstable.1, major.new_minor.patch-unstable.2. Кстати, рекомендую выбрать какой-то более привычный prerelease-идентификатор вместо unstable, например alpha и beta.

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

    Тут кстати встаёт вопрос, а так ли вам нужны предрелизы для ПАТЧ-версий библиотеки? Выглядит как чрезмерно детальное версионирование. Обычно когда публикуется патч-апдейт, и в нём обнаруживается баг, то просто выпускается новая версия с фиксом и со следующим patch-числом (т.е. была 2.5.2, потом вышла 2.5.3 с багом, для фикса которого выпустили 2.5.4).

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

    Собственно предрелизы на то и меньше релизов при операциях сравнения, что для этого и придуманы. Т.е. например:
    1.2.5 < 1.3.0-alpha.1 < 1.3.0-alpha.2 < 1.3.0-beta.1 < 1.3.0

    Чтобы пользоваться предрелизами правильно и потом не кусать локти из-за неудачно выбранной схемы, почитайте внимательно правила сравнения в спеке semver для предрелизов и подсмотрите в популярные пакеты как кто делает. Лично мы используем схему c alpha/beta плюс через точку номер предрелизного билда.

    Схема именования предрелизов должна быть устроена так, чтобы решать задачу "приближения" к релизной версии. Если обычные 3.5.7 нужно читать как "3-я версия API + 5-й набор фичей для этого API + 7-я версия патчей для этого набора фичей", то 4.0.0-beta.6 нужно читать как «вроде бы уже почти 4.0.0, но ещё непонятно сколько ещё косяков надо перепрыгнуть, чтобы добраться до 4.0.0. На глаз вроде бы уже немного осталось (beta), но это уже 6-я бета, а до неё ещё несколько альф было, поглядим сколько ещё багов нам заведут»
    Ответ написан
    2 комментария
  • Какая архитектура и технологии для разделения GPU терминальным пользователям?

    что проссто так виртуальные прослойки не дадут использовать бытовую карточку или карточка должна поддерживать архитектуру GPU Passthrough

    Не совсем верно. Бытовые карточки часто можно использовать, если драйвера для операционной системы внутри гостевой ВМ поддерживают это, сейчас нвидия вроде бы без ограничений разрешает проброс карточки в гостевую виртуалку (раньшедрайвера отслеживали это и отказывались запускаться, гуглите знаменитый Code 43). Некоторые бытовые карточки настраивать геморно, нужно пробрасывать ROM видяхи на гипервизоре. Нужно искать информацию по конкретным моделям каротчек. У AMD проблемы с тем, что драйвера в гостевой ОС некорректно обрабатывают перезагрузку ВМ, для этого умные люди даже написали костыль vendor-reset для некоторых моделей карточек.

    Но бытовые карточки конечно получится пробросить только целиком. Если вы хотите купить одну карточку и пробрасывать в несколько гостевых ВМ, вам нужна карта с поддержкой спеки SR-IOV, например у AMD эта спека реализована в виде технологии MxGPU. Поддерживается она в некоторых прошных карточках, например в некоторых картах из серии FirePro, стоят они соответствующих денег. У нвидии это вроде называется Multi-instance GPU, подробно не исследовал этот вопрос. Не, у нвидии технология так и называется vGPU, а MIG это один из способ реализации "распила" карточки на несколько виртуальных устройств, наряду с time sliced. Вот кстати инструкция по настройке vGPU на Proxmox VE, протестирована на карточке RTX A5000, близко к вашей. Рекомендую ознакомиться.

    Я пользуюсь проброшенной целиком бытовой карточкой от AMD.

    P.S. Материнка конечно тоже должна поддерживать SR-IOV, это встречается в серверных и workstation-платах.
    Ответ написан
    Комментировать
  • Как чистить папку AppData/Local/Packages?

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

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

    Вам нужно взять какую-нибудь тулу для сканирования иерархии файлов на занимаемый объём (TreeSize, WinDirState), найти какие подпапки весят много, определить каким приложениям они принадлежат (это можно сделать по названию папки), а затем удалить данные приложения через Settings > Apps > Installed Apps > НАЗВАНИЕ_ПРИЛОЖЕНИЯ > Advanced Options (в трёхточечном меню) > секция Reset. Это удалить данные только конкретного приложения, остальные не затронет. Систему тоже повредить не должно.
    Ответ написан
    Комментировать
  • Можно ли использовать ОС, созданную в hyper-v, как основную?

    Задался недавно вопросом: можно ли создать виртуальную машину в hyper-v, пробросить в неё свою видеокарту и использовать данную гостевую ОС как основную (то есть работать/играть на данной системе)?

    Да, можно, эта фича Hyper-V называется Discrete Device Assignment.
    И какая Windows понадобится для этого (имеется ввиду, можно ли использовать Win 10 или нужна Win server)?

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

    В данный момент - да, понадобится второй адаптер, т.к. устройство пробрасывается целиком. В Windows Server 2025 появится GPU partitioning, но пока хз с какими видяхами и материнками это будет работать.

    Да, кстати, насчёт оборудования. Всё это замечательно, но вам на вашей материнке скорее всего понадобится поддержка SR-IOV, ну и соответственно IOMMU на матери и процессоре.

    Во-вторых, далеко не все видяхи официально поддерживаются технологией DDA, обычно для этого тестируются только pro-шные линейки карт. Может оно будет работать и с вашей картой. Драйвера карт потребительского сегмента могут блокировать запуск карты, проброшенной в виртуальную машину, или просто работать некорректно (блокируют запуск, т.к. не поддерживают сценарий проброса). Например, сейчас для работы ряда AMD-шных карт с пробросом в ВМ нужен костыль vendor-reset (это линуксовый модуль ядра, для Hyper-V не годится). И NVidia относительно недавно начала поддерживать проброс линейки GeForce в виртуалку (и то непонятно, как там с Hyper-V DDA).

    Я сам использую подобный сетап и пишу прямо сейчас с него, но у меня в качестве гипервизора KVM (использую дистр Proxmox), и материнка ASRock Rack ROMED8-2T, где есть вышеуказанные плюшки (кстати, в качестве адаптера для хоста прокатывает встроенный в мать ASPEED AST2500, поэтому полноценная карточка у меня только одна). В гостевую виртуалку с Windows 11 проброшена карточка Radeon RX 5500 XT, с учётом вышеупомянутого костыля в целом работает. Есть некоторая нестабильность, плюс иногда приходится вместе с виртуалкой перезагружать весь хост. Но это следствие того, что AMD не поддерживает для этих карт работу в пробросе (хотя и не блокирует искусственно), с нвидией возможно было бы получше.

    Ищите информацию по ключевым словам VFIO и PCI passthrough, на Реддите есть неплохое коммюнити. И да, готовьтесь копать много информации и перепроверять её (например мой ответ тоже стоит перепроверить, всё довольно быстро меняется) и покупать оборудование сильно дороже потребительского (если у вас его ещё нет). По Hyper-V DDA информации тоже не так много, советую рассмотреть дистры с KVM, если вам не так принципиально.
    Ответ написан
    1 комментарий
  • Как использовать Command в привязке WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Ну, если прям на чистом WPF, без всякого упрощающего жизнь обвеса типа ReactiveUI, то как-то так.

    Код вьюмодельки.
    internal class MainViewModel
    {
    	private sealed class PlayCmd(MainViewModel mainViewModel) : ICommand
    	{
    		/// <summary>
    		/// Можно ли вызвать команду? Влияет на доступность привязанных к команде контролов, например кнопки
    		/// </summary>
    		public bool CanExecute(object? parameter) =>
    			// команду Play можно вызвать только если мы ещё не начали проигрывание
    			!mainViewModel.isPlaying;
    
    		/// <summary>
    		/// Ивент, нужный чтобы уведомить об изменении значения свойства CanExecute
    		/// </summary>
    		public event EventHandler? CanExecuteChanged;
    
    		public void Execute(object? parameter)
    		{
    			// вызываем метод у вьюмодели
    			mainViewModel.Play();
    			// дёргаем событие, чтобы сообщить всем, кто привязался к команде,
    			// что её статус "можно исполнить" изменился
    			// если этого не сделать, то кнопка НЕ задизаблится (хотя CanExecute уже возвращает false)
    			this.OnCanExecuteChanged();
    		}
    
    		private void OnCanExecuteChanged() =>
    			this.CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    	}
    
    	private readonly PlayCmd playCommand;
    	private bool isPlaying = false;
    
    	public MainViewModel()
    	{
    		this.playCommand = new(this);
    	}
    
    	public ICommand PlayCommand => this.playCommand;
    
    	public void Play()
    	{
    		//Player.Play();
    		this.isPlaying = true;
    	}
    }

    Код вьюхи.
    <Window x:Class="Miramax.MainWindow"
    		xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    		xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    		xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    		xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    		xmlns:local="clr-namespace:Miramax"
    		mc:Ignorable="d"
    		Title="MainWindow" Height="450" Width="800">
    	<Window.DataContext>
    		<local:MainViewModel />
    	</Window.DataContext>
    	<Grid>
    		<Button Command="{Binding PlayCommand}">Click</Button>
    	</Grid>
    </Window>
    Ответ написан
    1 комментарий
  • Какие есть инструменты для написания интерфейса для терминала?

    C++

    Rust

    Это из того, что у меня в закладках. Так-то ищите по тэгу TUI (text user interface, в оппозицию к GUI) - и будет вам счастье.
    Ответ написан
    Комментировать
  • Что вызывает ошибку NodeJS - MODULE_NOT_FOUND?

    А что вы имеете в виду под "скачал на другом компьютере модуль SerialPort"? Что именно вы скачали? .tar.gz-шник с npmjs.org? Если да, причём тут zip? Если нет - то непонятно на что вы рассчитываете, если тот репозиторий - это мультипакетная репа, так в папке packages лежит сразу несколько подпапок, каждая из которых релизится как самостоятельный NPM-пакет. Ну и воркспейс настроен в корневом package.json.

    Корневой package.json в репе явно не предназначен для того, чтобы всю репу подключать как один пакет, не знаю с чего вы взяли что это будет работать. Там ни main/import нету ни prebuild-скрипта.

    Мне кажется вам проще не в исходниках перенести, а скачать готовые пакеты с npmjs.org и поставить именно их. А ещё проще - принести готовый node_modules на оффлайн-машину, чтобы не долбаться с каждой зависимостью (а их будет очень много).

    А чтобы не мучаться с node_modules, раз уж у вас такие требования по оффлайну - сбандлите приложение в один js-ник на своей машине и потом несите его уже на тестовую оффлайновую. Ваша проблема сейчас в том, что вы пытаетесь разрабатывать на оффлайн-машине, может вам это и ни к чему (я не знаю, просто предполагаю).
    Ответ написан
    Комментировать
  • Задача выдачи файлов конфигураций и файлов секретов по Интернету - а есть ли готовые решения?

    Ну например:

    Гуглите "remote configuration" и "feature flags", обычно это идёт комплектом. Может применяться как к клиентским приложениям (десктоп, мобилка), так и к приложениям на стороне сервера (то, что как раз вам нужно).
    Ответ написан
    Комментировать
  • Как написать динамическую библиотеку на C++ при помощи CMake в среде QTCreator, которую потом можно будет импортировать в проекты на Python?

    Nipheris
    @Nipheris Куратор тега C++
    Попробуйте использовать pybind11. Если что, эта библиотека есть в ConanCenter. Вот репозиторий-пример для CMake.
    Ответ написан
    Комментировать
  • Контринтуитивный синтаксис объявления нескольких переменных одного типа?

    По делу уже ответили, приведу лишь интересную цитату от Денниса Ритчи:

    I'm still uncertain about the language declaration syntax, where in declarations, syntax is used that mimics the use of the variables being declared. It is one of the things that draws strong criticism, but it has a certain logic to it.

    Ссылка на интервью
    Ответ написан
    Комментировать
  • Как узнать параметры с которыми скомпилирована или собрана dll на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Очень похожий стек в этой issue (которая была создана по мотивам этой), предлагаю отслеживать её.
    Ответ написан
  • Как узнать хеш мержа в котором смержены изменения?

    git checkout R2
    git blame --first-parent <имя-файла>
    Ответ написан
    Комментировать
  • Какой самый простой способ организовать SSO?

    Для начала советую посмотреть OpenID Connect, до полного просветления. Для экспериментов (а может и для прода, смотря какие у вас требования) можно взять Keycloak в качестве сервера аутентификации.
    Когда разберётесь с этим, и соберёте готовую лабораторную, поймёте что нужно изменить именно под вас.
    Ответ написан
    Комментировать
  • Почему python возвращает существующий объект, вместо создания нового?

    В вашем примере выражение set() вычисляется один раз, а уже затем вызывается fromkeys. Это не имеет никакого отношения к set, так работают функции почти во всех языках программирования - сначала вычисляются значения аргументов, а потом с этими значениями вызывается функция. Итого, у вас везде передаётся один и тот же объект set. Будь там не set, а какой-нибудь Student, было бы то же самое.
    Правильный вариант: set_dict = { x: set() for x in range(3) }
    Ответ написан
    2 комментария
  • Как увеличить фото без потери качества?

    Сгенерировал в AI иллюстрацию

    Перерендерить в картинку большего размера? Если это вектор, в чём проблема? Зачем "увеличивать"-то?
    Ответ написан
  • Firefox - как зайти пол двумя разными аккаунтами, чтоб не было разлогина на одном?

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

    Если нужно больше двух сессий - тогда используйте профили.
    Ответ написан
    5 комментариев
  • Как вызывать метод в классе, которого нет, но он есть в том, который наследует его?

    abstract class Model {
       verify() {
          const name = this.getName()
       }
    
       abstract getName(): string;
    }
    
    class User extends Model {
       private name = 'Boris'
       override getName() { return this.name; }
    }
    Ответ написан
    2 комментария