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

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

Меж тем тут пока ковырялся в ту пятницу с шаблоном игры на Common Lisp, лишний раз подивился, какой же Raylib минималистичный, см. рис. 1 — одна-единственная библиотека, которая не зависит вообще ни от чего, кроме системных библиотек и весит, внимание, немногим более двух мегабайт. Конечно, остаётся открытым вопрос о том, а что же она при таких скромных размерах умеет, но вроде бы навскидку, судя по официальной документации (см. рис. 2), не сильно-то уступает приснопамятной SDL.

Биндинги raylib к Common Lisp тоже оставляют двоякое ощущение: вроде бы в течение 115 комитов пассажирский самолет Бройлер 747 терпит крушение над водами Атлантического океана автор отважно вручную прописывает сигнатуры сишных функций, и вроде даже аудио вон поддерживает, с другой стороны всей толпой не могут осилить добавить raygui, биндингов до сих пор нет в Quicklisp, а версия в asd-файле гордо значится как 0.0.1.

В общем, я свой любимый middleware liballegro, конечно, не брошу — больно много в нём изкоробки крутых фичей, отсутствующих у конкурентов, вроде подгрузки ресурсов из zip (и не только) архивов, единого файла конфигурации, воспроизведения видеофайлов, поддержки MacOS изкоробки и проч., не говоря уж о гранитной стабильности — люди раз в год минорную версию бампают 😁

Но Raylib, безусловно, крайне интересный вариант middleware для игрового движка.
🔥7
#лытдыбр

Был такой мемчик, мол, не-лисперы видят в коде на Lisp сплошные скобки, а trueъ лисперы видят красоту и структуру (см. рис. 1). Так вот, как выяснилось, есть пакет к Emacs от автора знаменитого magit, который буквально реализует этот мем 😂

Установил себе, и выглядит довольно мило (см. рис. 2) — у меня, в принципе, мозг уже давно научился скобочки игнорировать, а тут их ещё и затемнённым шрифтом подкрашивает 🌚
👍131😁1
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #проекты #common_lisp

Наконец дошли руки до важной вехи в разработке игрового движка — до нормального DSL для интерфейса 😊
Получилась вот такая красота — дюжина строчек очевидного кода без лишних деталей лёгким движением руки превращается в молниеносно быструю функцию в полтора килобайта машинного кода. Чуть подробнее расскажу в завтрашнем девлоге, а пока дайте знать, как вам с визуальной точки зрения, как говорится, ставь лойс если любо ❤️

Эй, фронтэндеры, всё ещё качаете пол-интернета в node_modules? А мы уже красим кнопки 😂
8
#лытдыбр

"Пиздец, ну и год." — "Капитан, но сейчас февраль!"
Новости, конечно, без мата никак не опишешь. Буквально в голове не укладывается, просто невозможно поверить.
Рядом с мостом тысячелетия вечером собирались люди, но я свою кукушечку оберегаю привычным способом — заныриванием в код.
😢51
#проекты #devlog #common_lisp

Нашёл в себе силы записать девлог.
На этот раз с английскими и русскими субтитрами (какой же OpenAI Whisper крутой в распознавании голоса, моё почтение).
https://youtu.be/VSp61zdA6C8
🔥3
#статьи

Я, конечно, не ИИ-алармист, и убеждён, что до сильного искуственного интеллекта a.k.a. AGI ещё срать и срать, если это вообще возможно, но вот этот текст с хабра, конечно, убеждённость немножко пошатнул, и дал некое количество пищи для размышлений о том, а что же такое интеллект естественный и какова вообще природа реальности 😵‍💫
Ещё умилило, как запись игры нейросеткой в Doom автор пометил эмодзи 🤖, а запись игры человеком — 🐵
#лытдыбр

За бортом 21° Цельсия. С одной стороны, здорово, с другой стороны, с приоткрытой балконной двери, конечно же, тянет куревом, потому что некурящий черногорец — это, я не знаю, как русский, не любящий быстрой езды 😩
🔥21
This media is not supported in your browser
VIEW IN TELEGRAM
Покойся с миром, мой кумир.
Россия будет свободной.
12💩3👎1😁1
#лытдыбр

