• Как войти на терминальный сервер без ввода логина и пароля?

    @res2001
    Developer, ex-admin
    В винде есть встроенный механизм хранения учетных данных для сетевых ресурсов: Credential Manager
    Проще всего до него добраться выполнив команду: control userpasswords2
    В открывшемся диалоге на закладке Advanced есть кнопка Manage Passwords. Вот это оно и есть.
    В общем создаете запись для удаленного сервера и пароль от нее будет использован автоматически.
    Управлять учетными данными в Credential Manager можно из командной строки с помощью утилиты cmdkey, т.е. можно автоматизировать процесс создания учеток на пользовательских компах.

    Так же в стандартном клиенте RDP после ввода пароля появляется галка "Сохранить учетные данные". Они сохраняются в тот самый Credential Manager. Затем достаточно вызвать RDP клиента и нажать Enter.
    Кроме того после полной настройки подключения в клиенте можно сохранить все настройки в *.rdp файл (кнопка "Сохранить как"), разместить его на раб.столе, например, и запускать подключение просто кликнув по иконке.
    Ответ написан
    Комментировать
  • Как правильно написать скрипт регистрации comcntr.dll при авторизации в системе?

    @res2001
    Developer, ex-admin
    Не в курсе про 1С и comcntr, но regsvr32 - регистрирует СОМ объекты.
    Чтоб dll зарегистрировалась ключ /n не нужен.
    И dll никуда не загружается. Регистрация - это внесение некоторых данных о СОМ объекте, содержащемся в dll в реестр винды. Чтобы в дальнейшем винда смогла вызывать этот объект.
    Кроме регистрации regsvr32 выполняет еще DllInstall - тут могут быть выполнены еще какие-то произвольные действия, необходимые объекту.
    Вообще я бы сначала скопировал dll на локальный диск, и только потом регистрировал уже с локального диска.
    По ключам: запустите: regsvr32 /?
    Ответ написан
  • Декларация и инициализация, в чем различия?

    @res2001
    Developer, ex-admin
    По моему, на русском чаще используют термин объявление, а не декларация. По крайней мере мне так привычнее.
    Объявление в одном из возможных переводов на английский звучит как declaration.
    https://en.cppreference.com/w/c/language/declarations
    https://en.cppreference.com/w/c/language/type

    Вы не правильно сопоставляете инициализацию и декларацию (объявление). Сопоставлять надо объявление и определение.
    Инициализация - всего лишь присвоение переменной некоторого начального значения. Она может быть при определении переменной или потом - не важно. Важно то, что перед инициализацией память для переменной должна быть выделена.
    Память выделяется когда переменная определяется.
    При объявлении память не выделяется, а только описывается (объявляется) тип. Тип включает в себя информацию о размере, выравнивании, возможных операциях, что-еще. Встроенные типы (int и т.п.) уже объявлены заранее и известны компилятору.
    Может быть предварительное объявление. Предварительных объявлений может быть сколько угодно много, если они не противоречат друг другу. Настоящее объявление может быть только одно.

    Понять различие между объявлением и определением на простом встроенном типе (int) довольно сложно, потому что сам тип уже известен, его не нужно объявлять. Для примера буду использовать структуру.

    Кроме того важно где конкретно в коде программы определена переменная - глобально (по отношению к файлу исходного кода) или локально (в функции).
    struct s;                     // предварительное объявление
    struct s { int v; };       // объявление структуры
    strcut s s1;                // определение глобальной структуры
    struct s s2 = { 0 };     // определение глобальной инициализированной структуры
    int main()
    {
      struct s s3;             // определение локальной структуры
    }

    Предварительное объявление - говорит о том, что где-то есть полное объявление. Тип объявленный только предварительным объявлением - не завершенный (не полный). Нельзя определить переменную по неполному типа. НО можно определить указатель на неполный тип. Но обращаться по указателю на неполный тип нельзя. Но присвоить адрес можно :-) Это можно использовать в своих интересах.
    После полного объявления типа уже можно определять переменные этого типа.
    s1 - глобальная не инициализированная структура. Память под нее выделяется в секции bss исполняемого файла. В исполняемом файле обычно не выделяется память непосредственно, но сохраняется размер секции. Загрузчик ОС читает размер секции из файла и выделяет память нужного размера. Глобальные не инициализированные переменные на самом деле инициализируются неявно нулем.
    s2 - глобальная инициализированная структура. Память под нее выделяется в секции data исполняемого файла. Тут уже не достаточно сохранить информацию о секции, т.к. есть начальные значения. Поэтому такие переменные непосредственно присутствуют в исполняемом файле (точнее выделена память под них и присвоено начальное значение). Есть еще секция rodata - для константных данных.
    s3 - локальная не инициализированная переменная. Память под нее выделяется на стеке. Не зависимо от того инициализирована переменная или нет, память выделена, а значит в этой памяти уже что-то лежит - не бывает "пустой" памяти. В случае не инициализированной переменной на стеке, в памяти лежит мусор, который остался тут от прошлых действий.
    Ответ написан
    1 комментарий
  • Как в одном проекте Clion создать несколько программ?

    @res2001
    Developer, ex-admin
    Я не использую CLion, но знаю что он использует cmake для проектов, а значит в нем работают механизмы cmake.
    Так что вы просто можете добавить еще одну цель в cmakelists.txt. Возможно в CLion это можно сделать как-то потыкав мышкой. Обычно cmakelists.txt правится руками. Смотрите документацию по cmake, у них довольно толковая документашка.

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

    @res2001
    Developer, ex-admin
    Ну и покажите что вы пытались сделать.

    Вообще текст куда-то должен попасть после ввода. Для этого функции чтения вы должны дать буфер, куда она и запишет, все что прочитала.

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

    Когда вы выделите буфер (с помощью malloc например), вы получите указатель. Пока этот указатель указывает на "пустой" буфер. После чтения в буфер, указатель будет указывать на прочтенные данные. Функция чтения вернет вам еще и длину прочитанных данных. Этого достаточно для дальнейшей работы с буфером.
    Ответ написан
    8 комментариев
  • Как сохранить значения нескольких переменных в С++ 17?

    @res2001
    Developer, ex-admin
    Вы же из getInfo возвращаете вектор, вот и принимайте вектор. В нулевом элементе вектора будет normal_weight, в первом weight. Вместо вектора можно было бы использовать std::pair или std::tuple. Они хранят свои данные статически, а вектор выделяет динамический массив, что в вашем случае максимально избыточно.

    Другой вариант передавайте в getInfo ссылки, тогда не надо будет ничего возвращать, значения в main появятся сами собой :-) Сейчас у вас аргутменты getInfo не понятно какую роль выполняют.
    Ответ написан
  • Почему не работает самоподписанный сертификат?

    @res2001
    Developer, ex-admin
    В корневые нужно пихать только сертификат ЦА. Это контейнер для них.

    Самоподписанный сертификат - это другое. Это когда у вас нет ЦА и вы просто выпускаете сертификат сервера и он сам себя подписывает. Такой простейший вариант сертификата.

    Сертификат ЦА - самоподписанный, т.к. его никто не подписывавет, но используете вы сертификат сервера и возможно клиента, а эти оба сертификата подписываются ЦА и они не самоподписанные. В работе используется сертификат ЦА только для проверки подписи предоставленного сертификата сервера и/или клиента, дальше для всего используются серверный и клиентский сертификаты.
    Не знаю особенностей Jitsi Meet, но по ссылке нет самоподписанных сертификатов. Там упор делается на использование LetsEncrypt, но по большому счету разницы нет - используете ли вы ЦА от LetsEncrypt или свой собственный. В случае своего ЦА , вы должны обеспечить возможность проверки сертификатов, правильно установив сертификат ЦА, тогда как сертификат LetsEncrypt (и других известных публичных ЦА) обычно уже установлен в системе. Процесс контроля за сроком сертификатов, их перевыпуском, ведением списка отозванных сертификатов и его доступностью то же ложится на вас.

    Любой сертификат содержит в себе публичный ключ владельца сертификата. Вторая часть ключа - секретный ключ - идет в отдельном файле. Серктеный ключ ЦА должен находится только на самом ЦА, он требуется только для выпуска новых клиентских сертификатов. В остальных случаях используется только сертификат ЦА, который можно свободно распространять. Аналогично и секретные ключи сервера/клиента - они должны находиться только у владельца ключа.
    Ответ написан
    1 комментарий
  • Как пингануть хост, находящийся за NAT, но когда при этом на шлюзе есть ssh?

    @res2001
    Developer, ex-admin
    ssh клиенты обычно позволяют подключиться и запустить команду на удаленном хосте. Подключаетесь и запускаете пинг сервера.
    Ответ написан
  • PKI. CA шифрует своим закрытым ключом или же открытом?

    @res2001
    Developer, ex-admin
    Сертификат не шифруются. Там нет секретной информации. Сертификат содержит публичный ключ и некоторые другие открытые параметры. Сертификат подписывается секретным ключом ЦА, для проверки подписи используется публичный ключ ЦА.
    ЭЦП всегда делается на секретном ключе, так что здесь нет какого-то отступления от правил.
    Ответ написан
    2 комментария
  • Почему переопределение метода без virtual -- это не переопределение?

    @res2001
    Developer, ex-admin
    Переопределить можно в любом случае, хоть с virtual, хоть без.
    Но тут важно что вам надо от переопределенного метода. Если вам нужно использовать полиморфизм, то нужно ставить virttual, если нет - то нет.

    Например дополним ваш пример функцией:
    void func(struct A &a)
    {
      a.fn();
    }
    
    int main() {
      B b;
      b.fn();
      func(b);
    }

    И передадим туда ссылку на b. Будет напечатана А, т.к. методы fn не виртуальные.
    Если были бы виртуальные, то напечатается B - полиморфизм в действии.
    Ответ написан
    Комментировать
  • Как можно передать unsigned char[] PROGMEM в функцию?

    @res2001
    Developer, ex-admin
    void func(const unsigned char *array, size_t array_length);
    ...
    func(bfr, sizeof(bfr)/sizeof(bfr[0]));


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

    @res2001
    Developer, ex-admin
    В п.1 написана какая-то синтаксически не корректная хрень, смысла которой я понять не могу.

    Массив бит или битовое поле можно реализовать, конечно. Фактически это будет массив байт (или любого другого беззнакового целого), можно его спрятать в typedef и реализовать над ним несколько операций отдельными функциями.
    Например в С++ есть специализация std::vector<bool>, которая для экономии памяти использует внутри битовый массив, а не массив bool, как можно было бы подумать.

    Объявляете байт и работаете с отдельными битами с помощью битовых операций. Если есть необходимость в более широком битовом поле, то можно все унифицировать: при инициализации задаете размер битового поля, вычисляете по заданному размеру размер массива (можно использовать uint8_t, uint16_t, uint32_t или uint64_t - любой беззнаковый целочисленный тип оптимальной длинны), выделяете память для массива.
    Операции над битовым полем:
    1. создание/удаление
    2. установить/снять бит по номеру
    3. проверить установлен ли бит по номеру
    4. опционально вычисление количества установленных бит и/или проверка пустое ли битовое поле.

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

    Объявить переменную размером в один бит (или размером не кратным 8 бит) нельзя, потому что в современных компьютерах минимально адресуемая единица памяти - 1 байт. Была бы 1 бит - можно было бы объявлять переменные размером в 1(2,3, 11, ...) бит. Это архитектурное ограничение компьютеров, а не языка программирования.
    Ответ написан
    2 комментария
  • Как использовать классы через интерфейсы?

    @res2001
    Developer, ex-admin
    А теперь развейте вашу мысль с классами MySQLBase и класс MSSQLBase.
    Вы хотите сделать универсальный адаптер, который будет работать с любой БД. Он принимает на вход ссылку на IBase и спокойно вызывает метод ConnectToBase, не заботясь о том, что там в реальности MySQLBase или MSSQLBase.
    Ответ написан
    Комментировать
  • Проблемы с синхронизацией времени на Windows 10, дело в системных настройках?

    @res2001
    Developer, ex-admin
    Программно время синхронизируется по протоколу NTP. В винду встроен NTP клиент (есть и NTP сервер, но это уже другая история). По умолчанию время синхронизируется с NTP серверами микрософт (у меня стоит по умолчанию time.windows.com). Провайдер не имеет отношения к времени на вашем компьютере.
    В интернете хватает бесплатных публичных NTP серверов. Вы можете выбрать любой, который находится ближе к вам географически и настроить винду на синхронизацию с ним. Начните с https://ntp.org

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

    Часовой пояс в винде должен быть настроен правильно, т.к. время отображается в соответствии с настроенным часовым поясом.
    Ответ написан
    Комментировать
  • Kак написать программу на C использующую Shell?

    @res2001
    Developer, ex-admin
    Ваша программа должна запросить пользователя название запускаемого исполняемого файла, запустить на выполнение этот файл, дождаться его завершения, повторить весь цикл.
    Основные функции ОС, которые выполняют нужный функционал тут же перечислены: fork, execv, wait. Есть и другие функции ОС, которые могут быть полезны.
    Ответ написан
    Комментировать
  • Что нужно исправить в кодее сортировки merge, чтобы она правильно работала?

    @res2001
    Developer, ex-admin
    Может быть потому, что массивы в С/С++ индексируются, начиная с нуля, следовательно последний элемент будет иметь индекс (n-1), т.е. 50. А вы передаете в merge_sort в качестве right значение 51. Так что у вас выход за пределы массива. Так же вы используете начальное значение для left = 1, таким образом вы не обрабатываете 0 элемент массива.

    Кроме того. Заверните ваш код в тег code (кнопка </> на панели инструментов) и верните все отступы - код не возможно читать.
    Ответ написан
    Комментировать
  • Как WSL 2 запускает приложения на физ. машине Windows? Как сделать это в VirtualBox или VMWare?

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

    По настройке сети для WSL2: https://learn.microsoft.com/ru-ru/windows/wsl/netw...
    Все получается.

    Подключить физический диск в ВМ можно. Для virtualbox нписано тут: https://www.virtualbox.org/manual/ch09.html#rawdisk
    У vmware есть своя инструкция.

    Подключить к гипервизору физическую машину - нельзя. Можно "сконвертировать" физическую машину в виртуальную и запускать уже виртуальную. Вот, например, инструкция от virtualbox: https://www.virtualbox.org/wiki/Migrate_Windows
    Ответ написан
    Комментировать
  • Как сделать Bat файл для пинга вводимого хоста?

    @res2001
    Developer, ex-admin
    set /p name="Input the host name: "
    ping %name%

    Даже не знаю, что тут комментировать :-)
    Дополнительную информацию смотрите тут:
    set /?
    ping /?
    Ответ написан
    1 комментарий
  • Где изучать STL и Boost?

    @res2001
    Developer, ex-admin
    STL по сути часть языка, так что в любом учебнике по плюсам будут и основы STL.
    Boost - это такая расширенная версия STL, многие новшества перед тем как попасть в стандарт и соответственно в STL тестируются на Boost. Но в Boost содержится много того, чего нет в STL. У Boost своя хорошая документация, изучайте по ней и по примерам.
    Любые другие библиотеки изучаются по документации от разработчиков библиотеки. Если документации нет, бывает и такое, - по исходникам.
    Ответ написан
    Комментировать
  • Какой компьютер выбрать для программирования?

    @res2001
    Developer, ex-admin
    1. Как уже писали, для программирования много не надо. Но когда комп начинает тормозить в не подходящий момент - это не приятно.
    2. Ноутбук или стационарный ПК надо выбирать исходя из того как вы пользуетесь им. Если он все время на одном месте - то смысла в ноуте нет.
    3. Учтите, что стационарный выйдет дешевле при тех же характеристиках.

    Я недавно обновил свой ноут. У меня вопроса не стояло ноут или ПК, т.к. регулярно бываю на выезде, хотя основное время - дома на удаленке.
    Взял Lenovo Legion 5. Доволен как слон :-)
    У Леново есть еще хорошие варианты в рамках линеек ThinkPad T/P/X. В каждой линейке несколько моделей. Пишут, что thinkpadы сертифицируются для пентагона, так что там качество на высоте должно быть.

    Если все таки остановитесь на ноуте, обращайте внимание на то, что в некоторых моделях память распаяна на материнке и заменить (увеличить) ее практически не реально. Так же есть смысл смотреть на наличие дополнительного слота для SSD. Ну и наличие необходимых внешних интерфейсов то же может быть важным вопросом. Если подключаете внешние мониторы, то смотрите, чтоб были разъемы в нужном количестве и нужного типа.
    Обычно, можно купить ноут с небольшим SSD и количеством памяти и сразу проапгрейдить его, возможно будет дешевле, чем сразу покупать ноут с необходимым размером SSD и памяти. На процессоре экономить не стоит.
    На озоне сейчас есть наши продавцы, которые возят из китая. Доставка долгая - 1-1.5 месяца. Но сильно дешевле, чем брать там где "в наличии". Растаможка уже включена в стоимость. У продаванов из Китая растаможка, скорее всего, не включена, поэтому у них ценник будет еще ниже, но он, с большой вероятностью, не окончательный.
    Ответ написан
    1 комментарий