Лисп в изгнании
229 subscribers
156 photos
21 videos
5 files
233 links
Авторский канал на околоайтишную тематику.

По всем вопросам @awkravchuk
Download Telegram
#мемасики

Какая же жиза, г-ди. Сегодня +35 обещают, остаётся только тюленить под кондиком
😢1
Forwarded from ДЕВОПСИНА | DevOps | Linux
This media is not supported in your browser
VIEW IN TELEGRAM
как тебе такая зона комфорта, bitch?

@devopsina
🔥2🤣1
#common_lisp

Попытался сделать очередной подход к снаряду кроссплатформенной изоляции окружения для Common Lisp, и чуть не заработал себе экзистенциальный кризис. CLPM г-на Эрика Тиммонса нормально работает, но при создании бинарника под виндусом крэшится из-за того, что ему почему-то не хватает памяти на кучу, а на багрепорт г-н Тиммонс не реагирует. Qlot — типичное fukamachiware, опирается на Roswell (на этом месте, в принципе, можно отправляться в магазин за верёвкой с мылом), но внезапно неплохо работает. До тех пор, пока не нужно собрать бинарник под ебучим виндусом, где Roswell даже работает, только у меня-то в CI-скриптах не виндус, а Wine, а вот под ним розвелл тупо крашится при любом действии, потому что 1) пытается установить в своих локальных целях бинарный SBCL, для чего скачивает msi-шку и ставит её msiexec'ом, и 2) msiexec делает вид, что всё хорошо, но на деле SBCL не ставит. Приехали. Использовать системный SBCL розвелл, конечно же, не умеет. Ну то есть как, можно ему сказать ros use sbcl/system, но он начнёт жаловаться, что ему не хватает какого-то его дампа по имени roswell.core, и вообще хуй пойми, откуда его взять.
Так и живём 😢
🤯3🔥2😁1💩1🙈1
#common_lisp

Хоть и проспал вчерашний утренний стрим, но наконец заборол кроссплатформенную сборку игры с джема, заставив работать Qlot напрямую из лиспа, а не через Roswell. Под конец ещё выяснилось, что виндус не умеет в симлинки (напомню, что винда — абсолютно проклятая ОС), но я уже без удивления обошёл это костылём.
Теперь бы ещё сделать билд под макось 😅 Может, кто-то из подписчиков готов предоставить удалённый доступ к своему макожелезу для моих экспериментов со сборкой? Напишите мне в личку, если да)
👍1🔥1😁1
#мемасики

И снова наступает годовщина интереснейшего исторического события, связанного с предотвращением массовой резни по этническому признаку.
Всем мирного неба над головой 🕊
👍1
Media is too big
VIEW IN TELEGRAM
#common_lisp

Дожили, я своими макросами внутри макросов внутри макросов в ECS-фреймворке поломал Clasp так, что он высирает многомегабайтный лог внутренней ошибки компилятора. С одной стороны, с класпом очень много вот такой возни (остальные шесть реализаций Common Lisp нормально вывозят мою макро-магию), с другой стороны, дропнуть его поддержку жалко, мало ли из этого гадкого утёнка спустя время вырастет что-то прекрасное 🦢
🔥5😈1
#лытдыбр #common_lisp

Сегодня на утреннем стриме тестил производительность новой фичи в ECS-фреймворке, над которой работал всю неделю, а именно, — составных индексов. Выяснилось, что обработка каждой новой тысячи объектов в игре (например, отрисовка анимированных спрайтов 32x32) занимает 0.25 мс, причём большую часть времени программа проводит внутри сишных функций из liballegro. По-моему, достаточно неплохо 😊
🔥101
#лытдыбр #common_lisp

Решил всё же дропнуть поддержку компилятора Clasp в своём ECS-фреймворке cl-fast-ecs из за его неуловимых внутренних ошибок. Ну то есть во-первых, силушек уже никаких моих вот с пикрелейтеда нету, все макросы в коде позакомментируешь, — работает, добавляешь какой-то совершенно безобидный кусочек кода — валится. И во-вторых, камон, на данный момент времени употреблять слова Clasp и fast в одном предложении — это оксюморон какой-то, он же буквально самый медленный среди вообще всех, даже медленнее ECL, который под капотом в C транслирует.

В общем, коммиты мутятся, процессорные циклы крутятся 😅
😱4👍2🥰1
#лытдыбр #common_lisp

Сегодня на утреннем стриме в третий раз в своей жизни реализовывал алгоритм A*, и опять с первого раза нормально не получилось 😅 Для прямого и ясного, как день, пути через несколько клеточек написанная мной функция возвращает гигантский путь из семи тысяч точек. Буду отлаживать завтра, наверное)
😁2
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp

Не без помощи товарища на утреннем стриме наконец доделал поиск пути A*-алгоритмом 😊 Путь типа того, что на видео, в отладочном режиме рассчитывается за 3 миллисекунды, так что, видимо, есть место для оптимизаций. Ну и сам путь иногда выглядит не очень естественным для живого существа из пространства с евклидовой метрикой, так что завтра буду пробовать трюки с Amit's A* Pages 😅
🔥5😁1
#мемасики

