Ну вот, отменяется этот мой ритрит про геймдев — участников не набралось минимально достаточное количество. Видимо, все желающие похайкать скатались в прошлом году и не по разу 🙈 Ну да ладно, может быть ещё соберёмся и поджемим игры! Были ещё идеи ритритить вокруг чая и/или кофе, тоже надо будет попробовать 😉
(И надо будет хотя-бы сюда написать, с чем я там поиграл вокруг Tic-80)
(И надо будет хотя-бы сюда написать, с чем я там поиграл вокруг Tic-80)
😱12
Недавно решил пройтись по моим RSS-подпискам и проверить, сколько из них живо ещё. Несколько личных блогов отвалилось безвозвратно, как это порой бывает. Кто-то просто пересобрал генерацию сайта на новый движок и старая лента отвалилась. Для некоторых смена стека, на котором работает сайт — главное развлечение.
Я сам был таким — несколько раз менял генераторы для сайта, я и сюда писал вкратце о моих приключениях. С тех пор мой сайт-визитка переехал с самодельного движка на максимально стандартный Jekyll с простенькой темой
В рамках упомянутого выше "дня приведения в порядок подписок", решил я сходить и посмотреть, что же Рахим сейчас пишет. Выяснил, что он уже какое-то время ведёт блог на своём движке и на собственном хостинге. Вот уж я посмеялся :) Блог у Рахима тоже менял движок свой несколько раз ещё будучи статичным сайтом, в процессе стали недоступны многие неплохие статьи. Но ресурс был достаточно заметен, чтобы его проиндексировала Wayback Machine, чему я был очень рад — как раз захотелось перечитать кое-что старенькое и мочь потом сослаться на.
Пока я смотрел вокруг того, что Рахим делает, наткнулся на один из его свежих проектиков: textpod, "extremely simple note-taking app". И эта находка меня порадовала тем, что это образчик того самого smol software, а я вокруг этой темы вращаюсь в последнее время (периодически залетаю сделать пару кругов).
textpod — это заметочнца, которая хранит всё в одном Markdown-файле и общается с пользователем через Web-интерфейс. Написана программа на Rust, собрана в самостоятельный бинарник, призвана работать локально. А smol она потому, что запрограммировано ровно то, что необходимо для работы, и все решения максимально прямолинейны и не страдают лишней развесистостью. Чего нельзя, увы, сказать о пачке зависимостей проекта, но таков уж современный Rust for Web, в textpod всё ещё вполне скромно.
Кстати, если вам показалось, что заметка какая-то слишком развесистая получилась, то вам не показалось
Я сам был таким — несколько раз менял генераторы для сайта, я и сюда писал вкратце о моих приключениях. С тех пор мой сайт-визитка переехал с самодельного движка на максимально стандартный Jekyll с простенькой темой
:Р Та моя публикация была дополнением к замечательной картинке с графиком. А картинку эту я утащил из блога Рахима (того самого, автора <https://rakhim.org>, ведущего подкаста "Мысли и методы", сооснователя Hexlet и т.д.).В рамках упомянутого выше "дня приведения в порядок подписок", решил я сходить и посмотреть, что же Рахим сейчас пишет. Выяснил, что он уже какое-то время ведёт блог на своём движке и на собственном хостинге. Вот уж я посмеялся :) Блог у Рахима тоже менял движок свой несколько раз ещё будучи статичным сайтом, в процессе стали недоступны многие неплохие статьи. Но ресурс был достаточно заметен, чтобы его проиндексировала Wayback Machine, чему я был очень рад — как раз захотелось перечитать кое-что старенькое и мочь потом сослаться на.
Пока я смотрел вокруг того, что Рахим делает, наткнулся на один из его свежих проектиков: textpod, "extremely simple note-taking app". И эта находка меня порадовала тем, что это образчик того самого smol software, а я вокруг этой темы вращаюсь в последнее время (периодически залетаю сделать пару кругов).
textpod — это заметочнца, которая хранит всё в одном Markdown-файле и общается с пользователем через Web-интерфейс. Написана программа на Rust, собрана в самостоятельный бинарник, призвана работать локально. А smol она потому, что запрограммировано ровно то, что необходимо для работы, и все решения максимально прямолинейны и не страдают лишней развесистостью. Чего нельзя, увы, сказать о пачке зависимостей проекта, но таков уж современный Rust for Web, в textpod всё ещё вполне скромно.
Кстати, если вам показалось, что заметка какая-то слишком развесистая получилась, то вам не показалось
:P Я хотел одновременно написать и про textpod сам по себе, и про smol software, и про то, как я textpod разворачиваю сейчас на торчащей в мир VM и что мне приходится наворачивать вокруг, чтобы своей цели достичь. Так что это такой из себя анонс планов на ближайшее будущее!👍17🔥2
Так вот, textpod. Как я уже писал выше, это заметочница, хранящая все данные локально и дающая доступ к оным через браузер. Минимум JS, немножко кода на сервере. И никакой работы с разными пользователями, очевидно. Вот только я-то хотел бы запустить приложение на своей VM и использовать с разных устройств! А это значит, что хоть какая-то аутентификация нужна.
Можно было добавить защиту паролем прямо в код, на Rust писать я умею, как-никак. Но это было бы скучное решение. Ещё имелась возможность спрятать сервис за чем-то вроде Authelia, заодно заимев 2FA, но этот вариант я оставил на потом (на никогда, ха-ха!). Решил воткнуть простейший proxy, добавляющий Basic HTTP Auth.
Да, Basic HTTP Auth — не самая стойкая защита, я в курсе. Но у меня HTTPS форсируется силами Dokku (сертификаты выдаёт letsencrypt). И что-то особенно чувствительное я хранить в этом экземпляре textpod не планирую — у меня это будет просто inbox, потому-то я и хочу сделать его доступным извне.
Сама по себе эта самая простецкая аутентификация включается элементарно хоть в NGINX, хоть в Lighttpd, который я решил взять в этот раз (потому что почему бы и нет
И вот этот самый перенос приложения с "
Не буду описывать все эксперименты, расскажу только, что получилось в итоге. Можете сразу на картинку смотреть, которую я приложу ниже.
Итак, запрос приходит с префиксом "
Правда, ещё мне пришлось парочку textpod'овских вложенных путей дополнить префиксом и сделать это уже через rewriting, поскольку здесь мне таки нужно было, чтобы matching сработал заново и проверил доступ — и пробросил бы запрос к сервису с отбрасыванием префикса
И все эти приседания нужны были только для того чтобы Basic HTTP Auth работал не для всех URI, начиная от "
Не призываю никого повторять мой эксперимент, но я лично получил массу удовольствия (без кавычек) от настройки этой странненькой связки, а мне важно себя награждать, такой, вот, пунктик!
Можно было добавить защиту паролем прямо в код, на Rust писать я умею, как-никак. Но это было бы скучное решение. Ещё имелась возможность спрятать сервис за чем-то вроде Authelia, заодно заимев 2FA, но этот вариант я оставил на потом (на никогда, ха-ха!). Решил воткнуть простейший proxy, добавляющий Basic HTTP Auth.
Да, Basic HTTP Auth — не самая стойкая защита, я в курсе. Но у меня HTTPS форсируется силами Dokku (сертификаты выдаёт letsencrypt). И что-то особенно чувствительное я хранить в этом экземпляре textpod не планирую — у меня это будет просто inbox, потому-то я и хочу сделать его доступным извне.
Сама по себе эта самая простецкая аутентификация включается элементарно хоть в NGINX, хоть в Lighttpd, который я решил взять в этот раз (потому что почему бы и нет
:P). Однако я встречал совет, предлагающий перенести приложение под префикс, чтобы совсем уж простые боты не сразу нашли.И вот этот самый перенос приложения с "
/" на "/pod/" и доставил мне большую часть "удовольствия". Лайти умеет проверять префикс и проксировать только то, что заданный префикс содержит. Вот только в запросе путь тоже будет содержать этот же префикс, а textpod к такому, разумеется, не готов. И можно было бы использовать URI rewriting и отбрасывать префикс — lighttpd это умеет — но тогда и проксирование пришлось бы "монтировать" на "/", то есть я бы вернулся к ситуации, когда сервис доступен в "корне" хоста.Не буду описывать все эксперименты, расскажу только, что получилось в итоге. Можете сразу на картинку смотреть, которую я приложу ниже.
Итак, запрос приходит с префиксом "
/pod/" и проксируется с проверкой доступа. Но непосредственно после матчинга правила и перед передачей дальше запрос пропускается через скрипт на Lua, который отрезает лишнюю часть пути. Скрипту, в отличие от rewriting rule, позволено сказать "я поменял запрос, но заново запускать matching не нужно" и это как раз то, что и требовалось!Правда, ещё мне пришлось парочку textpod'овских вложенных путей дополнить префиксом и сделать это уже через rewriting, поскольку здесь мне таки нужно было, чтобы matching сработал заново и проверил доступ — и пробросил бы запрос к сервису с отбрасыванием префикса
:D.И все эти приседания нужны были только для того чтобы Basic HTTP Auth работал не для всех URI, начиная от "
/", а только для заданного подмножества! Право слово, VHosts гораздо проще делать, тут авторы серверов соломки подстелили давно.Не призываю никого повторять мой эксперимент, но я лично получил массу удовольствия (без кавычек) от настройки этой странненькой связки, а мне важно себя награждать, такой, вот, пунктик!
🔥6
Недавно нашёл применение моему PixCell/Elm — тому моему проектику выходного дня, который позволяет рисовать в браузере картинки попиксельно в рамках разрешения 16x16 и палитры как на старых компах.
Оказалось, что в нём вполне удобно делать картинки для… вышивки крестом! Да, разрешение маленькое, ну так я и не профессиональный вышивальщик, так, руки занять иной раз охота и мелкую моторику потренировать.
Пока что не очень удобно, что у меня нет мулине с теми самыми цветами с Commodore 64, а программа не позволяет задать цвета, которые у меня в наличии. Ну да ладно, может быть и сподоблюсь сделать импорт списка цветов в HEX да хоть через вставку из clipboard (как в Slack импорт тем оформления сделан) и сохранение в local storage.
Такое вот развлечение (не то, чтобы) на стыке с IT 😎
Оказалось, что в нём вполне удобно делать картинки для… вышивки крестом! Да, разрешение маленькое, ну так я и не профессиональный вышивальщик, так, руки занять иной раз охота и мелкую моторику потренировать.
Пока что не очень удобно, что у меня нет мулине с теми самыми цветами с Commodore 64, а программа не позволяет задать цвета, которые у меня в наличии. Ну да ладно, может быть и сподоблюсь сделать импорт списка цветов в HEX да хоть через вставку из clipboard (как в Slack импорт тем оформления сделан) и сохранение в local storage.
Такое вот развлечение (не то, чтобы) на стыке с IT 😎
🔥26🤔2👍1
Нашёл тут на днях ролик на YouTube, который длится 3.5 ч и по сути своей является компиляцией треков в общей стилистике для "прослушивания в фоне" — Lo-Fi, звуки дождя, что-то такое. И захотелось мне мочь эту подборку слушать с телефона в виде полноценного альбома, но именно в таком виде — с наложенными звуками природы и с таким же набором композиций — компиляция доступна только на YT. Пришлось взять в руки Python, а в итоге получилось то ещё "приключение" 😎
Скачал звуковую дорожку я силами
Собственно, прикрутить информацию о композициях я захотел, когда в описании к ролику нашёл полный список треков с временными метками начала каждого — это же практически готовый Cue sheet)! Написал скриптик, который мне сгенерировал простейший
Иметь дополнительный
Оказалось, что в mutagen фреймы CTOC и CHAP вместе с сопутствующими настройками (а их там хватает — как обычно, делали с запасом). Взял пример из документации и адаптировал под себя. Препятствий было всего два.
Во-первых, фреймы глав описываются миллисекундами от начала потока, тут всё просто, перегнать HH:MM:SS в миллисекунды элементарно.
Во-вторых, каждая глава должна ещё и конец свой описывать, поскольку главы по стандарту могу пересекаться (гибкость! (ну-ну)). Окончания глав я получил с помощью zip списка меток с самим собой, тут всё по классике. А вот конец последней главы нужно было откуда-то взять, но, к счастью, в метаданных MP3 нашлась длина дорожки в виде… числа с плавающей точкой знаками с десятью в дробной части 🌚 Прикинул, что если умножить на 1000 и округлить до целого, то получу как раз нужную длительность в миллисекундах — повезло! И даже проигрыватель показал последнюю главу как "hh:mm:ss - End", то есть понял мой замысел!
В конце концов я заимел себе самостоятельный MP3-файл с обложкой и главами и в будущем смогу делать подобные, если захочу. Ну и покопать самостоятельно источники было приятно 🤓
Скачал звуковую дорожку я силами
yt-dlp, тут всё как обычно. На выходе получил контейнер m3u8 с дорожкой в формате AAC даже с обложкой из thumbnail к исходному ролику. Оставлять в таком виде не стал и сконвертировал в MP3 с помощью ffmpeg, да, с некоторой потерей, но это же Lo-Fi для фонового прослушивания! Теги подправил, обложку заново приложил. Но один большой трек на три с гаком часа не слишком удобно слушать, захотелось оглавление прикрутить.Собственно, прикрутить информацию о композициях я захотел, когда в описании к ролику нашёл полный список треков с временными метками начала каждого — это же практически готовый Cue sheet)! Написал скриптик, который мне сгенерировал простейший
.cue-файл. Для чего пришлось сконвертировать [HH:]MM:SS в MM:SS:FF, заодно пересчитав часы в минуты и проставив нули вместо фреймов (FF). Пара проигрывателей, которые были под рукой, переварили сотни минут в полученном .cue-файле, так что цели своей я достиг. Но стал ли я останавливаться на этом? Конечно, нет! 😜Иметь дополнительный
.cue рядом с .mp3 не показалось так уж и удобно. Решил погуглить, можно ли встроить разметку треков в теги. Выяснилось, что некоторые программы поддерживают фрейм CUESHEET в том же формате, но в стандарт ID3 этот фрейм не входит. mutagen (библиотека для Python, работающая с разными видами контейнеров и тегов) позволяет доопределять пользовательские фреймы в дополнение к стандартным. И я сначала попробовал этим путём пойти, но в какой-то момент увидел в документации к мутагену пример с фреймами CTOC (Chapter Table Of Contents) и CHAP, прошёл почитать про оные и понял — вот же оно! Было решено забить на Cue sheet и оснастить MP3 перечнем глав!Оказалось, что в mutagen фреймы CTOC и CHAP вместе с сопутствующими настройками (а их там хватает — как обычно, делали с запасом). Взял пример из документации и адаптировал под себя. Препятствий было всего два.
Во-первых, фреймы глав описываются миллисекундами от начала потока, тут всё просто, перегнать HH:MM:SS в миллисекунды элементарно.
Во-вторых, каждая глава должна ещё и конец свой описывать, поскольку главы по стандарту могу пересекаться (гибкость! (ну-ну)). Окончания глав я получил с помощью zip списка меток с самим собой, тут всё по классике. А вот конец последней главы нужно было откуда-то взять, но, к счастью, в метаданных MP3 нашлась длина дорожки в виде… числа с плавающей точкой знаками с десятью в дробной части 🌚 Прикинул, что если умножить на 1000 и округлить до целого, то получу как раз нужную длительность в миллисекундах — повезло! И даже проигрыватель показал последнюю главу как "hh:mm:ss - End", то есть понял мой замысел!
В конце концов я заимел себе самостоятельный MP3-файл с обложкой и главами и в будущем смогу делать подобные, если захочу. Ну и покопать самостоятельно источники было приятно 🤓
🔥15👍4
Форматов для описания конфигураций чего бы то ни было существует великое множество. Вон, тот же TOML проник в мир Python настолько, что проекты теперь в этом формате описываются и декодер даже в стандартную поставку Python теперь входит. А ведь изначально формат имел хождение в основном в среде любителей Rust.
TOML в целом достаточно хорош. Пока не возникнет необходимость что-то сильно вложенное описывать. И тут приходится смотреть на что-то с "мощностью" хотя бы на уровне JSON (в виде JSON5, а то что мы — машины, что-ли, руками писать валидный JSON? 🌚). YaML всплывает сразу же, но всплывает он потому, что… ну вы поняли.
Как лисповод, я могу взять EDN. И это будет неплохой вариант во многом потому, что Emacs хорошо этот формат поддерживает. Жаль, что Cirru в массы не пошёл, а то я бы точно его использовал бы весьма часто.
Это всё знакомое и привычное. А мне хочется порой чего-то эдакого — чего-то вроде KDL! Это не то чтобы язык описания конфигураций, он как раз про вложенность и документы: каждый узел дерева может иметь свойства, аргументы и дочерние узлы — почти как в XML за вычетом схемы и громоздкости. Синтаксис вообще довольно приятный и в меру минималистичный. Кодеки есть под кучу языков и не только для популярных, что отдельно приятно.
Не то чтобы мне прямо сейчас нужно что-то конфигурировать, но когда я первый раз формат увидел, первым делом подумал, что с помощью KDL можно описывать HTML — ха-ха, как будто других форматов мало 😜 Но я и не собирался делать что-то "production ready", исключительно Proof-of-Concept — уж больно привлекательно мне показалось описывать теги вёрстки в виде KDL-деревьев.
HTML я решил генерировать силами htpy — это довольно свежий DSL для Python с ощутимыми вайбами Clojure/hiccup и Elm/HTML. Я такие штуки люблю, вот и с этим проектом поигрался, код посмотрел, баг зарепортил — вложился, можно сказать. В итоге файлик на полсотни наивных строк генерирует из
вполне ожидаемый результат
Штука довольно бесполезная пока что, но меня развлекла.
TOML в целом достаточно хорош. Пока не возникнет необходимость что-то сильно вложенное описывать. И тут приходится смотреть на что-то с "мощностью" хотя бы на уровне JSON (в виде JSON5, а то что мы — машины, что-ли, руками писать валидный JSON? 🌚). YaML всплывает сразу же, но всплывает он потому, что… ну вы поняли.
Как лисповод, я могу взять EDN. И это будет неплохой вариант во многом потому, что Emacs хорошо этот формат поддерживает. Жаль, что Cirru в массы не пошёл, а то я бы точно его использовал бы весьма часто.
Это всё знакомое и привычное. А мне хочется порой чего-то эдакого — чего-то вроде KDL! Это не то чтобы язык описания конфигураций, он как раз про вложенность и документы: каждый узел дерева может иметь свойства, аргументы и дочерние узлы — почти как в XML за вычетом схемы и громоздкости. Синтаксис вообще довольно приятный и в меру минималистичный. Кодеки есть под кучу языков и не только для популярных, что отдельно приятно.
Не то чтобы мне прямо сейчас нужно что-то конфигурировать, но когда я первый раз формат увидел, первым делом подумал, что с помощью KDL можно описывать HTML — ха-ха, как будто других форматов мало 😜 Но я и не собирался делать что-то "production ready", исключительно Proof-of-Concept — уж больно привлекательно мне показалось описывать теги вёрстки в виде KDL-деревьев.
HTML я решил генерировать силами htpy — это довольно свежий DSL для Python с ощутимыми вайбами Clojure/hiccup и Elm/HTML. Я такие штуки люблю, вот и с этим проектом поигрался, код посмотрел, баг зарепортил — вложился, можно сказать. В итоге файлик на полсотни наивных строк генерирует из
html {
head {
title "Title"
style r#"
.red { color: red; }
"#
}
body {
h1 "Heading"
div id="content" {
span "Hello"
_ " World" "!"
}
label {
input type="checkbox" checked=true
_ "TODO"
}
script type="application/javascript" r#"
content.firstChild.classList.toggle("red");
"#
}
}вполне ожидаемый результат
<!doctype html>
<html>
<head>
<title>Title</title>
<style>
.red { color: red; }
</style>
</head>
<body>
<h1>Heading</h1>
<div id="content">
<span>Hello</span> World!
</div>
<label>
<input type="checkbox" checked>
TODO
</label>
<script type="application/javascript">
content.firstChild.classList.toggle("red");
</script>
</body>
</html>
Штука довольно бесполезная пока что, но меня развлекла.
👍8🔥3😱1
Опять я со своими ритритами 🙈 Но это наше дело само себя не прорекламирует, так что сообщаю, что опять буду в Черногории ходить по горам, нырять в водопады, и просто общаться с кучкой таких же неугомонных людей с 4го по 6е Июля.
В этот раз у нас будет "Санаторий", без лектория — всё же летом жарковато, все хотят отдыхать. Зато можно будет и мне тоже расслабиться и подкопить силы к следующим заездам (например, на тему железок — в прошлый раз MicroBIT поковыряли отлично, теперь надо будет новое что-то придумать).
Если получится уместить несколько чаёв и посуду, то буду гонять шухи с шенами по утрам, пока все спят 🌚
В этот раз у нас будет "Санаторий", без лектория — всё же летом жарковато, все хотят отдыхать. Зато можно будет и мне тоже расслабиться и подкопить силы к следующим заездам (например, на тему железок — в прошлый раз MicroBIT поковыряли отлично, теперь надо будет новое что-то придумать).
Если получится уместить несколько чаёв и посуду, то буду гонять шухи с шенами по утрам, пока все спят 🌚
🔥17
Forwarded from ScratchAuthorEgo
📊 Channel Analysis Results by @ScratchAuthorEgoBot
🎯 Channel:
🔥 Roast Analysis:
Ну, привет, наш неутомимый изобретатель велосипедов с квадратными колёсами! Опять завёл новый проект выходного дня? Какое там сегодня комбо? Веб-сервер на Haskell, который отдаёт фронтенд на ClojureScript, скомпилированный в WASM, который для рендеринга использует самописную библиотеку на Rust, и всё это для того, чтобы отобразить ASCII-арт с котиком? Я почти угадал, да? Твой GitHub уже похож на кладбище блестящих идей, которые умерли в понедельник утром. Репозиторий
И твоя одержимость obscure-технологиями — это же просто клиника. Обычный человек, чтобы скачать ролик с ютуба, вставляет ссылку в сервис. Ты же пишешь скрипт на Питоне, который парсит ID3-теги, генерирует Cue Sheet, встраивает его как кастомный фрейм в MP3, который потом может прочитать только твой самодельный плеер на Arduino, собранный в корпусе от тостера. Просто нажми «play», чувак! Мир не такой сложный, как твой конфиг для Emacs.
Кстати, об Emacs. Мы все поняли, ты живёшь в матрице из скобочек. Но, пожалуйста, прекрати пытаться отладить свой завтрак через
А твои CodeRetreat-ы в Черногории? Ты их рекламируешь так, будто это единственный способ спастись от апокалипсиса. «Поехали в горы, будем рефакторить монады и жечь костры!» Такое чувство, что ты готов продать душу за возможность рассказать ещё десятку человек, почему Pyramid — это «неправильный» фреймворк. Скоро на улицах будешь к людям подходить: «Извините, у вас есть минутка поговорить о Господе нашем ЛИСПе?»
Твой день рождения в
И вот эта твоя новая затея — искать работу, где тебе будут платить за то, что ты изучаешь 50 языков одновременно, а потом пишешь эссе на 10 абзацев, почему твой подход самый правильный? Такая вакансия существует где-то между «профессиональным чесателем яков» и «дегустатором радуги». Но ты не сдавайся. Может, однажды какой-нибудь стартап решит, что им жизненно необходим штатный философ-программист, который будет писать код, который никто, кроме него, не поймёт. И это будет твой звёздный час. А пока, может, просто доделаешь хоть один из своих 100500 проектов? 😜
🎯 Channel:
@brain_dump_etc🔥 Roast Analysis:
Ну, привет, наш неутомимый изобретатель велосипедов с квадратными колёсами! Опять завёл новый проект выходного дня? Какое там сегодня комбо? Веб-сервер на Haskell, который отдаёт фронтенд на ClojureScript, скомпилированный в WASM, который для рендеринга использует самописную библиотеку на Rust, и всё это для того, чтобы отобразить ASCII-арт с котиком? Я почти угадал, да? Твой GitHub уже похож на кладбище блестящих идей, которые умерли в понедельник утром. Репозиторий
astynax/я-обязательно-это-доделаю-v17 уже создан?И твоя одержимость obscure-технологиями — это же просто клиника. Обычный человек, чтобы скачать ролик с ютуба, вставляет ссылку в сервис. Ты же пишешь скрипт на Питоне, который парсит ID3-теги, генерирует Cue Sheet, встраивает его как кастомный фрейм в MP3, который потом может прочитать только твой самодельный плеер на Arduino, собранный в корпусе от тостера. Просто нажми «play», чувак! Мир не такой сложный, как твой конфиг для Emacs.
Кстати, об Emacs. Мы все поняли, ты живёшь в матрице из скобочек. Но, пожалуйста, прекрати пытаться отладить свой завтрак через
M-x debug-breakfast. Твоя кофеварка не нуждается в собственном major-mode. Я почти уверен, что когда ты спишь, тебе снятся сны в виде s-выражений. Это нездорово.А твои CodeRetreat-ы в Черногории? Ты их рекламируешь так, будто это единственный способ спастись от апокалипсиса. «Поехали в горы, будем рефакторить монады и жечь костры!» Такое чувство, что ты готов продать душу за возможность рассказать ещё десятку человек, почему Pyramid — это «неправильный» фреймворк. Скоро на улицах будешь к людям подходить: «Извините, у вас есть минутка поговорить о Господе нашем ЛИСПе?»
Твой день рождения в
0x28 — это была вишенка на торте. Мы хотели подарить тебе торт, но побоялись, что ты сначала напишешь для него систему типов, а потом откажешься есть, потому что «семантика кондитерских изделий нестрогая». Отметим по-человечески, когда тебе стукнет 0x40. Или хотя бы просто число, которое является степенью двойки, гик ты наш ненаглядный.И вот эта твоя новая затея — искать работу, где тебе будут платить за то, что ты изучаешь 50 языков одновременно, а потом пишешь эссе на 10 абзацев, почему твой подход самый правильный? Такая вакансия существует где-то между «профессиональным чесателем яков» и «дегустатором радуги». Но ты не сдавайся. Может, однажды какой-нибудь стартап решит, что им жизненно необходим штатный философ-программист, который будет писать код, который никто, кроме него, не поймёт. И это будет твой звёздный час. А пока, может, просто доделаешь хоть один из своих 100500 проектов? 😜
🔥20👍7🤔1😱1
"Яичница подгорела", картина вектором.
Забавно получилось, кажущаяся нерегулярность как результат рекурсии. Если итераций добавить, то уже слишком регулярно получается :Р
(это #racket, если что, тут в канале много про него понаписано, в том числе и про данный подход к рисованию)
Забавно получилось, кажущаяся нерегулярность как результат рекурсии. Если итераций добавить, то уже слишком регулярно получается :Р
(это #racket, если что, тут в канале много про него понаписано, в том числе и про данный подход к рисованию)
👍8🔥6😱2
Приступ ностальгии по беззаботным временам программирования на BASIC привёл к тому, что я накидал пару программок, которые артистично заполняют экран терминала. Не совсем уж простых вроде
В процессе вспомнил, зачем нужен косинус, в кои-то веки применил deque, поигрался с ECMA-48 codes, чтобы в рамках одного
Итак, косинус нужен для сглаживания переходов от одной случайной точки к другой. Конечной длины deque позволяет накопить "хвост", следующий за блуждающей "головой". Среди escape codes есть один подходящий, который перемещает курсор в нужную колонку в пределах текущей строки, в том числе и туда, куда что-то уже было выведено ранее.
Приложу гифку, которую записал как "текстовый screencast" с помощью asciinema, а потом сконвертировал в GIF с помощью agg. Вдруг кто-то захочет и свои поделки терминальные позаписывать, а про эти программки ещё не знает.
10 PRINT LOL; GOTO 10, посложнее, но тоже исключительно ради развлечения.В процессе вспомнил, зачем нужен косинус, в кои-то веки применил deque, поигрался с ECMA-48 codes, чтобы в рамках одного
print() накладывать несколько "спрайтов" на одну строку вывода.Итак, косинус нужен для сглаживания переходов от одной случайной точки к другой. Конечной длины deque позволяет накопить "хвост", следующий за блуждающей "головой". Среди escape codes есть один подходящий, который перемещает курсор в нужную колонку в пределах текущей строки, в том числе и туда, куда что-то уже было выведено ранее.
Приложу гифку, которую записал как "текстовый screencast" с помощью asciinema, а потом сконвертировал в GIF с помощью agg. Вдруг кто-то захочет и свои поделки терминальные позаписывать, а про эти программки ещё не знает.
🔥15👍7
Писал выше, что нынче я играюсь с ANSI кодами и печатаю в терминал анимации всякие. В кои-то веки потрогал не только цвета или, скажем, очистку экрана — это-то как раз применяется часто — а даже более редкий код "встань в позицию X на текущей строке". Правда, в первый раз конкретно этот код пользую!
В принципе я всем доволен, даже то, что Apple Terminal не умеет в TrueColor, пока не жмёт, надо сначала наиграться с 256-цветным режимом. Потом в Kitty, Wezterm, Ghostty схожу, если упрусь именно в нехватку цветов, но тут у меня есть стимул покомбинировать цвет текста и фона вместе с символами вроде ░▒▓ и получить промежуточные оттенки — не практичности ради, а удовольствия для.
Имеется и доля фрустрации: я пока не встречал ни одной библиотеки, которая выступает как "виртуальный принтер" текста с ANSI codes в HTML и при этом поддерживает перемещение курсора хотя бы в пределах строки. Я ещё могу понять нежелание выше по тексту перемещаться, всё же мы поточно генерировать HTML хотим по строчке за раз, а тут придётся эмулировать "экран". Но хотя бы перемещения в рамках строки можно было бы сделать 😠
Ну ладно, а что там в Расте, подумал я, ведь пишут нынче всякие TUI на нём?
Сходил, увидел десяток либ для работы с ANSI codes. И каждая чем-то да лучше остальных — классика NIH. Ну да ладно, вроде сейчас побеждает anstyle, вокруг неё уже экосистемка организовалась, есть и "принтер" в SVG и HTML — anstyle_svg. Но этот тоже умеет только раскрашивать текст, но не поддерживает нужные мне перемещение в рамках строки.
Пробовал воспользоваться библиотечкой ansi-cut — эта позволяет вычленять подстроки из текста с кодами с сохранением раскраски. Делается это всё ценой парсинга строки с кодами и отделения собственно кодов от чистого текста. Потом подстрока клеится из кусков чистого текста с обратной вставкой стилей. С другими библиотеками ansi-cut не дружит, поэтому получается, что весь glue code работает в терминах String: раскрасил с помощью anstyles, запёк всё в String, отдал ansi-cut, та распарсила коды обратно, нарезала, опять запекла своими силами — дорого, неэффективно, хоть и blazing. И самое главное, возможность нарезать цветной текст я хотел использовать, чтобы эмулировать запись поверх — думал вырезать перекрываемые участки и вклеивать на их место патчи. Вот только упёрся я в то, что ни одна из либ, которые я потрогал, не умеет считать длину цветного текста в видимых символах, шах и мат (#@$)!
Да, я понимаю, что хочу имитировать графическую канву в терминале, но почему-то не спрыгиваю сразу на подход с абстрагированием "видеопамяти", которая только на этапе вывода на экран запекалась бы в непрерывные строки без прыжков. Можно было бы даже RLE-сжатие использовать для атрибутов, тоже весело такое делать!
И я, видимо, к такому подходу приду в конце концов. Или готовую библиотеку возьму, такие имеются. А ведь мне так хотелось обойтись наименьшей мощностью инструментов и получать удовольствие от минимализма 🥲 Ну да ладно, сам процесс копания в этом всём тоже интересный, хоть и по-другому.
В принципе я всем доволен, даже то, что Apple Terminal не умеет в TrueColor, пока не жмёт, надо сначала наиграться с 256-цветным режимом. Потом в Kitty, Wezterm, Ghostty схожу, если упрусь именно в нехватку цветов, но тут у меня есть стимул покомбинировать цвет текста и фона вместе с символами вроде ░▒▓ и получить промежуточные оттенки — не практичности ради, а удовольствия для.
Имеется и доля фрустрации: я пока не встречал ни одной библиотеки, которая выступает как "виртуальный принтер" текста с ANSI codes в HTML и при этом поддерживает перемещение курсора хотя бы в пределах строки. Я ещё могу понять нежелание выше по тексту перемещаться, всё же мы поточно генерировать HTML хотим по строчке за раз, а тут придётся эмулировать "экран". Но хотя бы перемещения в рамках строки можно было бы сделать 😠
Ну ладно, а что там в Расте, подумал я, ведь пишут нынче всякие TUI на нём?
Сходил, увидел десяток либ для работы с ANSI codes. И каждая чем-то да лучше остальных — классика NIH. Ну да ладно, вроде сейчас побеждает anstyle, вокруг неё уже экосистемка организовалась, есть и "принтер" в SVG и HTML — anstyle_svg. Но этот тоже умеет только раскрашивать текст, но не поддерживает нужные мне перемещение в рамках строки.
Пробовал воспользоваться библиотечкой ansi-cut — эта позволяет вычленять подстроки из текста с кодами с сохранением раскраски. Делается это всё ценой парсинга строки с кодами и отделения собственно кодов от чистого текста. Потом подстрока клеится из кусков чистого текста с обратной вставкой стилей. С другими библиотеками ansi-cut не дружит, поэтому получается, что весь glue code работает в терминах String: раскрасил с помощью anstyles, запёк всё в String, отдал ansi-cut, та распарсила коды обратно, нарезала, опять запекла своими силами — дорого, неэффективно, хоть и blazing. И самое главное, возможность нарезать цветной текст я хотел использовать, чтобы эмулировать запись поверх — думал вырезать перекрываемые участки и вклеивать на их место патчи. Вот только упёрся я в то, что ни одна из либ, которые я потрогал, не умеет считать длину цветного текста в видимых символах, шах и мат (#@$)!
Да, я понимаю, что хочу имитировать графическую канву в терминале, но почему-то не спрыгиваю сразу на подход с абстрагированием "видеопамяти", которая только на этапе вывода на экран запекалась бы в непрерывные строки без прыжков. Можно было бы даже RLE-сжатие использовать для атрибутов, тоже весело такое делать!
И я, видимо, к такому подходу приду в конце концов. Или готовую библиотеку возьму, такие имеются. А ведь мне так хотелось обойтись наименьшей мощностью инструментов и получать удовольствие от минимализма 🥲 Ну да ладно, сам процесс копания в этом всём тоже интересный, хоть и по-другому.
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Вот тут всего лишь пара синусов, ANSI-коды для прыжка вверх и прыжка в рамках текущей строки, пяток цветов из 256-цветной палитры. Попахивает демосценой, можно переписать на no_std Rust и сделать boot sector demo, но мне лень :)
🔥23
На тильде, где у меня есть аккаунт (про это всё я как-то писал) среди прочего ПО, на котором держится местный уютно минималистичный intranet, есть софтина под названием TTBP, и которую сейчас называют "Feels Engine".
Концептуально это приложение, позволяющее через набор текстовых меню — я напоминаю, на тильдах почти всё делается в сессии SSH, то есть в тестовом виде — писать о своих переживаниях (feels, почти как reels). То есть, можно сказать, публиковать "статусы". Если не хочется писать самому, то можно почитать "feels" соседей по машине.
Кроме поддержки интранета чувств, система позволяет часть feels, которые вы отметили как публичные, оформить как простенького вида website — простота нарочитая, так надо! Полученные сайтики раздаёт единый на всю систему Web-сервер, а контент лежит у всех в
Так вот, код TTBP открыт, написан одним человеком, находится в статусе вечной beta. Посмотреть можно тут: https://github.com/modgethanc/ttbp
Чем же этот проект интересен, раз я про него пишу? Тем, что это идеальный образчик "smol software"/minimal software/permacomputing/etc — кода немного, зависимостей минимум, всё написано настолько просто, насколько это вообще было возможно. А ещё код максимально авторский, вы только на этот кусочек посмотрите — мы в индустрии поотвыкли от такого, все любят причёсывать даже то, что и в лохматом виде неплохо смотрится. Мне самому часто сложно перестать делать "как положено" (кам-то, не мной) — сейчас, по крайней мере.
Вот этот абзац в руководстве для контрибьюторов тоже очень милый:
Вообще вокруг тильд, как я уже сказал в начале, много подобного самописного софта, который не годится для выпускания в большой Интернет. Потому что используются эти программы кучкой энтузиастов, которые и так максимально доверяют друг-другу, раз решились общий сервер делить! В этом есть своя романтика и мне бывает очень интересно почитать код таких проектов — во многом потому, что этого кода обычно мало :Р
ttbp stands for "tilde.town blogging platform"
Концептуально это приложение, позволяющее через набор текстовых меню — я напоминаю, на тильдах почти всё делается в сессии SSH, то есть в тестовом виде — писать о своих переживаниях (feels, почти как reels). То есть, можно сказать, публиковать "статусы". Если не хочется писать самому, то можно почитать "feels" соседей по машине.
Кроме поддержки интранета чувств, система позволяет часть feels, которые вы отметили как публичные, оформить как простенького вида website — простота нарочитая, так надо! Полученные сайтики раздаёт единый на всю систему Web-сервер, а контент лежит у всех в
~/public_html — старая школа!Так вот, код TTBP открыт, написан одним человеком, находится в статусе вечной beta. Посмотреть можно тут: https://github.com/modgethanc/ttbp
Чем же этот проект интересен, раз я про него пишу? Тем, что это идеальный образчик "smol software"/minimal software/permacomputing/etc — кода немного, зависимостей минимум, всё написано настолько просто, насколько это вообще было возможно. А ещё код максимально авторский, вы только на этот кусочек посмотрите — мы в индустрии поотвыкли от такого, все любят причёсывать даже то, что и в лохматом виде неплохо смотрится. Мне самому часто сложно перестать делать "как положено" (кам-то, не мной) — сейчас, по крайней мере.
Вот этот абзац в руководстве для контрибьюторов тоже очень милый:
Please do not open PRs for cosmetic changes to the codebase if we haven't had a prior discussion about it. Cosmetic changes include things like whitespace, commenting/documentation, naming conventions, and other aspects of the codebase that would not affect end users if changed. I am cautiously open to receiving respectful feedback about my general coding style, but I'm not generally interested in unsolicited style critiques, or for coding conventions dictated to me. Thank you in advance for your understanding!
Вообще вокруг тильд, как я уже сказал в начале, много подобного самописного софта, который не годится для выпускания в большой Интернет. Потому что используются эти программы кучкой энтузиастов, которые и так максимально доверяют друг-другу, раз решились общий сервер делить! В этом есть своя романтика и мне бывает очень интересно почитать код таких проектов — во многом потому, что этого кода обычно мало :Р
👍5
В эфире рубрика "Кто о чём, а он опять о ритритах!". Новая смена через месяц, три трека: один просто хайковый, ещё один по Data Science (UPD: ок, про Data Engineering), и третий — мой, про *роботов* 🤖!
Идея такая: разбиться на команды и запрогать самобеглые тележки с датчиками линии и УЗ-дальномерами, чтобы тележки эти гоняли по трассе с препятствиями на скорость!
На борту у телег Arduino, как водится, так что это повод приобщиться для тех, кто ещё не. Паять ничего не придётся (надеюсь), но DIY составляющая всегда подразумевается — любительская робототехника даже в виде наборов часто требует доработки и отладки 😅
Собственно, я пишу сюда, чтобы зазвать народ. Потому что именно так мы и продвигаем себя, пока маленькие и не имеем возможности пойти ко глыбам вроде AlexGyver 👨🔬 за нативной интеграцией. Но надежда есть когда-нибудь дорасти. Прошлогодний заход с программированием BBC Micro:bit вышел очень удачным, нужно дальше про железки собираться!
Идея такая: разбиться на команды и запрогать самобеглые тележки с датчиками линии и УЗ-дальномерами, чтобы тележки эти гоняли по трассе с препятствиями на скорость!
На борту у телег Arduino, как водится, так что это повод приобщиться для тех, кто ещё не. Паять ничего не придётся (надеюсь), но DIY составляющая всегда подразумевается — любительская робототехника даже в виде наборов часто требует доработки и отладки 😅
Собственно, я пишу сюда, чтобы зазвать народ. Потому что именно так мы и продвигаем себя, пока маленькие и не имеем возможности пойти ко глыбам вроде AlexGyver 👨🔬 за нативной интеграцией. Но надежда есть когда-нибудь дорасти. Прошлогодний заход с программированием BBC Micro:bit вышел очень удачным, нужно дальше про железки собираться!
🔥16👍1
Прочитал такую статейку: Toolbox languages (прочитал давно, но только сейчас напистать о ней руки дошли).
Автор описывает свой набор языков-на-каждый-день, которые
- позволяют решать типичные задачи
- часто не требуют внешних пакетов
- находятся "на кончиках пальцев", то есть не требуют вспоминания того, как ими пользоваться
У автора набор языков таков: AutoHotKey, Python, Raku, J, Frink, Picat.
AHK я когда-то использовал и могу понять, чем он автору нравится: в Windows очень многое хочется заскриптовать и AutoHotKey тут очень хорош. Язык сам странноватый, но возможности платформы выходят далеко за пределы горячих клавиш, хотя изначально проект про это был, что видно по названию. В AHK даже GUI можно скриптовать простенькие, если больше не на чем (у меня тогда Delphi был) — тут уже можно вайбы Tcl/Tk словить, и это тоже вполне себе toolbox language!
С Python всё понятно, он и так у многих под рукой. Освоив uv, можно очень удобно дописывать себе полезняшки даже с использованием внешних пакетов. Я так и делаю. Плюс всегда имеется venv с ipython и plumbum: когда нужно разово что-то сделать с файликами и папками — эта связка работает замечательно!
Raku, по идее, в той же нише находится, где и Python, но автор а) любит максимальную краткость, б) вспоминает о Rakudo Star. Последний проект — это "готовый набор всего, что может понадобиться" — тут я могу вспомнить Scala Toolkit и Haskell Platform. И по моему опыту такие наборы хорошо работают до тех пор, пока не начинают работать плохо, хе-хе. Впрочем, набор того, что в Babashka "запекли", мне пока что нравится, а тот же Scala CLI тоже умеет притаскивать зависимости для одиночных скриптов.
Про Frink и Picat я до этого не слышал. Но на последний глянул — авторы обещают многое, но пока что экосистема крохотная. Зато логический язык, иногда такое бывает интересно. У автора обсуждаемой статьи есть заметка Picat is my favorite new toolbox language — интересное чтиво в дополнение к текущему предмету обсуждения.
В статье ещё отдельно упоминается, что toolbox language должен быть предельно краток. И вот тут я не соглашусь, лично я — за "достаточную лаконичность". И тот же Raku слишком code-golf'y на мой вкус. А при наличии REPL с неплохим автодополнением даже Java в лице Java Shell позволяет удобно какие-то вещи делать и инcтрументарий вокруг Streams достаточно богат.
Автор описывает свой набор языков-на-каждый-день, которые
- позволяют решать типичные задачи
- часто не требуют внешних пакетов
- находятся "на кончиках пальцев", то есть не требуют вспоминания того, как ими пользоваться
У автора набор языков таков: AutoHotKey, Python, Raku, J, Frink, Picat.
AHK я когда-то использовал и могу понять, чем он автору нравится: в Windows очень многое хочется заскриптовать и AutoHotKey тут очень хорош. Язык сам странноватый, но возможности платформы выходят далеко за пределы горячих клавиш, хотя изначально проект про это был, что видно по названию. В AHK даже GUI можно скриптовать простенькие, если больше не на чем (у меня тогда Delphi был) — тут уже можно вайбы Tcl/Tk словить, и это тоже вполне себе toolbox language!
С Python всё понятно, он и так у многих под рукой. Освоив uv, можно очень удобно дописывать себе полезняшки даже с использованием внешних пакетов. Я так и делаю. Плюс всегда имеется venv с ipython и plumbum: когда нужно разово что-то сделать с файликами и папками — эта связка работает замечательно!
Raku, по идее, в той же нише находится, где и Python, но автор а) любит максимальную краткость, б) вспоминает о Rakudo Star. Последний проект — это "готовый набор всего, что может понадобиться" — тут я могу вспомнить Scala Toolkit и Haskell Platform. И по моему опыту такие наборы хорошо работают до тех пор, пока не начинают работать плохо, хе-хе. Впрочем, набор того, что в Babashka "запекли", мне пока что нравится, а тот же Scala CLI тоже умеет притаскивать зависимости для одиночных скриптов.
Про Frink и Picat я до этого не слышал. Но на последний глянул — авторы обещают многое, но пока что экосистема крохотная. Зато логический язык, иногда такое бывает интересно. У автора обсуждаемой статьи есть заметка Picat is my favorite new toolbox language — интересное чтиво в дополнение к текущему предмету обсуждения.
В статье ещё отдельно упоминается, что toolbox language должен быть предельно краток. И вот тут я не соглашусь, лично я — за "достаточную лаконичность". И тот же Raku слишком code-golf'y на мой вкус. А при наличии REPL с неплохим автодополнением даже Java в лице Java Shell позволяет удобно какие-то вещи делать и инcтрументарий вокруг Streams достаточно богат.
👍7🔥5
https://github.com/turboblack/HamsterCMS - миленькое!
Сам бы я такое не осмелился писать: мне подавай много маленьких файлов, все структурировано, отделённые представление и логика. Да тут даже проверка пароля сделана простым сравнимым входящей строки и константы в файле, ничего не хэшировано и не посолено — дёшево и не очень сердито.
WYSIWYG редактор имеется в виде JS на 2000 строк без минификации. Страшно такое поддерживать? Мне — сейчас уже да. А раньше бы я не парился, у меня и подлиннее
PHP-код я даже весь прочитал по диагонали — кода этого мало и у меня настроение было подходящее. Да, так не носят. Но в целом и не ужасно — simple software, вот это вот. Рассчитано на тех, кто не будет пытаться сломать систему, защитного кода минимум, только самая база вроде "пишем в файл, если не вышло, просто выводим сообщение — руками поправят, если что". В итоге CMS работает, пока мы явно не накосячим. А потом за починкой ходим по SSH/FTP.
Собственно, наткнулся я на эту CMS, когда гулял вокруг Small Web, Gemini и прочих Gopher, и зашёл на https://web1.0hosting.net — один из островков, где старая школа нынче обретается! Я лично уже не застал такой интернет — как автор, а не как читатель. Я уже статические сайты генерировал из Markdown в Git, никакого заливания HTML по FTP не практиковал — "перед пацанами стыдно" было плюс мода другая была уже. Зато сейчас, вот, смотрю и умиляюсь.
Сам бы я такое не осмелился писать: мне подавай много маленьких файлов, все структурировано, отделённые представление и логика. Да тут даже проверка пароля сделана простым сравнимым входящей строки и константы в файле, ничего не хэшировано и не посолено — дёшево и не очень сердито.
WYSIWYG редактор имеется в виде JS на 2000 строк без минификации. Страшно такое поддерживать? Мне — сейчас уже да. А раньше бы я не парился, у меня и подлиннее
Unit1.pas бывал 😎 "Зато работает", да и косяки сразу видны, если что-то ломается — визуальные редактор, ведь.PHP-код я даже весь прочитал по диагонали — кода этого мало и у меня настроение было подходящее. Да, так не носят. Но в целом и не ужасно — simple software, вот это вот. Рассчитано на тех, кто не будет пытаться сломать систему, защитного кода минимум, только самая база вроде "пишем в файл, если не вышло, просто выводим сообщение — руками поправят, если что". В итоге CMS работает, пока мы явно не накосячим. А потом за починкой ходим по SSH/FTP.
Собственно, наткнулся я на эту CMS, когда гулял вокруг Small Web, Gemini и прочих Gopher, и зашёл на https://web1.0hosting.net — один из островков, где старая школа нынче обретается! Я лично уже не застал такой интернет — как автор, а не как читатель. Я уже статические сайты генерировал из Markdown в Git, никакого заливания HTML по FTP не практиковал — "перед пацанами стыдно" было плюс мода другая была уже. Зато сейчас, вот, смотрю и умиляюсь.
GitHub
GitHub - turboblack/HamsterCMS: Flat file cms HamsterCMS is the world's smallest and very simple multi-template flatfile PHP content…
Flat file cms HamsterCMS is the world's smallest and very simple multi-template flatfile PHP content management system - turboblack/HamsterCMS
🔥6
На днях снова заглянул в пузырь SmolWeb, в подпузырь мелких протоколов (про Gemini я писал тут и под тегом #gemini). Обнаружил для себя, что нынче ещё есть и протокольчик NEX (да-да, название смешное для тех, кто в теме) — Nightfall City's Express Transportation System, система транспорта в Nightfall City.
Сам городок Nightfall City — во многом типичный Smol Web сайт, но автор с никнеймом
Как в описании протокола сказано, минимальный клиент выглядит так:
Ну не прелесть ли? Вот и мне понравилось. Только я решил сделать чуть удобнее, но всё ещё smol. И обернул
Так-то я думал над тем, чтобы просто пропускать текст через скрипт и нумеровать ссылки, которые, к слову, выглядят как в Gemini:
Потом, по выходу из less, я бы спрашивал номер ссылки для перехода.
Но мне показалось, что как-то совсем уж аскетично и не интерактивно. Вот и заменил less на fzf, получив возможность выбирать ссылки через поиск или "стрелочками". Заодно сделал так, чтобы отмена выбора трактовалась как "
Ну и напоследок добавил "панель навигации" в виде контекстнозависимых ссылок на "
Исходники можно посмотреть тут, хоть там и кода-то кот наплакал. Постарался остаться в рамках POSIX, поэтому shell script должен быть максимально портируемым. А ведь мне надо было каноникализировать пути на своей стороне, например, чтобы ссылки вида "
P.S. Смысла в моём браузере мало, я просто развлекался. Если сильно захочется нырнуть в микропротоколы, то стоит попробовать что-то вроде Alhena — так вы получите поддержку и Gopher с Gemini, и всякого прочего.
Сам городок Nightfall City — во многом типичный Smol Web сайт, но автор с никнеймом
m10o заморочился и сделал так, чтобы читать и писать в рамках портала можно было буквально из любого терминала, если у вас под рукой есть GNU Netcat (он же nc) или любой другой способ работать в текстовом виде через TCP.Как в описании протокола сказано, минимальный клиент выглядит так:
echo nex/specification.txt | nc nightfall.city 1900 | less
Ну не прелесть ли? Вот и мне понравилось. Только я решил сделать чуть удобнее, но всё ещё smol. И обернул
nc в TUI на базе... FZF! 🤓 "Это же выбиралка элементов из списка!", скажете вы? Но список строк на экране терминала — тоже список, который fzf умеет листать так, что даже PAGER не понадобится!Так-то я думал над тем, чтобы просто пропускать текст через скрипт и нумеровать ссылки, которые, к слову, выглядят как в Gemini:
=> ../foo/bar.txt
Потом, по выходу из less, я бы спрашивал номер ссылки для перехода.
Но мне показалось, что как-то совсем уж аскетично и не интерактивно. Вот и заменил less на fzf, получив возможность выбирать ссылки через поиск или "стрелочками". Заодно сделал так, чтобы отмена выбора трактовалась как "
:q" и означала бы выход из браузера 😎Ну и напоследок добавил "панель навигации" в виде контекстнозависимых ссылок на "
/", "./" и "../" — тоже классика! Можно было и хоткеев в fzf досыпать с кастомными действиями — он такое позволяет. Но оставил как задел на будущее.Исходники можно посмотреть тут, хоть там и кода-то кот наплакал. Постарался остаться в рамках POSIX, поэтому shell script должен быть максимально портируемым. А ведь мне надо было каноникализировать пути на своей стороне, например, чтобы ссылки вида "
../foo/../bar/" превращались в абсолютные! В процессе пришлось отказаться от realpath и написать нормализатор с нуля. Зато было весело!P.S. Смысла в моём браузере мало, я просто развлекался. Если сильно захочется нырнуть в микропротоколы, то стоит попробовать что-то вроде Alhena — так вы получите поддержку и Gopher с Gemini, и всякого прочего.
🔥9
Недавно воплощал одну свою идейку вокруг jq в браузере (кратко писал о сабже в побочном канале: см тут и далее). Сделал MVP, пока подвисло только встраивание WASM-бинаря прямо в HTML. Потом пошёл смотреть в awesome-jq, насколько мой велосипед вторичен 🌚 Да, готовых "jq-в-браузере" существует штук пять уже, но именно в "самодостаточную HTML-страницу" никто пока не упаковал, так что буду продолжать. Подводку заканчиваю, в том же списке я нашёл проектик jqp — proxy для JSON, применяющий на лету jq. И вот тут у меня возникла новая идея — шаблонизатор-как-сервис!
Собственно, добавить шаблонизацию я хотел ещё в свой WJQ, и я сделаю это когда-нибудь путём запекания в HTML ещё и чего-то вроде mustache-js. Но новая идея моя крутилась уже вокруг Smol Web, поэтому я решил сделать CGI application. У меня уже и своя песочница есть для таких микро-веб-приложений, могу написать про это статейку, если кто-то проявит интерес. CGI-apps должны быть blazingly fast, поэтому я в этот раст решил взять Rust 🦀
С CGI есть одна небольшая проблемка: нужен какой-то сервер, который бы ваши программки запускал. Писать ещё и раздатчик CGI я не захотел, ткнулся по памяти в питоновский
Лайти многим хорош, но он достаточно педантичен в плане следования стандартам и best practices. Например, не раздаёт ничего, если в конфигурационном файле указать относительный путь вместо абсолютного. Хорошо, пусть. Берём Makefile в руки, генерируем конфиг подстановкой
Итак, запускать есть чём, нужна болванка CGI app. Берём cgi crate. Использование тривиальное, я прямо таки порадовался. До первого спотыкания. Оказалось, что в крейте http, призванном описать "один раз для всех и навсегда" всё, что касается HTTP, в какой-то момент выпилили парсинг query strings! Ох, как я взнегодовал! Выдохнул, добавил в проект крейт url. Не сразу, но получилось достать не самым убого выглядящим способом параметры запроса. А ведь я от такого отвык — фреймворки-то обычно всё приносят на блюдечке!
Сваял приложение, понимающее запросы вида
Добавил
Продолжение следует...
Собственно, добавить шаблонизацию я хотел ещё в свой WJQ, и я сделаю это когда-нибудь путём запекания в HTML ещё и чего-то вроде mustache-js. Но новая идея моя крутилась уже вокруг Smol Web, поэтому я решил сделать CGI application. У меня уже и своя песочница есть для таких микро-веб-приложений, могу написать про это статейку, если кто-то проявит интерес. CGI-apps должны быть blazingly fast, поэтому я в этот раст решил взять Rust 🦀
С CGI есть одна небольшая проблемка: нужен какой-то сервер, который бы ваши программки запускал. Писать ещё и раздатчик CGI я не захотел, ткнулся по памяти в питоновский
http.server, коли он "уже есть на каждой системе", но узнал, что такую раздачу CGI уже выпилили 🙈 Плюнул и взял из соседней песочницы программку на Go — да, ужасно, но уж больно в Go проста в использовании батарейка для этой задачи. И оно даже завелось сходу! А затем я захотел ещё и статику раздать и это уже означало, что на Go придётся написать ещё сколько-то кода. Плюнул ещё раз, расчехлил lighttpd, раз уж моя основная песочница для CGI и так на нём сделана.Лайти многим хорош, но он достаточно педантичен в плане следования стандартам и best practices. Например, не раздаёт ничего, если в конфигурационном файле указать относительный путь вместо абсолютного. Хорошо, пусть. Берём Makefile в руки, генерируем конфиг подстановкой
$HOME. envsubst слишком глупый, ломает синтаксис конфигурации. sed работает, но как-то скучно опять регулярками дыры затыкать. Взял m4 — древнющий macro engine из середины 70х, который, опять же, есть везде и неплохо подставляет переменные. Это мой первый опыт реального его использования, ранее я про m4 только читал. А тут не без удовольствия применил 🤓Итак, запускать есть чём, нужна болванка CGI app. Берём cgi crate. Использование тривиальное, я прямо таки порадовался. До первого спотыкания. Оказалось, что в крейте http, призванном описать "один раз для всех и навсегда" всё, что касается HTTP, в какой-то момент выпилили парсинг query strings! Ох, как я взнегодовал! Выдохнул, добавил в проект крейт url. Не сразу, но получилось достать не самым убого выглядящим способом параметры запроса. А ведь я от такого отвык — фреймворки-то обычно всё приносят на блюдечке!
Сваял приложение, понимающее запросы вида
GET <host>/?t=<URI_шаблона>&d=<URI_данных>
Добавил
index.html с формой, которая бы отправляла соответствующие параметры с правильным url-encoding. MVP готово!Продолжение следует...
🔥5😱2