• Как отключить пересылку (forwarding) для IPv4 навсегда (Windows)?

    @res2001
    Developer, ex-admin
    Глобально за пересылку отвечает параметр в реестре:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter
    Установите его в 0 и перезагрузитесь.
    Ответ написан
    4 комментария
  • Что означает запись?

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

    @res2001
    Developer, ex-admin
    Однако с точки зрения оптимизации, эстетики и/или стандартов, как писать все-таки лучше

    Как хотите.

    На самом деле опциями компилятора можно задать выдавать предупреждения (или даже ошибку) на подобное не явное приведение типов. Тогда это будет "не красиво" или даже вообще ошибка компиляции, и тут вам придется исправлять ситуацию добавив суффикс.
    Но подобные опции используют не часто. На сколько помню для gcc это опции -Wsign-conversion и/или -Wconversion но могу ошибаться. И, по моему, они даже не включаются через -Wall -Wextra -pedantic - обычно используют этот набор опций, когда хотят заставить компилятор выполнять больше проверок кода.
    Немного модифицировав опции можно добиться не предупреждения, а ошибки.

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

    @res2001
    Developer, ex-admin
    Цикл в батниках это for. Есть специализированные циклы (смотрите параметры for) для обхода папок и файлов.

    Так же можно получить список файлов с помощью dir. Опциями dir можно ограничить вывод например только файлами (dir /a-d) или только папками (dir /ad), задать сортировку и т.п. Вывод можно прогнать через фильтр findstr или find (dir ... | findstr "filtr string) и это все завернуть в for /f для разложения строк вывода на лексемы.

    Для справки:
    for /?
    dir /?
    findstr /?
    find /?
    if /?
    Ответ написан
    8 комментариев
  • В чем отличие ngnix от golang?

    @res2001
    Developer, ex-admin
    Веб сервер занимается обслуживанием сетевых соединений, передачей данных по сети и т.п. вещами.
    Приложения на go, PHP и прочих питонах вызываются веб сервером для генерации ответа на пользовательский HTTP запрос, в приложение в качестве параметра передается сам запрос. В простейшем случае, веб-сервер в качестве ответа может просто возвращать статический файл на диске, а не запускать программу.
    Таким образом приложение напрямую не взаимодействует по сети с клиентом, а работает через посредника - веб-сервер.
    Ответ написан
    7 комментариев
  • Диспетчер печати сильно грузит CPU. Почему?

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

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

    Из того, что реально необходимо в большинстве проектов:
    1. параллельное программирование: Энтони Уильмс C++. Практика многопоточного программирования
    2. сетевое программирование: Уильям Стивенс UNIX: Разработка сетевых приложений
    3. Разработка под линукс: Керриск Майкл Linux API. Исчерпывающее руководство
    4. базы данных. Тут очень много книг и много вариантов так что советовать ничего не буду, но стоит освоить работу хотя бы с одной реляционной базой данных и знать SQL. Рекомендую смотреть в сторону Postgres.
    Ответ написан
    Комментировать
  • Таблица маршрутизации?

    @res2001
    Developer, ex-admin
    1. Маршрутизаторов может быть много. Например, сеть большого предприятия, где используется несколько подсетей + доступ в интернет. На какой именно маршрутизатор должен отправлять пакет хост, предназначенный не для своей сети?
    2. Маршрутизаторы добавляются в систему то же через таблицу маршрутизации. Для шлюза по умолчанию в таблице маршрутизации добавляется маршрут для сети 0.0.0.0 (т.е. все адреса).

    Кстати, комп с виндой, даже не с серверной виндой, вполне может выступать в качестве маршрутизатора, т.к. винда умеет в маршрутизацию.
    Ответ написан
    Комментировать
  • Как работают std::mutex?

    @res2001
    Developer, ex-admin
    Энтони Уильямс: C++. Практика многопоточного программирования
    https://en.cppreference.com/w/cpp/thread

    Вы не блокируете тред, вы блокируете мьютекс. Если мьютекс уже заблокирован другим потоком, то второй тред будет ждать пока освободится мьютекс и потом его заблокирует. Ожидание будет происходить непосредственно в методе lock мьютекса. Есть вариант try_lock - когда ожидания не происходит, но если мьютекс уже захвачен кем-то, то возвращается соответствующая ошибка.
    В общем случае применение мьютекса выглядит так:
    m.lock()
    <unsafe operation>
    m.unlock()


    Конструкторы можно не удалять, просто в них нужно блокировать мьютекс объекта источника. Мьютекс объекта назначения блокировать не нужно, т.к. это конструктор и класс только создается и им пока еще никто не владеет, так что доступ к членам класса будет монопольный. Но в этих конструкторах надо создавать новые мьютексы для объекта назначения.
    Ответ написан
    1 комментарий
  • Устарел ли учебник Стивена Прата по C++?

    @res2001
    Developer, ex-admin
    Знаю только одну книгу на русском по С++20: https://dmkpress.com/catalog/computer/programming/... Хотя пристально вопрос не отслеживаю, возможно появилось что-то еще в других изданиях. Эта книга совсем не учебник - вы не научитесь по ней программированию на С++.
    Тем более вы не найдете учебник, где бы был описан 20 стандарт. Возможно на английском есть.
    Вообще книги формата учебников подтягиваются к современным стандартам с большим запозданием - лет 5 это норма. В любом случае Прата подойдет для изучения языка. После него можно углубить изучение каких-то вопросов, по которым остались пробелы и изучить нововведения поздних стандартов.
    Ответ написан
    Комментировать
  • Как исправить вылетание системы при попытке очистить корзину?

    @res2001
    Developer, ex-admin
    Запустите командную строку cmd.exe и от туда удалите что-нибудь не нужное и большое (например почистите свой %TEMP% - там обычно куча мелких файлов и подкаталогов, которые не нужны, но занимают место на диске). Удаление из cmd происходит минуя корзину. Это действие немного освободит пространства на диске и возможно корзина заработает нормально.

    В принципе удалять минуя корзину можно и из проводника, для этого выделите файлы и жмите Shift+Del.
    Ответ написан
    Комментировать
  • Spoolsv.exe завершает работу. Имя сбойного модуля: wsnmp32.dll. Как найти что работает не правильно?

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

    @res2001
    Developer, ex-admin
    Модуль B использует данные из Модуля A

    Что за данные?

    смаке оперирует целями и зависимостями, а не данными.
    Зависимости можно указать с помощью add_dependencies, подключить библиотеку с помощью target_link_libraries.
    Если у вас в каком-то из модулей генерируются какие-то данные, то, видимо, там есть custom_target - укажите его в зависимостях вышележащего уровня.
    Ответ написан
    9 комментариев
  • Почему программа "Конвентер Валют" выдаёт 0.000000 при любом значении?

    @res2001
    Developer, ex-admin
    Ответ в комментариях
    Ответ написан
    Комментировать
  • Как оформить код?

    @res2001
    Developer, ex-admin
    Это же трехмерный "кубический" массив. Нет смысла делать такую сложную конструкцию.
    Делайте std::vector<int> values(size * size * size);
    Правда индексы придется вычислять ручками или можно оформить это в виде своего класса и переопределить операцию индексации.
    Выделять память одним большим куском для многомерных массивов - это правильно.
    Ответ написан
    Комментировать
  • Зачем указывать адрес?

    @res2001
    Developer, ex-admin
    При биндинге можно указать вместо адреса константу INADDR_ANY (0.0.0.0) - т.е. все доступные адреса, тогда программа будет слушать указанный порт на всех адресах, доступных ОС.
    Адрес 127.0.0.1 (или любой из подсети 127.0.0.0/8) назначают, обычно тогда, когда сервис должен работать только в рамках локальной машины. Например у вас есть обратный прокси на nginx и пара сайтов на apache. Прокси будет слушать внешний адрес на 443 порту, а сайты вполне могут слушать 127.0.0.1 и принимать подключения только от прокси.
    Ответ написан
    Комментировать
  • С чего начать изучения сетевого программирования?

    @res2001
    Developer, ex-admin
    Классика жанра - книга Стивенса "UNIX. Разработка сетевых приложений"
    Книга старая, по моему последнее издание 2007 года. В сети есть в электронном виде. Если повезет можно купить в букинистических магазинах.
    Хоть она и старая, но все описанное вполне живо и активно используется. Там примеры на Си. Но в шарпе и во всех других ЯПах принципы сетевого программирования одни и те же, т.к. используют для реализации обмена средства, предоставляемые ОС, а в книге описаны именно они.

    UPD: Если что, то под виндой все то же самое. Конечно, есть свои нюансы местами, но не критично.
    Ответ написан
    Комментировать
  • Как реализовать сетевую маршрутизацию между двумя OpenVPN серверами?

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

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

    В линуксе для динамических библиотек используется каталог (/lib; /usr/lib) отличный от каталога с исполняемыми файлами (/bin, /usr/bin), поэтому появляется возможность устанавливать библиотеки через пакеты пакетного менеджера универсально для всех программ, использующих данную библиотеку. В пакете программы просто указывается зависимости от пакетов используемых библиотек.
    В винде принято все зависимости программы устанавливать в каталог с исполняемым файлом программы. И тут нет какого-то общепринятого механизма делать как линуксе. Хотя никто не запрещает вам делать свой собственный софт с подобным механизмом, но сам механизм вы должны придумать и поддерживать самостоятельно в своем софте и кроме ваших программ никто больше использовать этот механизм не будет.

    В cmake есть еще вариант поиска пакетов с помощью pkg-config: https://cmake.org/cmake/help/latest/module/FindPkg...
    Ответ написан
    Комментировать
  • Как присвоить динамическому массиву типа void* значение в Си?

    @res2001
    Developer, ex-admin
    Нельзя выделить память для произвольного типа, т.к. размер произвольного типа - произвольный. Память всегда выделяется конкретного размера.

    В вашем примере вы выделяете память для двух указателей (void*). На всех распространенных платформах указатель, не важно на какой тип он ссылается, имеет один и тот же размер.
    Нельзя сделать разъименование void*, т.к. это указатель с неопределенным типом - компилятор не знает какого типа данные лежат по адресу в указателе, а следовательно не может с ними корректно работать. Для нормальной работы нужно привести указатель к какому-нибудь типу и потом уже можно делать разъименование (ваш 3 пример).

    Ваш пример не корректен для х64 платформы, т.к. sizeof(void*) там 8 байт, а sizeof(int) - 4 байта.
    Вы mallocом выделяете 16 байт памяти (2 указателя), а в 3 присваивании (которое работает) присваиваете значение 10 старшей половине первого указателя. В общем выглядит как бред.
    Для х32 - корректен, т.к. тут sizeof(void*) == sizeof(int)

    Для копирования двух массивов произвольного типа и размера, нужно знать размер массива в байтах (не в элементах). Можно не знать тип, но знать размер необходимо - иначе ничего не поучится. Выделяете память заданного размера, приводите указатель к char* и побайтово копируете (memcpy).
    Приводить к int* и копировать intы в этом случае нельзя, т.к. массив может быть, например 3 байта или 33, тогда при копировании через приведение к int* вы неминуемо выйдете за границу массива.
    Ответ написан
    Комментировать