Дочитал таки сегодня статейки из блога Firefly Zero — одну про fantasy consoles, другую про WASM на микроконтроллерах.
Про #fantasy_consoles и про #pico8 я уже писал. Вот и в первой статье есть краткая история явления и упоминается тот самый fun от творчества в условиях ограничений — и про такое у меня есть!
Про #wasm тоже всякое тут можно найти, ведь это тоже один из моих "фоновых" интересов. Но именно в разрезе #gaming и маленьких железок я пока на него не смотрел и упомянутый в статьях выше WASM-4 звучит интересно — я не очень-то вижу, что я бы делал на WASM для Web, а вот реальную железку попрограммировал бы, в том числе и на "сыром" WebAssembly потенциально.
Так вот Firefly Zero — как раз та самая железка, программируемая на WASM. Да, ей ещё только предстоит быть выпущенной в массы. Но за проектом следить уже интересно, а игры уже можно начинать писать и запускать в браузере и на эмуляторе
P.S. Недавно с подачи читателя почитал про написание Web-приложений на Scheme с компиляцией во всё тот же WASM. Статье уже год, а там Wasm-GC уже используется, так что работа с DOM вполне уже доступна коду в WASM. Да, приходится пробрасывать API-функции из JS в WASM app явно, но такое разделение мне даже импонирует, ведь WASM всегда был про песочницы.
Про #fantasy_consoles и про #pico8 я уже писал. Вот и в первой статье есть краткая история явления и упоминается тот самый fun от творчества в условиях ограничений — и про такое у меня есть!
Про #wasm тоже всякое тут можно найти, ведь это тоже один из моих "фоновых" интересов. Но именно в разрезе #gaming и маленьких железок я пока на него не смотрел и упомянутый в статьях выше WASM-4 звучит интересно — я не очень-то вижу, что я бы делал на WASM для Web, а вот реальную железку попрограммировал бы, в том числе и на "сыром" WebAssembly потенциально.
Так вот Firefly Zero — как раз та самая железка, программируемая на WASM. Да, ей ещё только предстоит быть выпущенной в массы. Но за проектом следить уже интересно, а игры уже можно начинать писать и запускать в браузере и на эмуляторе
:) Очень жду железку, а пока попробую найти силы на осваивание платформы. Если что-то получится, то напишу сюда, как водится.P.S. Недавно с подачи читателя почитал про написание Web-приложений на Scheme с компиляцией во всё тот же WASM. Статье уже год, а там Wasm-GC уже используется, так что работа с DOM вполне уже доступна коду в WASM. Да, приходится пробрасывать API-функции из JS в WASM app явно, но такое разделение мне даже импонирует, ведь WASM всегда был про песочницы.
🔥6
Буду завтра докладывать про то, как Clojure можно в браузере запускать — не только про ClojureScript, но и про Scittle со товарищи. Трансляция тоже должна быть и я сам скринкаст запишу на всякий случай (если не забуду 🙈). Само мероприятие в Тбилиси будет проходить, я в этот раз не выбрался лично, но в виде говорящей головы выступлю!
Остальные доклады тоже обещают быть нескучными, хоть и с сильным уклоном в лиспы. Так что будет, что посмотреть :)
https://t.me/f0rthsp4ce/408 — тут подробности.
Остальные доклады тоже обещают быть нескучными, хоть и с сильным уклоном в лиспы. Так что будет, что посмотреть :)
https://t.me/f0rthsp4ce/408 — тут подробности.
Telegram
F0RTHSP4CE
* Fprog Tbilisi Meetup
* Программа мероприятия:
*** Воркшоп: формальная верификация программ с состоянием на Lean4 (@GabrielFallen)
(sic!) Воркшоп стартует в 12:00, хронометраж ~3 часа. Это практическое занятие, берите с собой компьютеры. После воркшопа…
* Программа мероприятия:
*** Воркшоп: формальная верификация программ с состоянием на Lean4 (@GabrielFallen)
(sic!) Воркшоп стартует в 12:00, хронометраж ~3 часа. Это практическое занятие, берите с собой компьютеры. После воркшопа…
🔥19👍1
https://www.youtube.com/watch?v=5T-XONZCptc трансляция тут
UPDATE: а вот и запись моего доклада (ссылка откроет весь плейлист, доклады все отличные были!)
UPDATE: а вот и запись моего доклада (ссылка откроет весь плейлист, доклады все отличные были!)
YouTube
Fprog Tbilisi Meetup (01.12.2024)
Fprog Tbilisi Meetup
* Программа мероприятия:
*** Воркшоп: формальная верификация программ с состоянием на Lean4 (@GabrielFallen)
(sic!) Воркшоп стартует в 12:00, хронометраж ~3 часа. Это практическое занятие, берите с собой компьютеры. После воркшопа…
* Программа мероприятия:
*** Воркшоп: формальная верификация программ с состоянием на Lean4 (@GabrielFallen)
(sic!) Воркшоп стартует в 12:00, хронометраж ~3 часа. Это практическое занятие, берите с собой компьютеры. После воркшопа…
👍4🔥1
Вчера закончил AdventOfCode'2024 c 50 звёздами.
Этот AoC — юбилейный, десятый. Я участвую с самого первого года и только однажды вообще не участвовал в процессе. Но потом несколько заданий всё же прорешал. Правда, "50/50" в прошедших сезонах постфактум я так и не добил, потому что вне мероприятия мотивации у меня не хватает надолго 🌚
Вообще количество звёзд, которые я набрал, год от года растёт, но это не говорит о том, что я начал лучше программировать, просто задачки стали проще 🙈 Это уже заметная тенденция. В нынешнем сезоне я забуксовал буквально один раз, в остальном мне хватало мемоизации и готовой библиотечки алгоритмов на графах. Возможно, авторы действительно хотят дать возможность продержаться подольше большему количеству людей. Посмотрим, что будет в 2025г.
А пока мои достижения выглядят так
Этот AoC — юбилейный, десятый. Я участвую с самого первого года и только однажды вообще не участвовал в процессе. Но потом несколько заданий всё же прорешал. Правда, "50/50" в прошедших сезонах постфактум я так и не добил, потому что вне мероприятия мотивации у меня не хватает надолго 🌚
Вообще количество звёзд, которые я набрал, год от года растёт, но это не говорит о том, что я начал лучше программировать, просто задачки стали проще 🙈 Это уже заметная тенденция. В нынешнем сезоне я забуксовал буквально один раз, в остальном мне хватало мемоизации и готовой библиотечки алгоритмов на графах. Возможно, авторы действительно хотят дать возможность продержаться подольше большему количеству людей. Посмотрим, что будет в 2025г.
А пока мои достижения выглядят так
🔥30👍5
В начале марта ребята делают новые смены CodeRetreat в Черногории.
В этот раз я не ведущий — сам я в апреле поеду, а на две поездки подряд за одну весну я пока не готов 🙈. Зато другим выбраться рекомендую настоятельно — переключить голову и завести знакомства, натереть мозоли, как водится. В марте там будет ещё не жарко, так что костры и прочие бани будут очень даже в тему.
🇬🇧 Кэмп-викенд на английском с полным погружением, фокусом на IT-собеседования и поиск работы на глобальном рынке. Хорошая практика для тех, кто хочет потренироваться перед важными собесами, прожарить свои резюме и разговориться (я прям жалею, что не попадаю — мне точно было бы полезно поспикать from my heart 🌚).
https://coderetreat.me/itenglish
28 февраля - 2 марта
🥷 Кэмп про ха(й)кинг! Вместе с этичным хакером будете заниматься поиском уязвимостей, научитесь видеть слабые места собственных приложений с точки зрения информационной безопасности. Даже соревнования будут, говорят!
https://coderetreat.me/securecamp
3 - 6 марта
Про то, что у меня будет на треке, я попозже напишу: у меня пока research не закончился — идея есть, тоже соревновательная, но с нужным ПО я пока не определился, как бы не пришлось велосипедить 😉. Ещё можно пройти и подписаться на @coderetreatme — там точно новость появится.
P.S. Да, это (само)реклама. Но мы на самом деле очень стараемся. И практика показывает, что у нас получается!
В этот раз я не ведущий — сам я в апреле поеду, а на две поездки подряд за одну весну я пока не готов 🙈. Зато другим выбраться рекомендую настоятельно — переключить голову и завести знакомства, натереть мозоли, как водится. В марте там будет ещё не жарко, так что костры и прочие бани будут очень даже в тему.
🇬🇧 Кэмп-викенд на английском с полным погружением, фокусом на IT-собеседования и поиск работы на глобальном рынке. Хорошая практика для тех, кто хочет потренироваться перед важными собесами, прожарить свои резюме и разговориться (я прям жалею, что не попадаю — мне точно было бы полезно поспикать from my heart 🌚).
https://coderetreat.me/itenglish
28 февраля - 2 марта
🥷 Кэмп про ха(й)кинг! Вместе с этичным хакером будете заниматься поиском уязвимостей, научитесь видеть слабые места собственных приложений с точки зрения информационной безопасности. Даже соревнования будут, говорят!
https://coderetreat.me/securecamp
3 - 6 марта
Про то, что у меня будет на треке, я попозже напишу: у меня пока research не закончился — идея есть, тоже соревновательная, но с нужным ПО я пока не определился, как бы не пришлось велосипедить 😉. Ещё можно пройти и подписаться на @coderetreatme — там точно новость появится.
P.S. Да, это (само)реклама. Но мы на самом деле очень стараемся. И практика показывает, что у нас получается!
coderetreat.me
IT English Camp
Кэмп в горах с погружением в английский для IT специалистов, 28 февраля - 2 марта, Черногория
🔥13
Вот и настало время отписать, с чем я поеду в ЧГ в конце апреля: GaveDev Jam (kinda) проводить! Попробуем коллективно написать Sokoban для Tic-80 в чаде кутежа, в стиле Mob Programming, с привлечением LLM (модно, молодёжно и просто весело).
Почему Tic-80? Потому что у виртуальных консолей максимальные retro vibes 👾, а эта конкретная штучка поддерживает несколько языков на выбор и является FOSS. И результат можно собрать в HTML-ку самостоятельную и опубликовать сразу же, это само по себе ценно!
Почему Sokoban? Потому что идея простая, но допускает усложнение. И пошаговость сама по себе освобождает от многих проблем, о которых думать не хочется 😎
Параллельно пообщаемся о GameDev в целом — прямо в время хайков. Как показала практика, какой-то суровый технический контент на retreats воспринимается с трудом, так что постараемся в основном удовольствие получить!
Собственно, ссылка на страничку мероприятия: https://coderetreat.me/gamejam
UPD: мероприятие отменяется или переносится на когда-нибудь 🙈
Почему Tic-80? Потому что у виртуальных консолей максимальные retro vibes 👾, а эта конкретная штучка поддерживает несколько языков на выбор и является FOSS. И результат можно собрать в HTML-ку самостоятельную и опубликовать сразу же, это само по себе ценно!
Почему Sokoban? Потому что идея простая, но допускает усложнение. И пошаговость сама по себе освобождает от многих проблем, о которых думать не хочется 😎
Параллельно пообщаемся о GameDev в целом — прямо в время хайков. Как показала практика, какой-то суровый технический контент на retreats воспринимается с трудом, так что постараемся в основном удовольствие получить!
Собственно, ссылка на страничку мероприятия: https://coderetreat.me/gamejam
UPD: мероприятие отменяется или переносится на когда-нибудь 🙈
👍11🔥5
Ну вот, отменяется этот мой ритрит про геймдев — участников не набралось минимально достаточное количество. Видимо, все желающие похайкать скатались в прошлом году и не по разу 🙈 Ну да ладно, может быть ещё соберёмся и поджемим игры! Были ещё идеи ритритить вокруг чая и/или кофе, тоже надо будет попробовать 😉
(И надо будет хотя-бы сюда написать, с чем я там поиграл вокруг 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