• Как сократить накладные расходы при обработке исключений в С++
    +1
    Исключение нужно для исключительной ситуации. ИМХО исключительные ситуации имеет смысл оптимизировать тогда, когда оптимизированы все штатные.
    Судя по всему, предложенное решение сочетает в себе минусы и от retval в стиле Си, и от плюсовых исключений: и (сравнительно) медленное, и может легко быть проигнорировано. Опять же, если исключение должно лететь уровней на пять вверх, весь код там превратится в лапшу из if'ов и переупаковывания Expected'ов.
  • Парковка для ваших минусов
    0
    С чего бы вдруг я захочу/меня заставят делать х2, если х2 платить мне не будут? Вот если будут, тогда ещё можно подумать.
    Другой вариант – внешний по отношению к работе стимул. Мой любимый – ипотека [...]
    Оба варианта – внешние. Ты их не выбирал, ожидания изменились сами, а развиваться пришлось тебе, причём – очень быстро.

    А как я могу не выбрать ипотеку сам, но при этом её получить?
  • Взламываем собеседования: по алгоритмам, по архитектуре, поведенческие и прочее
    0
    «Это была все вина Джерри, он был ответственен за большую часть проекта»
    Эти интервьюеры натренированы и заточены на то, чтобы идентифицировать дрянных людей и уделяют этому особое внимание.

    А если так оно и было? Может коллега Джерри реально косячил со своей частью кода. Или это был Джерри из бизнеса, который развернул требования на 180 градусов незадолго до концов срока. ИМХО ничем не лучше как брать всю вину на себя и рассказывать на собеседовании, как здорово ты всё портил, так и рассказывать, что всё было идеально и ни с какими проблемами не сталкивался.
  • Простые числа — насколько велико наше бессилие?
    +2
    Про представление перечислимого множества в виде полинома можно почитать Ю. В. Матиясевич, «Диофантовы множества». Там автор приводит конструктивное доказательство, алгоритм, как из математического выражения, описывающего перечислимое множество (язык Я5 в терминологии автора), можно получить полином, его описывающий (язык Я0). Я лично целиком весь этот путь не проделывал, но автор пишет
    Такой „перевод" с Я5 на Я0 требует чисто механической, нетворческой работы и в принципе может быть поручен вычислительной машине.

    И с виду написано оно очень понятно и здорово, не нужно быть на 100% в теме всех тонкостей.

    Во всём этом для меня лично особенно круто то, что для доказательства неразрешимости 10 проблемы Гильберта был проложен мост из математики в информатику, чтобы свести проблему в итоге к проблеме остановки. А ещё, имхо, нам очень повезло, что автор разговаривает на одном с нами языке, т.к. мы можем свободно послушать его лекции об этом всём на ютубе в оригинале.
  • Роскачество выбрало самые безопасные приложения для заказа такси
    +3
    «Незашифрованный контент при передаче возможно подменить исполняемым файлом, при открытии которого может быть выполнена вредоносная программа. Таким образом, что мало вероятно, но тем не менее возможно, при желании и определенных навыках злоумышленник может получить контроль над устройством. Более того, отсутствие шифрования делает устройство уязвимым для атак»

    Не, ну это бред. Для этого должна быть определённая уязвимость нефильтрации входных данных, чтобы можно было выполнить произвольный код, да плюс ещё опционально уязвимость повышения прав в системе, чтобы «покинуть пределы приложения». А то эдак мы все уязвимы потому и только потому что браузер может в http-протокол.
    Проблема отсутствия шифрования в том, что передаваемые данные могут быть кем-угодно прочитаны и переписаны. Т.е. если реквизиты банковской карты передаются, можно украсть деньги с этой карты, а если местоположение, то можно перенаправить такси на другой конец города. Но «овладевание» устройством — это вообще не про то.
  • Зарплатная вилка. Ты ж у мамы программист
    +2
    Тут есть три варианта. HR (да и любой другой собеседующий) может:
    1. Намеренно искать «косяк», чтобы сбить ЗП.
    2. Просто не шарить/заблуждаться в критериях.
    3. Может быть прав в своих критериях.

    В именно такой ситуации, как была описана, можно просто соврать, что на предыдущей работе у вас были один/несколько из проектов на шарпе, и опыт есть. Хуже от этого никому не станет:

    • В случае 1 найдутся ещё какие-то косяки, по которым вам нужно платить на 50к меньше, и результат будет тот же.
    • В случае 2, если программист реально шарит (хотя и промышленного опыта реально не было), то он и пройдёт тех.собес, и работать будет отлично.
    • В случае 3, если вы переоценили свои силы, то вы просто не пройдёте тех.собес.

  • Введение в теорию множеств
    +3
    Это в статье вообще некорректный пример, и фиг знает, почему он вообще там есть, и есть именно там (в мощностях). Он больше запутывает.
    Дело в том, что конкретный элемент может иметь только одно из двух отношений к конкретному множеству: либо присутствовать в нём, либо нет. Соответственно, либо в этом множестве есть пятёрка, либо пятёрки нет. Нескольких «одинаковых» элементов не бывает.
  • К вопросу о математике
    +12
    Формулирую задачу — сколько различных номеров длиной К, заканчивающихся на заданной кнопке р, можно набрать на клавиатуре телефона (тастатуре), если мы должны перемещаться по кнопкам ходом шахматного коня.

    Такая задача, возможно, вызовет интерес у любителей задачек изначально. Может быть она чуть-чуть заинтересует тех, кто любит шахматы или просто имеет иррациональную страсть к закономерностям на кнопочных телефонах.
    Но сторонников «математика не нужна» она лишний раз убедит, что математики варятся в своих абстрактных задачах ради самих задач, в абсолютном отрыве от реальности. И что все эти вектора и матрицы нужны для обсчёта бесконечных ходов сферических коней по шахматным телефонам, а не для «настоящих» задач.
    ИМХО чтобы человек заинтересовался математикой, нужно показать, как математика поможет решить лично его проблему. Например, для меня (учился в классе 7 в это время) это была проблема такого плана: как заставить в моём прототипе недоигры на VBA бегать объект по окружности. Тригонометрические функции тогда стали для меня «магией», которая позволила «открыть глаза» и отбросить стереотипы о «ненужных знаниях после арифметики». И чем дальше, тем больше задач, о которые я безуспешно бился лбом, внезапно оказывались решены в сильно более общем случае три века назад именно в математике.
    Собственно, «отбитость» моей задачи беганья по кругу для других людей может быть такого же уровня, как и задача из поста. Чтобы привлечь человека математикой, нужно показать ему решение той задачи, которая интересует лично его.
  • Закон ускоряющейся отдачи (часть 1)
    0
    Ага. А ещё может быть так: что предки видели как линейную зависимость, а мы видим как экспоненту, потомки увидят как примерную синусоиду.
    моё_хобби_экстраполировать.жпг
  • «Скользкие» места C++17
    +1
    Хмм. А разве
    return std::move(b);

    не является бесполезным/вредным? Скотт Майерс в «Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14» писал, что в лучшем случае компилятор поймёт нас, хотя не обязан, а в худшем мы сломаем RVO/NRVO. Или в 17 стандарте что-то с тех пор кардинально поменялось?
  • «Ты гуглишь людей?» или 5 вещей, которые мы делали при найме (но больше не будем)
    +1
    Натыкался на одного человека, у него был блог: там было много политики, мата и всего этого. Понятно, что человек, так скажем, эмоциональный. Соответственно, это нужно учитывать: если у тебя в команде трое спокойные, а кто-то новый на дейликах будет все время поднимать бучу, это скажется на команде.

    А может так человек пар выпускает в интернете, после чего как раз ему неинтересно нести эти темы в рабочий коллектив. ИМХО вообще не показатель.
  • Сон — это главный ресурс для мозга программиста
    +1
    Можно выработать привычку ставить будильник не на пробуждение, а на засыпание. Например, сигнал в 23:30 напомнит, что в 12 уже надо быть в кроватке и начать засыпать. Это совет, кстати, Мэтью Уолкер считает самым важным среди всех, касающихся гигиены сна.

    Такой режим для меня — это прямо насилие над собой. Если я не хочу спать в определённое время, то я, скорее всего, и не усну. Буду ворочаться, перекладывать нагретую подушку, крутить в голове какие-то тупые мысли. Бесполезная и неприятная трата времени. Лучше уж поделать что-нибудь, а лечь тогда, когда организм решит, что ему это нужно. Конечно, таким образом можно просидеть всю ночь, а утром на работу — но это ничего. Это значит, что организм получит свой недосып, а на следующий день уже сам скорректирует своё хотение спать.
    Но, конечно, оно у всех по-своему.
  • Черное Зеркало своими руками — обучаем бота на базе своей истории чатов
    +1
    Потенциально очень полезная штука.
    Интересно, насколько сильно машинное обучение в этом случае справится лучше, чем цепи Маркова, например.
  • Скан-код: Ремаппинг клавиш на клавиатуре
    0
    Я, конечно, понимаю, что прошло 10 лет, но, может быть, эта мечта всё ещё актуальна.
    Когда-то задался для себя этой целью и нашёл программу HIDMacros. Она как раз отлично справлялась с двумя клавами: на одной можно было поставить шорткаты на клавиши так, что те теряли изначальное предназначение, при этом на другой у клавиш оставался прежний смысл. Даже пользовался какое-то время так двумя клавиатурами, но потом надоело.
    Есть, правда, ложка дёгтя: программа больше не развивается автором, а на новых осях уже не работает (личный опыт: на WinXP x86 работала, на Win7 x64 уже нет). Хотя вместо неё автор мутит LuaMacros. Но ей лично я не пользовался, поэтому ничего уже сказать не могу.
  • Неопределённое поведение в C++
    0
    В заключение ещё раз напомню, что все вышеописанные термины относятся к синтаксически валидному коду, который будет успешно скомпилирован. Код, невалидный с точки зрения Стандарта, называется ill-formed program.

    Вот хотел ещё уточнить, может быть кто-нибудь из присутствующих подскажет. Я так понимаю, что если код не компилируется, то это значит, что он является ill-formed. Однако обратное неверно: код может скомпилироваться, но всё равно являться ill-formed, например, если в коде нарушено ODR. Так ли это? Нет ли ещё каких-нибудь вариантов компилирующегося кода, который при этом будет ill-formed?
    И ещё такой вопрос по поводу успешности компиляции: а не может ли UB всё-таки вызвать ошибку компиляции (просто как возможность, не обязательно даже стабильное повторение)? Оно же всё-таки U. Может при развёртывании каких-нибудь шаблонов или макросов, например?
    Хочется для себя по полочкам разложить, как эти все круги диаграммы Венна пересекаются, и что есть их пересечения: Implementation-defined behavior, Unspecified behavior, Undefined behavior, ill-formed, некомпилирующийся код.
  • Реконструкция Midi из видео роликов Synthesia (и ей подобным)
    0
    Классно! Года четыре назад задумывался о чём-то таком, но руки не дошли (да и не возникло прям огромной необходимости). Грустно только, что приходится вот так вот извращаться для того, чтобы получить мидишку, которая в принципе для мелодии есть, но не у тебя.
  • К 2100 году на Facebook будет больше аккаунтов умерших пользователей, чем живых
    0
    Это точно
    – Ничего страшного. За двадцать лет или ишак умрет, или эмир умрет, или я умру!
  • Обработка Segmentation Fault в C++
    0
    Общий синтаксис обработки исключений выглядит следующим образом:

    Нет, это не так. Каждому блоку __try{...} должен соответствовать либо один блок __except(...){...}, либо один блок __finally{...}. При этом допускаются вложенные блоки. Но синтаксиса в стиле «несколько catch паровозиком» как в чистых плюсах нет.
    См., например, Рихтер «Windows via C/C++», 769с:
    Обратите внимание на ключевое слово __except. За блоком try всегда должен следовать либо блок finally, либо блок except. Для данного блока try нельзя указать одновременно и блок finally, и блок except; к тому же за try не может следовать несколько блоков finally или except. Однако try-finally можно вложить в try-except, и наоборот.
  • Ещё один способ отстрелить себе ногу, используя std::thread
    +1
    Посмотрел стандарт — хм, да, действительно, не ведёт. Согласен. Спасибо, буду знать.
  • Ещё один способ отстрелить себе ногу, используя std::thread
    0
    Насколько я понял, это просто фундаментальные ошибки. Если убрать треды из обоих верхних примеров, то проблема никуда не уйдёт.
    Вызывать функцию класса из списка инициализации для поля можно только такую, которая использует лишь поля класса, что были уже инициализированы (и стоят выше этого поля).
    Вызывать виртуальные функции из конструктора и деструктора вообще нельзя (вызов ведёт на ещё не построенный или уже разрушенный «верхний этаж»).
  • Как браузер помогает товарищу майору
    +9
    Подозреваю, что эта фича живёт только в рамках дисков с файловыми системами, которые поддерживают дополнительные стримы. Т.е. передача файла по сети — это, всё-таки, операция передачи байт основного стрима. Да и при архивации тем же WinRar, например, альтернативные стримы теряются.
  • Как браузер помогает товарищу майору
    +26
    Это же просто супер! Всегда хотелось, чтобы к файлам из интернета привязывался их урл, откуда они. Часто бывает, что накачаешь файлов отовсюду, а потом ссылки на оригиналы не найти, а сослаться надо. Я даже в долгосрочных планах свой колхоз хотел писать, чтобы в альтернативные стримы урлы закидывать. А оказывается, что у меня всё это уже из коробки есть, только достать нужно.
  • Типовые ошибки пассажиров железных дорог и авиалиний
    +16
    Мы побороли эту проблему, сделав поля имени и отчества обязательными и установив ограничение на количество знаков во всех полях.

    А после этого не обращались с тем, что теперь фамилия, имя или отчество не влезает?
  • Проблемы безопасности дорожного движения, разбираем по пунктам
    0
    Это жесть, конечно. Но научиться всё это видеть и отсекать лишнее можно.
    Не намерены останавливаться/стоять — большая часть знаков сразу отсекается.
    Увидели сам лежачий или знак — ограничения скорости отсекаются (по нему просто и так нужно проезжать меньше 20, не помню, есть ли это в ПДД, но это просто разумно).
    Пешеходные и «осторожно, дети» — тоже не сильно важная инфа, судя по внешнему виду улицы, пешеходы и так появиться на проезжей части там могут в любой момент — гнать и терять внимание нельзя и так.
  • Под капотом Screeps — виртуализация в MMO-песочнице для программистов
    +1
    Так, на уровне идеи:
    Можно решить проблему выедания пользователем ресурсов тем, что сделать их платными (за операцию/единицу памяти или за операцию/единицу памяти сверх лимита, и т.п.). При этом платой может быть какой-нибудь внутриигровой ресурс, который пользователями же и будет добываться в игровом мире, эдакое топливо для бота. Что-то по примерной аналогии с gas в Ethereum.
    При этом для разработчика такой системы возникнет много интересных задач на подумать, как всё это дело отбалансить, а для игроков потом — как оптимизировать свой код и сколько тактов из него выделить на добычу топлива.
  • Почему Windows XP в 2019 году по-прежнему рулит, или ЧЯДНТ?
    +2
    Вот ещё полезная статья на эту тему. В частности, там автор здорово расписывает в статье и каментах настройку Firefox.
  • За что Android-разработчики ненавидят Google
    0
    Конкретно в этот аккаунт с телефона никогда не заходил.
  • За что Android-разработчики ненавидят Google
    +1
    Сочувствую, сталкивался с такой же проблемой, почти один в один. Но несмотря на то, что я знал все ответы (и оригинальный пароль, который точно не менялся, и ответ на секретный вопрос, и дату создания аккаунта), меня всё равно не пускали в аккаунт, потому что обнаружили «подозрительную активность», повода для которой я реально не давал. Скорее всего, их роботы посчитали подозрительным, что я заходил в акк через хром в инкогнито или что-нибудь ещё.
    Мне в итоге очень повезло, т.к. акк мне восстановили, но геморроя я поимел изрядно. Восстановить получилось через гуглфорум, вот здесь можно почитать мою историю со всеми деталями, возможно, кому-нибудь поможет в аналогичных ситуациях.
    Причём, что любопытно, в этот форум особо-то из справки и шаблонных ответов гугла не попадёшь. Т.е. чтобы найти такую возможность, её нужно искать. Ещё интереснее, если копнуть глубже: «поддержка» этого форума — не работники гугла, а энтузиасты. Как я понял, гугл обещал им какие-то призрачные плюшки за статистику (которую там все активно выпрашивают, копипастя устаревшие инструкции гугла и выпрашивая +1), и вот они там сидят, активничают. Но, если повезёт, там можно встретить и человека, у которого есть реальный доступ к сотрудникам гугла (не роботам). И, опять же, если повезёт, то последние порешают твою проблему.
  • Если изобрести язык программирования 21 века
    +4
    Я вообще не понял, с чем борется автор и как.

    И это вовсе не парадокс, а образец абсолютно корректного следования всеми уважаемому стандарту IEEE 754.

    Числа с плавающей запятой в интерпретации IEEE — вообще не числа. Математика требует ассоциативности от операции их сложения.

    Математика не требует. Требуется то, что описано в стандарте. Т.к. это «вообще не числа», то и непротиворечивые правила можно вводить свои, которые, собственно, были введены в стандарте. Притом оно — неплохое приближение действительных чисел «с обеих сторон» в ограниченных условиях. Если на пальцах, то по своей сути оно ближе к сути действительных чисел: как в теории действительных чисел (см. матан) есть неопределённости, бесконечности и всякие стремления к нулю слева, так и в реализации стандарта они есть. Если реально нужны не действительные числа, а рациональные, то нужно использовать готовые/писать свои реализации приближения рациональных, а не натягивать сову.

    Похожие особенности есть не только у чисел с плавающей запятой. Встроенные целые числа реализованы не лучше.

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

    Чутье подсказывает, что переполнение даст 0x0000. Однако такой исход не задокументирован ни в одном мировом стандарте. В обработке этой операции все ориентируются на подход C и семейства процессоров x86.

    Так получается, что подход C — один из мировых стандартов, где исход задокументирован.

    В качестве альтернативных вариантов может получиться 0xFFFF или будет вызвано прерывание, или некий специальный, указывающий на переполнение бит будет сохранен в особом месте.

    А это — другие стандарты.

    Такие моменты вообще нигде не рассматриваются, и правила обработки подобных операций отличается от языка к языку.

    И, собственно, главный вопрос: а как новый язык решит эту проблему? [Здесь комикс про универсальный стандарт]

    overflowed 9999
    underflowed 0

    Что это вообще такое? Если состояния, то, собственно, чем оно лучше NaN и +Inf, когда мы получаем оспариваемое состояние? Если поведение, то чем оно лучше переполнения, когда мы получаем оспариваемое поведение? Да и, собственно, подобные обрезки точности можно просто реализовать на базовых типах в готовых языках, для этого не нужно изобретать ещё один язык, или они даже есть из коробки: тип DECIMAL(N,M) в SQL или currency в некоторых языках.

    Разве такие вычисления не будут работать медленнее? Да, будут.

    Минус пласт пользователей языка.

    Насколько я могу судить, типичный программист 21 века нечасто решает дифференциальные уравнения.

    Минус ещё один пласт пользователей языка.

    Т.е. в итоге мы получаем ещё один язык 21 века, у которого другой синтаксис, который вводит новые костыли, новые стандарты и правила, но при этом не отказывается от костылей, стандартов и правил 20 века, и реализации на котором медленнее? Можно не надо?
  • Как генерировать осмысленные коммиты. Применяем стандарт Conventional Commits
    +9
    fix(products): поправить длину строки с ценой

    Часть заголовков неправильно отображается в мобильной версии из-за ошибок
    в проектировании универсальных компонентов.

    МЕТА ДАННЫЕ: SECRETMRKT-578, SECRETMRKT-602

    Мне кажется, что тут возникла небольшая ошибка. Коммит — не то, что должно быть сделано, а то, что уже сделано. Что нужно сделать должно быть написано в таске где-то или в требованиях. Как я понял, в этом примере такая информация находится в SECRETMRKT-578, SECRETMRKT-602. Т.е. верный вариант будет
    fix(products): поправлена длина строки с ценой

    Часть заголовков неправильно отображались в мобильной версии из-за ошибок
    в проектировании универсальных компонентов.

    МЕТАДАННЫЕ: SECRETMRKT-578, SECRETMRKT-602

    И тогда автоформирование Change Log уже взлетит само собой.

    UPD: Да, не дочитал. В статье об этом есть в конце. Но мне всё равно кажется это несколько странным.
  • Интересная задачка на С
    +8
    Подход с шаблонами сразу не прокатит, т.к. нужно знать n именно во время компиляции. А если мы знаем n во время компиляции, то мы просто можем написать
    print(n--);
    n+1 раз.

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

    Это задачка с искусственными ограничениями (в том плане, что вряд ли они встретятся в реальной задаче компании), поэтому давать её на собеседовании, конечно, можно, но ИМХО только в случае собеседования в клуб извращенцев.
  • Как PVS-Studio оказался внимательнее, чем три с половиной программиста
    +6
    Кстати, вы могли бы этот таск переклассифицировать из баги в фичреквест и не спешить закрывать. Ведь на самом деле ситуация показательная и с другой стороны: лог анализатора не дал трём с половиной программистам понять, что же происходит. Т.е. анализатор умён, спору нет, но мысль свою до людей он не донёс. Может быть, стоит на такие проблемы в логических выражениях выдавать другую ошибку? Какую-нибудь одну, красивую, которая подсветит сереньким цветом выражения, не влияющие на истинность условия, или как-то так? Ведь, насколько я понимаю, вы же всё равно строите деревья разборов этих условий, т.е. самая сложная часть уже есть и отлично работает.
  • Как PVS-Studio оказался внимательнее, чем три с половиной программиста
    +1
    Вот да. Правда, второй вариант не всегда может прокатить, не каждый символ можно так просто добавить в исходник — и в таких случаях я бы рекомендовал завести константы с говорящими именами, типа BIG_LETTER_A или FIRST_BIG_LETTER_EN, а в них уже можно любые коды засовывать, всё равно далее исходник будет читаемым.
    А вот третий вариант лично я бы рекомендовал почти всем и всегда. А то и в отдельный метод IsLetterOrDigit.

    Ошибку, кстати, нашёл, нарисовав интервалы на прямой, но изначально ожидал от задачи подвох в стиле дефайна скобки в начале файла или чего-то такого.
  • Моё разочарование в софте
    +9
    Абсолютно точно.
    То ли в 2014, то ли в 2015 у нас налоговая приняла законы, по которым XML-ины электронной отчётности по размеру стали допустимы до 10гб (вроде бы с изначального «копеечного» лимита 10-100мб), так все решения на DOM'ах очень красиво посыпались, когда пошли клиенты с громадными «контролируемыми сделками» и «книгами для ндс». Потому что DOM одной только памяти жрёт х10 от размера файла, и если раньше (100мб-1гб) на это закрывались глаза, то на 100гб глаза уже не закроешь, не говоря уже о платформе х86.
    Делал в те времена в системе электронной отчётности проект по уходу с DOM (легаси было крепко на него завязано, XPath и прочие плюшки активно использовались) на SAX в один пробег, с «эмуляцией» плюшек или обоснованным отказом от них — веселья было много. Теперь в резюме указываю тег XML, а на собеседованиях периодически посмеиваются, мол, что там знать-то, древовидная структура, теги/атрибуты и всё. Так-то оно да, но, как и в физическом мире, когда масса объекта пересекает определённые границы, проявляется много интересных эффектов, о которых даже не думаешь, щупая маленькие объекты.
  • Как я научил ИИ играть в Tetris для NES. Часть 2: ИИ
    +1
    Судя по видео (ссылка с привязкой ко времени) скольжения делать этот бот умеет.
  • Как я научил ИИ играть в Tetris для NES. Часть 1: анализ кода игры
    0
    Хотя, кстати, запамятовал: NP-полная задача — задача какой-либо оптимизации стратегии с известной заранее лентой фигур. И разумное приближение как раз, наверное, будет в том, что состояние стакана в итерации будет фиксировано, а известны будут только текущая и следующая фигуры — т.е. естественные ограничения игры. А все такие комбинации расположения двух фигур можно, думаю, и просто перебрать. Но, всё-таки, рано или поздно ИИ всё равно должен проиграть.
    arxiv.org/pdf/cs/0210020.pdf
  • Как я научил ИИ играть в Tetris для NES. Часть 1: анализ кода игры
    0
    Спасибо, интересно! Любопытно будет почитать вторую часть про алгоритмы бота, который играет в тетрис, потому что в строгом смысле эта задача NP-полная. Подозреваю, что там будет просто разумное приближение с допущениями, и ИИ всё-таки будет в конце концов проигрывать.
    Кстати, жалко, что статья об этом NES-тетрисе, а не от Tengen. Лично мне тот сильно больше нравится.
  • Проверили с помощью PVS-Studio исходные коды Android, или никто не идеален
    +1
    Т.е., оперируя старыми названиями констант, тянет заменить
    if (f->mode & O_RDONLY && expect_zeros)

    скорее на
    if ( (f->mode == O_RDONLY || f->mode == O_RDWR) && expect_zeros)
  • Проверили с помощью PVS-Studio исходные коды Android, или никто не идеален
    0
    А мне почему-то кажется, что имелось в виду что-то такое
    #define O_NORIGHTS 0
    #define O_READ 1
    #define O_WRITE 2
    #define O_READWRITE 3

    и проверка
    f->mode & O_READ

    должна была проверять разрешённость именно чтения. Хотя комментарий нам и говорит явно про «read-only», он мог писаться постфактум и быть просто навеян названием константы O_RDONLY. Тут без остального контекста сложно понять. Хотя, конечно, Ваше предположение выглядит проще.
  • Когда не стоит пользоваться алгоритмами STL. Пример с множествами
    0
    Хм, так причём тут STL? Эдак можно и минимум пытаться с помощью std::sort искать. Виновата не STL и не сортировка, просто в данном случае приоритет отдаётся уже реализованным алгоритмам, а не подходящим для задачи, что есть плохой подход (хотя и не всегда, кстати). По названию статьи подумал, что какой-то стандартный алгоритм над std::set работает хуже, чем велосипед, который будет приведён, хех.