Задать вопрос
  • Какие есть надёжные способы замены ip (типа vpn)?

    @res2001
    artur444, Могут быть, конечно.
    Лично я не пользуюсь этим сервисом, но исключать подобные варианты не стал бы. К тому же от этого не спасет ВПН. Если у вас сервис уже работал на русской винде, то скорее всего они это не используют. Но могут быть и другие варианты "вторичных признаков".
  • Какие есть надёжные способы замены ip (типа vpn)?

    @res2001
    CityCat4, Это вряд ли. ВПН трафик к нему не попадает.

    В легкую он может раскусывать только адреса известных ВПН сервисов или, как писал Drno, адреса хостингов. Это не то же самое, что распознавать факт прихода через ВПН.
    Кстати, ВПН в этом случае не обязателен, т.к. не стоит задачи спрятать трафик, можно на VPS настроить прокси вместо ВПН.

    Но становится проблемой найти забугорный VPS с адресами не заблокированными в ChatGPT.
    Можно, например, попробовать поискать VPSы в каких-нибудь экзотических странах, в Южной Америке или в Африке.

    Так же он может распознавать какие-то вторичные признаки, типа русской винды или установленной русской раскладки клавиатуры.
  • Как правильно перенаправить трафик с одного сервера на другой?

    @res2001
    Что мешает пользователям ВПН раздать в качестве адреса ДНС сервера адрес вашего DNS adguard home?
    Многие ВПН позволяют это делать.
  • Как правильно написать функцию принимающую универсальную ссылку?

    @res2001
    forward применяется там где надо передать дальше ту же семантику, что использовалась при вызове текущей функции. В конструкторе istream_iterator вариантов нет - он принимает только обычную ссылку на поток, так что нет смысла тут заворачивать в forward.
    https://en.cppreference.com/w/cpp/iterator/istream...
  • Почему boolean использует больше памяти чем byte?

    @res2001
    Меньше места он занимать не может из-за ограничений современной архитектуры процессоров. Тут уже отвечали про минимально адресуемую область памяти, смотри выше.
    Другое дело, что можно сделать оптимизированную реализацию массива boolean, где каждый отдельно взятый boolean будет занимать 1 бит. Но это не то же самое, что переменная типа boolean.
  • Почему boolean использует больше памяти чем byte?

    @res2001
    Можно сделать кастомную реализацию с побитовыми операциями, тогда можно будет засунуть восемь boolean переменных в один байт, но вряд ли есть хоть один язык программирование, где такое будет сделано штатно

    Есть такое. В С++ std::vector<bool> именно так и реализован:https://en.cppreference.com/w/cpp/container/vector_bool
    Для него в std написана специализация.
  • Как сервера взаимодействуют с клиентом если IP адреса не уникальные?

    @res2001
    Holy Molly, Есть технологии, позволяющие обходить NAT. Смотри, например, STUN.
    Любое ПО, которому нужен p2p обмен использует ту или иную технологию обхода NAT. Это все не просто и надо глубоко понимать вопрос, чтоб в этом разобраться.
    Любая технология обхода NAT зависит от некоего сервера, имеющего белый известный всем участникам адрес (или должен быть способ узнать этот адрес). Этот сервер нужен только на этапе "установления соединения", дальше обмен идет на прямую.
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    @res2001
    Totem, По многопоточности в стандартной библиотеке есть книга Энтони Вильямса.
    По системным функциям Линукс можно ман читать или например книгу Майкла Керриска.
    Про винду - у микрософта есть хорошая документация в свободном доступе. Книги не скажу, наверняка то же что-то есть.
    Неплохой курс по параллельному программированию есть тут: https://compscicenter.ru/courses/hp-course/
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    @res2001
    Wataru,
    Но внутри condition variable использует те же самые сигналы.

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

    На сколько я понимаю, в наиболее типичном применении как раз и будет лучший случай, т.к. система после yieldа, скорее всего, сразу уберет поток с исполнения и поставит в конец очереди, а т.к. потоки в примере с одним и тем же приоритетом, то следующий раз очередь на выполнение для потока b дойдет только после потока a.
    Тут много допущений, которые надо проверять, и возможно в конкретной системе ТС будет не такое поведение.

    На сколько я знаю под виндой нет родного condvar, поэтому реализации наверняка используют те самые WaitForSingleObject и Event, так что это по сути то же самое. Только имеющее стандартный интерфейс. Согласен - мьютекс надо лочить, это дает немного оверхеда. Для винды я видел пару реализаций condvar, в то время когда MSVS еще не дорос до собственной, а С++11 уже вышел.
    В обычном случае лично я предпочту использовать стандартный интерфейс, чем платформозависимый.
    Но если это критическая к скорости выполнения задача, то возможно стоит использовать родное решение для конкретной платформы, но только в случае если стандартное заметно проигрывает с скорости.
  • Как убедиться что атомарные операции будут выполнены точно правильно?

    @res2001
    Wataru, Задействовать сигналы для связи между потоками кажется избыточным.
    В этом случае я бы использовал ожидание на condition variable.

    Так же можно использовать барьеры (std::barrier в С++20 или pthread_barrier) - собственно барьеры "специализированы" на синхронизации потоков. Барьеры, скорее всего, сделаны на мьютексах и condvarах, не то чтобы это какой-то отдельный примитив синхронизации - просто готовая реализация для частного случая.

    Если задача только в синхронизации потоков, то атомики не нужны.

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

    @res2001
    Totem, Когда имеете дело с потоками, то вообще нет никаких гарантий порядка выполнения, кроме тех, которые ты обеспечил себе сам.
    Циклы в атомарных операциях используются повсеместно.
  • Как развернуть второй сервер OpenVPN на одном железе?

    @res2001
    dmvlch_dev,
    Я так понимаю нужен либо tun либо tup адаптер, или оба?

    Нужен только тот, который вы используете в конфиге в опции dev, и в том количестве, сколько вы планируете запускать экземпляров openvpn с этим типом адаптера.
  • Как развернуть второй сервер OpenVPN на одном железе?

    @res2001
    dmvlch_dev, Просто создать еще один адаптер. Настраивать адаптер не требуется.
    Если не указывать номер адаптера в конфиге (dev tun0), а просто указывать dev tun, то openvpn сам выберет первый свободный адаптер нужного типа (в этом случае и менять конфиг не требуется).
  • Как используются "магические константы" в реальных реализациях?

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

    Вас не смущает использование магической константы NULL?

    Магическими их называют, потому что, когда вы в коде используете константу типа 1234 - то нифига не понятно, что эти цифры означают в коде и зачем они тут. Поэтому они магические - не понятные. Если этой константе дать имя, то магия может исчезнуть, если имя будет удачным.
  • Как попасть в IT школьнику?

    @res2001
    Eugene-Usachev, Оттачивай навык, если есть желание. Пообщайся с людьми, это лучше чем "общаться" с компьютерами.
  • Как исправить ошибку Error LNK2019 unresolved external symbol... при вызове функции из сторонней библиотеки?

    @res2001
    Андрей,
    я сторонню библиотеку указал в Additional include Directories

    Название пункта говорит само за себя - вы указали дополнительный путь где компилятор будет искать файлы заголовков, чтоб их можно было включить директивой #include.
    То, о чем я писал выше вы не сделали. Как написал Александр Ананьев, библиотеку надо добавить еще и в опции Linkerа.
    Но что бы это добавление работало, библиотека должна быть доступна компилятору, т.е. уже собрана как статическая или динамическая библиотека (см. коментарий Станислав Макаров ).
    В микрософтовском компиляторе используются lib файлы для компоновки с библиотеками. В случае со статической библиотекой lib файл содержит саму библиотеку в бинарном виде. Для динамической библиотеки dll библиотеки будет лежать отдельно, а в lib файле будут только ссылки на dll.
    При компоновке нужен lib файл библиотеки.
    При запуске вашей программы в случае использования динамической библиотеки dll должна быть доступна загрузчику ОС, lib файл на этом этапе не используется.
  • Как исправить ошибку Error LNK2019 unresolved external symbol... при вызове функции из сторонней библиотеки?

    @res2001
    Чтоб использовать библиотеку не достаточно только подключить заголовочный файл директивой #include надо еще и указать компилятору использовать библиотеку в опции -l.
    В MSVS используемые библиотеки указываются где-то в опциях проекта, точнее не скажу.
  • Как искать значение в сбалансированном бинарном дереве?

    @res2001
    lightseeker,
    По какой логике надо искать ?

    Ну у вас же была какая-то логика по которой вы запихнули вторую тройку именно к правому потомку (под четверку), по той же логике вы ищите и все последующие вхождения. Т.е. если у вас дубликаты всегда в правом потомке, то и ищите их там же - левый можно не обходить.
    Но я бы воспользовался советом GavriKos хранить количество дубликатов в листьях. Точнее хранить количество вхождений значения вместе со значением. Для вашего случая, когда данные - это просто числа, количества будет достаточно. В более сложных вариантах может потребоваться организовать, например, связный список в каждом узле.
  • Как можно передать структуру в printf, а к переменным её обращаться из шаблона?

    @res2001
    Если "о структуре мы ничего не знаем", только указатель на void вместо структуры, то и вывести мы ничего не можем.
    Даже имея шаблон это не сделать корректно в общем случае.
    Тем более printf это не умеет.

    Но printf умеет так:
    S1 s1 = (S1){1, 1};
    printf("A:  %d,  B: %d",  s1);

    Т.е. тут не указатель void, а полностью определенная структура. Это работает, потому что компилятор кладет на стек в качестве параметров printf всё содержимое структуры. Поля в шаблоне нужно указывать в порядке следования полей структуры, пропускать и добавлять поля нельзя.
  • Высокий пинг по необоснованным и не понятным причинам. В чем может быть дело?

    @res2001
    ilya12081991, Проверить просто:
    Выключите других потребителей вашего интернета и
    1. по перемещайтесь с ноутом по квартире и одновременно следите за пингом.
    2. подключитесь к роутеру проводом и посмотрите пинг
    Если в обоих случаях пинг не улучшается, то проблемы не с сетью, а с компом. Смотрите, что там у вас грузит процессор/сеть/диск.