Как я написал эмулятор Nintendo Gameboy на C++ за две недели

Расскажу, как устроена архитектура консоли Nintendo Gameboy, как можно эмулировать её основные компоненты, какие решения я принимал в процессе разработки и какие инструменты использовал.
Пользователь

Расскажу, как устроена архитектура консоли Nintendo Gameboy, как можно эмулировать её основные компоненты, какие решения я принимал в процессе разработки и какие инструменты использовал.

В этой части нас ждёт погружение в один из способов организации мультипоточности на базе единственного ядра процессора. Мы научимся принудительно переключать выполнение между полностью зацикленными участками кода, ничего не "знающими" о каком-то другом коде, конкурирующем за процессорное внимание. По ходу повествования будут даны все необходимые пояснения и читателю не придётся обращаться к другим источникам, кроме первой части статьи.

Мэтт Годболт, знаменитый разработчик Compiler Explorer — потрясающий человек, вам стоит найти в вебе и изучить весь созданный им контент. Именно этим и занимался, просматривая Correct by Construction: APIs That Are Easy to Use and Hard to Misuse. Я уже больше двадцати лет работаю с C/C++, поэтому эта тема была мне близка.
Когда я смотрел его доклад, ко мне постоянно приходила мысль: «Да! И именно поэтому в Rust это делается так». После просмотра видео я подумал, что этот доклад — отличный способ понять, как Rust помогает разработчикам не только в безопасности по памяти, и в своей статье я расскажу об этом.
Но прежде нам следует поговорить о поднятых Мэттом проблемах и о том, как он предлагает решать их в C++. Сделайте себе одолжение и посмотрите доклад целиком, а я разберу один из его пунктов.

Эта история началась с того, что мне захотелось поработать с интерпретатором одного очень экзотического языка программирования, а закончилась тем, что я освоил не менее экзотические (для меня) нюансы работы с памятью в С в Windows и POSIX, и того, как работает отладчик gdb в Windows.

Разговаривая по мобильному телефону, вы пользуетесь радиосвязью и даже не задумываетесь об этом. Однако были времена, когда такая связь была доступна далеко не всем. Радиолюбители собирали приёмники и передатчики на лампах и транзисторах, подключали к ним большие антенны и устанавливали связь с другими городами и странами, использовали радио для управления моделями самолетов, автомобилей и катеров.
Сегодня можно купить готовые и современные передающие и приёмные устройства как для радиосвязи, так и для радиоуправления. Довольно популярны относительно недорогие программно-определяемые радиосистемы Software-defined radio (SDR). Модули связи LoRa позволяют устанавливать связь на значительном расстоянии даже при небольших уровнях мощности. Однако знакомство с базовыми принципами создания устройств радиосвязи на транзисторах, на мой взгляд, будет полезно начинающим радиолюбителям.
В этой статье я расскажу об устройстве биполярных транзисторов, совершивших в свое время революцию в электронике. Затем приведу схемы простейших генераторов высокочастотных колебаний и расскажу, как собрать несложный передатчик и настроить его на частоту 27 МГц.
Надеюсь, что эксперименты, описанные в статье, помогут вам войти в увлекательный мир радиосвязи!

Партия в Magic: The Gathering начинается ещё до того, как игроки выложат перед собой свои первые карты. Magic — это коллекционная карточная игра, в которой противники выбирают оптимальную колоду карт на основании их предположений о том, как она будет работать против гипотетических оппонентов со множеством разных стратегий. Сама же партия позволяет доказать или опровергнуть прогнозы игрока. Так как уже выпущено примерно тридцать тысяч уникальных видов карт (хотя маловероятно, что их все приобретёт один игрок), существует множество разных степеней вариаций.
Это изобилие возможностей породило очень много вопросов и идей. Некоторые игроки задавались вопросом, насколько сложна игра на самом деле. Например, достаточно ли в ней сложности для выполнения вычислений, как на компьютере? Разработчик ПО Алекс Черчилль и два других игрока в Magic создали cигровую ситуацию, в которой карты действуют, как универсальный компьютер — машина Тьюринга. В 2019 году они опубликовали свою работу на arXiv.org.
Их компьютерная модель позволила подвести итог: Magic — это самый сложный вид игры. Теоретически, партия в Magic может выполнять любые вычисления, на которые способен компьютер.

