Задать вопрос
  • Как использовать библиотеку 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/
    Можно принудительно после скачивания удалять эти потоки. Как конкретно это делать не подскажу.
    Ответ написан
  • Какую выбрать ОС для интернет-шлюза?

    @res2001
    Developer, ex-admin
    Если хотите прокачать скилы в администрировании фаервола, то ставьте ту же голую Ubuntu или FreeBSD и тренируйтесь.
    Если такой цели нет, то берите готовый продукт, с GUI. Вполне подойдут все тут предложенные (и железные и софтовые) и еще пачка других может найтись.
    Если в конторе есть развернутая виртуальная инфраструктура, то корп.фаервол можно реализовать на ВМ, это достаточно удобно, плюс все плюшки от виртуализации.
    На мой взгляд софтовый вариант более гибок, т.к. кроме функций фаервола он может быть и корпоративным ВПН сервером, и внешним почтовым сервером и прокси. Совмещать функции или нет на одном железе - это уже другой вопрос. Любые готовые решения не в состоянии предоставляют "полной" гибкости, конечно.
    Ответ написан
  • Softether vpn server исчезает инет почему?

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

    @res2001
    Developer, ex-admin
    Одно время работал на компанию, находящуюся на другом конце страны, разница во времени 8 часов. Все нормально. Когда надо было пообщаться с офисом приходилось предпринимать дополнительные действия - встать рано или наоборот. При приеме это все обсуждалось, график работы зафиксирован в договоре.
    С трудовой проблем не было - отправил почтой первым классом. У меня то же были опасения на счет трудовой и я перед отправкой сделал нотариально заверенную копию, не пригодилась. Потом оформил электронную трудовую, что и вам рекомендую (это должен делать работодатель, вам надо только написать заявление).
    Почта, кстати, работает нормально. Заказные письма ходят достаточно быстро, ни разу косяков не было. Первый класс - чуть дороже и чуть быстрей, но не критично. Только надо определится с оптимальным временем посещения этого заведения, т.к. в часы пик там обычно много народу. У меня до сих пор оптимально 12-16.

    Трудовой договор и прочие документы можно отправлять обычным заказным письмом.
    Хорошо иметь дома принтер (подойдет черно-белый), т.к. регулярно надо будет что-то печатать/подписывать/пересылать, не часто, но 3-4 раза в год точно.

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

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

    @res2001
    Developer, ex-admin
    Пинг - это команда:
    ping <IP адрес сервера>
    ping использует протокол ICMP для запросов и ответов. ICMP может быть заблокирован фаерволом на хостах в интернете, так что успешное прохождение не гарантируется.
    Ответ написан
  • Какая книга по c++ на данный момент актуальна, годна?

    @res2001
    Developer, ex-admin
    Если учить с нуля, то сгодится любая толстая книга по языку более-менее современного издания. Смотрите, что бы в ней был учтен хотя бы стандарт С++11 или С++14. Не пытайтесь найти учебник с самым последним стандартом - их нет. Например, Прата или Лафоре последних изданий сгодятся вполне. Тот же Лоспинозо, судя по содержанию, наверное то же подойдет.
    Дальше уже надо будет углубляться в зависимости от сферы деятельности и интересов.
    Углубленно именно по языку в разных направлениях на русском могу порекомендовать:
    1. Майерс "Эффективный и современный С++. 42 рекомендации ..." - толково о нововведениях в С++11/14.
    2. Уильямс "C++. Практика многопоточного программирования"
    3. Гантерот "Оптимизация программ на C++" - рассказывает про устройство STL, что и в каких случаях лучше применять с замерами производительности и т.п.
    Все 3 книги не для новичков, требуют уже нормального понимания базовых принципов и некоторой практики.
    Ответ написан
    Комментировать
  • Как заменить символ во всех файлах?

    @res2001
    Developer, ex-admin
    Для обхода файлов по маске используете цикл for. Из переменной цикла с помощью модификаторов получаете имя файла. С помощью операции замены подстроки в команде set делаете замену в имени файла. С помощью ren задаете файлу новое имя.
    Для справки:
    for /?
    set /?
    ren /?
    setlocal /?

    Модификаторы для переменной цикла описаны в справке по for.
    В теле цикла вам придется изменять переменные и тут же использовать новые значения. По умолчанию в батниках это не работает. Чтоб работало надо в самом начале дать команду
    setlocal ENABLEDELAYEDEXPANSION
    Затем для обращение к переменной в нутри цикла использовать восклицательные знаки, а не знаки процента, например так: !var!. Это приведет к отложенной подстановке переменных в команду. Переменная цикла всегда работает с процентами %%i
    Ответ написан
    Комментировать
  • Как закрепить ярлык на панели задач через gpo?

    @res2001
    Developer, ex-admin
    Ответ написан
    Комментировать
  • Где найти полное руководство пользователя по Линуксу?

    @res2001
    Developer, ex-admin
    Дистрибутив Linux - это такой конструктор из нескольких достаточно глобальных вещей, которые могут меняться от дистрибутива к дистрибутиву, но их не так много и количество комбинаций не то что бы сильно велико. Но т.к. это конструктор, то общей "всебъемлющей" документации нет (кроме страниц ман, по понятным причинам) - в этот конструктор входит ПО, которое делают разные люди, часто никак не связанные с теми кто выпускает конкретный дистрибутив.
    То что объединяет все дистрибутивы - это ядро линукс и набор "стандартных" утилит. По утилитам подойдут любые книжки по администрированию линукс. Про ядро то же можно что-нибудь найти, если вы программист.

    То что отличает дистрибутивы один от другого:
    1. пакетный менеджер: отвечает за установку и обновление софта, а так же за обновление всей ОС
    2. системный менеджер: чаще всего сейчас это systemd, но есть и альтернативы, он отвечает за старт ОС, за запуск служб и т.п.
    3. GUI - графических оболочек довольно много, хотя часто ноги растут из гнома или кед, каждый дистрибутив пытается добавить что-то свое отличительно в GUI оболочку, чтоб его можно было узнавать на фоне других. Но именно этот аспект ОС по большому счету не сильно важен - управлять ОС, в т.ч. и GUI можно из командной строки. Сейчас в GUI уже есть довольно много инструментов для управления ОС, но далеко не все.

    Есть и другие подсистемы Linux поменьше, которые могут отличаться в разных дистрибутивах, например сетевая подситсема.

    Так что изучать нужно конкретный пакетный менеджер, конкретный системный менеджер, конкретную графическую оболочку, которые используются в конкретном дистрибутиве по документации на их сайтах. А так же стандартный набор утилит и стандартные правила работы Linux, которые едины для всех дистрибутивов и по ним есть книги.
    Ответ написан
    Комментировать
  • Две сессии на win 10, возможно?

    @res2001
    Developer, ex-admin
    RDPWrapper позволяет такое делать, ищите на гитхабе. Но это нарушение лицензии.
    Ответ написан