• Можно ли частично изменить маску подсети в сети организации?

    @res2001
    Developer, ex-admin
    Есть смысл не расширять маску, а наоборот разбить сеть на несколько меньших сетей и настроить между ними маршрутизацию. Сетей может быть несколько, при этом каждую из них не делайте меньше 24. Таким образом останется адресное пространство для расширения в каждой отдельно взятой сети.
    Ответ написан
    3 комментария
  • Почему мой компьютер не виден в локальной сети?

    @res2001
    Developer, ex-admin
    Обычно достаточно добавить сеть в Частный профиль и по умолчанию все остальное срабатывает.

    Вообще общий доступ настраивается в win11: Settings->Network&Internet->Advanced Network Settings->Advanced Sharing Settings: для Private Networks включить все что там есть.
    Для All Networks включить Password protection sharing и выбрать режим шифрования (128 бит рекомендуется).
    У меня все это вроде бы было включено по умолчанию, но не поручусь.
    Если у вас в сети нет домена и АД, то желательно на всех компах настроить одну и ту же рабочую группу для одноранговых сетей микрософт: Setting->System->About->Domain and Workgroup->Change (после изменения возможно потребуется перезагрузка). Там же можно задать и имя компьютера в сети.
    Ну и на последок в свойствах сетевого адаптера, который используется для доступа в локальную сеть (Settings->Network&Internet->Advanced Network Settings->сверху в списке раскрываем нужный сетевой адаптер->More Adapter Options->Edit) должны быть включены Client for Microsoft Networks, File and Printer Sharing for Microsoft Networks. Эти настройки по умолчанию включены.
    В винде начиная с вин10 довольно часто меняют названия и местоположения некоторых настроек. Все вышеприведенное актуально для Win11 23H2.

    Правила для фаервола по умолчанию разрешают доступ служб microsoft network для приватного профиля, так что тут ничего настраивать обычно не нужно.

    После этого другие компы должны начать видеть компьютер в сети и иметь возможно использовать его расшаренные ресурсы регистрируясь по логину/паролю. Для этих целей можно завести отдельных пользователей и группы, которым раздавать права на расшаренные ресурсы.
    Ответ написан
    Комментировать
  • Как настроить CMake на установку пакетов?

    @res2001
    Developer, ex-admin
    Самому заниматься установкой зависимостей есть смысл только для статически линкуемых библиотек. В этом случае самый простой вариант такие библиотеки оформить например как субмодуль git. Тогда при клонировании вашего репозитория скачаются исходники библиотеки. В cmake просто собираете ее как отдельный таргет и используете по назначению. Хорошо если библиотека уже поддерживает сборку через cmake - будет меньше возни. Если нет, то придется написать самому для нее CMakeLists.txt.

    Для динамических библиотек стоит оставить удовлетворение зависимостей пользователю, потому что вариантов пакетных менеджеров много (вы хотите их все поддерживать?). В вашем CMakeLists.txt нужно только сделать тем или иным способом поиск установленного пакета и если его нет - выдачу ошибки и завершение сборки. Такие механизмы в cmake есть. Можно использовать выше приведенный find_package или например pkg_check_modules (который в свою очередь использует утилиту pkg-config).
    Почти все более-менее серьезные приложения не пытаются установить самостоятельно свои зависимости при сборке. Можете проверить. Например: https://github.com/nginx/nginx?tab=readme-ov-file#...

    Вы можете дополнительно к сборке приложения добавить и создание пакета для пакетного менеджера (или для нескольких пакетных менеджеров). Вот тут то вы и укажите необходимые приложению зависимости (в разных дистрибутивах линукс пакеты с зависимостями могут называться по разному). И тогда, когда пользователь будет устанавливать ваш пакет через пакетный менеджер все зависимости установятся автоматически.
    В cmake есть механизм для создания пакетов для разных пакетных менеджеров: https://cmake.org/cmake/help/book/mastering-cmake/...
    Ответ написан
    2 комментария
  • Кириллица в c++. Что с ней не так?

    @res2001
    Developer, ex-admin
    В виндовой консоли есть 2 русские кодировки cp866 и cp1251. Причем cp866 используется по умолчанию! Так же есть еще 65001 (UTF8), которая то же умеет в кирилицу. Пользователь консоли может менять кодировку по собственному усмотрению (команда chcp /?). Как правило встроенные виндовые утилиты командной строки правильно работают с любой установленной кодировкой (можете сами в этом убедиться).

    Дополнительно к кодировкам самой консоли винды добавляется еще кодировка в которой написаны ваши исходники. Кодировка исходников должна быть совместима с кодировкой консоли. Если не совместима, то нужно или переключать кодировку консоли (что для консольных утилит не хорошо - это вам пользователи утилиты потом расскажут) или перекодировать вводимые/выводимые строки на лету.

    Самый простой вариант решить проблему - писать исходники в cp866, тогда в консоли по умолчанию все будет выводится правильно без всяких танцев с бубном. Но если пользователь поменяет кодировку, то все опять разъедется. Кроме того использовать cp866 для исходников - не комильфо.

    Лучше исходники всегда писать в UTF8 а для строк использовать wchar_t.
    Тут и не только тут эта проблема уже обсуждалась не однократно. Например посмотрите эту ссылку: https://qna.habr.com/answer?answer_id=2278154#comm...
    Не смотрите, что там тема по Си - проблема та же самая и решения для Си и С++ будут похожие.
    Ответ написан
    Комментировать
  • Почему эта программа вычисляет факториал больших чисел неправильно?

    @res2001
    Developer, ex-admin
    Видимо ошибка в длинных вычислениях. Сложно просто глядя на код что-то сказать.
    Для оптимизации тут применена многопоточность, но похоже, что присутствуют гонки, хотя есть попытка использовать мьютекс для защиты, но явно этого не достаточно.
    Похоже, что эта программа толком не отлаживалась.

    Думаю, больше толку было бы для оптимизации, если бы использовались SIMD инструкции, а не многопоточность.
    Есть оптимизированные библиотеки для длинной арифметики, проще всего было бы использовать какую-то подобную библиотеку, а не изобретать собственный велосипед. С использованием такой библиотеки задача была бы достаточно тривиальной.
    Ответ написан
    5 комментариев
  • Можно ли сделать раздельное туннелирование VPN для отдельных программ?

    @res2001
    Developer, ex-admin
    Добавьте маршруты до адресов discordа через ВПН. А остальное пускайте на шлюз по умолчанию.
    При подключении ВПН не должен переписывать шлюз по умолчанию.
    Останется только выяснить адреса дискорда. В этом могут помочь сервисы whois.
    Ответ написан
    Комментировать
  • Данные в таком случае будут хранится в стеке?

    @res2001
    Developer, ex-admin
    Если это определение внутри функции/метода - то Number будет лежать на стеке.
    Если вне функции/метода - в области глобальных данных.
    А вот данные на которые указывает Number могут лежать где угодно.
    Да, указатель может указывать и на данные на стеке или в глобальной области. В общем на любой выделенный блок памяти он может указывать. А в вашем примере даже и не на выделенный, только обращаться по такому указателю нельзя.
    Ответ написан
  • Как организовать свой интернет-магазин на NAS?

    @res2001
    Developer, ex-admin
    NAS относится к интернет магазину примерно никак.
    NAS - это просто место где лежат файлы, любые файлы - хранилище файлов. Это не веб сервер. Вы не сможете на NAS запустить свой сайт - он не предназначен для этого.
    Вы можете использовать NAS для хранения файлов вашего магазина, можете не использовать. Безразлично. Файлы магазина обычно можно перенести в процессе куда угодно без больших проблем.
    Обычно начинают с простого варианта - все файлы лежат локально на веб сервере. По мере увеличения нагрузки можно думать об оптимизации.
    Ответ написан
    Комментировать
  • Как сделать одномерный массив в си?

    @res2001
    Developer, ex-admin
    Если количество цифр фиксировано, то просто перечислите в формате scanf сразу их все.
    Если количество цифр может меняться, то ...
    Вводить как строку и потом парсить ее с помощью strtol, кода будет, конечно, больше, чем сейчас.
    Строку вводить в какой-то достаточно большой буфер длинной в 1 или 4 кб.
    При превышении буфера можно выдавать ошибку.
    Или ввод оформить в цикл, на случай, если буфер заполнится, а Enter пользователь еще не нажал. Выход из цикла по нахождению символа '/n' в буфере. В таком случае буфер можно делать меньше. Но тут возникает дополнительная проблема с неоконченным вводом, т.е. пользователь вводит число 123456 и допустим 123 прилетело в конец прошлого буфера, а 456 в начало следующего. Это надо будет решать в коде.

    Есть проблема с фиксированным размером массива.
    Если нужен произвольный размер входных данных, то можно, предварительно выделять массив какого-нибудь начального размера, если в ходе парсинга размер массива превысится, то сделать realloc увеличив размер массива в 2 раза. Ну и надо отдельно хранить количество реально заполненных элементов массива.
    А вообще, массив может оказаться не нужен, если взглянуть на задачу целиком.
    Ответ написан
    1 комментарий
  • Как из одного приложения запустить другое?

    @res2001
    Developer, ex-admin
    Можно запускать скрипт удаленно с помощью psexec или wmi. Предварительно надо будет настроить все удаленные станции, чтоб можно было это использовать.
    Это может быть простой батник, который убивает процесс и запускает повторно. Правда есть нюанс - удаленно скрипт можно запустить только с админскими правами, а приложение надо запускать с правами пользователя и в сеансе пользователя.
    Чтоб решить эту проблему может быть запуск можно сделать не на прямую, а например из задачи шедулера, которую удаленным скриптом дергать. Кстати утилита schtasks, с помощью которой можно управлять заданиями шедулера из ком.строки, умеет работать удаленно. Так что возможно даже psexec/wmi не понадобятся. Т.е. нужно написать локальный скрипт, который ищет нужный процесс, прибивает его и запускает повторно. Настроить в шедулере задачу с фиксированным именем с запуском этого скрипта и выключить эту задачу. Дальше на сервере при наступлении события просто дергаете schtasks, который будет удаленно принудительно одноразово стартовать настроенную задачу.
    Ответ написан
    5 комментариев
  • Что будет, если не удалять графические объекты при завершении программы в C++ SDL2?

    @res2001
    Developer, ex-admin
    Система в большинстве случаев сама освободит почти все ресурсы при завершении программы. Есть исключения, но они довольно редки.

    Но вот представьте ситуацию: прошел год и вы решили использовать код, который написали в этом проекте. Т.е. ваш старый код будет вызываться и завершаться в новом окружении (новой программе), но новая программа еще продолжит работать, а ресурсы не освобождены. И возможно новая программа захочет вызвать ваш старый код не один раз, а 1000 раз например. Вот тут-то вы и словите все утечки, которые оставили год назад.

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

    Кстати, этот вопрос не связан конкретно с SDL, он вообще про все что угодно, что может быть захвачено и освобождено вашим процессом.

    Так что освобождайте все что захватывает ваша программа явно в вашем коде и не надейтесь, что кто-то это сделает за вас.
    Ответ написан
  • Настраивается ли выход в интернет из сети OpenVPN не из сервера а из одгого из клиентов?

    @res2001
    Developer, ex-admin
    Учитывая, что выход в интернет - это просто правильный маршрут по умолчанию в стандартной таблице маршрутизации, которая не имеет отношения к ВПН. То, да, настроить такие маршруты вполне можно.

    Тут вам проще, видимо, будет сделать 2 ВПН. Один для всех клиентов. Второй для клиента, который будет выступать шлюзом в интернет. Причем, видимо, для второго ВПН роли клиента и сервера лучше поменять местами, т.е. ваш предполагаемый клиент будет ВПН сервером, а сервер первого ВПН станет клиентом во втором ВПН. Как-то так вижу.
    Ответ написан
  • Как сохранить размер окна через реестр?

    @res2001
    Developer, ex-admin
    Создайте батник для каждого запускаемого экземпляра игры.
    В батнике перед запуском игры меняйте ключи реестра на те значения, что нужны для этого конкретного экземпляра игры. Это можно делать с помощью стандартной утилиты reg или можно предварительно выгрузить из regedit нужную ветку реестра с правильными значениями и им же импортировать ее в батнике, ключи командной строки regedit для импорта смотри в справке или в гугле.
    Таким образом вы сначала подготавливаете реестр к запуску, а затем запускаете игру.
    Ответ написан
    Комментировать
  • Проблемы с подключением заголовочных файлов на C++, как исправить?

    @res2001
    Developer, ex-admin
    Можно так:
    #include "../include/sys.h"
    Кавычки тут важны!

    Но лучше всего добавить путь поиска заголовочных файлов с помощью дополнительной опции компилятора:
    g++ -I include ...
    И подключать заголовок уже просто указывая только имя файла:
    include <sys.h>
    Ответ написан
  • В чем ошибка в Бат-файле для запуска отчета в АИДА и отправки на почту?

    @res2001
    Developer, ex-admin
    Аида запускается и на этом процесс останавливается.

    Сейчас вы пытаетесь запустить aida 2 раза, через start и без него во 2 строке. Оба варианта могут сработать. Но очевидно, что по разному, т.к. параметры aida различаются.
    Или возможно, 2 вариант не сработает, из-за того что не прописан полный путь к aida.

    В текущем виде команда start запускает aida без параметров, поэтому вы видите окно aida в котором ни чего не происходит.
    Вторая команда, если она отрабатывает, возможно делает то что надо. Отчет на почту приходит?
    Если нет, то попробуйте для начала добавить полный путь во 2 строке.

    Правильность параметров командной строки для отправки отчета смотрите в документации AIDA. Я тут не в курсе.

    start - запускает приложение и не ждет его завершения, т.е. консольное окно у вас закроется сразу, если вы запускаете батник через ярлык с раб.стола например.
    Без start - консольное окно не закроется, будет ждать завершения запущенного процесса.
    Можно использовать любой вариант. Оба в одном батнике - избыточны.

    Командную строку для aida в обоих вариантах приведите к одному виду, видимо, как во 2 варианте, только, возможно, надо добавить полный путь к aida.

    Правильный вариант использования start в вашем случае такой:
    start "%USERPROFILE%\Desktop\AIDA64\aida64.exe" /E pochta@mail.ru /SUBJ "Отчет AIDA64 $HOSTNAME" /HTML /SUM

    Конечно, если параметры для aida вы сформировали правильно.
    Ответ написан
    1 комментарий
  • Где можно скачать Qt 5.5.1 под Ubuntu?

    @res2001
    Developer, ex-admin
    Собрать самому можно, исходники лежат на github.
    Можно взять установочный пакет из репы старой убунты: https://launchpad.net/ubuntu/xenial/amd64/qtbase5-...
    Но там еще пачку зависимостей надо тянуть. Может быть проще поставить нужную версию убунты?

    И зачем вообще именно версию 5.5.1? Если вам надо собрать приложение, то попробуйте на последней доступной Qt5 в вашем дистре линукс собрать, с большой вероятностью соберется.
    Ответ написан
  • Почему клиент не подключается к серверу OpenVPN?

    @res2001
    Developer, ex-admin
    Ответ написан
    Комментировать
  • Зачем передавать функцию как параметр через указатель с++?

    @res2001
    Developer, ex-admin
    Обычно callbackи так передают. Потом вызываемая функция при наступлении события сама ее вызывает.
    Ответ написан
  • Лучше ли использовать enum для цвета нежели struct?

    @res2001
    Developer, ex-admin
    Как я понимаю через выше aligment тем лучше?

    Нет. Это бред. Тут не применимы термины лучше/хуже.

    Alignment (выравнивание) - это просто свойство типа данных.
    enum по умолчанию имеет тип int, соответственно и все его свойства наследуются. В С++ (с версии 17, если не ошибоаюсь) можно самому выбрать тип enum. Для выравнивания обычно действует простое правило - тип должен быть выровнен в памяти на границу кратную его размеру. Например у int размер 4 байта (обычно), и выравнивание должно быть по границе 4 байт. у char/uint8_t - размер 1 байт, соответственно ограничений по выравниванию нет, т.е. выравнивание по границе байта. Тип SDL_Color - это, видимо, структура, состоящая из 4 uint8_t (или что там в SDL используют для unsigned char), выравнивание для структуры берется из типа ее первого поля (если аттрибутами не задано другое).
    Используй типизированный в uint8_t enum и будет тебе счастье.
    https://en.cppreference.com/w/cpp/language/enum

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