Задать вопрос
  • Почему при работе батника не отображается результат поиска файла?

    @res2001
    Developer, ex-admin
    Попробуйте такой вариант цикла в searchdone: for /f "usebackq delims=" %%I in ("%tempfile%")

    Согласен с pumpkinm, на счет выполнения вложенного cmd. Возможна ситуация, что на момент выполнения чтения файла с результатом, этот файл все еще захвачен процессом вложенного cmd и type не может его прочитать.
    Ответ написан
  • Не работает case в switch. Как решить проблему?

    @res2001
    Developer, ex-admin
    Блоки case в операторе switch это просто аналог меток для goto. Соответственно после перехода на какой-то case выполнение программы продолжается по всем строкам кода подряд. И если вы не предусмотрели явный выход из блока case (с помощью break или return), то выполнение продолжится и в следующем case и т.д.

    Современные компиляторы умеют выдавать ошибки или предупреждения для таких случаев, т.к. очень часто в коде действительно присутствует ошибка - пропуск оператора break или return (как у вас). В gcc для этого служит опция -Wimplicit-fallthrough. Иногда проваливание в следующий case бывает полезно и используется на практике программистами, тогда (при использовании опции -Wimplicit-fallthrough) надо явно указать на это компилятору. В документации gcc в описании этой опции указано как это сделать.

    Вообще рекомендую ужесточать проверки компилятора, как минимум с помощью стандартных опций: -Wall -Wextra.
    А так же указывать какому стандарту языка надо придерживаться компилятору: -std=c++17 или -std=gnuc++17
    Можно добавить и опцию: -pedantic
    По умолчанию многие полезные предупреждения отключены.
    Многие предупреждения можно перевести в ошибку или игнорировать.
    Есть и другие полезные проверки, которые может делать компилятор, которые не входят в -Wall -Wextra. Но для начала используйте хотя бы их.

    Описание опций предупреждений gcc смотри тут: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
    Ответ написан
    Комментировать
  • Как хранятся многомерные массивы в памяти?

    @res2001
    Developer, ex-admin
    Многомерные массивы можно задавать несколькими способами:
    int arr1[2][3];
    int (*arr2)[3] = new int[2][3];
    int *arr3 = new int[2*3];
    int **arr4 = new int*[2];
    arr4[0] = new int[3];
    arr4[1] = new int[3];
    
    // Следующие утверждения верны:
    static_assert(sizeof(arr1) == (sizeof(int)*2*3));
    static_assert(sizeof(arr2) == sizeof(int(*)[3]));
    static_assert(sizeof(arr3) == sizeof(int*));
    static_assert(sizeof(arr4) == sizeof(int**));
    
    static_assert(sizeof(arr1[0]) == (sizeof(int)*3));
    static_assert(sizeof(arr2[0]) == (sizeof(int)*3));
    static_assert(sizeof(arr3[0]) == sizeof(int));
    static_assert(sizeof(arr4[0]) == sizeof(int*));

    В 1-3 варианте данные массива хранятся последовательно друг за другом по строкам. 4 вариант - это "массив массивов" (его могут называть и по другому), тут требуется отдельный массив указателей, данные строк могут хранится в разных местах памяти.
    Обращаться к элементам arr1, arr2 и arr4 можно с помощью индексации: arr1[i][j] и это будет работать, но по разному для arr1/2 и arr4.
    arr3 это по сути одномерный массив. То что он двумерный знаете только вы как программист. Поэтому через индексацию можно обращаться только к первой размерности. Чтоб включить и вторую размерность потребуется ее явно посчитать. Например для элемента arr2[1][2]:
    *(arr2 + 1 * 3 + 2);
    // или то же самое
    arr2[1*3 + 2];


    С точки зрения производительности 4 вариант самый плохой, т.к. для обращения к элементу требуется два чтения памяти, а так же из-за того что каждая строка хранится отдельно от других в памяти, то кэш процессора будет использоваться менее эффективно, чем для остальных вариантов. Кроме того тут используется дополнительный массив указателей (первая размерность).
    Не смотря на то что 3 вариант кажется довольно многословным (особенно если константы заменить на осмысленные имена переменных), но на производительности это никак не сказывается, т.к. по сути те же самые вычисления индекса делаются и для arr1/2, только для них это делает компилятор сам неявно.
    Ответ написан
    Комментировать
  • Не могу понять почему не работает USER тред?

    @res2001
    Developer, ex-admin
    Видимо потому что main заканчивается и программа завершается вместе со всеми потоками.

    Вообще не понятно, что ты этим хотел сказать. Где вызов swapcontext? Без него стеки псевдопотоков не используются и переключение контекстов не происходит. Зачем они тогда тут нужны?
    В прошлом варианте с таймером, по крайней мере, была идея и было понятно, чего ты хотел добиться. Хоть оно и не работало.
    Ответ написан
  • Как отключить TlS в Windows?

    @res2001
    Developer, ex-admin
    Отключить TLS в винде можно настройками реестра. В свое время, когда нашли уязвимость в SSL3.0, все ринулись переходить на TLS с помощью запрета SSL. Аналогично можно запретить и TLS.
    Вот статья с того времени, там найдете указание где это отключается в реестре: https://www.atraining.ru/beast-move-from-ssl-to-tls/
    Описание самих ключей реестра ищите у микрософта.

    Но это влияет на софт, который использует механизмы ОС для шифрования трафика. Например это работало для RDP или для Internet Explorer.
    Если приложение использует например openssl для шифрования, то этот вариант не будет работать. Тут надо искать какой-то вариант запрета через openssl. Есть и другие библиотеки, реализующие шифрование.
    Ответ написан
    Комментировать
  • Как решить проблему с Segmentation fault?

    @res2001
    Developer, ex-admin
    Ошибка выполнения stat для файла: No such file or directory

    Потому что:
    strcpy(filename, "mntEntry->mnt_dir");
    Вы записываете в filename строку "mntEntry->mnt_dir", а не каталог.
    Добавить затем слэш в конец можно так: strcat(filename, "/");
    Или вручную:
    size_t len = strlen(filename);
    filename[len] = '/';
    filename[len + 1] = '\0';

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

    Есть еще момент. В линукс есть константа PATH_MAX она задает максимальный размер пути к файлу. Рекомендую ваши буфера для хранения путей делать размером PATH_MAX.
    Ответ написан
  • Шифрует ли SSH web-трафик при подключении к http://localhost в браузере?

    @res2001
    Developer, ex-admin
    Данные от ssh клиента до ssh сервера идут в шифрованном виде.
    От браузера до ssh клиента и от ssh сервера до веб сервера идет обычный HTTP или HTTPS.
    Ответ написан
    Комментировать
  • Почему после ассемблера учить Си легче?

    @res2001
    Developer, ex-admin
    Утверждение пожалуй верно.

    Лично на мой взгляд это из-за того, что и в ассемблере и в Си есть указатели. Причем в ассемблере ничего кроме указателей для работы с памятью нет (имею ввиду именно оперативную память, а не регистровую или ПЗУ) и вам волей-неволей на ассемблере придется понять, что это такое и как реально работает память в компе. И с этими знаниями очень легко уже понять указатели в Си, т.к. это суть одно и то же, только синтаксис разный.

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

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

    У издательства ДМК пресс есть книжки по ассемблеру (в т.ч. по АРМ) и по архитектуре компьютеров, можете посмотреть у них на сайте, там же можно и купить. Что плохо, они не делают скидку на электронные книги, как многие другие.
    Изучать нужно ассемблер под ту платформу, на которой вы сможете писать тестовые программы. Обычно это х86, но при наличии, например, малинки или апельсинки можно и АРМ попробовать.
    Конечно можно и эмулятором воспользоваться, но это лишние проблемы. А может и не лишние - если уж вы хотите ассемблер, то это может пригодиться.
    Ответ написан
    Комментировать
  • Если в Linux операции с файлами в пределах потока блокирующие, то как тогда работают БД?

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

    Думаю ваш вопрос не связан с п.1, т.к. это больше про параллельное программирование, а не про файлы и БД.
    Файловые операции легко могут не блокировать поток - асинхронный ввод/вывод.
    Файл можно открыть с монопольным доступом и с общим доступом. В общем доступе этот же файл может открыть и другое приложение одновременно с вашим.
    При общем доступе вы можете блокировать какую-то область файла и работать с этой областью "монопольно".
    БД открывают свои файлы в монопольном режиме.
    В разных потоках одного приложения вы можете открыть файл один раз и работать с одним и тем же дескриптором файлов из разных потоков. Но это может создать кучу проблем с целостностью структуры файла, если много потоков будут не согласованно писать в файл.
    Файловые операции ОЧЕНЬ медленные. Поэтому все нормальные базы данных работают через свой собственный кэш. Поэтому там, обычно нет кучи потоков, которые лопатят файл БД. Движок SQL берет данные из кэша, есть некий "менеджер кэша" - отдельный поток, которому движок дает запрос на данные, если данных в кэше прямо сейчас нет, то менеджер кэша читает данные из файла в кэш и отдает эти данные запрашиваемому потоку. Чтение файла наверняка то же идет не на прямую, а запросы на чтение ставятся в очередь и возможно какой-то другой поток (или тот же менджер кэша) по очереди читает необходимые данные. Аналогично и с записью - через кэш и последующую очередь на запись.
    Если запустить MS Sql Server с настройками по умолчанию с достаточно большой по объему базой он довольно быстро отожрет в компе вообще всю свободную память (конечно, если БД меньше, чем объем ОЗУ, то всю память не отожрет). Не то что бы ему очень нужно прямо сейчас вот столько памяти (он может в это время вообще простаивать), просто он начитал данные в кэш.
    Как-то так я это вижу.
    Ответ написан
    Комментировать
  • Как сделать перенаправление UDP?

    @res2001
    Developer, ex-admin
    PHP будет медленнее, конечно же, но на сколько критично оценить трудно. Т.к. в этой задаче основные задержки будут приходится на системный ввод/вывод, а не на работу самой программы.
    Если хорошо знаете PHP, то реализуйте сначала на нем, оцените производительность и решите надо ли переписывать на плюсах.
    Ответ написан
    Комментировать
  • Как отключить пересылку (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 (или чем вы там пользуетесь) и вас этот вопрос может не парить вообще.
    Если вы пишете библиотеку, которую распространяете в исходниках, то есть вероятность, что пользователь при сборке захочет добавить своих опций и тогда ошибки/предупреждения могут проявится. Можете расставить суффиксы для обхода потенциальных проблем, а можете забить и оставить на усмотрение конечного пользователя библиотеки.
    Ответ написан
    Комментировать
  • В чем отличие 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.
    Ответ написан
    Комментировать