• Реализация оператора in в С++

      Привет! Сегодня я надеюсь показать вам немного магии. Моим хобби является придумывание всяких казалось бы невозможных штук на С++, что помогает мне в изучении всевозможных тонкостей языка ну или просто развлечься. Оператор in есть в нескольких языках, например Python, JS. Но в С++ его не завезли, но иногда хочется чтобы он был, так почему бы его не реализовать.

      	std::unordered_map<std::string, std::string> some_map = 
      	{
      		{ "black", "white" },
      		{ "cat", "dog" },
      		{ "day", "night" }
      	};
      
      	if (auto res = "cat" in some_map)
      	{
      		res->second = "fish";
      	}
      

      Читать дальше →
    • Крестики-нолики на DNS

        Изначально я хотел назвать этот пост «игра в 0 строк HTML, JS и CSS», вдохновлённый этим постом, но это было бы слишком громко. Так или иначе, сильно ухудшив UX, я получил крестики-нолики, работающие исключительно силой DNS протокола.



        Для неподготовленного пользователя выглядит, конечно, страшно, зато даже браузер не нужен для игры.
        Читать дальше →
      • Создание «искусственной жизни» на компьютере

        • Tutorial
        Всем привет. В статье хочу описать свой эксперимент по созданию «искусственной жизни» на компьютере.

        Как это выглядит?

        картинка кликабельна

        На компьютере создаётся виртуальная среда со своими правилами и выпускается первая простейшая живность. Буду называть их ботами. Боты могут погибнуть или выжить и дать потомство. Потомок может слегка отличаться от предка.

        Ну а дальше за работу принимается эволюция и естественный отбор.

        А мне остаётся только наблюдать за развитием мира.

        Чем неожиданнее для создателя и многообразней будут варианты развития мира, тем более удачным можно считать эксперимент.

        Поведением ботов управляет код, записанный в них.

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

        Внутреннее устройство кода — это самое интересное в проекте.

        Код должен быть простым и выдерживать различные модификации (случайное изменение любого элемента в коде) над собой без синтаксических ошибок.
        Читать дальше →
      • Бот для Starcraft на Rust, C и на любом другом языке

          StarCraft: Brood War. Как много это значит для меня. И для многих из вас. Настолько много, что я засомневался, давать ли ссылку на вики.


          Как-то раз мне в личку постучался Halt и предложил выучить Rust. Как и любые нормальные люди, мы решили начать с hello world написания динамической библиотеки под Windows, которая могла бы загружаться в адресное пространство игры StarCraft и управлять юнитами.


          В статье будет описан процесс поиска решений, использования технологий, приемов, которые позволят вам почерпнуть новое в языке Rust и его экосистеме или вдохновиться для реализации бота на своем любимом языке, будь то C, C++, ruby, python, e.t.c.

          Ready to roll out!
        • GitHub превращается… превращается GitHub… в элегантный Windows 95

          • Tutorial


          В Твиттере какое-то время назад запостили шутку в честь приобретения Майкрософтом ГитХаба — страницу сайта, перестилизованную в стиле Windows 98. Я решил, что шутка слишком хороша, чтобы оставаться шуткой.

          Давайте перекрасим GitHub!
        • Нейронки за 5 минут

            Давайте я за 5-10 минут чтения и понимания коротенькой статьи добавлю вам в резюме строчки «машинное обучение» и «нейронные сети»? Тем, кто далек от программирования, я развею все мифы о сложности ИИ и покажу, что большая часть всех проектов на машинном обучении строится на предельно простых принципах. Поехали — у нас всего пять минут.

            Рассмотрим самый базовый пример нейронных сетей — перцептроны; я сам только после этого примера полностью осознал, как работают нейронные сети, так что, если я не накосячу, и вы сможете понять. Помните: никакой магии здесь нет, простая математика уровня пятого класса средней школы.
            Читать дальше →
          • Ой, у вас баннер убежал!

            Ну. И что?
            Реклама
          • GUI-приложение размером менее 1 Кб

            На досуге задался вопросом возможности создания приложения, со следующими требованиями:

            • хоть сколько-нибудь полезная прикладная функция (то есть не пустышка)
            • наличие оконного интерфейса
            • размер менее 1 Кб
            Читать дальше →
          • Библиотека ненаписанных книг

            Есть у меня мечта: разработать собственную компьютерную игру.

            Казалось бы, мечта крайне неоригинальная. Этого хотят очень многие, но все мы прекрасно знаем, что из этого обычно получается. Большая недостижимая цель.

            Чего не хватает тем, кто хочет разработать игру?

            Я считаю, что всего три основных компонента влияют на то, хотим мы играть в какую-то игру, или же не хотим.

            1. Игровая механика.
            2. Сеттинг.
            3. Идентичность.

            Графика, озвучка, сюжет — это, конечно, значительно влияет на игровой процесс, но за рамками этих трёх компонентов они не нужны. Иногда избыток спецэффектов даже пагубно влияет на игру.

            1. Самый интересный момент в написании компьютерной игры — это игровые механики.
            Их нельзя полноценно передать ни текстом, ни статичными картинками. Игровые механики — это процесс.

            Так или иначе, именно здесь нужен прототип. Трёхдневный прототип с самыми основными функциями игры, который будет описываться всего парой фраз. Если он увлечёт вас настолько, что вы сами захотите продолжения — всё более или менее правильно. Можно дополнять и украшать.

            В детстве я пытался создать игру с большим и сложным миром, но её не получалось завершить из-за кучи пробелов в знаниях. И мне в голову пришло решение проблемы: просто писать примитивную маленькую игрушку на 3 дня разработки. А потом ещё одну. А потом ещё. По ходу разработки внедрять свои идеи и решать возникающие проблемы. И так — до тех пор, пока не наберусь опыта.

            Вы будете смеяться, но получилось.

            Зелёный шарик, 16*16 пикселей размером, убегал от красного шарика…

            — О, круто! А можешь так же, но в 3D? — подзадоривал меня старший брат.

            Именно он показал мне, что такое программирование, когда я был совсем ребёнком.

            Зелёный трёхмерный шарик убегал от красного и собирал тающие льдинки. За каждую льдинку полагался один балл, а сохранённые при сборе жизни давали дополнительные баллы.


            Читать дальше →
          • Особенности вызова функций в С++

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


              • Регистры и их назначение при вызове функций.
              • Передача и возврат простых типов и структур.
              • Как передача по ссылке и по значению влияют на оптимизации тела функции компилятором.
              • Как используется место при многочисленных вызовах функций.
              • Механизм виртуальных вызовов.
              • Оптимизация хвостовых вызовов и рекурсии.
              • Инициализация структур, массивов и векторов.

              Осторожно! Статья содержит большое количество кода на C++ и ассемблере (Intel ASM с комментариями), а также множество таблиц с оценками производительности. Всё написанное актуально для x86-64 System V ABI, который используется во всех современных Unix операционных системах, к примеру, в Linux и macOS.

              Читать дальше →
            • Грязные трюки разработчиков видеоигр

              • Перевод

              Предыдущие части: раз, два, три.

              Благодарим за игру!


              В первой части Wing Commander при выходе из игры мы получали от нашего менеджера памяти EMM386 исключение. Экран очищался и на него выводилась единственная строка, что-то типа «Ошибка менеджера памяти EMM386. Бла-бла-бла».

              Нам нужно было выпустить игру как можно быстрее, поэтому я отредактировал ошибку менеджера памяти в hex-редакторе, чтобы она выглядела как «Благодарим за то, что играли в Wing Commander».

              — Кен Демарест

              Читать дальше →
            • Пятничный JS: случайное перемешивание

                Экзамен в школе прапорщиков.
                — Вот смотрите. Это большой палец, это — указательный, это — средний, это — безымянный, это — мизинец. Мешаем, мешаем, мешаем (двигает пальцами)… Теперь где какой?
                Всем привет. С ортодоксальной точки зрения сегодня не настоящая пятница — просто день, когда завтра выходной. Поэтому статья в моей традиционной рубрике тоже будет не совсем настоящая, у неё пониженный градус безумия и повышенная полезность. Однако довольно предисловий, перейдём к сути.

                Перед моими студентами регулярно встаёт задача случайного перемешивания массива. За её решением они, как правило, лезут в гугл. И гугл им подсказывает следующее:

                var shuffledArr = arr.sort(function(){
                  return Math.random() - 0.5;
                });
                

                Здесь и далее будем называть этот метод случайной сортировкой. Сегодня я решил написать о том, какие преимущества и недостатки есть у такого подхода.
                Читать дальше →
              • Проект «Морровинд»

                • Перевод
                image

                Вам нужно сыграть в Morrowind.

                (Предупреждение: ниже идут несколько абзацев похвал Морровинду, так что вы можете спокойно пропустить их и переходить к самой сути поста.)

                В начале Morrowind вы обычный обалдуй, только что сошедший с тюремного корабля с 87 золотыми в кармане (в этом мире одна буханка хлеба стоит 1 золотой, то есть это примерно 35 фунтов — именно столько вам придётся заплатить за 87 упаковок нарезанного белого хлеба в Tesco). Вашим первым заданием будет получение посылки от человека в другом городе, и вы можете или проехаться на силт страйдере (огромном насекомом с длинными ногами, которым, вероятно, управляет вечно пьяный жуткий водитель — почти как в лондонских автобусах) или прогуляться туда пешком по дикой местности, сражаясь с ордами хищных птиц-переростков железным кинжалом, который вы стянули из бюро переписей. Только ваш кинжал всегда промахивается, потому что, видите ли, создатели боевой системы Morrowind вдохновлялись настольными ролевыми играми, а аниматорам платили не так много, поэтому даже если ваше оружие очевидно вонзается в мясистое тело того, в кого вы, игрок, целитесь, нет никаких гарантий, что вы на самом деле попали.

                Посему, сломав пару мышей из-за тысяч яростных кликов, вы решаете бросить Morrowind и тратить свою жизнь на что-то более интересное.

                Или вы продолжаете играть и узнаёте о том, как усталость влияет на ваши шансы кого-нибудь ударить (и за кем-нибудь приударить), изучаете игровую механику, покупаете новую мышь, добираетесь до Балморы и погружаетесь в один из самых богатых миров, которые я видел в играх. Вы проживаете сюжет, поднимающий вопросы об организованной религии, ксенофобии, колониализме, племенных легендах, пророчествах, свободе воли и выборе приоритетов между собственными интересами и интересами организации, к которой вы принадлежите.
                Читать дальше →
              • Планирование спидрана Morrowind с помощью имитации отжига

                • Перевод
                image

                Ну ты и соня, тебя даже вчерашний шторм не разбудил. Говорят, мы уже приплыли в Морровинд. Нас выпустят и позволят нам сделать спидран, это точно!

                Введение


                Существует знаменитый спидран основного квеста Morrowind, в котором, по сути, игрок перемещается к месту конца игры, использует несколько свитков и заклинаний, а затем убивает босса.

                Однако не существует категории спидранов Morrowind, в которой игрок стремится стать главой всех фракций. Несмотря на любовь критиков и отличный сюжет, большинство квестов Morrowind заключаются в заданиях «принеси вещь» или «убей этого типа», а квестов, в которых требуется что-то ещё, не так много. Но планирование такого маршрута спидрана всё равно может быть чрезвычайно интересным по следующим причинам:
                Читать дальше →
              • Как сегодня создаются 64k intro: погружение в Immersion

                • Перевод
                image


                В декабре прошлого года мы наконец-то закончили наш проект. В этом видео показана наша последняя работа — четырёхминутная анимация «Immersion». Точнее, это запись того, что обычно называется 64k-интро. Но подробнее об этом чуть позже.


                Работа над проектом заняла лучшие свободные часы последних двух лет жизни. Всё это началось во время проведения Revision 2015, большого мероприятия, устраиваемого каждый год в Германии во время пасхальных каникул. Мы вдвоём болтали по дороге из отеля в место проведения мероприятия. Предыдущим вечером уровень конкуренции в области 64kB intro оказался высоким. Очень высоким. Опытная и хорошо известная венгерская группа Conspiracy наконец вернулась с серьёзной, потрясающей работой. Наш лучший враг Approximate идеально успел по времени с завершением цикла выпуска и показал значительные улучшения в сторителлинге. Продуктивная группа Mercury обрела собственный зрелый стиль дизайна в интро, которое не оставляло сомнений в своей победе.
                Читать дальше →
              • Адский проект

                • Перевод
                Несколько лет назад меня пригласили консультантом по одному проекту ПО для крупной французской технологической компании. Увиденное выходит за рамки всего, что я мог представить в разработке. Простое отсутствие профессиональной компетентности оказалось не самым худшим. Гораздо хуже было крайнее презрение к человеческому достоинству, что показалось мне сравнимо с тюрьмой в том виде, как я её представляю. Вот список, проверьте сами.

                Масштаб


                • Разработка программного обеспечения для государственного агентства.
                • Сложность низкая, с несколькими вывертами.

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

                7 лет спустя проект ещё не оформился. Набегают штрафы по несколько тысяч евро в сутки. Руководство решает сократить расходы и производит увольнения опытных сотрудников, нанимая людей с небольшим или нулевым опытом работы.

                10 лет спустя, учитывая катастрофическое состояние проекта, менеджмент среднего звена решает нанять некоторых людей с опытом разработки, чтобы вернуться в график. Средняя текучка среди новичков: три месяца. Это минимальный срок, чтобы иметь право уволиться во Франции.
                Читать дальше →
              • Язык программирования, рассчитанный на минификацию


                  Однажды я принял участие в конкурсе демо (программ, генерирующих аудио-визуальный ряд, основной особенностью которых является экстремально маленький размер — десятки или даже единицы кибибайт).


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


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


                  Но даже так большинство существующих языков не предназначены для данной оптимизации — очевидно, они имеют множество элементов, которые нужны для понимания человеку, а не машине. А что, если разработать язык, специально рассчитанный на минификацию?


                  В том конкурсе, в итоге, участвовать я не стал. Однако, данная идея не покидала меня. Ведь она может быть полезна и для более практичных целей, чем демо — в мире фронтенда объём клиентских скриптов до сих пор крайне важен, если удастся сократить его, данное решение может оказаться оправданым хотя бы в некоторых случаях.


                  Я решил провести эксперимент — сделать прототип языка и посмотреть, что из этого выйдет.

                  Читать дальше →
                • Массивы, указатели и другие квантовые явления вокруг нас

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



                    Этот пост полностью соответсвует своему названию. Для начала в нем будет показано, что вопреки утверждению стандарта, а также классиков языка Си Кернигана и Ритчи, использование индексов массивов соверешенно не равнозначно использованию соответствующих указателей, а выбор эпиграфа будет понятен в самом конце. И да – середина поста тоже не пустая.
                    Читать дальше →
                  • Редактор TECO: EMACS, я твой отец

                      Впервые про TECO я прочитал в пародийной статье Real Programmers Don't Use Pascal, написанной незадолго до моего рождения. Там было написано, что настоящие программисты не используют новомодные редакторы EMACS и VI:


                      Нет, Настоящий Программист хочет редактор вида «Просил? Так получай!» — сложный, загадочный, мощный, не прощающий ошибок, опасный. TECO, если быть точным.
                      Оригинал
                      No, the Real Programmer wants a `you asked for it, you got it' text editor — complicated, cryptic, powerful, unforgiving, dangerous. TECO, to be precise.

                      Это меня заинтриговало. Что за зверь такой, можно ли его пощупать? Википедия рассказала, что TECO — это Text Editor & COrrector, создан он в 1962-м году в DEC и использовался на компьютерах семейства PDP, а позже на системах OpenVMS. Оказалось, что существует порт на Си, который поддерживается энтузиастами в актуальном состоянии и собирается под современными операционными системами. Вот я и решил почувствовать себя настоящим программистом хотя бы немножко.


                      Читать дальше →
                      • +52
                      • 9,5k
                      • 9
                    • Пробрасываем вызовы Steam API из Wine в GNU/Linux и обратно с помощью Nim

                        У игроков на платформе GNU/Linux множество проблем. Одна из них — необходимость устанавливать отдельный клиент Steam для каждой Windows игры из Steam. Ситуация усугубляется необходимостью установки ещё и родного клиента Steam для портированных и кроссплатформенных игр.

                        Но что если найти способ использовать один клиент для всех игр? За основу можно взять родной клиент, а игры для Windows пусть обращаются к нему так же как, например, к OpenGL или звуковой подсистеме GNU/Linux — средствами Wine. О реализации такого подхода и пойдёт речь далее.

                        Читать дальше →
                      • Игры, в которых нужно писать код (часть 2)


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

                          Читать дальше →
                        Самое читаемое