
Приветствую, Хабравчане!
В данной статье я начну реализацию кроссплатформенной библиотеки LDL. Опишу её исходный код, архитектуру. Пока библиотека умеет только рисовать несколько примитивов, но я только в начале реализации. Если интересно заходите.
Извращения с кодом
Приветствую, Хабравчане!
В данной статье я начну реализацию кроссплатформенной библиотеки LDL. Опишу её исходный код, архитектуру. Пока библиотека умеет только рисовать несколько примитивов, но я только в начале реализации. Если интересно заходите.
Привет! Меня зовут Никита Соболев, я core-разработчик языка программирования CPython, а так же автор серии видео про его устройство.
Я продолжаю свой цикл статей на хабре про детали реализации питона. Сегодня я хочу рассказать, как tuple
устроен внутри.
Под катом будет про: мутабельность кортежей (и планы по отмене такого поведения), дичь с ctypes
, переиспользование памяти и другие оптимизации.
Ну и конечно – мое полное видео на полтора часа, где будет множество дополнительной информации о деталях работы VM.
Если вам такое интересно или целиком незнакомо – добро пожаловать!
Здравствуйте, на связи nikhotmsk с очередным потоком сугубо-технических мыслей. В своей прошлой статье я обещал не использовать жаргонный язык и улучшить читаемость статей. Так вот, сообщаю, что из этого ничего не получилось. Поэтому если вы ничего не поймете, то это значит, что у вас не хватило знаний, как говорил персонаж из книги - "Чтобы что-то узнать, надо уже что-то знать". Но расстраиваться не нужно.
Глядя на главную картинку вы уже почувствовали неладное. Да, я программирую для старинного компьютера ZX Spectrum. Того самого, который построен на чипе Zilog Z80, и у которого графическая память, пожалуй, самая запутанная среди всех ретро-машин. Но наша статья не об этом, а о том, как всё же совместить Ассемблер и Си. Методы, описанные здесь, скорее всего подойдут и к вашему проекту. Ведь теория остается неизменной.
Пока одни пытаются учить других как надо что-то там делать на ПЛИСах, я продолжаю постигать дзен в имплементации никому ненужных идей не несущих какой-либо практической ценности. Я уже делал и сумматор с одним уровнем логики, и рисовал картины-на-кристалле виваде, и делал ненормальное проектирование в вивадском ECO флоу (txt, видео), и даже делал Трахтенберга на ПЛИСах.
Сегодня мы продолжим путь издевательства над нашей дорогой областью программируемой логики и попробуем што-то новенькое: а именно мы перевернем типичную фразу "Да у нас в плис все параллельно" и сделаем последовательный сумматор на одном Full Adder, но который может складывать числа любой положительной разрядности ну на оооочень высокой тактовой частоте доступной простой смертной логике.
Язык Crystal каждый раз удивляет меня. Я думал что язык с синтаксисом Руби не может быть быстрым как Си. Я думал что учитывая что его авторы сидят на Маке или Линуксе его никогда не портируют на винду. Я думал что не справятся с многопоточностью учитывая насколько это усложняет шедулер. И уж совершенно точно я был уверен что портировать его на микроконтроллеры нереальная задача - большой рантайм, ориентированная на GC стдлиба.
Сейчас я покажу как можно писать для микроконтроллеров на Crystal.
Идея сделать игру под Android на Go была неоднозначной, но интересной. Я легко мог представить Go не только в привычной для него сервисной нише, но и в прикладной — его кросс-платформенность и близость к системному уровню в сочетании с простотой пришлись бы там очень кстати. И вот мы здесь — игру мечты я пока не создал, но пару игр попроще сделать удалось.
В этой статье я хочу рассказать об инструментах, появившихся по ходу работы. Сами инструменты я объединил в библиотеку Youngine и опубликовал на GitHub. Там же я опубликовал небольшой пример проекта.
В разработке игр динамические и статические массивы являются основным инструментом при работе с набором объектов, буду дальше называть их vector. Вы можете подумать про разные map, set, и другие ускоряющие структуры, но их тоже предпочитают делать поверх векторов. Почему так? Вектора просты для понимания, удобны для большого числа задач, особенно там, где объём данных заранее неизвестен или примерно известен. Но как вы понимаете, за все надо платить, и расплачиваться приходится производительностью, которой, как обычно, всегда не хватает. Так что, использование динамических массивов имеет свои ограничения и особенности.
Как часто вы ловите ошибки в VBA?
А как часто вам приходится пытаться понять откуда ноги растут?
Если макрос состоит из одной процедуры, это немного другая история...
Но вот если у вас полноценный стек вызовов, когда:
Main() -> NestedSub1 -> NestedFunc -> NestedSub2 ... -> NestedSubN
как отловить, в каком произошла ошибка?
Окей, вы скажите "Поставим On Error GoTo Catch
и в Catch: Debug.Print "Function name"
", да?
А если эту функцию вызывают несколько разных Sub/Function, как понять в каком из них произошла ошибка?
Представляем вам реализацию игры в крестики-нолики на С с помощью одного вызова printf. Написана для участия в IOCCC в 2020 году.
«String interning», иногда это называют «пулом строк» — это оптимизация (https://en.wikipedia.org/wiki/String_interning), при которой хранится только одна копия строки, независимо от того, сколько раз программа ссылается на нее. Среди других оптимизаций по работе со строками (SWAR, SIMD-cтроки, immutable strings, StrHash, Rope string, и немного других), часть которых была описана тут, она считается одной из самых полезных оптимизаций в игровых движках, есть правда небольшие недостатки у этого подхода, но экономия памяти и скорость работы при правильной подготовке ресурсов и работе с лихвой их перекрывают.
Вы 100% когда-нибудь писали одну и ту же строку несколько раз в одной программе. Например:pcstr color = "black";
А позже в коде пришлось написать: strcmp(color, "black");
Как видите, строковый литерал "black"
встречается несколько раз. Означает ли это, что программа содержит две копии строки "black"? Более того, означает ли это, что в оперативную память загружаются две копии этой строки? На оба вопроса ответ — зависит от компилятора и вендора. Благодаря некоторым оптимизациям в сlang (Sony) и GCC, каждая строка-литерал хранится в программе только в одном экземпляре, и, следовательно, только одна копия загружается в оперативную память, поэтому иногда cтановятся возможными разные фокусы.
Приветствую Хабравчане!
В прошлой статье получилось создать минимальную программу "Hello world!" размером 3,5 кб. Теперь будем рисовать нативными средствами Windows.
Приветствую, Хабравчане!
Решил сделать цикл статей по написанию на С++, различных небольших программ. Под новые и старые ОС. Мне кажется мы стали забывать как раньше программировали:) Для себя определил несколько важных критериев.
Привет, Хабр!
Хочу поделиться одним любопытным и совершенно нетривиальным кейсом использования Русского Алгоритмического Языка. В этой статье я расскажу, зачем мне это вообще понадобилось и почему в конечном счете я влюбился в него.
(картинка позаимствована с одного из официальных туториалов)
Ковыряясь в скриптах наткнулся на интересный case. Чё тут интересного то? Подсказка, это не цикл. Да, вот эти вот break'и выглядят тут совершенно инородно. Возможно когда-то этот кусок эм, кода работал в цикле и break каким-то боком был нужен? Но сейчас цикла нет а brake есть. Бомбит? Бомбит до такой степени что я решился писнуть небольшую статейку про case
.
На 100%-ю полноту освещения не претендую, все мои эксперименты лишь очень поверхностные но несколько точек постараюсь расставить.
В ходе обсуждения с товарищем docent2007 статьи о сортировке «Милосердный Сталин» у нас сами собой родились дополнительные, весьма полезные методы сортировки. Эти методы определённо могут пригодиться каждому.
Либеральная сортировка уважает каждое значение и его "право" на место.
def liberal_sort(arr):
# Каждый элемент остается на своём месте, потому что все равны
return arr
То есть массив возвращается таким, какой он есть, без изменений, поскольку "у каждого элемента своё уникальное место, которое нельзя нарушить".
Есть еще вариант Либеральной сортировки, где все элементы группируются по какому-то общему признаку, чтобы "никто не чувствовал себя изолированным". Внутри каждой группы порядок сохраняется.
from collections import defaultdict
def liberal_sort_with_groups(arr, key_func=lambda x: x):
# Группируем элементы по ключу, но внутри групп порядок сохраняется
groups = defaultdict(list)
for item in arr:
groups[key_func(item)].append(item)
result = []
for group in groups.values():
result.extend(group)
return result
arr = [5, 3, 8, 3, 1, 8, 5]
sorted_arr = liberal_sort_with_groups(arr, key_func=lambda x: x % 2)
print(sorted_arr)
# нечетные и затем четные, но порядок в группах сохранен
# -> [5, 3, 3, 1, 5, 8, 8]
В праздничные выходные мне пришло в голову, что я давно не занимался чем-то бессмысленным. Представляю вашем вниманию... Regex Chess: набор из 84688 регулярных выражений, которые при выполнении по порядку генерируют ход (валидный, то есть не совсем ужасный) для переданного в качестве входных данных состояния шахматной доски. [Прим. переводчика: здесь в оригинале статьи есть интерактивный виджет, позволяющий сыграть с движком.]
Вот вся программа, которая делает ходы против игрока (серьёзно, я не шучу, она действительно такая короткая):
let regex_list = [/* очень длинный список регулярных выражений */]
let board = "rnbqkbnr / pppppppp / 8 / 8 / 8 / 8 / PPPPPPPP / RNBQKBNR w KQkq - 0 1";
for (regex of regex_list) {
board = re.replace(regex.pattern, regex.target)
}
display(board)
Прочитав этот пост, вы поймёте (надеюсь), как возможна эта последовательность регулярных* выражений, а также что делают конкретные регулярные выражения.
* Снобы могут заявить что-то типа «Вы сказали, что будете использовать регулярные выражения, но они не регулярные!" Но меня это не волнует.
Как всегда, код проекта выложен на GitHub.
Это еще одна статья про демосцену, сайзкодинг, ассемблер, MS‑DOS и ретрокодинг. То есть, о том, как ночами напролет добровольно и бесплатно писать бесполезный и очень трудоемкий код, и получать от этого массу удовольствия (и седую бороду). Даже если вы уже пробовали и вам не понравилось, вам все равно стоит почитать. Возможно, вы что‑то делали не так. Например, использовали не те буквы и цифры. А еще тут есть подборка «демок» размером в 256 байт!
Ответ: да! И вот же он:
Игра запускается, и вы можете перемещаться по миру 64x64x64 при помощи клавиш WASD. Пробелом прыгаем, мышью осматриваемся. Щёлкнув левой кнопкой мыши, можно разрушить блок, а правой — установить землю.
Можно просмотреть QR-код при помощи следующей команды под Linux:
zbarcam -1 --raw -Sbinary> /tmp/m4k &&chmod +x /tmp/m4k && /tmp/m4k
-1: выйти после того, как код будет просканирован
--raw: не обрабатывать его как текст
--Sbinary: воспользоваться двоичной конфигурацией
Проект выложен на GitHub здесь:TheSunCat/Minecraft4k
Гифки + FFMPEG + Gemini 2.0 Flash Thinking Experimental = 🔥. Мой эксперимент по созданию софта для себя
Так, давайте еще раз.
Я - Владимир, который в прошлый раз рассказал про то, как сделать классную, цельную и масштабируемую логику для кроссплатформенного приложения в вакууме.
Открытым остался вопрос: как ее к UI подключать?
Точнее я уже частично отвечал на этот вопрос в двух прошлых статьях, но в этой я хотел бы целенаправленно поговорить именно об этой части того подхода, который я предлагаю.
В этой статье я разложу по полочкам само решение, как я к нему пришел и при чем тут Алан Тьюринг. А бонусом покажу как это все масштабируется и оставлю вас размышлять о том, почему мы не додумались до этого раньше (ну за 85 лет уже можно было бы).