brain_dump_etc
663 subscribers
108 photos
4 videos
3 files
415 links
Дампы мыслей, свалка ссылок, программизмы, вкусовщина!

Автор: @astynax
Донаты (patreon и прочее): https://astynax.me/support.html
Чат: https://xn--r1a.website/brain_dump_chat
Twitch: https://www.twitch.tv/astynax2hs
Discord: https://discord.gg/tJvze5
Download Telegram
​​Рубрика "ссылка на видео"!

Let's Reverse: Adventures of Lomax graphics — интересный и довольно необычный скринкаст (куда уж без стримов сейчас?) разбора одной старой игры (The Adventures of Lomax от крутейших Psygnosis) на предмет того, как игра хранит графику.

Зрелище само по себе нескучное, особенно если вы интересуетесь #reverse_engineering, но в этот раз ещё и инструментарий использован примечательный: вся работа делается в IPython REPL. И не в Jupyter, а именно в текстовом режиме — текстом выводятся гистограммы, палитры, даже сама графика! Используется для всего этого фреймворк Mr.Crowbar, предоставляющий eDSL (автор вдохновлялся Django ORM, %)), с помощью которого вы жонглировать байтиками, описывать структуры и обрабатывать их так, как Web-разработчики работают с моделями ORM. Собственно это видео как раз и записано автором фреймворка как demo для "Мистера Фомки".

Сам я положу Mr.Crowbar в копилочку, а вам желаю приятного просмотра! А может быть даже и вдохновлю кого-то (менее ленивого, чем я) что-то эдакое пореверсить >;^F

#python #gamedev #video
​​Повозился тут со штуками вокруг Gemini (см выше).

Серверы

Именно статический "сайт" поднимать не особо хотелось, но таки поднял: gemini://recursive.one (он же через проксю). Раздаётся с помощью Agate, минималистичного Gemini-сервера, написанного на #Rust. Agate кроме раздачи статики ничего не умеет, так что пока статическая страница и повисит %)

Потыкал пакеты из набора haskell-gemini: пока сыровато. Так что #Haskell с Gemini я подружу позже.

Зато приятно оказалось пользоваться Jetforce. Это фреймворк для #Python такой. Построен на Twisted, внутри типы проаннотированы, async тут и там, при этом код выглядит "как Flask", то есть как набор декорированных функций — современненько!

Мне интересно было именно "Gemini приложение" написать, то есть что-то, создающее контент на лету. Получилось вполне прилично: основная функциональность в Jetforce уже есть. Нужно только будет написать eDSL для более удобного (чем захват регулярками) описания параметров в путях.

Клиенты

На десктопе попробовал пожить с Castor, графическим клиентом, написанным на #Rust, опять же. Но клиент пока слишком юн, и им не слишком удобно пользоваться.

В итоге пересел на Lagrange. Вот этот — красавец! Написан на C11 и SDL, аппаратно ускоряет отрисовку, красиво показывает текст, может и графику показать inline, управляется хоткеями. Даже "лого" генерирует для ресурсов на основе их имени — как умолчательные аватары на GitHub, вы такие точно видели. Пока я крайне доволен пользованием, рекомендую!

На Android пока остановился на deedum. Он не слишком красив, но крайне шустр и нетребователен к ресурсам.

Контент

В Gemlogs — это такие дневники в Geminiverse — народ пишет, есть что почитать. А ещё есть зеркала Lobste.rs и HackerNews, даже с комментариями. Ту же Wikipedia можно почитать через такой прокси. Словом, уютненько :^)
👍1
Я вам скажу, с вводом данных в #Gemini работать не скучно: аналога POST в Gemini нет, как нет и URL encoded параметров! И cookies тоже отсутствуют, как класс, как вы помните. Да, вы можете привязаться к пользовательскому сертификату и таким образом реализовать сессионность, но это уже будет сквозное состояние, чего хотелось бы избежать.

Зато Gemini сервер может запросить строку специальным ответом. После чего клиент покажет пользователю диалог с заданным приглашением, а результат ввода отправит обратно на сервер в виде query string. Соответственно, если вы хотите получить несколько значений, то вам нужно будет каждое запросить отдельно и сохранить в URL (кроме последнего, которое будет в query string). При этом размер запроса ограничен килобайтом на всё про всё — много не попостишь. Но тем интереснее!

Лелею идею написать FSM, которая взяла бы на себя весь этот сбор параметров, чтобы в обработчике запроса уже иметь все данные введёнными. Для Jetforce описание параметров можно будет оформить как "eDSL #Python-style" — на декораторах.

Также было бы интересно попробовать воплотить в Gemini интерактивность, подобную той, что использует #Racket в своих Stateful Servlets. Там вы тоже пишете код так, что данные вводятся "запросами к пользователю": вы отравляете пользователю форму, и получаете результат тут же в коде. Внутри всё реализовано на сохранении состояния в URL и рэкетовых continuations, снаружи же выглядит как магия — люблю такое ;) А уж насколько магически выглядят Web Cells: вы имеете переменную, которая помнит состояние между вызовами обработчика запроса, и таких переменных даже может быть несколько!
Кажется, получилось неплохо! Заодно дал некоторую вводную про то, что же за вещь такая — эти наши Git hooks.

https://youtu.be/oeca7fvjDf4
👍1
Вот запись моего сегодняшнего монолога про Cozy Programming:

https://youtu.be/QVmCLRrunoc

В программе:

- Ностальгия по BASIC (тут про такое уже было)
- PICO-8, про который тут есть и в количествах
- TIC-80 — его открытый аналог, см анимацию выше
- Железки вроде GameShell и PlayDate (про обе писал, смотрите ссылки)
- DrRacket как уютный способ порисовать картинки кодом (пост про это — тут)

Также коснулся особенностей графики ZX Spectrum, палитровой анимации, вспомнил про Amiga Workbench — всё это вскользь, но в контексте.
🔥3
А вот и запись

- задачка на Rosetta Code
- больше про паттерн тоже применительно к Python можно прочитать в этой статье

В ролике я показал, как можно использовать паттерн Active Enum вместо ветвления с помощью if/match и получить "более идиоматичный для ООП" код — по-SmallTalk-овски более идиоматичный, конечно же 😎. Суть паттерна: варианты перечисления обладают закреплённым поведением, в идеале — каждый своим.

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

В Kotlin есть свои enum classes и там прикрепление поведения к вариантам тоже делается элементарно. Отдельно приятно использовать в качестве вариантов объекты вместо классов, когда закреплённое поведение реализуется методами, а полей как таковых нет.

В Java традиционные перечисления умеют только быть собой и именовать варианты, не более. Но нынче есть и sealed classes, которыми можно описать то же множество значений с поведением, да ещё и в одном файле можно хранить и базовый класс, и варианты — да, не нужно иметь по файлу на классик из трёх строк! Правда, остаётся возможность где-то указать в качестве типа класс-вариант, что идёт несколько в разрез с идеей "варианты — всегда значения типа-перечисления."

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

Вообщем, мне паттерн нравится — тем, что позволяет размять мозги и взглянуть на задачу иначе. А не потому что он для мира ООП, хе-хе 😉
👍5