В данной серии статей я изложу мои наработки по решению задачи про Винтика и Шпунтика в рамках челленджа @vvvphoenix. Наработок достаточно много, и изложение их всех в одной статье получилось бы слишком объемным, либо же пришлось описывать всё достаточно сжато. Ни того, ну другого не хотелось бы, поэтому разбиваю изложение на части. Пока планируется 4 части, возможно в ходе их написания появятся идеи для новых частей или новые продвижения в решении задачи. И тогда частей будет больше. Данная первая часть скорее вводная, в которой я опишу такой подход к подсчету числа вариантов в различных комбинаторных задачах, как "формула включения-исключения".

OLMo — моделька от AI2, разработанная учёными для учёных. Если вы занимаетесь экспериментами над нейронками, это идеальный вариант: весь код и данные, необходимые для тренировки, открыто лежат на GitHub. Более того, выложены даже промежуточные чекпоинты, с очень высокой гранулярностью. Это отличает ее от якобы "открытых" нейронок, которые обычно приходят к тебе монолитным финальным бинарём.
Эта статья — короткий гайд, адаптированный с GitHub создателей нейросети и проверенный на практике.

Почему фотоны исчезают в тёмных полосах интерференции? Что значит — «каждый фотон интерферирует только с самим собой»? И как природа вообще позволяет одному и тому же объекту вести себя как частица и как волна одновременно — пока вы на него не смотрите?
Эта статья — попытка аккуратно, но живо разобрать то, что Фейнман называл «единственной настоящей загадкой квантовой механики». Без мистики, без занудства — с ясными объяснениями, визуализацией, реальными экспериментами и последними интерпретациями, включая квантовый ластик, многомировую картину и информационную природу реальности.
Для тех, кто хочет не просто услышать про двойную щель, а наконец понять, что там происходит.

Здравствуйте, меня зовут Дмитрий Карловский и я.. придерживаюсь следующей парадигмы мышления: всякое определение должно иметь чёткую границу между тем, что ему соответствует, и тем, что не соответствует.
К сожалению, часто можно встретить споры о пересекающихся определениях, словно они взаимоисключают друг друга. Не менее часто можно встретить ложную дилемму между двумя терминами не покрывающими всё множество сущностей.
Что ж, позвольте внести ясность и предложить вам непротиворечивую классификацию парадигм - подходов к написанию кода, во многом определяющих способ мышления человека по донесению задачи до кремниевого исполнителя.

Книга Design Patterns: Elements of Reusable Object-Oriented Software («Приёмы объектно-ориентированного проектирования. Паттерны проектирования»), также известная под названием "синей книги", по цвету обложки первого издания, или книги "банды четырех/GoF" издана почти тридцать лет назад.
Для такой отрасли, как разработка игр, если смотреть на игры, как на программное обеспечение, это средние века. О правильности сформулированных в этой книге решений говорит хотя бы то, что её рекомендуют к прочтению до сих пор, и на основе этих рекомендаций строят новые системы и фреймворки, хотя вот сами фреймворки особым долголетием не отличаются.
Я всё еще считаю, что книга актуальна - как базовые знания вроде математики, алгоритмов и примитивов синхронизации, но за прошедшие годы люди создали и обнаружили множество новых, хоть и не таких известных. А некоторые паттерны, настолько стали, затасканными что ли, что превратились скорее в антипаттерны, как например, Singleton и совсем потерялся смысл его использования. И там где разумное применение не приносит больше вреда, но позволяет развязать зависимости, создание архитектуры на таких принципах - ведет только к разбуханию кода, и коду ради кода.
Другие шаблоны, например Command/Flyweight были забыты и мало применяются в общем софтостроении, но прочно обосновались в разработке игр и интерактивных системах. Собственно о таких вещах и хотел рассказать в этой статье, и показать несколько специфичных шаблонов, применяемых в игрострое, о которых вы вряд ли услышите за его пределами, или будете порицаемы за их использование.
Заходите, великов и граблей хватит на всех.