Вчера, в 1:55 ночи по тихоокеанскому стандартному времени, сам Роберт Смит, автор Coalton (строго типизированной надстройки над Common Lisp) одобрительно твитнул ссылку на 1 часть моего туториала по геймдеву на Common Lisp, а потом его ретвитнул, на секундочку, сам Пол Грэм, популяризатор лиспов ещё с девяностых, автор книг «On Lisp» и «ANSI Common Lisp» и сооснователь Y Combinator.
Ещё её Сионеску репостнул, но это уже не так впечатляюще, хотя тоже человечек в наших кругах известный)
В принципе, жизнь можно считать прожитой не зря 😊
🔥20👍3👏2
#лытдыбр #clojure

Между делом тут решил сделать небольшой пет-проект на злобу дня в виде вебсервиса на Clojure. Примерно прикинул используемый стек и куда и как буду развёртывать, начал писать код, разбирая шаблон Luminus на отдельные запчасти и выкидывая ненужные. И вот встал вопрос взаимодействия вебсервиса с БД, и тут я задумался.

Штука в том, что в подавляющем большинстве случаев в Java и, как следствие, в Clojure вопросы масштабирования всегда решаются тред-пулами, хотя вот уже лет десять как самый модный подход для их решения — асинхронщина на основе интерфейсов мультиплексирования ввода-вывода а-ля epoll(7) в Linux или kqueue(2) в *BSD. Полез подробнее изучать вопрос, выяснилось, что на самом деле в топе известных бенчмарков от Techempower по Clojure находится решение с асинхронным жабовским сервером Undertow и очень экспериментальным асинхронным драйвером БД от наших финских коллег из Metosin porsas. Поспрашивал в русскоязычном чатике по Clojure, кстати, очень крутое сообщество, не то что лисперский чатик, в котором мы только и знаем, что про коммунизм сраться 😅. Там мне объяснили, что нужно не выёживаться и использовать тред-пулы 😁 Я решил показать преимущества асинхронного подхода на примере и вчера уже к ночи сделал бенчмарк на чистой сишечке, чтобы не оглядываться на рантайм языка.

Как бенчмарк устроен:
1. Два варианта, синхронный и асинхронный. Оба запускаются с заданным количеством тредов и запускают в каждом серверный цикл, с помощью флажка SO_REUSEPORT на серверном сокете.
2. Сценарий обработки следующий: дожидаемся конца запроса от клиента (путём поиска \r\n\r\n в конце буфера), делаем в PostgreSQL запрос SELECT pg_sleep(5), отвечаем клиенту HTTP/1.0 204 No Content, обрываем соединение.
3. Синхронный вариант ждёт ответа от БД в блокирующем режиме; таким образом, для него 1 тред = 1 обрабатываемый в данный момент клиент.
4. Асинхронный вариант отправляет запрос в БД, закидывает сокет соединения с БД в общий eventloop и уходит на следующую его итерацию, таким образом, один тред с одним циклом событий может "одновременно" обрабатывать сколь угодно много клиентов. Всегда мечтал поиспользовать C-шный интерфейс к libpq в асинхронном режиме, вот и довелось, правда, место в документации, где этот вариант описывается, зачитал до дыр, прежде чем сделал 😅
5. Для теста использовал wrk с 10 одновременными соединениями в течение минуты, таким образом, максимальная теоретическая производительность в этом бенчмарке — 10 / 5 = 2 запроса в секунду; напомню, запрос обрабатывается минимум 5 секунд из-за эмуляции медленных запросов в базе через pg_sleep(5).

По результатам асинхронный вариант изи достиг максимальной производительности в два потока (строго говоря, даже в один, но что я, зря код для многопоточного epoll писал 😂). В то же время синхронному варианту для этого понадобилось 100 тредов, да и то была парочка таймаутов; собственно, по дефолту в PostgreSQL max_connections как раз 100, и мне было лень его подкручивать выше.

Написал в кложа-чатике, но там меня снова убедили, что с тред-пулом по сути всё то же самое, просто нужно аккуратно его настроить, и накидали ссылок для изучения ❤️
6🔥1
#мемасики

Заорал, как говорится, в голос а потом вспомнил, что я на ноутбуке Manjaro уже несколько месяцев не обновлял 😭
😁6