Рубрика «ненормальное программирование» - 28

Для эффекта вертикального скроллинга в первой части «The Legend of Zelda» используются манипуляции графическим «железом» NES, скорее всего не предусмотренные разработчиками консоли.

Переходы между экранами в Legend of Zelda используют недокументированные возможности NES - 1

У меня нет доступа к официальной документации Picture Processing Unit (PPU — графический чип) консоли NES, поэтому мои заявления о «неопределённом поведении» скорее ближе к догадкам. Спецификацию работы графического оборудования я взял из NesDev Wiki. PPU управляется записью в регистры с отображением в память. Если использовать эти регистры так, как это было (похоже) задумано проектировщиками, то добиться этого эффекта было бы невозможно:

Переходы между экранами в Legend of Zelda используют недокументированные возможности NES - 2

При скроллинге экрана по вертикали весь экран должен скроллиться разом. В предыдущем GIF показан пример частичного вертикального скроллинга. Часть экрана остаётся стационарной (элементы интерфейса), а другая часть (игровая область) прокручивается по вертикали. Частичный вертикальный скроллинг невозможно реализовать при «стандартной» работе с PPU.

В отличие от него, частичный горизонтальный скроллинг полностью определён и возможен.

Переходы между экранами в Legend of Zelda используют недокументированные возможности NES - 3

Запись в отдельный регистр PPU в момент отрисовки кадра может привести к графическим артефактам. The Legend of Zelda намеренно вызывает артефакт, который проявляется как частичный вертикальный скроллинг. В этом посте я немного расскажу о графическом оборудовании NES и объясню, как работает трюк с вертикальным скроллингом.
Читать полностью »

Cities: Skylines — это игра-симулятор города, обладающий достаточной сложностью, чтобы создавать в нём универсальные логические элементы. При помощи универсальных логических элементов можно построить любую схему, в том числе и Тьюринг-полные машины. То есть как и в Minecraft, мы можем создать внутри Cities: Skylines компьютер. Однако было бы очень трудно создавать на основе этих элементов полнофункциональный компьютер, поэтому я продемонстрирую вместо него 4-битный сумматор. Всё выполняется в ванильной версии игры, не требуется ни модов, ни дополнений.

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

Игра Cities: Skylines оказалась Тьюринг-полной: создаём 4-битный сумматор - 1

Основные участники, слева направо: электростанция на жидком топливе, водонапорная башня, канализационная труба. Сзади стоит ветровая турбина.
Читать полностью »

До После
import math
import os.path

import requests

# 100500 other imports

print(math.pi)
print(os.path.join('my', 'path'))
print(requests.get)
import smart_imports

smart_imports.all()

print(math.pi)
print(os_path.join('my', 'path'))
print(requests.get)

Так получилось, что аж с 2012 года я разрабатываю open source браузерку, являясь единственным программистом. На Python само собой. Браузерка — штука не самая простая, сейчас в основной части проекта больше 1000 модулей и более 120 000 строк кода на Python. В сумме же с проектами-спутниками будет раза в полтора больше.

В какой-то момент мне надоело возиться с этажами импортов в начале каждого файла и я решил разобраться с этой проблемой раз и навсегда. Так родилась библиотека smart_imports (github, pypi).

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

Например, не надо будет писать import math чтобы обратиться к math.pi — мы и так можем понять, что в данном случае math — модуль стандартной библиотеки.

Smart imports поддерживают Python >= 3.5 Библиотека полностью покрыта тестами, coverage > 95%. Сам пользуюсь уже год.

За подробностями приглашаю под кат.
Читать полностью »

В одной из статей опубликованных на хабре я в комментах вычитал, что на gitlab.com есть копии deepNude, чисто из любопытства нашел ее и сделал форк «на всякий случай». Через 3 часа после этого я не смог запушить код, т.к. улетел в бан…

image
Читать полностью »

Далее мы рассмотрим в деталях основные характеристики языка Move и в чем его ключевые различия с другим, уже популярным языком для смарт-контрактов — Solidity (на платформе Ethereum). Материал основан на изучении доступного он-лайн 26-страничного whitepaper-а.

Введение

Move — это исполняемый язык байт-кода, который используется для выполнения пользовательских транзакций и смарт-контрактов. Обратите внимание на два момента:

  1. В то время как Move является языком байт-кода, который может напрямую выполняться на виртуальной машине Move, Solidity (язык смарт-контрактов в Ethereum) — язык более высокого уровня, который сначала компилируется в байт-код перед выполнением в EVM (Ethereum Virtual Machine).
  2. Move можно использовать не только для реализации смарт-контрактов, но и для пользовательских транзакций (подробнее об этом будет дальше), в то время как Solidity — это язык только для смарт-контрактов.

