brain_dump_etc
662 subscribers
102 photos
4 videos
3 files
410 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
​​Повозился тут со штуками вокруг 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