tgindex
brain_dump_etc

brain_dump_etc

Статистика

Дампы мыслей, свалка ссылок, программизмы, вкусовщина! Автор: @astynax Донаты (patreon и прочее): https://astynax.me/support.html Чат: https://t.me/brain_dump_chat Twitch: https://www.twitch.tv/astynax2hs Discord: https://discord.gg/tJvze5

Последний пост
7 авг.
Последнее чтение
12:13
Постов за неделю
0
Всего постов
21
Тип
открытый
Язык
русский
Категория
Технологии (по похожим)
В каталоге с
12 авг.
Подписчики
664
0 за 3 дн.
Сутки
−1
−0,15%
Неделя
 
Месяц
 
Просмотров на пост
665
21 постов
Вовлечённость
100,2%
к подписчикам
Постов в день
0,0
всего 21
Упоминаний
1
каналов
Охват размещения
оценка
1/24сутки в ленте
213
1/48двое суток
244
1/72трое суток
263

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • 7 авг.24111из brain_leakage_etc

    Копаюсь дальше в профиле Safari 🔬 В процессе написал программку, которая дампает plist в JSON, потому что кое-что у Safari в plists хранится — у Apple ещё со времён Next любовь к property lists. Благо, для Rust есть готовая либа, которая умеет читать и XML-вариант и бинарный. Так что я просто сделал plist->raw_dict->JSON, а дальше с jq развлекался. Ну да это всё цветочки. Теперь по ягодкам. У Safari в History.db есть табличка history_tags, которая относится m2m к history_items, то есть каждая посещённая страничка потегана более чем одним тегом. Тегов у меня в табличке 1700 с лишним! Причём первым по id идёт "GNU Emacs"! Потыкался, погонял уточку запросами с джойнами. По тегу "GNU Emacs" нашлись вполне релевантные сайты. А вот сайт языка Factor имеет ярлычок "Arch Linux", хе-хе 🤓 Причём, судя по всему, Safari делает некий NLP локальный, чтобы теги выцепить — и вот это прям интересно! Но, увы, нигде не задокументировано. Надо будет посмотреть, что можно понять про меня по этим тегам, интересно же! 😎

  • 7 авг.22822из brain_leakage_etc

    Снова порадовался тому, что Safari хранит историю в SQLite, хоть и добраться до файла не так уж и просто из-за огораживания macOS. У меня отключена очистка истории в настройках браузера, уж и не помню с каких пор. И когда я перключаю настройку в "забывать всё, спустя год", Safari говорит, мол, ты точно хочешь удалить 100000 записей? При этом сам Safari колдобится от такого объёма истории, но продолжает терпеть, раз я решил хранить всё 🤪 Короче говоря, я периодически хожу и грохаю поиски, ссылки на youtube, на Gmail. Последний вообще любит намусорить в историю, хотя сама идея вынести состояние в URL и неплохая. Вот и сегодня я сходил, для разнообразия с помощью duckdb, вспомнил схему, прогнал парочку "DELETE FROM ... WHERE url LIKE ...", а потом полирнул с помощью VACUUM. Прямо приятно стало от такой мощи в моих ручищах!

  • Перенаправлю сюда, пусть побудет. А то в тот канал пишу когда что-то наболело, или просто "не тянет полноценный формат", а тут почти набралось уже и не о наболевшем (почти) 😉

  • Мне тут подкинули(🙃) ссылку на видео про Open Hardware принтер. Сама железка ещё на стадии сбора средств, вот отчёт о прогрессе свежий. Сайт у создателей тоже есть, красивый. А мне уже есть, о чём сказать. Выглядит хорошо, эстетично. А вот пригодность к модификации под большим вопросом. Если ребята перестанут выпускать головки в какой-то момент, не дождавшись вовлечения других производителей в процесс, то весь этот open hardware не будет стоить выеденного яйца. Потому что далеко не каждый сможет сделать на коленке печатающую головку могущую печатать те самые 1200dpi даже одним цветом, не говоря уж о многоцветной печати. Я ещё почитаю, может быть в принтер можно поставить какую-то популярную головку от существующих производителей, но есть у меня сомнения по этому поводу: уж больно любят принтероделы обложиться патентами и всё запретить (понято, почему, но всё равно грустно). Ещё одна претензия от меня касается ориентации на рулон бумаги. Да, я понимаю, что это сильно упростило конструкцию. Вот только рулоны есть не везде в продаже и бумага в них тоньше, чем можно найти в листах. А ещё нужен резак, и хоть тут он и встроенный (в головку, скорее всего), но это уже усложнение конструкции по сравнению с печатью на листы. Ну и в конце концов я предпочитаю принтеры, которые двигают лист без перегибов — такие могут и на картоне печатать и на всяких листах с клеевым слоем. Это более универсальная конструкция и именно такую я бы ждал от открытого принтера для энтузиастов — вдруг кто-то захочет ещё и фотопечать опробовать, а бумага под это дело не очень терпит перегибы на местах (🌚). Подытожу, для меня оно недостаточно open, но если полетит, то сработает хотя бы как пример того, что аудитория готова к открытой оргтехнике. И вот тогда уже мы дождёмся DIY МФУ c возможностью пересобрать со струйной головки на матричную и даже — мечтать так мечтать — на барабан для лазерной печати!

  • Кстати, если кто-то вдруг захочет в тот же Super StarTrek поиграть в браузере, то вот вам максимально аутентичная версия. На код можно посмотреть тут, там много игр переписано на разные языки, так что репозиторий интересный со многих точек зрения! А я лично почитал оригинальный код SST на BASIC и занырнул в ностальгию максимально: это как раз тот уровень развития BASIC, который именно я застал на микро-компьютерах — без подпрограмм, с номерами строк. На QBASIC я писал не так уж и долго, быстро перешёл на Turbo Pascal и сильно в BASIC с SUBs я не нырял. Да и программы мои были достаточно небольшими, чтобы обходиться без SUBs, хотя свой куцый клон SimCity я делал в своё время и это довольно длинная программа для QB. Свою же реализацию Super StarTrek я в итоге скорее всего перепишу на Emacs Lisp, чтобы прямо из Emacs играть — там и многооконность есть, чтобы ту же инструкцию всегда под рукой иметь, и вообще можно поэкспериментировать с "богатым текстовым интерфейсом", всякие кнопочки кликабельные сделать!

  • 29 мая754201

    В 1973 увидеть такое на телеке, к которому подключен ваш микрокомпик, было несказанно круто, я уверен! Мне в мои ранние 90е — и то было волнительно! Причём, эту "картинку" было видно на листинге, что только подогревало любопытство — и звало уже набрать какую-то тысячу строк под одной за раз без редактора, ведь оно того стоило, да? (в этом конкретном случае ожидания игра оправдывала, к счастью!)

  • 29 мая662142

    В детстве мне как-то попалась пачка плохих фотокопий страниц какой-то книги с линстингами игр на BASIC. Копии даже были не первого порядка, а копии копий, кажется. Но код как-то да читался, а это было уже что-то! Не то чтобы мне хватило терпения набрать все игры, но несколько не самых длинных я таки вводил, отлаживал и многому научился в процессе! Машиной моей в то время был "Электроника МС-1502" с клоном GW-BASIC в ПЗУ. Графические возможности у этой реализации были бедные, зато функций для работы с математикой и текстом было предостаточно. И мне очень нравилось, что в книге игры были все сплошь текстовые, так что портирование было осуществимым. Правда, мне некуда было код сохранять, я в том время ещё не озаботился подключением кассетного магнитофона к своей ПЭВМ, так что тетради в клетку были моими накопителями, а код в уме крутить можно было прямо в школе 🤓 Книжка та, копию которой я имел, называлась, как я сильно позже узнал, BASIC Computer Games — не слишком замысловато, согласен! Но, как оказалось, для очень и очень многих это был первый шажок в программирование игр на домашнем микро-компьютере. Сейчас, если поискать вокруг современных ретро-интерпретаторов вроде pcbasic, вы очень часто попадаете на сайт другой реализации, Vintage Basic, а уже там находится и страница со всеми листингами из той самой книги! Так вот, к чему весь этот экскурс? На одной из тех бледных копий разворотов книжки я в своё время нашёл код Super Star Trek. И знаете, что? Это было моё первое знакомство с Треком как с явлением — да, именно игровая программа на BASIC! И это была, между прочим, достаточно сложная программа для своего времени (1973!): тут вам и космос с 64 квадрантами, в каждом есть звёзды, редкие звёздные базы, не очень редкие корабли клингонов, а вам нужно и всех противников уничтожить, и за энергией уследить, не забывая заряжать щиты и чиниться на базах, да ещё и в отведённое время уложиться — игра пошаговая, но каждое действие тратит песочек в часах. Напомню, это всё делает программа на BASIC, код которой был напечатан в книжке! В последующие годы я видел много реализаций, которые просто воспроизводили оригинал на более актуальных системах или же что-то добавляли и расширяли. Да и просто игр-наследников за годы вышла уйма. Не побоюсь утверждать, что даже FTL: Faster Than Light корнями к Trek уходит! И вот, некоторое время назад я решил вспомнить детство и поиграть в Super Star Trek. Понадеялся на то, что уж для Unix-систем-то должна существовать реализация! Таки не нашлось сходу, так что я решил переписать оригинал с BASIC на что-то знакомое мне, даже не с целью поиграть в результат, а просто ради процесса. И всё руками, без этих ваших сеток — опять же, ради самих ощущений работы над чем-то достаточно конечным, но всё ещё приносящим радость! И вот уже несколько вечеров потихоньку, по кусочку за раз переписываю первую попавшуюся реализацию SST, которую нашёл на GitHub. Моя версия будет на Clojure, а более конкретно, на Babashka: хочется сохранить концепцию "один файл со всем кодом" без компиляции и прочих сборок. Кстати, реализация, которую я упомянул — это тоже результат переписывания на Clojure для самообразования, но я на этот код не смотрел, взял только опорный вариант на C# и переписывал уже его. Там же в репозитории есть StarTrek.cs — и вот это уже кое-что забористое! Тот, кто делал этот вариант, взял исходный код на BASIC и сделал так, чтобы это был как бы C#, но с метками на каждую строчку и GOTO для прыганья на эти метки — это уже современное искусство какое-то 🤪 Собственно, это всё, что я хотел сказать, хе-хе! Конечный результат я может быть даже никому не покажу, там всё нарочито императивное: циклы, атомы в роли мутабельных переменных — я тоже не делал свою версию идиоматично и по заветам отцов ФП, а "писал на Clojure как на C". Потому что могу 😉 А вы живите долго и процветайте 🖖

  • Ну что, постримлю чутка. Clojure и парсинг. Тут смотреть: https://www.twitch.tv/astynax2hs Сюда приходить поговорить: mumble://0xdd.org.ru UPD: Опять грабли, стрим был в 360p, запись тоже, так что имеет смысл только слушать 🙈 Но если вдруг кому интересно, то речь шла про начало реализации интерпретатора языка Knight, который "проще некуда", а парсить я решил на своей реализации парсер-комбинаторов — потому что могу. Продолжать я всё равно буду, скорее всего. Надеюсь в следующий раз наступить не на эти грабли по крайней мере 🌚

  • Если кого-то ещё удивляет else: у питоновского for (помню, как я про это писал в уроке для Hexlet), то вы просто мало языков видели 😎 > {FIRST { "(".print }; LAST { ")".print }; .print; ",".print if 1 ff^ 10 } for [1..10]; "".say (1,2,3,4,5,6,7,8,9,10) А вообще вот статейка хорошая про циклы. Update: Кто-то испугался. А зря! У того же Golang есть defer, который освобождает ресурсы даже в случае ошибки. Raku всего лишь обобщает такие "действия до/после/в случае" и разрешает использовать в любых блоках. Называются такие штуки phasers, потому что привязаны к фазам. Даже фазеры специфичные только для циклов (как тот самый FIRST) используют всё тот же синтаксис, просто у циклов набор фаз шире, чем у обычных блоков. Единственное, что в том примере выше действительно страшновато, так это flip-flop оператор ff^ — эти друзья в Raku действительно очень своеобразные! Но в моём примере как раз тот самый случай, когда я хочу в рамках цикла что-то сделать не на каждой итерации, а только в поддиапазоне, и тут flip-flops как раз к месту 😎 Update #2: Конечно же, я знаю про макрос loop в Common Lisp, практикую периодически. И циклы с состоянием в Racket тоже пользую 😎

  • В жизни программиста на языке с объектами наступает момент, когда этот программист решает, что пора написать свой DI Container. Я тоже был там лет цать назад, году в 2014 😎 Мы тогда делали платформу, в которой БД, API и Web GUI генерировались на лету (метапрограммирование в рантайме, не кодогенерация) из одного JSON-файла. И всё это добро склеивалось из кусочков с помощью DI контейнера за моим авторством. Я даже на PiterPy катал с докладывать про дела с DI в Python в целом и про свою поделку в частности, вот тут есть запись того доклада. При этом и тогда нельзя было сказать, что я такой уж любитель ООП, так что, нет, мой yadic (Yet Another DI Container) не был следствием того, что я прочитал книжку про паттерны проектирования 😜 Просто в той платформе была реальная польза от использования контейнера. Кода у меня, кстати, получилось совсем немного, пара-тройка страниц в одном файле. Даже скрипт, который брал JSON с конфигурацией и выводил .dot-файл, пригодный для отрисовки с помощью Graphwiz — и тот больше строк кода занимал, как не странно 🤓 Этим визуализатором структуры мы даже нашли пару протечек абстракции, когда стрелочки перепрыгивали через слой в нашей лазаньи (вместо спагетти, кек). Так вот, вспомнил я себя из того времени, когда на новой работке увидел DI container за авторством моего лида. Тоже самодельный, конечно же, в лучших традициях велосипедостроения! Но тоже нужный, потому что LiveKit не предоставляет никаких средств поинжектить подключения к Redis в ваш код без лишней связанности. И да, лид мой примерно в том же возрасте, в котором я свой yadic писал, и этот факт меня отдельно позабавил 😁 И да, у меня к этому контейнеру есть претензии, конечно же. Например, мне не нравился, что он таки ничего не инжектирует, а только лишь (UPD: таки инжектирует и даже на основе аннотации типов у конструкторов) позволяет по интерфейсу добыть реализацию. И то, что фаза настройки не выделена чётко, а в разных местах кода вызывается метод регистрации реализаций. Я-то выступаю за то, чтобы конфигурировалось всё статически и строго в одном месте максимально близко к точке входа в программу! Да, иногда не хочется все ресурсы создавать сразу, но этим как раз можно управлять посредством ленивости — явной, как части конфигурации. Есть, над чем стоит поработать, проще говоря 😎 P.S. Всё ещё считаю, что DI может очень сильно запутывать код, если вам не дали достаточно богатый набор инструментов, позволяющих посмотреть на то, что, куда и откуда инжектируется. У моего yadic на старте был визуализатор, который использовался прямо со старта. IntelliJ IDEA понимает Spring, без этого понимания мне лично было бы тяжко, как минимум, во время знакомства с новыми проектами — да, это закрытая и платная функция, но она того стоит (в совокупности со всем тем, что ещё IDEA умеет делать).

  • Ладно, подкаст не вышел пока :) Будем думать 🙈 mumble://0xdd.org.ru — в мамбл заходите просто поболтать

  • А вот и запись - задачка на Rosetta Code - больше про паттерн тоже применительно к Python можно прочитать в этой статье В ролике я показал, как можно использовать паттерн Active Enum вместо ветвления с помощью if/match и получить "более идиоматичный для ООП" код — по-SmallTalk-овски более идиоматичный, конечно же 😎. Суть паттерна: варианты перечисления обладают закреплённым поведением, в идеале — каждый своим. Похожего результата с использованием Active Enum можно добиться в Scala, там тоже синтаксис для перечислений легковесный и позволяет прикладывать данные к вариантам, а затем эти данные уже можно использовать в коде, не прибегая к условиям или сопоставлению с образцом. В Kotlin есть свои enum classes и там прикрепление поведения к вариантам тоже делается элементарно. Отдельно приятно использовать в качестве вариантов объекты вместо классов, когда закреплённое поведение реализуется методами, а полей как таковых нет. В Java традиционные перечисления умеют только быть собой и именовать варианты, не более. Но нынче есть и sealed classes, которыми можно описать то же множество значений с поведением, да ещё и в одном файле можно хранить и базовый класс, и варианты — да, не нужно иметь по файлу на классик из трёх строк! Правда, остаётся возможность где-то указать в качестве типа класс-вариант, что идёт несколько в разрез с идеей "варианты — всегда значения типа-перечисления." В Rust нормальные алгебраические типы и закрепить поведение за вариантами перечисления легко, само собой. Вообщем, мне паттерн нравится — тем, что позволяет размять мозги и взглянуть на задачу иначе. А не потому что он для мира ООП, хе-хе 😉

  • Стримлю один паттерн, который неплохо лёг на одну задачку с Rosetta Code. https://www.twitch.tv/astynax2hs А вечером буду подкастик делать в основном голосовой, ближе к делу напишу.

  • Сегодня моему интернету было совсем грустно, нужно будет попробовать другой сетап для стримов-подкастов в дополнением к обычным, где я экран показываю. Может быть таки в какую-нибудь студию выбираться или переговорку. В любом случае спасибо всем, кто заглядывал!

  • Поехали, сюда заходите: https://www.twitch.tv/astynax2hs Буду ковырять рандомный код на Python и разглагольствовать про permacomputing. В голосовой канал дискорда заходите, если захочется присоединиться https://discord.gg/gqkRbJqU

  • Сегодня попробую вечером постримить. Где-то в 18-19 GMT+4. Можете заявки накидать, могу высказаться по заданным темам — попробовать такой формат для разнообразия 😎

  • Вот запись: https://youtu.be/LusYWxmwWX0 Ничего уникального, просто Emacs и Cider, но зато показываю на примере кода для Babashka 😎

  • Стартанул стрим по моему сетапу для Clojure по просьбам трудящихся

  • Вот запись моего сегодняшнего монолога про Cozy Programming: https://youtu.be/QVmCLRrunoc В программе: - Ностальгия по BASIC (тут про такое уже было) - PICO-8, про который тут есть и в количествах - TIC-80 — его открытый аналог, см анимацию выше - Железки вроде GameShell и PlayDate (про обе писал, смотрите ссылки) - DrRacket как уютный способ порисовать картинки кодом (пост про это — тут) Также коснулся особенностей графики ZX Spectrum, палитровой анимации, вспомнил про Amiga Workbench — всё это вскользь, но в контексте.

  • Через 5 мин стартану стрим про cozy programming & stuff

brain_dump_etc — tgindex