Существует огромный пласт литературы, призванный помочь начинающим инвесторам разобраться в себе и фондовом рынке. В каких-то книгах акцент делается на экономическую составляющую, анализ историй успеха и торговые стратегии – сюда можно отнести «Принципы» Рэя Далио, «Разумного инвестора» Бенджамина Грэма, биографии и автобиографии Уоррена Баффетта и т.д.
В других же работах в центре внимания оказываются закономерности психики, помогающие или мешающие торговать на бирже. Как правило, эти особенности являются предметом интереса поведенческой экономики – одной из ключевых дисциплин, разбираться в которой необходимо каждому, кто хочет преуспеть на фондовом рынке. Десятилетия научных изысканий создали базис для публицистической литературы, где трейдерам даются практические советы как «разогнать» или, наоборот, обуздать собственный мозг, чтобы сорвать банк. «Под капотом» таких трудов – выкладки из теории игр, соцопросы и эксперименты с функциональной МРТ, выявляющие зоны коры, ответственные за экономические решения. Ярчайший пример – абсолютный бестселлер «Думай медленно… решай быстро» такого титана, как Даниэль Канеман. Также многие десятилетиями открывают для себя что-то новое в работах такого гуру, как Нассим Талеб. А кто-то-то – штудирует трактат «Больше, чем вы знаете» эксперта в сфере поведенческих финансов Майкла Мобуссина.
Мы же сегодня мы расскажем об одном из ярчайших представителей такой литературы – книге Бретта Стинбарджера, одного из пионеров исследования поведения инвесторов с позиций бихевиоризма. Его работа «Самоучитель трейдера» является практическим руководством по саморазвитию для трейдеров, построенным на ряде психотехник, которые мы и разберем.

Хочу поделиться знанием, которое не является секретом, в каких-то курсах по алгоритмам оно наверняка дается, но нагуглить его совсем не просто. Поэтому пусть будет.
Алгоритм Дейкстры можно обобщить на произвольную функцию длины пути, если только она удовлетворяет трем условиям:
Монотонность. При добавлении ребра к пути, его длина не уменьшается.
Консистентность. При добавлении одинакового ребра к путям одинаковой длины, получившиеся новые пути имеют одинаковую длину.
Оптимальность префикса. Если к двум путям приписать одинаковое ребро, то кратчайший путь останется кратчайшим.
Под катом я привожу доказательство корректности обобщенного алгоритма и показываю, как его применить в задаче на литкоде: Trapping rain water II.

Google sheets with C++
Привет, пишу тг бота на C++. Недавно мне требовалось подключить выгрузку данных из бд в гугл таблицы, но годного гайда как это сделать я не нашел. Поэтому будет простенький гайд. Расписываю как читать и записывать данные в гугл таблицы. Использовал библиотеки rapidjson, libcurl и jwt-cpp.

Идиома RAII — давно зарекомендовал себя как удобный способ автоматического управления ресурсами в C++. Обычно мы применяем его для управления памятью, файловыми дескрипторами или мьютексами. Однако что, если расширить понятие RAII до управления не только физическими ресурсами, но и логическими контрактами и состояниями системы?
В этой статье я хочу поговорить о том, как RAII можно использовать для контроля жизненного цикла асинхронных операций, транзакций или подписок, гарантируя их корректное завершение или откат до прежнего состояния.

Парадокс Моравека принадлежит к числу наиболее интересных концептуальных открытий ХХ столетия. Раз за разом он заставляет нас пересматривать свои представления о возможностях искусственного интеллекта.
С формальной точки зрения парадокс ставит под сомнение интуитивное представление человека о том, что сложные интеллектуальные задачи требуют больше вычислительных ресурсов, нежели простые моторные действия. За примерами далеко ходить не надо: оказалось, что научить компьютер играть в шахматы на уровне условного Гарри Каспарова, признанного гроссмейстера, гораздо проще, чем воспроизвести моторику годовалого ребенка, умеющего хватать игрушки или сохранять равновесие при ходьбе.

Привет, Хабр!
Если вы пишете код для систем с ограниченными ресурсами, или просто хотите держать в голове не только логическую, но и физическую модель своей программы — вам необходимо понимать, как именно компилятор размещает данные в памяти.
Штрихкод и с чем его едят на плюсах. Сегодня я покажу вам как я писал простейший сканер штрихкодов EAN-8 и EAN-13. Конечно, я мог бы взять готовые и более функциональные сканеры из интернета, НО зачем? Зачем, если можно сделать самому, если можно развить свои навыки и расширить портфолио? Вот и я так подумал...
Если вы заинтересовались - я сейчас вам раскачаю про код...


Не так давно ко мне в руки попала игровая ретро-консоль и у меня возникло желание написать для неё свою игру. А возникало ли у вас желание написать свою игру под игровую консоль?