Задать вопрос
  • Нужно ли заключать все переменные макроса в скобки?

    @res2001
    Developer, ex-admin
    В данном случае скобки, скорее всего, действительно роли не играют. Я не смог придумать вариант, в котором бы подстановка без скобок дала бы не правильный результат.
    Но в других случаях скобки обычно нужны. Так что проще запомнить правило - параметры макросов при использовании заключай в скобки. И делать так всегда, чем каждый раз думать, нужны тут скобки или нет.
    Кроме того, если ни я ни вы не придумали подходящего варианта для взлома конструкции, это не значит, что его не может быть в принципе.
    Ответ написан
    1 комментарий
  • Превратить команду gcc в cmake?

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

    Сборка с помощью cmake происходит типовыми командами практически одинаковыми для любого cmake проекта. Находясь в каталоге сборки (любой пустой каталог):
    cmake <каталог с проектом> -G <generator type>
    cmake --build .

    generator type - зависит от того с помощью чего вы планируете осуществлять сборку. Обычно в линукс это "Unix Makefiles" в винде например "Visual Studio 15 2017". Весь список поддерживаемых генераторов можно увидеть с помощью cmake --help
    Ответ написан
    Комментировать
  • Как вставить новый массив в имеющийся?

    @res2001
    Developer, ex-admin
    В общем случае нужно:
    1. расширить принимающий массив на количество элементов во вставляемом массиве (обычно это перевыделение памяти с копированием содержимого старого массива в новый большего размера),
    2. переместить в конец часть старого массива после позиции вставки,
    3. вставить (скопировать/перенести) элементы вставляемого массива.

    Вставка новых элементов - это увеличение размера массива. Изменить размер можно только у динамического массива. Для автоматического и статического это сделать нельзя.

    В std::vector есть метод insert, который сделает всю работу за вас. Правда тут придется вставлять элементы по одному. В С++20, похоже, появилась перегрузка insert, где можно вставить несколько элементов сразу.
    Ответ написан
    1 комментарий
  • Как перенести все настройки системы на другой компьютер?

    @res2001
    Developer, ex-admin
    Если это не контроллер домена, просто включите новый компьютер (со свежеустановленной виндой и вновь включенный в домен) в теже группы, где был старый компьютер. Политики применятся автоматически.
    Что-то где-то - придется настраивать руками или пытаться достать со старого компа/диска. Есть смысл снять образ диска, чтоб можно было из него что-то вытащить, если потребуется.

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

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

    @res2001
    Developer, ex-admin
    Это называется дедубликацией. В Windows Server давно уже есть соответствующие родные службы, так что можете просто заменить Windows 10 на Windows Server :-)
    На сколько я знаю, есть сборки пакетов для дедубликации, которые работают на Windows 10. Собраны они умельцами из соответствующих пакетов Windows Server. Сам не пользовался, так что ничего по функционалу не скажу. Гуглите.

    PS: не пользуйтесь ccleaner
    Ответ написан
    Комментировать
  • Как запускать компьютер с помощью кнопки на сайте?

    @res2001
    Developer, ex-admin
    Технология называется WakeOnLan.
    1. Эта фишка должна поддерживаться БИОС компьютера, который нужно включать. И ее надо там включить. Называться в БИОСе может по разному, зависит от фантазии разработчика БИОС. Пробуждение возможно только через проводной сетевой адаптер, соединение компа с сетью должно быть через провод. ВайФай не канает. Комп, естественно, должен быть включен в электрическую и локальную сети.
    2. После этого протестируйте внутри локальной сети. Для отправки WoL пакетов используйте свободное ПО, можно погуглить.
    3. На роутере надо настроить проброс определенного UDP порта на широковещательный внутренний адрес.
    4. Для пробуждения компьютера вам понадобиться МАС адрес сетевого адаптера компа, который надо пробуждать, и внешний IP адрес роутера. Для отправки WoL пакетов из интернет есть свободное ПО с возможность работы через интернет (это важно, т.к. формируются разные UDP пакеты для случая LAN и WAN), а так же встречал и сайты, которые это умеют делать.

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

    @res2001
    Developer, ex-admin
    Приложения по любому остаются на диске.
    Тут все зависит от того как будет проверятся наличие приложений.
    Теоретически, если использовать "портабельную" версию приложения, т.е. без установщика, и скопировать приложение в профиль другого пользователя (т.е. приложение должно находится именно в профиле другого пользователя c:\Users\<user name>\...), то без прав администратора из-под учебного пользователя это приложение (файл на диске) будет не видно.
    Ответ написан
  • Сколько всего ip адресов в глобальном интернете?

    @res2001
    Developer, ex-admin
    2. Если вам провайдер выдает IPV6, то вы можете использовать в интернете IPv6.
    Реальный адрес, полученный от провайдера, обычно, имеет ваш роутер, а не ваш компьютер. Так что, ориентироваться только на вывод ipconfig бесполезно. Посмотреть с каким адресом вы реально выходите в интернет можно на сайтах типа 2ip.com. Для интереса можете сверить вывод ipconfig и что показывает 2ip.com.
    Для проверки готовности вашего компа к использованию IPv6 пройдите ipv6-test. Сайтов с ним в интернете хватает.
    Если ваш комп реально получает от провайдера IPv6 адрес и если узел назначения (веб сайт) то же имеет IPv6 адрес, то, скорее всего, обмен с этим сайтом будет происходить с использованием IPv6.
    Провайдеры могут выдавать оба адреса и IPv4 и IPv6. Какой из них будет использоваться для обмена, ОС решает отдельно для каждого конкретного соединения с узлом в интернете. Приложения могут принудительно использовать тот или иной протокол, или отдать этот выбор на усмотрение ОС.
    Ответ написан
    8 комментариев
  • Как использовать библиотеку GLFW используя только g++?

    @res2001
    Developer, ex-admin
    1. добавьте в опции компилятору путь к файлам заголовков библиотеки (через опцию -I)
    2. путь к библиотечным файлам (опция -L)
    3. перечислите в опциях -l все библиотеки, которые будете использовать.

    Это стандартный путь для использования сторонних библиотек в вашей программе, не зависимо от конкретной библиотеки.
    Ответ написан
    2 комментария
  • Библиотека Cron scheduler на windows для си?

    @res2001
    Developer, ex-admin
    В винде шедулер доступен в виде набора COM объектов.
    Смотрите тут: https://docs.microsoft.com/en-us/windows/win32/tas...
    Кросс-платформенной библиотеки не встречал.
    Ответ написан
    Комментировать
  • Почему не устанавливаются пакеты в Astra Linux 2.12? Не запускается версия 1.7?

    @res2001
    Developer, ex-admin
    У астры неплохая вики, а так же есть форум, пользуйтесь. Там уже большая часть вопросов "от новичков" разжевана.
    На счет репозиториев, на сколько помню, там по умолчанию прописан только репозиторий лежащий на диске (на CD или на образе), никаких репозиториев в интернете не зарегистрировано. Если диск не вставлен или образ не смонтирован, то репозиторий будет не найден.
    Но это можно легко поправить: https://wiki.astralinux.ru/pages/viewpage.action?p...
    Ответ написан
    Комментировать
  • Взаимодействие уровней сетевых моделей?

    @res2001
    Developer, ex-admin
    Взаимодействие между уровнями - это детали реализации.
    Тот же TCP/IP можно реализовать очень по разному с разными интерфейсами для прикладного приложения.
    Наиболее распространенное сейчас сетевое API это Berkeley Sockets (или просто сокеты). Сокеты реализуют в т.ч. и взаимодействие по TCP/IP. Есть и другие сетевые API, например TLI, но я никогда в реальности не встречал его использования.
    Сетевое API - это то с помощью чего прикладной программист использует сеть. Внутри тех же сокетов есть свои интерфейсы для передачи между сетевыми уровнями.
    Ответ написан
    2 комментария
  • Как ограничить копирование данных из сетевых папок, локального ПК, на флешки и внешние ресурсы?

    @res2001
    Developer, ex-admin
    Вам нужна DLP система. Их много разных. Обычно это достаточно тяжелый софт, требует серьезной настройки, разработки правил. Тяжелый - в том смысле, что с ним тяжело работать, требует от администратора определенного погружения в проблему. А не то что установил и забыл.
    Конечно, никакая DLP система не даст 100% гарантии от утечек информации. Как уже писалось выше - это должно быть комплексным решением, начиная от организационной документации по ИБ под роспись сотрудников и до системы видеонаблюдения, сигнализации и т.п. И сама DLP тут далеко не на первом месте по эффективности, просто один из кирпичиков.
    Ответ написан
    Комментировать
  • Как сделать чтобы программа ждала завершения bat-файла?

    @res2001
    Developer, ex-admin
    Как уже было сказано system() всегда выполняется синхронно, т.е. ждет окончания выполняемой программы.
    В батнике аналогично - когда стартуете команду/программу обычным способом батник приостанавливается до завершения программы.
    Так что описанного поведения по этим причинам быть не может.
    Скорее всего проблема в чем-то другом.
    В конце батника добавьте строку pause, чтоб он не закрывался сразу и посмотрите что выводится на консоль. Подозреваю, там будет какая-то ошибка. Может быть "file not found" или еще что-нибудь.
    Ответ написан
    Комментировать
  • Чем обусловлены различия в работе со строками и другими массивами?

    @res2001
    Developer, ex-admin
    void func()
    {
    char str1[] = "Hello";
    const char* str2 = "Hello";
    int* mas1 = { 4, 5, 7, 9 };  // compile error
    int mas2[] = { 4, 5, 7, 9 };
    char* str3 = {'s', 't', 'r', '3', '\0'};  // compile error
    char str4[] = {'s', 't', 'r', '4', '\0'};
    ...
    }

    Объявление str1 и str2 это не совсем одно и то же.
    str1 выделяет на стеке массив charов подходящего размера и копирует в этот массив строку "Hello". Строка "Hello" до копирования будет хранится в сегменте памяти для констант (rodata), который сформируется ОС автоматически при загрузку исполняемого файла в память. Таким образом строка str1 лежит полностью на стеке, ее можно изменять при желании, но увеличивать размер нельзя. str1 может быть как константной строкой, так и не константной.
    str2 - на стеке выделяется память под указатель, указателю присваивается адрес строки "Hello", которая все так же лежит в сегменте rodata. Поэтому const тут необходим, т.к. оригинальная строка, на которую ссылается str2 не изменяемая. Если убрать const у str2, то, например, gcc выдаст предупреждение по умолчанию, но код скомпилирует. Если дальше попытаться изменить str2 (например str2[0] = 'h';), то компилятор на присвоение уже ничего не скажет, т.к. str2 уже не константная строка, но при выполнении получишь segfault, т.к. пытаешься изменить read-only память.
    В случае инициализации mas1, выражение в фигурных скобках - это список инициализации. На основании списка инициализации компилятор генерирует код, который при выполнении проинициализирует массив mas1, т.е. он не генерирует массив, он генерирует код, что-то типа такого mas1[0] = 4; mas[1] = 5; ... при этом компилятор подразумевает, что память под mas1 уже должна быть выделена подходящего объема. Но в примере mas1 - это не массив - это указатель, который никуда не ссылается. Инициализировать указатель таким образом не возможно. Нужно делать так, как показано для mas2.
    Точно так же списком инициализации можно проинициализировать и массив для строки (str3) и получить ту же ошибку, что и для mas1.
    Из примеров можно сделать вывод, что для строк в языке существует специальный синтаксис, который больше нигде не применим - пример str2. Это так и есть.

    Сырые строки (Си строки, ASCIIZ строки, строки оканчивающиеся нулем) ни разу не устаревшие. Объект string, конечно удобный и прочее, но он медленный из-за того, что хранит свою строку в динамической памяти, и при изменении строки перевыделяет память по мере надобности и копирует строку в новую память. Операции выделения/удаления динамической памяти очень дорогие. Чаще всего string - вполне адекватный выбор, но там где нужна быстра работа со строками лучше поискать другие варианты, например сырые строки.
    В С++17 появился std::string_view - это обертка над константной сырой строкой, делает код немного более понятным, но не производит никаких манипуляций с динамической памятью - ему на вход надо дать сырую строку. Он ее и использует для своих операций. Из-за того, что string_view не изменяет свою строку и не манипулирует с памятью - он работает быстрее, но у него ограниченное количество операций - отсутствуют операции модифицирующие строку.
    Ответ написан
    3 комментария
  • Как балансировать трафик между двумя провайдерами в двух объединенных ЛВС?

    @res2001
    Developer, ex-admin
    В свое время делал нечто подобное используя в качестве роутера комп с FreeBSD. Настраивал тамошний фаервол ipfw, используя подход "policy routing" + множественные таблицы маршрутизации + statefull firewall.
    Обеспечивалось как балансировка, когда оба канала работали, так и отказоустойчивость - когда один из каналов затыкался, весь трафик переключался на оставшийся. Отказоустойчивость обеспечивалась дополнительным скриптом, который мониторил доступность канала и "выключал" в фаерволе одну из веток, при восстановлении канала выключенная ветка активировалась. Какой из маршрутов выбрать для конкретного исходящего пакета выбиралось случайным образом. Естественно, для TCP случайно выбирался маршрут только для первого пакета для установки соединения, остальные шли уже по сохраненному маршруту.
    Все это достаточно сложно реализовывалось и отлаживалось, времени ушло около месяца, при том, что я хорошо владел и FreeBSD и фаерволом, но делалось все на живой сети, это сильно замедляло процесс.

    В отличие от вашей конфигурации у меня оба канала в интернет приходили в один шлюз. Но это не принципиально. Разница лишь в том, что в вашей конфигурации вам придется подобным образом настраивать одновременно 2 шлюза.

    Если ваши фаерволы не поддерживают такой возможности из коробки, то скорее всего в текущей конфигурации это не возможно.
    Думаю, что на линуксе то же можно было бы что-то подобное соорудить, там по моему, есть все необходимые инструменты.
    Вариант с собственной AS возможен, но думаю, что он реалистичен только для крупных организаций. Я не изучал цену вопроса и пороги вхождения в обладатели AS.
    Ответ написан
    Комментировать
  • Как разделить строку до и после определённого символа?

    @res2001
    Developer, ex-admin
    Вариант с "токенизацией" делит один единственный буфер на несколько Си строк, т.е. там просто записывается завершающий 0 вместо разделителей. Это быстро и довольно просто, ничего никуда не копируется, дополнительная память не выделяется. Но надо иметь ввиду, что используется один и тот же буфер и если вы его не аккуратно перезапишите (не важно по какому указателю на внутренние строки), то ваши строки "испортятся". Освобождая память под этим буфером надо, естественно, по указателю на начало буфера, а не по указателю на произвольную строку внутри буфера. Освободив буфер надо иметь ввиду, что все строки, содержащиеся в буфере то же освободились.

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

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

    Если же вам надо только "вывести подстроку", то можно просто искать позицию разделителя, с его помощью вычислять размер левой подстроки и используя printf("%*s", len, leftstr); выводить левую подстроку. Дальше сохраняем указатель на начало правой подстроки, ищем от него следующий разделитель, то, что раньше было правой подстрокой становится левой, точно так же выводим и т.д. в цикле.
    Вместо printf можно выводить так: cout << setw(len) << leftstr;
    Ответ написан
    Комментировать
  • Какая из профессий в сфере IT предполагает и программирование и работу непосредственно с оборудованием/с железом?

    @res2001
    Developer, ex-admin
    Подскажите пожалуйста, какие есть профессии требующие навыков программирования, но при этом предполагающие так же работу "в поле" непосредственно с оборудованием

    В поле с оборудованием работает любой админ в любой конторе. Но оборудование как правило достаточно типовое и решения то же. Программирование там может быть, а может и не быть - по желанию конкретного человека. Я, когда был админом, поскольку уже имелся некоторый опыт разработки, пытался применять навыки программиста в работе - это в основном скрипты для автоматизации собственных задач. Но в админстве работы в поле не так много, когда уже все настроено и работает, то там остается в основном поддержка работоспособного состояния. Исключение составляют большие организации, где постоянно есть чем заняться по обслуживанию сети и/или железа.

    Если же хочется больше программирования, то тут уже не до работы в поле. Можно программировать железо, тогда вы "поле" можете частично перенести к себе за раб.стол. Если вам это направление подходит, то налегайте на Си и потом на С++ и ищите вакансии связанные с низкоуровневой разработкой.
    Ответ написан
    Комментировать
  • Как убрать предупреждение в Excel о файлах по сети?

    @res2001
    Developer, ex-admin
    Обычно в винде это появляется на файлах, скачанных из интернета.
    Если вы скачаете файл и сразу посмотрите его свойства, то на закладке General в самом низу увидите дополнительную надпись о том, что файл попал сюда из другого места и может быть заблокирован. Рядом есть галка Unblock.
    На сколько я помню это реализуется с помощью альтернативных потоков данных в NTFS. Почитать можно, например, тут: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D1%8C%D... и https://stealthbits.com/blog/ntfs-file-streams/
    Можно принудительно после скачивания удалять эти потоки. Как конкретно это делать не подскажу.
    Ответ написан