Читать полностью »

Дифференцируемое программирование - 1

С четырьмя параметрами я могу задать слона, а с пятью я могу заставить его шевелить хоботом.
– John Von Neumann

Идея «дифференцируемого программирования» очень популярна в мире машинного обучения. Для многих не ясно, отражает ли этот термин реальный сдвиг в том, как исследователи понимают машинное обучение, или это просто (еще один) ребрендинг «глубокого обучения». В этом посте разъясняется, что нового дает дифференцируемое программирование (или ∂P) в таблице машинного обучения.

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

Далее мы пролистаем полотно неинтересного текста, захотим узнать, что такое автодифференцирование и даже популяем из катапульты!

Читать полностью »

Окружи, откуси, распили: новое соревнование Mini AI Cup #4 - 1

Привет! Большинство из нас, специалистов в IT сфере, любит играть в игры — карточные, настольные, компьютерные и другие. Зачастую бывает, что игры пользы никакой не приносят, а хотелось бы всё и сразу — удовольствие, фан и знания. Специально для вас мы стараемся изобретать «игры для программистов», которые сочетают в себе всё вышеперечисленное. Предлагаем вам познакомиться с ними и приглашаем принять участие в соревновании по искусственному интеллекту Mini AI Cup #4!
Читать полностью »

Приветствую всех хабрачитателей. Я очень люблю поразмять свои мозги разными задачками — это могут быть какие-то математические задачи, интересные головоломки, связанные с программированием, или какие-то ctf-таски.

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

XT_CTF_01

XT_TASK_101

Ссылка на таск: xt_task_101.zip
Формат флага: XTGFLAG{…}
SHA1 флага: 6980D76C3C5246A101820A77031CA0EBE84A4A0E

XT_TASK_102

Ссылка на таск: xt_task_102.zip
Формат флага: XT{…}
SHA1 флага: 16448BF22750DE7E575A5A86E739FA9018ACFE52

XT_QUEST_103

Ссылка на таск: xt_quest_103.zip
Количество уровней: 15 + бонус
Читать полностью »

Как увидеть цвет, которого в природе не бывает?

image

Четыре года назад на Хабое был пост с интересным и полезным видео «Как устроен цвет». Лектор — Дмитрий Николаев, заведующий сектором зрительных систем ИППИ РАН.

Я сделал расшифровку (в меру своего понимания материала), потому что считаю и тему важной и подачу — отличнейшей. Пока набирал текст, чуть не поменял своё φ(λ). Слово спикеру:

Поговорим о математике и геометрии цвета, о том, какие абстрактные структуры заложены в этом слове.

Что такое «цвет» не знает никто.

Цвет — это что-то, о чем говорит человек, наблюдающий и познающий мир с помощью глаза.

Глаз регистрирует какие-то свойства электромагнитного излучения, называемого светом, попадающего в глаз, преломляющегося на хрусталике, проецируемого на сетчатку. «Колбочки» регистрируют какие-то мощностные свойства. И дальше внезапно человек говорит о каком-то «цвете».

В физике нет цвета, а есть спектральные свойства излучения.

«Цвет» связан с относительным распределением спектральной энергии, мощности или потока излучения. (При прохождении через призму человек видит характерную «радугу».)

Совершенно точно, «цвет» — психологический феномен. Цвет — это ощущение, к объективной физике не имеющий отношения.

Мы можем говорить о цвете вещей — красная рубашка — «краснота» рубашки напрямую никак не связана с тем, какое излучение придет от этой рубашки в глаз.
Читать полностью »

Всем доброго здравия!

При обучении студентов разработке встроенного программного обеспечения для микроконтроллеров в университете я использую С++ и иногда даю особо интересующимся студентам всякие задачки на определения особо больных на голову одаренных учеников.

В очередной раз таким студентам была дана задача поморгать 4 светодиодами, используя язык С++ 17 и стандартную библиотеку С++, без подключения дополнительных библиотек, типа CMSIS и их заголовочных файлов с описанием структур регистров и так далее… Побеждает тот, у кого код в ROM будет занимать наименьший размер и меньше всего затрачено ОЗУ. Оптимизация компилятора при этом не должна быть выше Medium. Компилятор IAR 8.40.1.
Победитель едет на Канары получает 5 за экзамен.

Сам я до этого тоже эту задачу не решал, поэтому расскажу как её решили студенты и что получилось у меня. Предупреждаю сразу, навряд ли такой код можно будет использовать в реальных приложениях, потому и разместил публикацию в раздел «Ненормальное программирование», хотя кто знает.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js