Лол, на реддите прекрасное: не у одного меня крыша едет от ковыряния в потрохах Шиндуса 😂
😁1
#common_lisp #лытдыбр

Путём длительных экспериментов выяснил, что из всех дистрибутивов GNU-тый CLISP собран с поддержкой тредов, а, следовательно, и с возможностью загрузки bordeaux-threads, только в NixOS и в Gentoo (да и то, если в последней включить юз-флаг threads). Возможно, в Guix тоже, но только после того, как там примут патч от моего подписчика. Но в NixOS настолько древняя версия, что на неё даже Quicklisp не ставится. В общем, в порыве очередной оптимизации CI для своего ECS-фреймворка я всё перелопатил, и теперь в нём CLISP запускается из аж специального докер-образа 😅
🔥5
#видео #лытдыбр

Посмотрел тут выступление крутейшего Майка Актона, одного из популяризаторов идей data-oriented programming (и ECS в частности). В докладе Майк, как водится, гнёт линию, что не нужно заниматься генерализацией и пытаться решить какие-то эфемерные общие случаи, а нужно решать те задачи, которые конкретно есть в руках в данный момент. Мысль о том, что всё течёт, всё меняется, не бывает на самом деле "future-proof" кода и уже через пять-десять лет код твоей игры (да и сама игра), скорее всего, никому не будет нужен, довольно болезненная, но глубокая 🤔
5
#лытдыбр

В принципе, начинаю понимать г-на Влада Цепеша, жившего в своё время в краях по соседству, потому что в таком климате единственный способ выжить без кондиционера — это, действительно, дрыхнуть днём в каком-нибудь тёмном подземелье с приятным могильным холодком, и только с заходом солнца выползать из него поделать дела 🫠
🔥7🤗1
#лытдыбр #common_lisp

Вообще я думал, что неплохо соображаю в классических структурах данных, но если начинаешь заниматься низкоуровневой оптимизацией с расчёсыванием кэша CPU вдоль шёрстки и вот этим вот всем, становится жарковато. В последние дней десять занимался тем, что добавлял в свой ECS-фреймворк индекс, прямо как в реляционных БД — вспомогательную структуру данных, которая позволяет быстро сделать обратный запрос, т.е. ответить на вопрос "какие сущности имеют вот это конкретное значение такого-то слота такого-то компонента?". Так вот, следите за руками:

• Хэш-таблица с цепочками в виде лисповских односвязных списков замечательно подходит, но любой поиск по такому индексу — это ужас с точки зрения кэша процессора, да и при вставке требует лишних аллокаций.
• Хэш-таблица с открытой адресацией прекрасно уложится в кэш, так как является по сути единственным плоским массивом, но малину портит тот факт, что сущности с одинаковыми значениями слота в неё вставляются чёрти как, а для кэша хорошо бы было, чтобы они шли в аккуратном возрастающем порядке; а организовать какой-нибудь бинарный поиск места для вставки не выйдет потому, что несколько probing sequences (как это по-русски, последовательности попыток?) могут пересекаться.
• Сбалансированное бинарное дерево тоже подошло бы, если бы не случай одинаковых значений слота — за логарифмическое время, мне кажется, никак не получить все сущности с одинаковыми значениями, придётся обходить вообще всё дерево за O(n), и зачем тогда вообще такой индекс нужен.
• На B+-дерево что-то боюсь замахнуться 😅

Судя по тишине в моём вопросе на SO никто индексами в ECS особо не заморачивался.
В общем, если формализовать задачу, нужна структура данных, в которую можно сравнительно быстро, хотя бы за логарифм, вставлять повторяющиеся ключи произвольного типа (значения слота компонента) со связанными с ними целочисленными значениями (сущностями) и быстро, в идеале за константное время, получать в отсортированном виде все значения, связанные с заданным ключом. Ну и в идеале чтобы эта структура не превращала кэш CPU в щепки 😂

P.S. Перечитал пост и понял, что действительно из того, что я знаю, подходит либо B+-дерево, либо хэштабличка с отсортированными цепочками. Скорее всего, на завтрашнем стриме буду делать второй вариант, хотя B+ тоже интересно, раньше никогда руками такого не делал.
🔥8👍2
#лытдыбр #common_lisp

На этой неделе решил взяться за behaviour trees — паттерн, используемый для построения сценариев функционирования NPC в играх, и заодно попытаться натянуть его на паттерн ECS 😅 Даже изобразил простенькое тестовое дерево для персонажа-вражины, пытающегося догнать игрока и пнуть его в ближнем бою (см. рис. 1). Правда, с первого раза реализовать не получилось, — мозг запнулся о тот факт, что возвращаемое из узлов дерева булевское значение (успех/неуспех) нужно хранить для каждого узла дерева, а не по одному на всего персонажа, что неизбежно приводит к тому, что своя копия дерева должна быть у каждого персонажа; а мне изначально хотелось сэкономить памяти и хранить только один экземпляр дерева на всех. В общем, завтра с утра на стриме попытаюсь переделать ровно 😊
🔥3