• Что за странная запись в С++?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Для обращения к любому выражению по его имени в C++ имеется механизм поиска имен. Это довольно сложный и многоэтапный механизм, в результате которого исходя из контекста обращения и самого имени транслятор силится понять что же там такое прекрасное имел в виду писатель кода.

    Насколько видно, базово механизм делится на две ветви: поиск квалифицированных имен и поиск неквалифицированных имен.
    И именно в этот момент речь заходит о т.н. квалификации имени выражения.
    Квалификация имени выражения тем полнее, чем точнее от самого корневого пространства имен (т.е. от ::), через все пространства имен и пространства составных типов, написано имя выражения.

    Имя Process::WaitForExit, хоть и является уже квалифицированным за счет указания пространства типа, в котором метод объявлен, все еще остается недостаточно квалифицированным чтобы считаться полностью квалифицированным.
    Вызов метода по его полной квалификации выглядел бы так:
    process.::base::Process::WaitForExit(&exit_code);

    Для чего это нужно. Как уже было сказано выше, UNL силится понять что там задумал писатель исходя из контекста кода и используемого имени. И иногда UNL в этом деле не преуспевает.
    Например если шаблон типа наследуется от шаблона другого типа и пытается в своем интерфейсе использовать поля или методы своего родителя. Иначе транслятор просто не найдет в шаблоне родителя того, к чему там не было прямых обращений.
    Или, например, более полная квалификация требуется для невиртуального вызова виртуального метода.
    Полная квалификация всегда требуется для обращения к выражению внутри пространства имен из кода в другом пространстве имен.
    Еще полная квалификация всегда требуется для обращения к статическим выражениям структур и классов снаружи этих структур и классов.

    Для чего нужно было писать полную квалификацию конкретно в приведенном коде?
    А кто его знает. Метод base::Process::WaitForExit[?] не является виртуальным чтобы сделать предположение о невиртуальном вызове.
    Просто автору так захотелось, наверное.
    Ответ написан
    2 комментария
  • Как найти утилиту для проверки COM объектов?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    https://learn.microsoft.com/en-us/windows/win32/co...

    ставите разработку для си и там где то внутри эта утилита, так же есть и в sdk
    Ответ написан
    1 комментарий
  • Существуют ли курсы с "арендной" моделью?

    vabka
    @vabka
    Токсичный шарпист
    Есть. Тот же JavaRush, например, имеет подписочную модель.
    Ну и при оплате через рассрочку или даже всей суммы целиком - тебя никто не запрещает отказаться от курса и запросить возврат суммы за недополученные уроки.
    Ответ написан
    2 комментария
  • Что не так с кавычками в bash?

    saboteur_kiev
    @saboteur_kiev Куратор тега bash
    software engineer
    Перед тем как выполнить любую команду происходит parameter expansion
    Поэтому если выполнить команду
    find . -name a*
    и в каталоге есть файлы a1, a2 и a3, то баш проведет expansion и на самом деле попытается выполниться команда
    find . -name a1 a2 a3
    что будет синтаксической ошибкой, так как непонятно что такое a2 и a3

    А если написать так:
    find . -name "a*"
    то параметр "a*" уже отправится именно в find и он его распарсит согласно всем правилам wildcard в линукс

    P.S. это касается выполнения любой команды. Просто в find . -name люди чаще всего попадаются.
    А так можно поэксперементировать на
    echo a*
    echo "a*"
    Ответ написан
    Комментировать
  • Почему Doom портируют куда только можно?

    @mayton2019
    Bigdata Engineer
    Doom - это была одна из первых игр где была реализована в полной мере техника BSP (Binary-Space-Partition). Это позволяло в реальном времени очень быстро сортировать и рендерить полигоны без привлечения Z-Buffer. (Рендеринг был чисто прогарммный. На то время еще не было ускорителей 3Д графики и видеокарточка умела только отображать память на экран. ) Игра не была по настоящему трехмерной. А только рализовывала 1 этаж. Рендерить надо было только пол и потолок. Для каждой точки где стоял персонаж. И наклонных горизонтальных поверхностей в ней не было как раз по этой причине. Ее называли 2.5-мерной игрой. Было также много идей оптимизации вычислений. Например вместо вещественных чисел - целые 32х битные с fixed point.

    В скобках замечу что это был 1993 год и на дворе было царство Intel 286/386. Это были машины с тактовой частотой меньше ваших телефонов (Pentium только только релизнулся и еще ни у кого не был). И трехмерный Doom был прорывом. На моем тогда еще 386SX от подтормаживал но играть было можно. И со звуком для SoundBlaster. И конечно это было лучше чем Wolfenstein.

    Аналогичное было реализовано в Duke Nukem 3d. Но Дюк был менее популярен ИМХО. Были и масса других 3д игр в жанке RPG но они были не такие динамичные. Походовые в основном.

    Вобщем сегодня если вы гейм-дев то вам желательно хотя-бы ознакомиться с техниками оптимизации которые были в Doom. Можно почитать и про Quake но это просто развитие идеи BSP деревьев для полного 3D с 5 или 6 степенями свободы. Еще можно почитать про реализацию игры Esctatica. Там не на полигонах а на шариках или эллипсах реализована игровая графика. Тоже интересно.

    UPD: Заменил MMORPG на RPG.
    Ответ написан
    6 комментариев
  • Что делать с кросс-компиляцией на gcc?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    apt-get install gcc-aarch64-linux-gnu

    после этой команды команда dpkg -L gcc-aarch64-linux-gnu покажет тебе содержимое пакета, откуда ты узнаешь, что имя компилятора -- aarch64-linux-gnu-gcc
    Ответ написан
    1 комментарий
  • Как реализовать Алгоритм Брезенхэма?

    @mayton2019
    Bigdata Engineer
    Брезенхем не использует вещественные числа. В этом его суть. Вещественные появляются просто в ходе доказательства его правильности. Но сама реализация - только на целых числах.
    Ответ написан
    4 комментария
  • Может кто-нибудь дать реальную задачу на которой можно применить ООП?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    https://habr.com/ru/post/87205/
    читайте ООП в общем то делалось для удобства, как и паттерны
    Ответ написан
    Комментировать
  • Зачем нужны корневые сертификаты?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    Жил-был у бабушки серенький троллик...
    Вся система PKI - она иерархична и построена на доверии. Больше ни на чем. Только на доверии, которое достаточно один раз обмануть, чтобы перестать доверять системе в целом.

    Есть некое множество контор, которые выпускают SSL-сертификаты. Они не самые лучшие и не самые правильные, просто однажды они собрались и решили замутить бизнес. Почему все доверяют им? Да просто потому что до недавнего времени не было поводов их обвинить в мошенничестве - там все в порядке (было) с "внутренней полицией", которая нарушителей выкидывала нафиг с пляжа.
    Ну и - самое главное - все доверяют им, потому что их корневые сертификаты размещены в хранилищах корневых сертификатов у Windows и Mozilla (Google использует хранилище Windows).

    И все

    Никакой исключительности - просто тупой договорняк размером с мир. Но, поскольку всегда есть возможность поместить в хранилище корневых (кроме как в андроиде, который сразу же начинает визжать "аааа, меня контролирует Большой Брат!") свои собственные сертификаты - эта схема всех устраивала.

    Пока ребята не решили выстрелить себе в ногу, прекратив выпуск сертификатов в зонах .ru/.su/.by/.рф просто по политическим мотивам. Их право - частный бизнес - он такой частный бизнес. Но тут все резко как-то вспомнили, что все "мировые удостоверяющие центры" вовсе нифига не мировые, а просто кучка самозванцев.

    И будут у нас скоро госСA, госсертификаты, госбраузеры и все прочее в порядке импортозамещения.

    Теперь о том, как проверяется валидность сертификата. А проверяется она очень просто - если сертификат выпущен CA, который находится в списке доверенных - он валидный.

    ВСЕ!

    Ты можешь развернуть свой CA, поместить его сертификат в хранилище корневых у себя на компе - и все сертификаты, выпущенные им - для тебя - станут валидными. Выпускай хоть для vk.com, хоть для whitehouse.gov.

    И вот именно поэтому все так боятся поместить в хранилище корневых сертификат от какого-нибудь госСA - потому что все сертификаты, выпущенные им система будет считать валидными! Она не делает разницы между сертификатом от Thawte и от "Товарищ Майор Inc." - она примет сертификат и от того, и от того. А товарищ майор, получив возможность выпускать сертификаты, валидные в Вашей системе, будет выпускать их на ходу и подсовывать их вместо "настоящих", получая доступ к сессионным ключам и таким образом расшифровывая https-трафик (что собственно Fiddler и делает)
    Ответ написан
    8 комментариев
  • Зачем нужны корневые сертификаты?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Кажется, что вся эта конструкция держится на том, что тот единственный корневой (?) сертификат, которым подписаны все остальные, есть только у удостоверяющего центра.
    Именно. Система держится на доверии к УЦ.

    почему все так боятся, что кто-то установит в их систему левый корневой сертификат?
    Потому что это позволит злоумышленнику сгенерировать свои сертификаты на произвольные имена, подписанные корневым сертификатом, которому доверяет ваша система и, при возможности перенаправления трафика, отправить вас на свой сайт или просматривать ваш https-трафик, который вы считаете зашифрованным.

    И сразу второй вопрос: почему какой-нибудь Fiddler, который устанавливает в систему свой корневой сертификат вообще работает?
    Без установки своего корневого сертификата Fiddler не сможет перехватывать https-трафик. Тот, кто ставит себе Fiddler, должен понимать, что в системе возникает уязвимость.
    Ответ написан
    2 комментария
  • Зачем нужны корневые сертификаты?

    vesper-bot
    @vesper-bot
    Любитель файрволлов
    Ну начнем с того, что корневых сертификатов приличное множество. Не один, и не один десяток даже. Пример:
    624e91669b7e4193133731.png
    64 штуки. И сертификат, подписанный любым из них, система считает доверенным. Это, собственно, и причина, почему боятся получить дополнительный корневой сертификат - заранее не знаешь, у кого есть возможность подписи с его помощью, и отличить сертификат, подписанный новым добавленным корневым (транзитивно или нет), можно только после того, как ты его получишь, при этом большинство программ не позволяют пользователю заблокировать соединение, установленное с использованием доверенного сертификата. То есть, вначале тебя с ним поимеют, потом тебе вычищать последствия.
    Fiddler точно так же устанавливает свежесозданный (это важно, новая пара ключей, которых ни у кого нет) корневой сертификат тебе в доверенные корни, и использует его, чтобы на лету генерировать сертификаты для каждого сайта, куда ты ломишься, подсовывая их браузеру, чтобы тот не вякал, а сам выполняя роль man-in-the-middle.
    Вопрос доверия имеющимся "корням" остается на совести администратора системы (то есть вас), при этом по сети могут прилетать обновления списка корневых сертификатов, после которых опять нужно проверять хранилище на случай появления нежелательных для вас корневых сертификатов.
    Ответ написан
    1 комментарий
  • Зачем нужны корневые сертификаты?

    15432
    @15432
    Системный программист ^_^
    Fiddler перехватывает подключение, создает "промежуточный сайт", с тем же именем который и подписан левым сертификатом. Так он может видеть все пересылаемые данные и HTTPS перестает быть безопасным.

    Потому все и боятся левых сертификатов, чтобы локально или на уровне провайдера ваш трафик / пароли / данные карт / переписку не прослушивали.
    Ответ написан
    1 комментарий
  • Как/чем обработать фото лица человека, чтобы оно оставалось ясным для людей, но по нему стало невозможно искать аккаунт в соцсетях?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Самый действенный способ - не выкладывать свои фото в соцсети.
    Проверено на себе. Работает.
    Ответ написан
    2 комментария
  • Что почитать про парсинг?

    BadCats
    @BadCats
    К ответу datka - как к реальному и чисто прикладному - добавлю, что еще можно углубиться в теория формальных языков, грамматики (как работают компилятор, интерпретаторы) - что, возможно, позволит писать более универсальный код - не так сильно привязанный к верстке страницы - т.к можно пытаться анализировать html/xml - на уровне токенов и лексем, даже с кастомными классами и атрибутами для элементов. Но это очень сложная область и возможно, что "овчинка выделки не стоит".
    Ответ написан
    Комментировать
  • Как понять PlatformIO?

    profesor08
    @profesor08
    Написали расширения для VS Code, написали некоторый универсальный фреймворк для разработки. На первый взгляд выглядит неплохо.

    А на ООП можно писать, сделай врапер и пользуйся.
    Ответ написан
    Комментировать
  • Как понять PlatformIO?

    @RockindDemon
    platformio это, во-первых, всё-таки фреймворк. Он задаёт общий формат описания и структуру проекта для микроконтроллеров, умея инсталлировать тулчейны и собирать проекты под разные конфигурации. И наподобие cmake он умеет генерировать файлы проектов для работы в различных IDE.

    Во-вторых, это ещё и плагин к vscode (можно использовать и без vscode, через командную строку).

    Вещь приятная и удобная в использовании, мне нравится.
    Ответ написан
    Комментировать
  • Как именовать булевские "флаги"?

    longclaps
    @longclaps
    Весело у вас )
    Флаг DISABLE, буде он принят, будет явно указывать то, что он обрамляет легаси-код. Придёт новый программист в команду, прочтёт вот это моё предыдущее предложение, и будет не заглядывая в историю коммитов понимать, что про заенабленые фичи можно спрашивать у коллег, а задизабленые придётся разгребать самому (
    Ответ написан
    Комментировать
  • Что делать с include-ами?

    terrier
    @terrier
    Ну, в C++ так не делают.
    Вставлять результаты дефайнов в "#include" явно запрещено, хотя, может быть, было бы и полезно.
    Если вам это действительно сильно нужно - используйте предварительную кодогенерацию, пройтись скриптом по исходникам и подменить какой-нибудь "$placeholder$" на определенную some_const_name должно быть несложно.

    Правильно ли я понимаю, что препроцессор никто и никогда не будет развивать и, видимо, вскоре от него откажутся?

    Нет, пока жив C++, жив и препроцессор.
    Ответ написан
    1 комментарий